配置容器组(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.11.3版或更高版本,或1.27.93版或更高版本的 Amazon CLI。您可以使用aws --version | cut -d / -f2 | cut -d ' ' -f1检查您的当前版本。软件包管理器(如yum、apt-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.24,则可以将kubectl的1.23、1.24或1.25版本与之配合使用。要安装或升级kubectl,请参阅 安装或更新 kubectl。 -
包含集群配置的现有
kubectlconfig文件。要创建kubectlconfig文件,请参阅 为 Amazon EKS 集群创建或更新 kubeconfig 文件。
配置容器组(pod)以使用服务账户
-
使用以下命令创建部署清单,您可以使用该部署清单部署容器组 (pod) 以确认配置。pod 使用现有的 Kubernetes 服务账户。必须正确配置服务账户。有关更多信息,请参阅配置 Kubernetes 服务账户以代入 IAM 角色。将
示例值替换为您自己的值。cat >my-deployment.yaml<<EOF apiVersion: apps/v1 kind: Deployment metadata: name:my-appspec: selector: matchLabels: app:my-apptemplate: metadata: labels: app:my-appspec: serviceAccountName:my-service-accountcontainers: - name:my-appimage:public.ecr.aws/nginx/nginx:1.21EOF -
将清单部署到集群。
kubectl apply -fmy-deployment.yaml -
确认您的 pod 具有所需的环境变量。
-
按上一步部署后,查看部署的 pods。
kubectl get pods | grepmy-app输出示例如下。
my-app-6f4dfff6cb-76cv91/1 Running 0 3m28s -
查看 pod 使用的 IAM 角色的 ARN。
kubectl describe podmy-app-6f4dfff6cb-76cv9| grep AWS_ROLE_ARN:输出示例如下。
AWS_ROLE_ARN: arn:aws:iam::111122223333:role/my-role角色 ARN 必须与您用于注释现有服务账户的角色 ARN 匹配。有注释服务账户的更多信息,请参阅 配置 Kubernetes 服务账户以代入 IAM 角色。
-
确认 pod 具有 Web 身份令牌文件挂载。
kubectl describe podmy-app-6f4dfff6cb-76cv9| grep AWS_WEB_IDENTITY_TOKEN_FILE:输出示例如下。
AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com.cn/serviceaccount/tokenkubelet代表 pod 请求并存储令牌。默认情况下,如果令牌早于其总生存时间的 80%,或者令牌大于 24 小时,则kubelet会刷新令牌。您可以使用 pod 规范中的设置修改任何账户(默认服务账户除外)的过期期限。有关更多信息,请参阅 Kubernetes 文档中的服务账户令牌卷预测。 集群上的 Amazon EKS 容器组(pod)身份 Webhook
监控使用具有以下注释的服务账户的 pods: eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/my-roleWebhook 将之前的环境变量应用于这些容器组(pod)。您的集群无需使用 Webhook 来配置环境变量和令牌文件挂载。您可以手动配置 pods 以包含这些环境变量。Amazon 开发工具包支持的版本首先在凭证链提供商中查找这些环境变量。角色凭证用于满足这些标准的 pods。
-
-
确认您的 pods 可以使用您在附加到角色的 IAM policy 中分配的权限与 Amazon Web Services 进行交互。
注意
当 pod 使用来自与服务账户关联的 IAM 角色的 Amazon 凭证时,该 pod 容器中的 Amazon CLI 或其他开发工具包仅使用该角色提供的凭证。如果您不限制对提供给 Amazon EKS 节点 IAM 角色 的凭证的访问,pod 仍然可以访问这些凭证。有关更多信息,请参阅限制对分配给工作节点的实例配置文件的访问
。 如果您的 pods 无法按预期与服务进行交互,请完成以下步骤以确认所有配置都正确。
-
确认您的容器组(pod)使用支持通过 OpenID Connect Web 身份令牌文件代入 IAM 角色的 Amazon 开发工具包版本。有关更多信息,请参阅使用支持的 Amazon 开发工具包。
-
确认部署正在使用服务账户。
kubectl describe deploymentmy-app| grep "Service Account"输出示例如下。
Service Account:my-service-account -
如果您的 pods 仍然无法访问服务,请查看 配置 Kubernetes 服务账户以代入 IAM 角色 中描述的步骤,以确认您的角色和服务账户的配置都正确。
-