配置 Pods 以使用 Kubernetes 服务账户 - Amazon EKS

配置 Pods 以使用 Kubernetes 服务账户

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

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

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

  • 与 IAM 角色关联的现有 Kubernetes 服务账户。必须使用 IAM 角色的 Amazon 资源名称(ARN)注释服务账户。该角色必须具有关联的 IAM 策略,其中包含您希望您的 Pods 必须具有的权限,以便使用 AWS 服务。有关如何创建和配置服务账户和角色的更多信息,请参阅 为 Kubernetes 服务账户分配 IAM 角色

  • 在您的设备或 AWS CloudShell 上安装和配置 AWS 命令行界面(AWS CLI)的版本 2.12.3 或更高版本,或版本 1.27.160 或更高版本。要查看当前版本,请使用 aws --version | cut -d / -f2 | cut -d ' ' -f1。软件包管理器(如 yumapt-get 或适用于 macOS 的 Homebrew)通常比 AWS CLI 的最新版本落后几个版本。要安装最新版本,请参阅《AWS 命令行界面用户指南》中的安装使用 aws configure 快速配置。AWS CloudShell 中安装的 AWS CLI 版本也可能比最新版本落后几个版本。要对其进行更新,请参阅《AWS CloudShell 用户指南》中的将 AWS CLI 安装到您的主目录

  • 您的设备或 AWS CloudShell 上安装了 kubectl 命令行工具。该版本可以与集群的 Kubernetes 版本相同,或者最多早于或晚于该版本一个次要版本。例如,如果您的集群版本为 1.29,则可以将 kubectl1.281.291.30 版本与之配合使用。要安装或升级 kubectl,请参阅 设置 kubectl 和 eksctl

  • 包含集群配置的现有 kubectl config 文件。要创建 kubectl config 文件,请参阅 通过创建 kubeconfig 文件将 kubectl 连接到 EKS 集群

    1. 使用以下命令创建部署清单,您可以使用该部署清单部署 Pod 以确认配置。将示例值替换为您自己的值。

      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:X.XX 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/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 将之前的环境变量应用于这些 Pods。您的集群无需使用 Webhook 来配置环境变量和令牌文件挂载。您可以手动配置 Pods 以包含这些环境变量。AWS SDK 将 IRSA 与 AWS SDK 结合使用支持的版本首先在凭证链提供商中查找这些环境变量。角色凭证用于满足这些标准的 Pods。

    4. 确认您的Pods可以使用您在附加到角色的 IAM 策略中分配的权限与 AWS 服务进行交互。

      注意

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

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

      1. 确认您的 Pods 使用支持通过 OpenID Connect Web 身份令牌文件分派 IAM 角色的 AWS 开发工具包版本。有关更多信息,请参阅 将 IRSA 与 AWS SDK 结合使用

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

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

        示例输出如下。

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