Composer中KubernetesPodOperator在default命名空间报403禁止错误
问题拆解
从报错日志能直接看出两个核心问题:
- K8s权限不足:你使用的ServiceAccount
system:serviceaccount:composer-1-20-12-airflow-2-4-3-a5161aba:default在default命名空间下没有pods资源的list权限,导致KubernetesPodOperator无法正常创建、管理Pod。 - 任务逻辑偏差:你的目标是运行R脚本,但当前
KubernetesPodOperator仅执行了echo命令,未实际运行R代码;而BashOperator依赖Airflow Worker节点安装R环境,但GCP Composer默认Worker中并未预装R。
一、修复ServiceAccount权限
不管你认为该SA是否具备编辑器权限,实际权限绑定存在缺失,需为其添加Pod管理相关权限:
1. 定义权限规则
新建airflow-pod-role.yaml文件:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default name: airflow-pod-manager rules: - apiGroups: [""] resources: ["pods", "pods/logs", "pods/exec"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
2. 绑定权限到目标ServiceAccount
新建airflow-pod-rolebinding.yaml文件:
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: namespace: default name: airflow-pod-manager-binding subjects: - kind: ServiceAccount name: default namespace: composer-1-20-12-airflow-2-4-3-a5161aba roleRef: kind: Role name: airflow-pod-manager apiGroup: rbac.authorization.k8s.io
3. 应用配置到K8s集群
执行以下命令:
kubectl apply -f airflow-pod-role.yaml kubectl apply -f airflow-pod-rolebinding.yaml
二、正确实现R脚本运行
根据你的目标,推荐直接使用KubernetesPodOperator运行带R环境的镜像,无需依赖Airflow Worker环境:
调整后的DAG代码
from airflow import DAG from airflow.contrib.operators.kubernetes_pod_operator import KubernetesPodOperator from datetime import datetime, timedelta default_dag_args = { 'owner': 'airflow', 'depends_on_past': False, 'start_date': datetime(2023, 10, 31), 'email_on_failure': False, 'email_on_retry': False, 'retries': 1, 'retry_delay': timedelta(seconds=5), } dag = DAG( 'prueba-bash-gcs', default_args=default_dag_args, schedule_interval=None, ) # 直接通过K8s Pod运行R代码 run_r_script = KubernetesPodOperator( task_id="run-r-script", dag=dag, name="run-r-task", namespace="default", image="rpy2/base-ubuntu", # 该镜像预装R环境 # 直接执行R代码,若需运行外部脚本可挂载存储 cmds=["Rscript", "-e"], arguments=['a <- 3+3; cat(a, "\\n")'], # 若要运行GCS上的脚本,需配置Volume挂载GCS存储桶 # volumes=[...], # volume_mounts=[...], ) # 若坚持使用BashOperator,需为Composer Worker安装R环境 # 可通过Composer初始化脚本添加:apt-get update && apt-get install -y r-base-core # test_bash = BashOperator( # task_id='test-bash-r', # dag=dag, # bash_command='Rscript -e \'a <- 3+3;cat(a, "\n")\'' # ) run_r_script
关键说明
- 镜像选择:
rpy2/base-ubuntu自带R环境,若需特定R版本,可选用官方镜像如rocker/r-ver:4.3.1。 - 脚本挂载:若需运行GCS上的R脚本,需通过Kubernetes Volume挂载GCS存储桶(需先配置GCS CSI驱动),再在
cmds中指定脚本路径。 - BashOperator替代方案:若一定要用BashOperator,需修改Composer Worker配置,通过初始化脚本安装R环境。
内容的提问来源于stack exchange,提问作者moltke_colombia
相关产品推荐
相关产品推荐

