在气流 kubernetes pod 操作员中传递 --serviceaccount

问题描述

我正在尝试使用 Airflow kubernetes pod operator 创建和运行 pod。 下面的命令已尝试并确认可以正常工作,我正在尝试在本地使用 kubernetes pod 操作员复制相同的命令

kubectl run sparkairflow -n test-namespace --image=some-docker-repo.com:hello-world --serviceaccount=airflow --restart=Never -- spark-submit --deploy-mode cluster --master k8s://kubernetes.default.cluster.local:123 \
                 --name sparkairflow \
                 --conf spark.kubernetes.namespace=test-namespace \
                 --conf spark.kubernetes.container.image=some-docker-repo.com:hello-world \
                 --conf spark.kubernetes.authenticate.driver.serviceAccountName=airflow \
...

在这里遇到一堵墙,因为似乎没有办法使用气流传递 --serviceaccount 标志,这是我的实现所必需的,并且会在我这边抛出错误

线程“main”io.fabric8.kubernetes.client.KubernetesClientException 中的异常:pods“sparkairflow-155252344-driver”被禁止用户“system:serviceaccount:test-namespace:default”无法在API中观看资源“pods”命名空间“test-namespace”中的组“”:访问被拒绝

到目前为止,我发现的解决方案主要集中在将用户添加到命名空间角色上,但这对我来说是不可能的。

有什么方法可以将 serviceaccount 标志传递给气流 kubernetes 运营商?

谢谢!

解决方法

事实证明,airflow 代码中的 pod 对象确实有 service_account_name 字段,只是没有由 KubernetesPodOperator 设置。我必须扩展 KubernetesPodOperator 并通过复制所有内容来覆盖 execute 方法。添加了一行,我在其中为 pod 对象设置了 service_account_name。

不是最干净的解决方案,但它有效!

,

KubernetesPodOperator 包含一个参数 service_account_name,您可以使用该参数指定 K8s 服务帐户。它适用于 Airflow v2 和 v1.10,后者只是没有记录。

示例调用(主要取自 https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/stable/operators.html):

quay_k8s = KubernetesPodOperator(
    namespace='default',image='quay.io/apache/bash',service_account_name="my_k8s_svc_acct",cmds=["bash","-cx"],name="airflow-private-image-pod",task_id="task-two",)