我在 Amazon Elastic Kubernetes Service(Amazon EKS)中使用服务账户的 AWS Identity and Access Management(IAM)角色(IRSA)时收到错误。
解决方法
检查 IAM ARN 的格式
如果您在服务账户注释中设置的 IAM ARN 的格式不正确,则会收到以下错误:
“An error occurred (ValidationError) when calling the AssumeRoleWithWebIdentity
operation: Request ARN is invalid”
以下是格式不正确的 ARN 的示例:
eks.amazonaws.com/role-arn: arn:aws:iam::::1234567890:role/example
由于这个 ARN 有多余的冒号(:),所以这个 ARN 的错误格式会导致错误消息。要验证 ARN 格式是否正确,请参阅 IAM ARN。
检查您的 AWS 账户是否有 IAM OIDC 提供商
如果没有创建 OpenID Connect(OIDC)提供商,则您会收到以下错误:
“An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: No OpenIDConnect provider found in your account for https://oidc.eks.region.amazonaws.com/id/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”
要解决此错误,请获取 IAM OIDC 提供商 URL:
aws eks describe-cluster --name cluster name --query "cluster.identity.oidc.issuer" --output text
**注意:**将 cluster name 替换为您的集群名称。
输出结果类似于以下示例:
https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
要列出 IAM OIDC 提供商,请运行以下命令:
aws iam list-open-id-connect-providers | grep EXAMPLED539D4633E53DE1B716D3041E
**注意:**将 EXAMPLED539D4633E53DE1B716D3041E 替换为 IAM OIDC 提供商的 URL。
如果 OIDC 提供商不存在,请运行以下 eksctl 命令以创建一个 OIDC 提供商:
eksctl utils associate-iam-oidc-provider --cluster cluster name --approve
**注意:**将 cluster name 替换为您的集群名称。
您也可以使用 AWS 管理控制台为您的集群创建 IAM OIDC 提供商。
验证 IAM OIDC 提供商的受众
当您创建 IAM OIDC 提供商时,必须使用 sts.amazonaws.com 作为受众。如果受众不正确,则您会收到以下错误:
“An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience”
要查看 IAM OIDC 提供商的受众,请运行以下命令:
aws iam get-open-id-connect-provider --open-id-connect-provider-arn ARN-of-OIDC-provider
**注意:**将 ARN-of-OIDC-provider 替换为您的 OIDC 提供商的 ARN。
在 ClientIDList 参数下,输出必须显示 sts.amazonaws.com。要使用 Amazon EKS 控制台查看受众,请完成以下步骤:
- 打开 Amazon EKS 控制台。
- 选择集群的名称,然后选择概览选项卡。
- 在详细信息部分中,记下 OIDC 提供商 URL 的值。
- 打开 IAM 控制台。
- 在导航窗格中的访问管理下,选择身份提供商。
- 选择与您的集群 URL 匹配的提供商。
要更改受众,请完成以下步骤:
- 打开 IAM 控制台。
- 在导航窗格中的访问管理下,选择身份提供商。
- 选择与您的集群 URL 匹配的提供商。
- 选择操作,然后选择添加受众。
- 添加 sts.amazonaws.com。
验证您是否使用根证书指纹创建了 IAM OIDC 资源
如果没有使用根证书指纹创建 OIDC 提供商,则您会收到以下错误:
“An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint”
**注意:**非根证书指纹每年更新一次。根证书指纹每十年更新一次。最佳实践是在创建 IAM OIDC 时使用根证书指纹。
例如,您使用以下其中一项服务创建了 IAM OIDC:
- AWS 命令行界面(AWS CLI)
- AWS Tools for PowerShell
- IAM API
在这种情况下,您必须手动获取指纹。如果您在 IAM 控制台中创建了 IAM OIDC,则最佳实践是手动获取指纹。使用此指纹验证控制台是否已获取正确的 IAM OIDC。
要查找根证书指纹和到期日期,请运行以下命令:
echo | openssl s_client -servername oidc.eks.your-region-code.amazonaws.com -showcerts -connect oidc.eks.your-region-code.amazonaws.com:443 2>/dev/null | awk '/-----BEGIN CERTIFICATE-----/{cert=""} {cert=cert $0 "\n"} /-----END CERTIFICATE-----/{last_cert=cert} END{printf "%s", last_cert}' | openssl x509 -fingerprint -noout -dates | sed 's/://g' | awk -F= '{print tolower($2)}'
**注意:**将 your-region-code 替换为您的集群所在的 AWS 区域。
输出示例:
9e99a48a9960b14926bb7f3b02e22da2b0ab7280 sep 2 000000 2009 gmt jun 28 173916 2034 gmt
在上述输出中,9e99a48a9960b14926bb7f3b02e22da2b0ab7280 是指纹,sep 2 000000 2009 gmt 是证书开始日期,jun 28 173916 2034 是证书到期日期。
检查 IAM 角色的信任策略的配置
如果 IAM 角色的信任策略配置错误,则您会收到以下错误:
“An error occurred (AccessDenied) when calling the AssumeRoleWithWebIdentity operation: Not authorized to perform sts:AssumeRoleWithWebIdentity”
要解决此问题,请确保您使用的是正确的 IAM OIDC 提供商。如果 IAM OIDC 提供商正确,则查看 IAM 角色以检查信任策略的条件配置是否正确。
验证您的容器组身份 webhook 配置是否存在且有效
容器组身份 webhook 注入了必要的环境变量和预计卷。如果您意外删除或更改了 webhook 配置,则 IRSA 会停止工作。
要验证您的 webhook 配置是否存在且有效,请运行下面的命令:
kubectl get mutatingwebhookconfiguration pod-identity-webhook -o yaml
如果 pod-identity-webhook 配置不存在,请运行下面的命令来创建它:
CLUSTER_CA=$(aws eks describe-cluster --name CLUSTER_NAME --region REGION_CODE --query 'cluster.certificateAuthority.data' --output text);
cat << EOF | kubectl apply -f -
apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
name: pod-identity-webhook
webhooks:
- name: iam-for-pods.amazonaws.com
clientConfig:
url: "https://127.0.0.1:23443/mutate"
caBundle: $CLUSTER_CA
failurePolicy: Ignore
rules:
- operations: [ "CREATE" ]
apiGroups: [""]
apiVersions: ["v1"]
resources: ["pods"]
scope: "*"
reinvocationPolicy: IfNeeded
sideEffects: None
admissionReviewVersions: ["v1beta1"]
EOF
**注意:**将 CLUSTER_NAME 替换为您的集群名称,并将 REGION_CODE 替换为集群区域。
验证您的容器组身份 webhook 是否向使用 IRSA 的容器组注入了环境变量
要验证您的容器组身份 webook 是否向使用 IRSA 的容器组(pod)注入了环境变量,请运行以下命令之一:
kubectl get pod <pod-name> -n <ns> -o yaml | grep aws-iam-token
-或-
kubectl get pod <pod-name> -n <ns> -o yaml | grep AWS_WEB_IDENTITY_TOKEN_FILE
验证您是否使用支持的 AWS SDK
查看您的 AWS SDK。确保您使用的 AWS SDK 版本允许您通过 OIDC 网站身份令牌文件代入 IAM 角色。
相关信息
为什么不能在我的 Amazon EKS 容器组中使用服务账户的 IAM 角色?
如何排查 Amazon EKS 中的 OIDC 提供程序和 IRSA 问题?