Монтируйте тома с секретами с помощью Python Kubernetes API
Я пишу DAG Airflow, используя
KubernetesPodOperator
. Процесс Python, запущенный в контейнере, должен открыть файл с конфиденциальными данными:
with open('credentials/jira_credentials.json', 'r') as f:
creds = json.load(f)
и клиент CloudStorage должен быть аутентифицирован:
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = "credentials/cloud_storage_credentials.json"
В соответствии с передовыми методами безопасности я не упаковываю образ контейнера с конфиденциальными данными. Вместо этого я использую секреты Kubernetes . Используя Python API для Kubernetes , я пытаюсь смонтировать их как том, но безуспешно.
credentials/
Каталог существует в контейнере, но он пуст. Что нужно сделать, чтобы сделать файлы jira_credentials.json и cloud_storage_credentials.json доступными в контейнере?
Мой код DAG:
from airflow import DAG
from datetime import datetime, timedelta
from airflow.contrib.operators.kubernetes_pod_operator import KubernetesPodOperator
from airflow.kubernetes.secret import Secret
from airflow.kubernetes.volume import Volume
from airflow.kubernetes.volume_mount import VolumeMount
from airflow.operators.dummy_operator import DummyOperator
from kubernetes.client import models as k8s
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': datetime.utcnow(),
'email': ['airflow@example.com'],
'email_on_failure': False,
'email_on_retry': False,
'retry_delay': timedelta(minutes=5)
}
volume = Volume(name="volume-credentials", configs={})
volume_mnt = VolumeMount(mount_path="/credentials", name="volume-credentials", sub_path="", read_only=True)
secret_jira_user = Secret(deploy_type="volume",
deploy_target="/credentials",
secret="jira-user-secret",
key="jira_credentials.json")
secret_storage_credentials = Secret(deploy_type="volume",
deploy_target="/credentials",
secret="jira-trans-projects-cloud-storage-creds",
key="cloud_storage_credentials.json")
dag = DAG(
dag_id="jira_translations_project",
schedule_interval="0 1 * * MON",
start_date=datetime(2021, 9, 5, 0, 0, 0),
max_active_runs=1,
default_args=default_args
)
start = DummyOperator(task_id='START', dag=dag)
passing = KubernetesPodOperator(namespace='default',
image="eu.gcr.io/data-engineering/jira_downloader:v0.18",
cmds=["/usr/local/bin/run_process.sh"],
name="jira-translation-projects-01",
task_id="jira-translation-projects-01",
get_logs=True,
dag=dag,
volumes=[volume],
volume_mounts=[volume_mnt],
secrets=[
secret_jira_user,
secret_storage_credentials],
env_vars={'MIGRATION_DATETIME': '2021-01-02T03:04:05'},
)
start >> passing
1 ответ
Согласно этому примеру, это специальный класс, который будет автоматически создавать монтирование томов. Глядя на ваш код, кажется, что ваш собственный том с монтированием переопределяет
/credentials
крепление создано
Secret
, и потому что вы предоставляете пустой
configs={}
, это крепление также пусто.
Попробуйте предоставить только
secrets=[secret_jira_user,secret_storage_credentials]
и удаление руководства
volume_mounts
.