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

上次更新时间:2021 年 12 月 10 日

当我将服务账户的 IAM 角色 (IRSA) 与 Amazon Elastic Kubernetes Service (Amazon EKS) 配合使用时,经常会出错。

简短描述

要排查 Amazon EKS 中的 IRSA 问题,请完成以下其中一个部分中的步骤:

  • 检查 IAM ARN 的格式
  • 检查您的 AWS 账户是否有 IAM OIDC 提供程序
  • 验证 OIDC 提供程序的受众
  • 验证是否使用根证书指纹创建 OIDC 资源
  • 检查您的 IAM 角色信任策略的配置
  • 验证您的 pod 身份 webhook 配置是否存在且有效
  • 验证您使用的是受支持的 AWS 开发工具包

解决方法

检查 IAM ARN 的格式

如果您的 IAM Amazon Resource Name (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 格式,请参阅 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 提供程序的网址:

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 替换为上一个命令返回的值。

如果 OIDC 提供程序不存在,请使用以下 eksctl 命令创建一个:

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。

– 或者 –

完成以下步骤:

1.    打开 Amazon EKS 控制台

2.    选择集群的名称,然后选择 Configuration(配置)选项卡。

3.    在 Details(详细信息)部分中,记下“OpenID Connect provider URL”(OpenID Connect 提供程序 URL)的值。

4.    打开 IAM 控制台

5.    在导航窗格中的 Access Management(访问管理)下,选择 Identity Providers(身份提供程序)。

6.    选择与集群 URL 匹配的 provider(提供程序)。

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

1.    打开 IAM 控制台

2.    在导航窗格中的 Access Management(访问管理)下,选择 Identity Providers(身份提供程序)。

3.    选择与集群 URL 匹配的 provider(提供程序)。

4.    选择 Actions(操作),然后选择 Add audience(添加受众)。

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 时使用根证书指纹。

如果您使用 AWS Command Line Interface (AWS CLI)、适用于 PowerShell 的 AWS 工具或 IAM API 来创建 IAM OIDC,则必须手动 obtain the thumbprint(获取指纹)。如果您在 IAM 控制台中创建 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>&- | tail -r | sed -n '/-----END CERTIFICATE-----/,/-----BEGIN CERTIFICATE-----/p; /-----BEGIN CERTIFICATE-----/q' | tail -r | 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 角色配置指南检查信任策略的条件是否正确配置。

验证您的 pod 身份 webhook 配置是否存在且有效

如果您不小心删除或更改了 webhook 配置,则 IRSA 将停止工作。

运行以下命令以验证您的 webhook 配置是否存在且有效:

kubectl get mutatingwebhookconfiguration pod-identity-webhook  -o yaml

验证您使用的是受支持的 AWS 开发工具包


这篇文章对您有帮助吗?


您是否需要账单或技术支持?