0

我有一个服务帐户,我试图在安装在同一命名空间中的多个 pod 中使用它。

其中一个 pod 是由 Airflow KubernetesPodOperator 创建的。另一个是通过 Helm 通过 Kubernetes 部署创建的。

在 Airflow 部署中,我看到分配了 IAM 角色并创建、列出了 DynamoDB 表等,但是在第二个掌舵图部署(或)在测试 pod 中(按此处所示创建),我在 DynamoDB 中不断收到AccessDenied错误消息。CreateTable

我可以看到 AWS 角色 ARN 被分配给服务账户,服务账户被应用到 pod 并且相应的令牌文件也被创建,但我看到了AccessDenied异常。

arn:aws:sts::1234567890:assumed-role/MyCustomRole/aws-sdk-java-1636152310195 is not authorized to perform: dynamodb:CreateTable on resource

服务帐户

Name:                mypipeline-service-account
Namespace:           abc-qa-daemons
Labels:              app.kubernetes.io/managed-by=Helm
                     chart=abc-pipeline-main.651
                     heritage=Helm
                     release=ab-qa-pipeline
                     tier=mypipeline
Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::1234567890:role/MyCustomRole
                     meta.helm.sh/release-name: ab-qa-pipeline
                     meta.helm.sh/release-namespace: abc-qa-daemons
Image pull secrets:  <none>
Mountable secrets:   mypipeline-service-account-token-6gm5b
Tokens:              mypipeline-service-account-token-6gm5b

PS:使用KubernetesPodOperator和通过 Helm 图表部署创建的客户端代码都是相同的,即相同的 docker 映像。其他属性,如nodeSelectortolerations,卷挂载也是相同的。

它们的describe pod输出是相似的,只是名称和标签发生了一些变化。KubernetesPodOperatorpod 具有 QoS 类,而BurstableHelm 图表是BestEffort.

为什么我进入AccessDeniedHelm 部署但没有进入KubernetesPodOperator?如何调试这个问题?

4

1 回答 1

1

每当我们遇到AccessDenied异常时,可能有两个可能的原因:

  1. 您分配了错误的角色
  2. 分配的角色没有必要的权限

就我而言,后者是问题所在。分配给特定角色的权限可以是复杂的,即它们可以更细化。

例如,在我的例子中,角色可以创建/描述的 DynamoDB 表仅限于那些以特定前缀开头的表,而不是所有 DynamoDB 表。

因此,始终建议您在收到此错误时检查 IAM 角色权限。

如问题所述,请务必使用awscli图像检查服务帐户。


请记住,AWS SDK 中使用了一个凭证提供程序链,它决定了应用程序要使用的凭证。在大多数情况下,DefaultAWSCredentialsProviderChain使用 ,其顺序如下所示。确保 SDK 选择了预期的提供者(在我们的例子中是WebIdentityTokenCredentialsProvider

 super(new EnvironmentVariableCredentialsProvider(),
              new SystemPropertiesCredentialsProvider(),
              new ProfileCredentialsProvider(),
              WebIdentityTokenCredentialsProvider.create(),
              new EC2ContainerCredentialsProviderWrapper());

此外,您可能还希望在记录器中将 AWS 开发工具包类设置为 DEBUG 模式,以查看选择了哪个凭证提供程序以及原因。


要检查服务帐户是否应用于 pod,请对其进行描述并检查 AWS 环境变量是否设置为它,例如AWS_REGION、和。AWS_DEFAULT_REGIONAWS_ROLE_ARNAWS_WEB_IDENTITY_TOKEN_FILE

eks.amazonaws.com/role-arn如果没有,则通过描述该服务帐户来检查您的服务帐户是否具有 AWS 注释。

于 2021-11-12T11:02:13.083 回答