Knowledge Center Monthly Newsletter - March 2025
Stay up to date with the latest from the Knowledge Center. See all new and updated Knowledge Center articles published in the last month and re:Post’s top contributors.
如何排查 Amazon EKS 中的 OIDC 提供商和 IRSA 问题?
我的容器组(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 提供商,请完成以下步骤:
-
检查您的集群的 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
-
列出您账户中的 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 角色是否具有所需的权限,请完成以下步骤:
- 打开 IAM 控制台。
- 在导航窗格中,选择角色。
- 选择要验证的角色。
- 在权限选项卡下,验证所需的策略是否已附加到角色。
- 验证 IAM 角色信任关系的设置是否正确。
要检查您的 IAM 角色是否附带了策略,请完成以下步骤:
-
打开 IAM 控制台。
-
在导航窗格中,选择角色。
-
选择要检查的角色。
-
选择信任关系选项卡。验证您的策略的格式是否与以下 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_NAME 和 YOUR\ _NAMESPACE 替换为您的 Kubernetes 容器组(pod)和命名空间。
输出示例:
serviceAccountName: irsa
检查环境变量和权限
在容器组(pod)的环境变量中查找 AWS_ROLE_ARN 和 AWS_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),则必须删除该容器并重新创建它:
- 运行以下命令删除容器组(pod):
**注意:**请将 POD_NAME> 替换为您的容器组(pod)的名称。$ kubectl delete pod POD_NAME
- 运行以下命令来重新创建容器组(pod):
**注意:**将 SPEC_FILE 替换为您的 Kubernetes 清单文件路径和文件名。$ kubectl apply -f SPEC_FILE
确认受众是正确的
如果您创建的 OIDC 提供商的受众不正确,则会收到以下错误: “Error - An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience”
检查您的集群的 IAM 身份提供商。你的 ClientIDList 是 sts.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 官方已更新 1 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前