使用 EKS Pod 身份简化 Amazon EKS 插件的 IAM 权限

作者: pmm |

本博客由亚马逊云科技高级产品经理 Sriram Ranganathan 和亚马逊云科技首席解决方案架构师 Vikram Venkataram 撰写。

导言

作为亚马逊云科技 re:Invent 2023 的一部分,Amazon Elastic Kubernetes Service (Amazon EKS) 推出了 Amazon EKS Pod Identity,简化了将 Amazon Identity and Access Management (IAM) 权限应用于 Kubernetes 集群工作负载的方式。一些 EKS 插件支持联网、存储和计算等关键集群功能,需要与底层亚马逊云科技服务进行交互。EKS Pod 身份有助于向 EKS 插件注入 IAM 权限,使插件能够与底层亚马逊云科技服务进行交互。

EKS 附加容器利用亚马逊云科技开发工具包使用 IAM 权限向亚马逊云科技服务发出 API 请求。插件必须使用亚马逊云科技证书签署其亚马逊云科技 API 请求。每个 EKS Pod 身份关联都会将一个角色链接到特定集群命名空间中的服务帐号。EKS 插件利用 Kubernetes 服务账户获取 IAM 权限。当插件 pod 使用具有关联的服务帐号时,EKS 会在 pod 的容器中设置环境变量。这些变量将亚马逊云科技开发工具包配置为在与亚马逊云科技服务交互时使用 EKS Pod 身份证书。

现在,您可以通过单个操作直接通过 EKS 为插件提供 EKS Pod 身份关联,无需单独管理插件和 Pod 身份。此功能允许您在初始集群创建期间为插件指定 EKS Pod Identity 权限,从而简化为集群组件设置访问控制的过程。这种方法使您可以更轻松地向 EKS 插件应用权限。有关支持的插件,请参阅 EKS 用户指南。

功能概述

EKS 插件 API 引入了新的 PodiDentityAssociations 参数,使您能够实现更精细的 IAM 角色到服务账户的映射。此功能使插件可以关联多个服务账户,每个账户都具有精确定义的 IAM 权限。通过利用此功能,客户可以实现最小权限原则,这样每个服务帐号只能获得其特定操作要求所需的最低权限。

podIdentityAssociations 参数可通过亚马逊云科技命令行接口 (亚马逊云科技 CLI) 命令访问 aws eks create-addonaws eks update-addon,为在插件管理期间配置服务账户权限提供了一种简化的方法。

示例创建插件工作流程

为了演示新的 PodiDentityAssociations 参数的实际应用,可以考虑一个涉及运行 Kubernetes 版本 1.30 的现有 EKS 集群的场景。使用 CLI 向集群添加 Amazon VPC CNI (vpc-cni) 插件时,客户需要将特定的 IAM 角色与该插件的服务账户关联起来。

为插件确定适当的 IAM 权限是第一步。客户可以利用两个关键的 Amazon EKS API 操作来确定必要的权限和服务账户配置:

  • DescribeAddonVersions API: 此操作提供有关可用插件版本以及该插件是否需要 IAM 权限的信息。
  • DescribeAddonConfiguration API: 此 API 可帮助客户了解该插件的特定服务帐号和相关权限需求。

通过组合这些 API 调用,您可以精确地将 IAM 权限映射到正确的服务账户,以实现 EKS 插件的优秀配置和最低的权限访问权限。

第一步使用 describe-addon-versions CLI 命令从 Amazon EKS API 中检索 Kubernetes 1.30 的默认 vpc-cni 版本。通过检查 requiresIamPermissions 参数,您可以快速确定所选插件是否需要 IAM 权限。

aws eks describe-addon-versions \
   --addon-name vpc-cni \
   --kubernetes-version 1.30 \
   --query 'addons[].{
     AddonName: addonName,
     Versions: addonVersions[?compatibilities[].defaultVersion|contains(@, `true`)].{
       AddonVersion: addonVersion,
       KubernetesVersion: compatibilities[0].clusterVersion,
       RequiresIamPermissions: requiresIamPermissions
     }
   }' \
 
JSON

输出如下所示:

+——————————————————————————+
| 插件名称 |
+————————————————+
| vpc-cni |
+——————————————————+
|| 插件版本 | KubernetesVersion | requiresIamPermissions ||
|+——————————+———————————+|
| v1.19.0-eksbuild.1 | 1.30 | True ||
+————————————+————————+

请注意,该 requiresIamPermissions 标志设置为 True,表示插件的服务账户需要特定的 IAM 权限。要确定服务帐号及其所需权限,客户可以利用 DescribeAddonConfiguration API。

aws eks describe-addon-configuration \
  --addon-name vpc-cni \
  --addon-version v1.19.0-eksbuild.1 \
  --query '{
    addonName: addonName,
    addonVersion: addonVersion,
    podIdentityConfiguration: podIdentityConfiguration
  }' \
  --output json | jq '.'
JSON

此 API 调用返回为插件的服务账户推荐的特定 IAM 权限。

{
  "addonName": "vpc-cni",
  "addonVersion": "v1.19.0-eksbuild.1",
  "podIdentityConfiguration": [
    {
      "serviceAccount": "aws-node",
      "recommendedManagedPolicies": [
        "arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy"
      ]
    }
  ]
}
JSON

从上面的输出来看,vpc-cni 插件需要在 AmazonEKS_CNI_Policy 亚马逊云科技托管策略中定义的权限,这些权限应应用于 aws-node 服务账户。在本演练中,已经基于 EKS Pod 身份规范创建了具有推荐权限的 IAM 角色 AmazonEKSPodIdentityAmazonVPCCNIRole。要查看信任策略和附加到角色的亚马逊云科技托管策略,请使用以下命令。

aws iam list-attached-role-policies \
  --role-name AmazonEKSPodIdentityAmazonVPCCNIRole \
  --query 'AttachedPolicies[].PolicyArn' \
  --output json
  
[
    "arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy"
]


aws iam get-role \
  --role-name AmazonEKSPodIdentityAmazonVPCCNIRole \
  --query 'Role.AssumeRolePolicyDocument' \
  --output json | jq '.'
  

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "pods.eks.amazonaws.com"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ]
    }
  ]
}


aws iam get-role \
  --role-name AmazonEKSPodIdentityAmazonVPCCNIRole \
  --query 'Role.Arn' \                       
  --output json | jq '.'
  
"arn:aws:iam::123456789012:role/AmazonEKSPodIdentityAmazonVPCCNIRole"
JSON

现在我们知道了 vpc-cni 插件所需的权限以及应应用这些权限的服务帐号,您可以通过传递 podIdentityAssociations 参数来创建插件,该参数将先前创建的角色映射到 vpc-cni 插件的 aws-node 服务帐号。

aws eks create-addon \
  --cluster-name demo \
  --addon-name vpc-cni \
  --addon-version v1.19.0-eksbuild.1 \
  --pod-identity-associations '[{
    "serviceAccount": "aws-node",
    "roleArn": "arn:aws:iam::123456789012:role/AmazonEKSPodIdentityAmazonVPCCNIRole"
  }]'
  

{
    "addon": {
        "addonName": "vpc-cni",
        "clusterName": "demo",
        "status": "CREATING",
        "addonVersion": "v1.19.0-eksbuild.1",
        "health": {
            "issues": []
        },
        "addonArn": "arn:aws:eks:us-east-2:123456789012:addon/demo/vpc-cni/e0c9a2b7-0df2-5ab5-60ee-6871ee9237a5",
        "createdAt": "2024-11-19T17:17:44.916000+00:00",
        "modifiedAt": "2024-11-19T17:17:44.936000+00:00",
        "tags": {},
        "podIdentityAssociations": [
            "arn:aws:eks:us-east-2:123456789012:podidentityassociation/demo/a-5ygeq7y6kw0aw8lmk"
        ]
    }
}
JSON

安装插件后,您可以验证所有 Pod 是否已启动并正在运行,以及该插件是否获得了 IAM 权限。要确认证书,请查找 AWS_CONTAINER_CREDENTIALS_FULL_URI 和 AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE 环境变量。要了解有关 EKS Pod Identity 的凭证机制的更多信息,您可以查看此博客。

kubectl get pods -n kube-system -l k8s-app=aws-node
JSON
NAME             READY   STATUS    RESTARTS   AGE
aws-node-q5jjb   2/2     Running   0          6m19s
aws-node-x5ks6   2/2     Running   0          6m19s
JSON

让我们对 pod 对象做个描述:

kubectl describe pods -n kube-system -l k8s-app=aws-node
Name:                 aws-node-q5jjb
Namespace:            kube-system
Labels:               app.kubernetes.io/instance=aws-vpc-cni
                      app.kubernetes.io/name=aws-node
                      controller-revision-hash=7995674748
                      k8s-app=aws-node
                      pod-template-generation=1
...
Init Containers:
...
    Environment:
      ...
      AWS_CONTAINER_CREDENTIALS_FULL_URI:      http://169.254.170.23/v1/credentials
      AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE:  /var/run/secrets/pods.eks.amazonaws.com/serviceaccount/eks-pod-identity-token
    Mounts:
      /host/opt/cni/bin from cni-bin-dir (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-whv85 (ro)
      /var/run/secrets/pods.eks.amazonaws.com/serviceaccount from eks-pod-identity-token (ro)
      
...
JSON

Pod 身份关联可以随时应用于插件。如果您已经在没有推荐的 IAM 权限的情况下创建了 vpc-cni 插件,则可以随时使用 update-addon CLI 命令在创建插件后应用这些权限。

使用 EKS 控制台创建集群的工作流程示例

IAM 服务账户角色 (IRSA) 允许您将 IAM 角色与 Kubernetes 服务账户关联起来。这有助于你通过只给 pod 所需的权限来实现最小权限原则。设置 IRSA 要求你首先创建 EKS 集群,然后提取其唯一的 OpenID Connect (OIDC) 提供商网址。此 URL 是创建 OIDC 提供商所必需的,该提供商将生成配置 IAM 角色的信任策略所需的特定亚马逊资源名称 (ARN)。这种顺序的工作流程意味着插件的 IAM 证书只能在创建集群后才能应用。

EKS Pod Identity 代表了该工作流程的重大改进。通过消除对 OIDC 提供商的依赖,该解决方案允许更直接的 IAM 权限分配。作为集群创建工作流程的一部分,您现在可以将 IAM 权限应用于插件的服务账户。在应用插件所需的权限之前,您不再需要等待集群创建。这种简化的方法简化了配置插件访问权限的过程,提高了集群部署的整体效率和安全性。

让我们看看实际情况。现在,您可以选择所需的插件作为集群创建的一部分,并轻松应用现有 IAM 角色。

图 1:控制台中选定的 EKS 插件

图 1:控制台中选定的 EKS 插件

选择插件并导航到配置选择插件设置页面后,您将看到任何需要 IAM 权限的插件的插件访问权限部分。您可以从下拉列表中选择可用的 IAM 角色,也可以使用创建推荐角色按钮创建一个。

图 2:为插件配置 EKS Pod 身份

图 2:为插件配置 EKS Pod 身份

单击 "创建推荐角色" 按钮将在单独的浏览器选项卡中启动 IAM 控制台,其中会自动预填创建角色所需的所有信息。这包括亚马逊云科技托管策略、信任策略、角色名称和描述。

图 3:选择 EKS Pod Identity 作为可信实体

图 3:选择 EKS Pod Identity 作为可信实体

图 4:为角色添加权限

图 4:为角色添加权限

图 5:已完成角色的权限

图 5:已完成角色的权限

您可以查看信息,然后单击 "创建角色"。保留默认角色名称将使 EKS 能够在将相应的插件添加到同一账户中的其他集群时自动使用该角色。覆盖角色名称将需要客户从下拉列表中手动选择角色。

图 6:EKS 插件配置

图 6:EKS 插件配置

继续查看并创建步骤并创建集群。集群激活后,您将在插件选项卡中看到已安装的插件列表以及 EKS Pod Identity。

图 7:控制台中已安装插件的视图

图 7:控制台中已安装插件的视图

结论

EKS 插件和 EKS Pod Identity 之间的集成简化了 IAM 权限管理,为插件配置服务账户权限提供了一种更加简化和安全的方法。通过使您能够在集群创建期间或随后的任何时候轻松发现和应用特定权限,这种集成消除了以前与插件访问管理相关的复杂性,即无法将 Pod 身份应用于集群创建期间选择的插件。

现在,您可以在单个插件中将不同的权限应用于不同的服务帐号,从而可以更有效地实现最小权限原则。这种方法不仅通过最大限度地降低潜在访问风险来增强安全性,还可以使用推荐的 IAM 权限简化插件部署工作流程。随着 Kubernetes 生态系统的复杂性不断增加,EKS 插件和 Pod Identity 集成提供了一个强大的解决方案,平衡了安全性、灵活性和易管理性,为管理 Kubernetes 集群中的附加权限提供了简化的解决方案。

接下来的步骤

试一试 Amazon EKS 插件的简化 IAM 权限!

准备好简化您的 Kubernetes 集群管理了吗?借助 EKS Pod 身份,您现在可以毫不费力地为 EKS 插件配置 IAM 权限。告别复杂的手动角色配置,向更直观的方法问好。只需点击几下,您就可以更简化地管理集群插件的 IAM 权限。

查看我们的容器路线图!

如果您对我们如何改进 Amazon EKS 插件或容器服务的其他方面有想法,请使用容器路线图向我们提供反馈并查看我们现有的路线图项目。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。