прохождение --serviceaccount в воздушном потоке kubernetes pod operator
Я пытаюсь создать и запустить модуль с помощью оператора модуля Airflow kubernetes. Команда ниже проверена и подтверждена как работающая, и я пытаюсь воспроизвести то же самое, используя оператор 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" не может просматривать ресурсы "pods" в группе API "" в пространстве имен "test-namespace": доступ запрещен
Решения, которые я нашел до сих пор, в основном сосредоточены на добавлении пользователя по умолчанию в роль пространства имен, но в моем случае это невозможно.
Есть ли способ передать флаг serviceaccount оператору airflow kubernetes?
Спасибо!
2 ответа
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",
)
Оказывается, у объекта pod в коде воздушного потока есть поле service_account_name, оно просто не устанавливается KubernetesPodOperator. Мне пришлось расширить KubernetesPodOperator и переопределить метод execute, скопировав его все. Добавлена одна строка, в которой я установил service_account_name для объекта pod.
Не самое чистое решение, но оно сработало!