如何排查 Amazon EKS 中的 IRSA 错误?

3 分钟阅读
0

我在 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 控制台查看受众,请完成以下步骤:

  1. 打开 Amazon EKS 控制台
  2. 选择集群的名称,然后选择概览选项卡。
  3. 详细信息部分中,记下 OIDC 提供商 URL 的值。
  4. 打开 IAM 控制台
  5. 在导航窗格中的访问管理下,选择身份提供商
  6. 选择与您的集群 URL 匹配的提供商

要更改受众,请完成以下步骤:

  1. 打开 IAM 控制台
  2. 在导航窗格中的访问管理下,选择身份提供商
  3. 选择与您的集群 URL 匹配的提供商
  4. 选择操作,然后选择添加受众
  5. 添加 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 问题?

AWS 官方
AWS 官方已更新 2 个月前