1

我正在尝试使用 Airflow kubernetes pod 运算符创建和运行一个 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 操作员?

谢谢!

4

2 回答 2

3

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",
)
于 2021-04-13T14:16:39.570 回答
1

事实证明,气流代码中的 pod 对象确实有 service_account_name 字段,只是不是由 KubernetesPodOperator 设置的。我不得不扩展 KubernetesPodOperator 并通过复制所有方法来覆盖执行方法。在我为 pod 对象设置 service_account_name 的位置添加了一行。

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

于 2021-04-07T15:13:05.160 回答