如何排查 Amazon EKS 中的 OIDC 提供商和 IRSA 问题?

4 分钟阅读
0

我的容器组(pod)无法使用 Amazon Elastic Kubernetes Service(Amazon EKS)账户令牌的 AWS 身份和 Access Management(IAM)角色权限。

解决方案

检查您的集群是否已有 IAM OIDC 提供商

如果提供商已经存在,则您会收到类似以下内容的错误: “WebIdentityErr: failed to retrieve credentials\ncaused by: InvalidIdentityToken: No OpenIDConnect provider found in your account for https://oidc.eks.eu-west-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E\n\tstatus code: 400”;

要检查您是否有 IAM OIDC 提供商,请完成以下步骤:

  1. 检查您的集群的 OIDC 提供商 URL:

    $ aws eks describe-cluster --name cluster_name --query "cluster.identity.oidc.issuer" --output text

    输出示例:

    https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
  2. 列出您账户中的 IAM OIDC 提供商。请将 EXAMPLED539D4633E53DE1B716D3041E 替换为上一个命令返回的值:

    aws iam list-open-id-connect-providers | grep EXAMPLED539D4633E53DE1B716D3041E

    输出示例:

    "Arn": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"

如果该命令返回输出,则说明您的集群已经有了提供商。如果命令未返回输出,则必须创建 IAM OIDC 提供商

检查您的 IAM 角色是否具有所需的权限和附加的 IAM 政策

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

要检查您的 IAM 角色是否具有所需的权限,请完成以下步骤:

  1. 打开 IAM 控制台
  2. 在导航窗格中,选择角色
  3. 选择要验证的角色。
  4. 权限选项卡下,验证所需的策略是否已附加到角色。
  5. 验证 IAM 角色信任关系的设置是否正确。

要检查您的 IAM 角色是否附带了策略,请完成以下步骤:

  1. 打开 IAM 控制台

  2. 在导航窗格中,选择角色

  3. 选择要检查的角色

  4. 选择信任关系选项卡。验证您的策略的格式是否与以下 JSON 策略的格式相匹配:

    {  "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME",
              "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com"
            }
          }
        }
      ]
    }

    要验证信任关系,请在 AWS 命令行界面(AWS CLI)中运行 get-role 命令:

    $ aws iam get-role --role-name EKS-IRSA

    **注意:**将 **EKS-IRSA **替换为您的 IAM 角色名称。
    在输出 JSON 中,查找 **AssumeRolePolicyDocument **部分。
    输出示例:

    {  "Role": {
        "Path": "/",
        "RoleName": "EKS-IRSA",
        "RoleId": "AROAQ55NEXAMPLELOEISVX",
        "Arn": "arn:aws:iam::ACCOUNT_ID:role/EKS-IRSA",
        "CreateDate": "2021-04-22T06:39:21+00:00",
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"
              },
              "Action": "sts:AssumeRoleWithWebIdentity",
              "Condition": {
                "StringEquals": {
                  "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com",
                  "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME"
                }
              }
            }
          ]
        },
        "MaxSessionDuration": 3600,
        "RoleLastUsed": {
          "LastUsedDate": "2021-04-22T07:01:15+00:00",
          "Region": "AWS_REGION"
        }
      }
    }

    **注意:**根据您的用例,更新 AWS 区域、Kubernetes 服务账户名称和 Kubernetes 命名空间。

检查您是否创建了服务账号

运行以下命令:

$ kubectl get sa -n YOUR_NAMESPACE

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

输出示例:

NAME      SECRETS   AGEdefault   1         28d
irsa      1         66m

如果您没有服务账号,那么请参阅 Kubernetes 网站上的 Configure service accounts for pods

验证服务账户的 IAM 角色注释是否正确

要验证您的服务账户是否具有正确的 IAM 角色注释,请运行以下命令:

$ kubectl describe sa irsa -n YOUR_NAMESPACE

**注意:**将 irsa 替换为您的 Kubernetes 服务账户名,将 YOUR_NAMESPACE 替换为您的Kubernetes 命名空间。

输出示例:

Name:                irsaNamespace:           default
Labels:              none
Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME
Image pull secrets:  none
Mountable secrets:   irsa-token-v5rtc
Tokens:              irsa-token-v5rtc
Events:              none

验证您在容器组(pod)中是否正确指定了 serviceAccountName

要验证 serviceAccountName,请运行以下命令:

$ kubectl get pod POD_NAME  -o yaml -n YOUR_NAMESPACE| grep -i serviceAccountName:

**注意:**将 POD_NAMEYOUR\ _NAMESPACE 替换为您的 Kubernetes 容器组(pod)和命名空间。

输出示例:

serviceAccountName: irsa

检查环境变量和权限

在容器组(pod)的环境变量中查找 AWS_ROLE_ARNAWS_WEB_IDENTITY_TOKEN_FILE

$ kubectl -n YOUR_NAMESPACE exec -it POD_NAME -- env | grep AWS

输出示例:

AWS_REGION=ap-southeast-2AWS_ROLE_ARN=arn:aws:iam::111122223333:role/EKS-IRSA
AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
AWS_DEFAULT_REGION=ap-southeast-2

验证应用程序使用支持的 AWS 开发工具包

软件开发包的版本必须大于或等于以下值:

Java (Version 2) — 2.10.11Java — 1.11.704
Go — 1.23.13
Python (Boto3) — 1.9.220
Python (botocore) — 1.12.200
AWS CLI — 1.16.232
Node — 3.15.0
Ruby — 2.11.345
C++ — 1.7.174
.NET — 3.3.659.1
PHP — 3.110.7

要查看支持的最新软件开发包版本,请参阅 Using a supported AWS SDK

重新创建容器组(pod)

如果您在应用 IRSA 之前创建了容器组(pod),则运行以下命令来重新创建容器组(pod):

$ kubectl rollout restart deploy nginx

输出示例:

deployment.apps/nginx restarted

对于进程守护程序或 StatefulSets 部署,运行以下命令:

$ kubectl rollout restart deploy DEPLOYMENT_NAME

如果您只创建了一个容器组(pod),则必须删除该容器并重新创建它:

  1. 运行以下命令删除容器组(pod):
    $ kubectl delete pod POD_NAME
    **注意:**请将 POD_NAME> 替换为您的容器组(pod)的名称。
  2. 运行以下命令来重新创建容器组(pod):
    $ kubectl apply -f SPEC_FILE
    **注意:**将 SPEC_FILE 替换为您的 Kubernetes 清单文件路径和文件名。

确认受众是正确的

如果您创建的 OIDC 提供商的受众不正确,则会收到以下错误: “Error - An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience”

检查您的集群的 IAM 身份提供商。你的 ClientIDListsts.amazonaws.com

$ aws iam get-open-id-connect-provider --open-id-connect-provider-arn arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E

输出示例:

{  "Url": "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E",
  "ClientIDList": [
    "sts.amazonaws.com"
  ],
  "ThumbprintList": [
    "9e99a48a9960b14926bb7f3b02e22da2b0ab7280"
  ],
  "CreateDate": "2021-01-21T04:29:09.788000+00:00",
  "Tags": []
}

验证您是否配置了正确的指纹

如果在 IAM OIDC 中配置的指纹不正确,则您会收到以下错误:“failed to retrieve credentials caused by: InvalidIdentityToken: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint”。

要自动配置正确的指纹,请使用 ** eksctl** 或 AWS 管理控制台创建 IAM 身份提供商。有关获取指纹的其他方法,请参阅获取 OpenID Connect 身份提供商的指纹。

对于 AWS 中国区域,请检查 AWS_DEFAULT_REGION 环境变量

对于部署到 AWS 中国区域集群的 应用 IRSA 容器组(pod)或进程守护程序,请在容器组(pod)规范中设置 AWS_DEFAULT_REGION 环境变量。如果您不设置这个变量,那么容器组(pod)或进程守护程序可能会收到以下错误:“An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation: The security token included in the request is invalid”。

要将 AWS_DEFAULT_REGION 环境变量添加到您的容器组(pod)或进程守护程序规范中,请运行与以下示例类似的命令:

apiVersion: apps/v1kind: Deployment
metadata:
  name: my-app
spec:
  template:
    metadata:
      labels:
        app: my-app
    spec:
      serviceAccountName: my-app
      containers:
      - name: my-app
        image: my-app:latest
        env:
        - name: AWS_DEFAULT_REGION
          value: "AWS_REGION"
...
AWS 官方
AWS 官方已更新 1 年前