You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何KubernetesPodOperator未使用已配置的IRSA角色?

EKS+Airflow IRSA权限问题排查

问题背景

我使用Terraform模块terraform-aws-modules/eks/aws部署了EKS集群,通过Helm官方Chart部署Airflow,并为Worker Pod的ServiceAccount添加了IRSA注解:

serviceAccount:
  create: true
  name: "airflow-worker"
  annotations:
    eks.amazonaws.com/role-arn: "arn:aws:iam::123456789:role/airflow-worker"

该airflow-worker角色已附加权限策略,可扮演另一角色执行S3操作。通过exec进入BashOperator Pod的Python Shell,能成功完成相关操作;但将程序打包为Docker镜像,通过KubernetesPodOperator调用时,出现权限拒绝错误:

botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the AssumeRole operation: 
User: arn:aws:sts::123456789:assumed-role/core_node_group-eks-node-group-20220726041042973200000001/i-089c64b96cf7878d8 is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::987654321:role/TheOtherRole

查看失败Pod的描述,可见环境变量AWS_ROLE_ARN已设置为arn:aws:iam::123456789:role/airflow-worker,但实际使用的是Terraform自动创建的未知角色。

疑问

  1. 为何使用该自动创建的角色,而非Helm配置的IRSA角色airflow-worker?
  2. 该自动创建的角色是什么?Terraform模块自动生成的角色用途难以从文档知晓。
  3. 为何BashOperator等其他Operator可使用airflow-worker角色,唯独KubernetesPodOperator不行?
  4. AWS_IAM_ROLE环境变量是什么?为何未被使用?

问题解答

1. 为何未使用配置的IRSA角色?

你配置的IRSA仅作用于Airflow Worker自身的Pod(即运行BashOperator的Pod),但KubernetesPodOperator会在集群内创建独立的新Pod执行任务。如果未显式指定ServiceAccount,新Pod默认会使用所在Namespace的默认ServiceAccount,而该账号没有配置IRSA注解,因此AWS SDK会 fallback 到节点的IAM角色(即错误中出现的自动创建角色)。

即使新Pod中存在AWS_ROLE_ARN环境变量,这只是Worker Pod传递过来的,但由于新Pod未绑定对应IRSA的ServiceAccount,IRSA机制未生效,SDK不会使用该变量。

2. 自动创建的角色是什么?

这个core_node_group-eks-node-group-xxx角色是Terraform EKS模块为EKS节点组自动创建的EC2实例角色,用途是让EKS节点能够与AWS API交互,比如拉取容器镜像、向EKS控制面上报节点状态等,仅包含节点运行所需的基础权限,没有你自定义的AssumeRole权限。

3. 为何BashOperator可用,KubernetesPodOperator不行?

  • BashOperator是在Airflow Worker Pod内部执行命令,该Pod已绑定你配置的airflow-worker ServiceAccount,IRSA机制正常生效,因此使用对应的IAM角色权限。
  • KubernetesPodOperator会启动全新的独立Pod,若未显式指定ServiceAccount,新Pod会使用默认ServiceAccount,而默认账号没有IRSA配置,因此会使用节点的实例角色,导致权限不足。

4. AWS_IAM_ROLE环境变量是什么?为何未被使用?

AWS_IAM_ROLE并非IRSA的标准环境变量,可能是自定义或旧版本的变量。IRSA生效的标准变量是AWS_ROLE_ARN和AWS_WEB_IDENTITY_TOKEN_FILE,这两个变量由kubelet在Pod启动时基于ServiceAccount的IRSA注解自动注入。

即使Pod中存在AWS_ROLE_ARN,如果Pod未绑定配置了IRSA注解的ServiceAccount,AWS SDK不会使用该变量,而是按照默认凭证链优先使用节点的实例角色。


内容的提问来源于stack exchange,提问作者user4601931

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 08:54:24