[英]Error in image_pull_secrets for private repository Airflow deployed in Kubernetes
我已經在 azure kube.netes 中部署了 apache airflow。
apache airflow 的 Helm 倉庫: https://github.com/apache/airflow/tree/master/chart
AKS 版本:1.16.13
一旦我部署了 airflow,我就用這個 dag 測試了它:
from airflow import DAG
from datetime import datetime, timedelta
from airflow.contrib.operators.kubernetes_pod_operator import KubernetesPodOperator
from airflow.operators.dummy_operator import DummyOperator
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': datetime.utcnow(),
'email': ['airflow@example.com'],
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=5)
}
dag = DAG(
'kubernetes_sample', default_args=default_args, schedule_interval=timedelta(minutes=10))
start = DummyOperator(task_id='run_this_first', dag=dag)
passing = KubernetesPodOperator(namespace='default',
image="python:3.8-slim-buster",
cmds=["python3","-c"],
arguments=["print('hello world')"],
labels={"foo": "bar"},
name="passing-test",
task_id="passing-task",
get_logs=True,
dag=dag
)
passing.set_upstream(start)
它工作正常。 現在我想使用我自己的圖像。 為此,我正在使用 azure 容器,並遵循本指南: https://airflow.readthedocs.io/en/latest/howto/operator/kube.netes.html ,我正在使用此代碼創建訪問的秘密我的 azure 注冊表:
kubectl create secret docker-registry testquay \
--docker-server=quay.io \
--docker-username=<Profile name> \
--docker-password=<password>
我構建了我的圖像並在本地進行了測試,它正在運行。 我將圖像上傳到 azure 容器注冊表,然后編寫以下 dag:
from airflow import DAG
from datetime import datetime, timedelta
from airflow.contrib.operators.kubernetes_pod_operator import KubernetesPodOperator
from airflow.operators.dummy_operator import DummyOperator
from airflow.contrib.kubernetes import secret
import logging
import os
import sys
import traceback
try:
env_var_secret = secret.Secret(
deploy_type='env',
deploy_target='VERSION_NUMBER',
secret='myregistrykey',
key='VERSION_NUMBER',
)
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': datetime.utcnow(),
'email': ['airflow@example.com'],
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=5)
}
dag = DAG(
'jordi_test_get_secert2', default_args=default_args, schedule_interval=timedelta(minutes=10))
start = DummyOperator(task_id='run_this_first', dag=dag)
quay_k8s = KubernetesPodOperator(
namespace='default',
name="passing-test7",
image='docker.io/test-pai-1',
image_pull_secrets=env_var_secret,
task_id="passing-task6",
get_logs=True,
dag=dag
)
start >> quay_k8s
except Exception as e:
error_message = {
"message": "An internal error ocurred"
,"error": str(e)
, "error information" : str(sys.exc_info())
, "traceback": str(traceback.format_exc())
}
logging.info(error_message)
並給我這個錯誤:
File "/home/airflow/.local/lib/python3.6/site-packages/airflow/kubernetes/pod_generator.py", line 272, in __init__
for image_pull_secret in image_pull_secrets.split(','):
AttributeError: 'Secret' object has no attribute 'split'
遵循本指南: https://airflow.readthedocs.io/en/latest/howto/operator/kube.netes.html
from airflow import DAG
from datetime import datetime, timedelta
from airflow.contrib.operators.kubernetes_pod_operator import KubernetesPodOperator
from airflow.operators.dummy_operator import DummyOperator
from kubernetes.client import models as k8s
import logging
import os
import sys
import traceback
try:
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': datetime.utcnow(),
'email': ['airflow@example.com'],
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=5)
}
dag = DAG(
'jordi_test2', default_args=default_args, schedule_interval=timedelta(minutes=10))
start = DummyOperator(task_id='run_this_first', dag=dag)
quay_k8s = KubernetesPodOperator(
namespace='default',
name="passing-test7",
image='docker.io/test-pai-1',
image_pull_secrets=[k8s.V1LocalObjectReference('myregistrykey')],
task_id="passing-task6",
get_logs=True,
dag=dag
)
start >> quay_k8s
except Exception as e:
error_message = {
"message": "An internal error ocurred"
,"error": str(e)
, "error information" : str(sys.exc_info())
, "traceback": str(traceback.format_exc())
}
logging.info(error_message)
但是給我這個錯誤:
for image_pull_secret in image_pull_secrets.split(','):
AttributeError: 'list' object has no attribute 'split'
如果我 go 到 Kube.netesPodOperator 的 Airflow 文檔: https://airflow.apache.org/docs/stable/_api/airflow/contrib/operators/kube.netes_pod_operator/index.885178647
說:
image_pull_secrets (str) – Any image pull secrets to be given to the pod. If more than one secret is required, provide a comma separated list: secret_a,secret_b
怎樣寫才是正確的呢?
會要求澄清作為評論,但我沒有聲譽。 因此,提供具有一些假設的解決方案。
在這里你的秘密被命名為testquay
kubectl create secret docker-registry testquay \ --docker-server=quay.io \ --docker-username=<Profile name> \ --docker-password=<password>
但是,您在發布的代碼中將其引用為myregistrykey ,這是為了遵循您引用的示例。
image_pull_secrets=[k8s.V1LocalObjectReference('myregistrykey')],
它應該根據示例引用秘密名稱。
image_pull_secrets=[k8s.V1LocalObjectReference('testquay')],
同樣對於第一個 DAG 代碼,我認為您不能以這種方式傳遞Secrets
object。 這些是為了在運行時作為卷或環境變量注入到 k8s pod 中。 https://github.com/apache/airflow/blob/v1-10-stable/airflow/kube.netes/secret.py#L35-L40
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.