为什么我不能在我的 Amazon EKS 容器组 (Pod) 中为服务账户使用 IAM 角色?

3 分钟阅读
0

我想为服务账户使用 AWS Identity and Access Management (IAM) 角色。但是,我的 Amazon Elastic Kubernetes Service (Amazon EKS) 容器组 (Pod) 无法代入分配的 IAM 角色。或者,我的容器组 (Pod) 改用分配给 Amazon EKS 节点的默认 IAM 角色。

解决方案

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

确认您的 Amazon EKS 集群有 IAM OIDC 身份提供者

如果还没有,请为您的集群创建 IAM OpenID Connect (OIDC) 提供者。您的集群必须有 OIDC 提供者才能使用 IRSA。

然后,完成以下步骤以验证您是否正确配置了 OIDC 提供者:

  1. 打开 IAM 控制台
  2. 从导航窗格中,选择 Identity providers(身份提供者)。
  3. Provider(提供者)下,识别并记下 OIDC 提供者 URL。
  4. 在单独的选项卡或窗口中,打开 Amazon EKS 控制台
  5. 从导航窗格中,选择 Clusters(集群)。
  6. 选择您的集群,然后选择 Configuration(配置)选项卡。
  7. Details(详细信息)下,检查 OpenID Connect provider URL(OpenID Connect 提供者 URL)的值。验证该值是否与 IAM 控制台中的 OIDC 提供者 URL 相匹配。
  8. 如果 URL 不匹配,则必须创建新的 IAM OIDC 提供者

验证您的 IAM 角色策略和信任策略配置

当您的 IAM 角色不具备所有必需的权限时,将会出现 IAM 问题。或者,如果您使用 AWS 管理控制台或 AWS CLI 创建 IAM 角色,则您的 IAM 角色的信任关系策略可能存在语法错误。

要验证您的 IAM 角色策略并检查信任策略中是否存在语法错误,请完成以下步骤:

  1. 打开 IAM 控制台
  2. 在导航窗格中,选择 Roles(角色),然后选择您的角色。
  3. 选择 Permissions(权限)选项卡,然后验证您是否已将配置所需的所有权限分配给该角色。
  4. 选择 Trust relationships(信任关系)选项卡,然后选择 Edit trust relationship(编辑信任关系)。
  5. 在您的信任关系的策略文档中,验证您的策略格式是否与以下 JSON 策略的格式相匹配:
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::your-account-id:oidc-provider/oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER:sub": "system:serviceaccount:your-namespace:your-service-account",
              "oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER:aud": "sts.amazonaws.com"
            }
          }
        }
      ]
    }
    在您的 JSON 策略中,检查 Federated 属性行和 StringEquals 属性行的格式。对于 Federated,请确认您已正确设置了 AWS 区域代码、AWS 账户 ID 和唯一 OIDC 标识符的格式。对于 StringEquals,请确认您已正确设置了区域代码、OIDC 唯一标识符、Kubernetes 命名空间和 Kubernetes 服务账户名称的格式。
  6. 如果您编辑策略文档以更正格式错误,请选择 Update trust policy(更新信任策略)。

确认您的服务账户存在,且 IAM 角色的 Amazon 资源名称 (ARN) 注释的格式正确

完成以下步骤:

  1. 要确认您的 Kubernetes 服务账户是否存在,请运行以下命令:
    kubectl get serviceaccount YOUR_ACCOUNT_NAME -n YOUR_NAMESPACE -o yaml
    **注意:**请将 YOUR_ACCOUNT_NAME 替换为您的账户名称,将 YOUR_NAMESPACE 替换为您的命名空间。
    如果前面的命令未返回服务账号名称,则创建一个服务账号。有关详细信息,请参阅 Kubernetes 网站上的 Use more than one ServiceAccount(使用多个服务账户)
  2. 确认您的服务账户使用正确的名称。此外,请确认您正确设置了其 role-arn 注释的格式。示例:
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      annotations:
        eks.amazonaws.com/role-arn: arn:aws:iam::012345678912:role/my-example-iam-role
      name: my-example-serviceaccount
      namespace: my-test-namespace

使用测试容器组 (Pod) 验证服务账户是否正常运行

运行测试容器组 (Pod) 以验证服务账户是否正常运行、是否可以挂载环境变量以及是否可以代入指定的 IAM 角色。完成以下步骤:

  1. 创建一个名为 awscli-pod.yaml 的本地 YAML 文件。示例:

    apiVersion: v1
    kind: Pod
    metadata:
      name: awscli
      labels:
        app: awscli
    spec:
      serviceAccountName: YOUR_SERVICE_ACCOUNT
      containers:
      - image: amazon/aws-cli
        command:
          - "sleep"
          - "604800"
        imagePullPolicy: IfNotPresent
        name: awscli
      restartPolicy: Always

    **注意:**请将 YOUR_SERVICE_ACCOUNT 替换为您的 Kubernetes 服务账户名称。

  2. 要从命名空间中的 YAML 文件创建测试容器组 (Pod),请运行以下命令:

    kubectl apply -f ./awscli-pod.yaml -n YOUR_NAMESPACE

    **注意:**请将 YOUR_NAMESPACE 替换为您的命名空间。

  3. 要确认 awscli 容器组 (pod) 是否具有 AWS_ROLE_ARNAWS_WEB_IDENTITY_TOKEN_FILE 环境变量,请运行以下命令:

    kubectl exec -n YOUR_NAMESPACE awscli -- env | grep AWS

    输出示例:

    AWS_ROLE_ARN=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME
    AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
  4. 要确认测试容器组 (Pod) 是否使用正确的 IAM 角色,请运行以下命令:

    kubectl exec -it awscli -n YOUR_NAMESPACE -- aws sts get-caller-identity

    输出示例:

    {    "UserId": "REDACTEDY471234567890:botocore-session-1632772568",
        "Account": "012345678912",
        "Arn": "arn:aws:sts::012345678912:assumed-role/your-iam-role/botocore-session-1632772568"
    }

    记下 Arn 的值。确保 IAM 角色是您希望在容器组 (Pod) 中使用的角色。

  5. 要删除 awscli 容器组 (pod),请运行以下命令:

    kubectl delete -f ./awscli-pod.yaml -n YOUR_NAMESPACE

    **注意:**请将 YOUR_NAMESPACE 替换为您的命名空间。

如果 awscli 容器组 (Pod) 显示正确的 IAM 角色,则表明服务账户的 IAM 角色功能正在按预期运行。前面的步骤确认您已将 IAM 令牌正确挂载到了容器组 (Pod)。如果您的应用程序仍然无法使用 IAM 令牌文件,则应用程序或 SDK 层面可能存在问题。例如,应用程序使用 AWS 凭证的方式可能存在问题,或可能存在不支持的 SDK 版本问题。有关详细信息,请参阅使用默认凭证提供程序链将 IRSA 与 AWS SDK 结合使用

AWS 官方已更新 23 天前