Skip to content

AWS Controllers for Kubernetes (ACK) 测验

本测验考查你对 AWS Controllers for Kubernetes (ACK) 的概念、架构、安装、安全性和运维的理解。

选择题

  1. ACK (AWS Controllers for Kubernetes) 的主要用途是什么?
    • A) 仅通过 AWS console 管理 AWS resources
    • B) 通过 Kubernetes API 以声明式方式管理 AWS resources
    • C) 仅在 AWS 上运行 Kubernetes clusters
    • D) 自动降低 AWS costs
显示答案

答案:B) 通过 Kubernetes API 以声明式方式管理 AWS resources

解释: ACK 是一个项目,使 Kubernetes 用户能够直接使用熟悉的 Kubernetes APIs 和工具(kubectl、Helm 等)来管理 AWS services 和 resources。这允许与 GitOps 工作流集成,并通过声明式配置以基础设施即代码的方式管理 AWS infrastructure。

  1. 在 ACK 架构中,哪个组件会针对每个 AWS service 单独安装?
    • A) Kubernetes API Server
    • B) Service controller
    • C) etcd database
    • D) kubelet
显示答案

答案:B) Service controller

解释: ACK 为每个 AWS service(S3、RDS、DynamoDB 等)提供独立的 service controllers。例如,要管理 S3 buckets,你需要安装 S3 controller;要管理 RDS databases,你需要安装 RDS controller。这种模块化方法允许你只安装所需 services 的 controllers。

  1. 为 ACK controllers 设置 IAM permissions 以管理 AWS resources 的推荐方法是什么?
    • A) 仅使用 EC2 instance profiles
    • B) 将 AWS access keys 存储在 ConfigMap 中
    • C) 使用 IRSA (IAM Roles for Service Accounts)
    • D) 使用具有所有 AWS permissions 的 root account
显示答案

答案:C) 使用 IRSA (IAM Roles for Service Accounts)

解释: IRSA (IAM Roles for Service Accounts) 是为 ACK controllers 授予 AWS resource management permissions 的推荐方法,它通过将 IAM roles 与 Kubernetes service accounts 关联来实现。此方法遵循最小权限原则,支持安全的凭证管理,并允许仅向每个 controller 授予必要权限。

  1. 在 ACK 中,删除 Kubernetes resource 时若要保留 AWS resource,应使用哪个 annotation?
    • A) services.k8s.aws/keep-resource: "true"
    • B) services.k8s.aws/deletion-policy: "orphan"
    • C) services.k8s.aws/preserve: "true"
    • D) services.k8s.aws/no-delete: "true"
显示答案

答案:B) services.k8s.aws/deletion-policy: "orphan"

解释: 默认情况下,当 Kubernetes resource 被删除时,ACK 会删除对应的 AWS resource。不过,设置 services.k8s.aws/deletion-policy: "orphan" annotation 后,即使 Kubernetes resource 被删除,也会保留 AWS resource。这对于防止在生产环境中意外删除重要 resources 很有用。

  1. 如何使用 ACK 将现有 AWS resources 导入 Kubernetes?
    • A) 使用 kubectl import command
    • B) 使用 AWS console 的 export feature
    • C) 将 services.k8s.aws/resource-imported: "true" annotation 添加到 resource manifest
    • D) 使用 ACK CLI import command
显示答案

答案:C) 将 services.k8s.aws/resource-imported: "true" annotation 添加到 resource manifest

解释: 要将现有 AWS resources 导入 ACK,请创建 resource manifest 并添加 services.k8s.aws/resource-imported: "true" annotation。这会使 ACK controller 连接到现有 AWS resource,而不是创建新的 resource。这支持将现有基础设施逐步迁移到 GitOps 工作流。

  1. 哪个 ACK service controllers 的成熟度级别适合生产使用?
    • A) Alpha
    • B) Beta
    • C) GA (Generally Available)
    • D) Preview
显示答案

答案:C) GA (Generally Available)

解释: ACK service controllers 会经历三个成熟度级别:Alpha、Beta 和 GA。Alpha 是早期开发阶段,API 可能发生变化;Beta 表示功能已完整,但 API 仍可能变化。GA (Generally Available) 是可用于生产的阶段,提供稳定的 APIs 和完整功能。

  1. 哪个 Condition type 表示 ACK resource 已成功同步?
    • A) ACK.Ready
    • B) ACK.ResourceSynced
    • C) ACK.Healthy
    • D) ACK.Available
显示答案

答案:B) ACK.ResourceSynced

解释: 可以在 status.conditions 字段中检查 ACK resource 的状态。当 ACK.ResourceSynced Condition 为 True 时,表示 Kubernetes resource 的期望状态(spec)已与实际 AWS resource 状态成功同步。这允许你验证 resource 是否已正确创建或更新。

  1. 在 ACK 中,为多个团队或环境隔离 permissions 的推荐方法是什么?
    • A) 使用单个 controller 管理所有环境
    • B) 使用独立 namespaces 和 IAM roles 进行隔离
    • C) 仅使用 AWS Organizations
    • D) 仅使用 VPC isolation
显示答案

答案:B) 使用独立 namespaces 和 IAM roles 进行隔离

解释: 要在 ACK 中为多个团队或环境(开发、预发布、生产)隔离 permissions,建议为每个团队或环境使用独立的 Kubernetes namespaces 和 IAM roles。为每个 namespace 安装独立的 controllers,并将 roles 与适用于该环境的 IAM policies 关联。此外,可以使用 Kubernetes RBAC 控制用户对 ACK resources 的访问。

简答题

  1. ACK controllers 调用 AWS APIs 来创建、更新和删除 resources,同时检测并解决期望状态与实际状态之间差异的模式叫什么?
显示答案

答案:Reconciliation Loop 或 Reconciliation Pattern

解释: Reconciliation loop 是 Kubernetes controllers 的核心模式,ACK 也基于此模式。ACK controllers 会持续比较 Kubernetes resources 的期望状态(spec)与 AWS resources 的实际状态。当检测到差异时,controller 会调用 AWS APIs,使实际状态与期望状态一致。此过程会自动重复,以检测并纠正漂移。

  1. ACK 使用哪种 Kubernetes extension mechanism 通过 Kubernetes API 定义 AWS resources?
显示答案

答案:CRD (Custom Resource Definition)

解释: ACK 使用 CRD (Custom Resource Definition) 通过 Kubernetes API 定义 AWS resources。例如,安装 S3 controller 时,会创建 BucketBucketPolicy 等 CRDs,让你可以像管理 Kubernetes resources 一样管理 S3 buckets。每个 service controller 都会为对应 AWS service 的 resources 提供 CRDs。

  1. 检查 ACK resource 状态时,可以在哪个字段找到 AWS resource 的 ARN (Amazon Resource Name)?
显示答案

答案:status.ackResourceMetadata.arn

解释: 当 ACK resource 成功创建后,对应 AWS resource 的 ARN 会存储在 status.ackResourceMetadata.arn 字段中。使用 kubectl describe command 检查 resource 状态时可以看到此信息。你也可以在 status.ackResourceMetadata.ownerAccountID 字段中查看拥有该 resource 的 AWS account ID。

  1. ACK 中允许从多个 clusters 引用同一个 AWS resource,或管理不同 AWS accounts 中 resources 的功能叫什么?
显示答案

答案:Cross-Account Resource Management 或 Multi-Cluster Support

解释: ACK 提供了从多个 Kubernetes clusters 引用同一个 AWS resource,或管理不同 AWS accounts 中 resources 的功能。为此,需要配置 IAM role chaining 或 cross-account IAM policies,使 ACK controllers 能够访问其他 accounts 中的 resources。此功能支持在 multi-cluster 或 multi-account 环境中进行集中式 resource management。

动手实践题

  1. 编写一个 Kubernetes manifest,使用 ACK 创建一个 S3 bucket。bucket 名称为 "my-ack-demo-bucket-2025",并添加标签 Environment: Development。
显示答案

答案:

yaml
apiVersion: s3.services.k8s.aws/v1alpha1
kind: Bucket
metadata:
  name: my-ack-demo-bucket
  namespace: default
spec:
  name: my-ack-demo-bucket-2025
  tagging:
    tagSet:
      - key: Environment
        value: Development
  createBucketConfiguration:
    locationConstraint: us-west-2

解释: 这是使用 ACK S3 controller 创建 S3 bucket 的 manifest。metadata.name 是 Kubernetes resource name,spec.name 是实际的 AWS S3 bucket name。由于 bucket names 必须全局唯一,实际使用时请使用唯一名称。AWS resource tags 可以通过 tagging.tagSet 设置,createBucketConfiguration.locationConstraint 指定 bucket 将被创建的 region。

  1. 编写使用 Helm 安装 ACK S3 controller 并配置 IRSA 的 commands。使用 cluster name "my-eks-cluster" 和 namespace "ack-system"。
显示答案

答案:

bash
# 1. Add Helm chart repository
helm repo add aws-controllers-k8s https://aws.github.io/eks-charts
helm repo update

# 2. Create IAM service account for IRSA
eksctl create iamserviceaccount \
  --cluster=my-eks-cluster \
  --namespace=ack-system \
  --name=ack-s3-controller \
  --attach-policy-arn=arn:aws:iam::aws:policy/AmazonS3FullAccess \
  --approve \
  --override-existing-serviceaccounts

# 3. Install S3 controller
helm install ack-s3-controller \
  aws-controllers-k8s/s3-chart \
  --namespace ack-system \
  --create-namespace \
  --set serviceAccount.create=false \
  --set serviceAccount.name=ack-s3-controller \
  --set aws.region=us-west-2

解释: 首先,添加 ACK Helm chart repository。然后使用 eksctl 创建用于 IRSA 配置的 IAM service account。S3 management 所需的 IAM policy 会附加到此 service account。最后,使用 Helm 安装 S3 controller,并配置为使用已创建的 service account。对于生产环境,最好使用遵循最小权限原则的 custom policy,而不是 AmazonS3FullAccess。

  1. 编写 commands,用于检查 controller logs 并查看 resource status,以排查 ACK 创建的 resources 的问题。
显示答案

答案:

bash
# 1. Check ACK controller logs
kubectl logs -n ack-system -l app.kubernetes.io/name=ack-s3-controller

# 2. Check specific resource status and events
kubectl describe bucket my-ack-demo-bucket

# 3. Check detailed resource status (JSON format)
kubectl get bucket my-ack-demo-bucket -o json | jq '.status'

# 4. Check resource-related events
kubectl get events --field-selector involvedObject.name=my-ack-demo-bucket

# 5. Check CRD installation status
kubectl get crd | grep services.k8s.aws

# 6. Check controller deployment status
kubectl get deployment -n ack-system

解释: 排查 ACK resource 创建问题时,需要检查多个方面。首先,检查 controller logs 以识别 AWS API 调用错误或 permission 问题。使用 kubectl describe 检查 resource 状态和 Conditions,并通过 events 跟踪最近的变化。同时确认 CRDs 已正确安装且 controller pods 正常运行。常见问题包括 IAM permissions 不足、region 设置不正确以及 resource name 冲突。


评分:

  • 13-15 题正确:优秀(ACK expert level)
  • 10-12 题正确:良好(具备 practical application 能力)
  • 7-9 题正确:一般(建议 additional learning)
  • 0-6 题正确:不足(需要复习 basic concepts)

返回学习材料