配置容器组(pod)以使用 Kubernetes 服务账户 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

配置容器组(pod)以使用 Kubernetes 服务账户

如果 pod 需要访问 Amazon Web Services,则您必须配置它以使用 Kubernetes 服务账户。服务账户必须关联到有权访问 Amazon Web Services 的 Amazon Identity and Access Management(IAM)角色。

先决条件

  • 现有集群。如果还没有,可以使用 开始使用 Amazon EKS 指南之一创建一个。

  • 集群的现有 IAM OpenID Connect(OIDC)提供商。要了解您是否已拥有一个(IAM)角色或如何创建一个(IAM)角色,请参阅 为集群创建 IAM OIDC 提供商

  • 与 IAM 角色关联的现有 Kubernetes 服务账户。必须使用 IAM 角色的 Amazon 资源名称(ARN)注释服务账户。该角色必须具有关联的 IAM policy,其中包含您希望您的容器组(pod)必须具有的权限,以便使用 Amazon Web Services。有关如何创建和配置服务账户和角色的更多信息,请参阅 配置 Kubernetes 服务账户以代入 IAM 角色

  • 您的设备或 Amazon CloudShell 上安装并配置了 2.8.0 版或更高版本,或 1.25.87 版或更高版本的 Amazon CLI。您可以使用 aws --version | cut -d / -f2 | cut -d ' ' -f1 检查您的当前版本。软件包管理器(如 yumapt-get 或适用于 macOS 的 Homebrew)通常比 Amazon CLI 的最新版本落后几个版本。要安装最新版本,请参阅《Amazon Command Line Interface 用户指南》中的安装、更新和卸载 Amazon CLI使用 aws configure 进行快速配置。Amazon CloudShell 中安装的 Amazon CLI 版本也可能比最新版本落后几个版本。要对其进行更新,请参阅《Amazon CloudShell 用户指南》中的将 Amazon CLI 安装到您的主目录

  • 您的设备或 Amazon CloudShell 上安装了 kubectl 命令行工具。该版本可以与集群的 Kubernetes 版本相同,或者最多早于或晚于该版本一个次要版本。例如,如果您的集群版本为 1.22,则可以将 kubectl 版本 1.211.221.23 用于它。要安装或升级 kubectl,请参阅 安装或更新 kubectl

  • 包含集群配置的现有 kubectl config 文件。要创建 kubectl config 文件,请参阅 为 Amazon EKS 集群创建或更新 kubeconfig 文件

配置容器组(pod)以使用服务账户

  1. 使用以下命令创建部署清单,您可以使用该部署清单部署容器组 (pod) 以确认配置。pod 使用现有的 Kubernetes 服务账户。必须正确配置服务账户。有关更多信息,请参阅配置 Kubernetes 服务账户以代入 IAM 角色。将示例值替换为您自己的值。

    cat >my-deployment.yaml <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: serviceAccountName: my-service-account containers: - name: my-app image: public.ecr.aws/nginx/nginx:1.21 EOF
  2. 将清单部署到集群。

    kubectl apply -f my-deployment.yaml
  3. 确认您的 pod 具有所需的环境变量。

    1. 按上一步部署后,查看部署的 pods。

      kubectl get pods | grep my-app

      输出示例如下。

      my-app-6f4dfff6cb-76cv9 1/1 Running 0 3m28s
    2. 查看 pod 使用的 IAM 角色的 ARN。

      kubectl describe pod my-app-6f4dfff6cb-76cv9 | grep AWS_ROLE_ARN:

      输出示例如下。

      AWS_ROLE_ARN: arn:aws:iam::111122223333:role/my-role

      角色 ARN 必须与您用于注释现有服务账户的角色 ARN 匹配。有注释服务账户的更多信息,请参阅 配置 Kubernetes 服务账户以代入 IAM 角色

    3. 确认 pod 具有 Web 身份令牌文件挂载。

      kubectl describe pod my-app-6f4dfff6cb-76cv9 | grep AWS_WEB_IDENTITY_TOKEN_FILE:

      输出示例如下。

      AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com.cn/serviceaccount/token

      kubelet 代表 pod 请求并存储令牌。默认情况下,如果令牌早于其总生存时间的 80%,或者令牌大于 24 小时,则 kubelet 会刷新令牌。您可以使用 pod 规范中的设置修改任何账户(默认服务账户除外)的过期期限。有关更多信息,请参阅 Kubernetes 文档中的服务账户令牌卷预测

      集群上的 Amazon EKS 容器组(pod)身份 Webhook 监控使用具有以下注释的服务账户的 pods:

      eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/my-role

      Webhook 将之前的环境变量应用于这些容器组(pod)。您的集群无需使用 Webhook 来配置环境变量和令牌文件挂载。您可以手动配置 pods 以包含这些环境变量。Amazon 开发工具包支持的版本首先在凭证链提供商中查找这些环境变量。角色凭证用于满足这些标准的 pods。

  4. 确认您的 pods 可以使用您在附加到角色的 IAM policy 中分配的权限与 Amazon Web Services 进行交互。

    注意

    当 pod 使用来自与服务账户关联的 IAM 角色的 Amazon 凭证时,该 pod 容器中的 Amazon CLI 或其他开发工具包仅使用该角色提供的凭证。如果您不限制对提供给 Amazon EKS 节点 IAM 角色 的凭证的访问,pod 仍然可以访问这些凭证。有关更多信息,请参阅限制对分配给工作节点的实例配置文件的访问

    如果您的 pods 无法按预期与服务进行交互,请完成以下步骤以确认所有配置都正确。

    1. 确认您的容器组(pod)使用支持通过 OpenID Connect Web 身份令牌文件代入 IAM 角色的 Amazon 开发工具包版本。有关更多信息,请参阅使用支持的 Amazon 开发工具包

    2. 确认部署正在使用服务账户。

      kubectl describe deployment my-app | grep "Service Account"

      输出示例如下。

      Service Account: my-service-account
    3. 如果您的 pods 仍然无法访问服务,请查看 配置 Kubernetes 服务账户以代入 IAM 角色 中描述的步骤,以确认您的角色和服务账户的配置都正确。