Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makalede Helm kullanarak Azure Kubernetes Service'te (AKS) Apache Airflow yapılandırıp dağıtacaksınız.
İş yükü kimliğini yapılandırma
komutunu kullanarak Airflow kümesi için bir ad alanı
kubectl create namespaceoluşturun.kubectl create namespace ${AKS_AIRFLOW_NAMESPACE} --dry-run=client --output yaml | kubectl apply -f -Örnek çıkış:
namespace/airflow createdKomutunu kullanarak
kubectl applybir hizmet hesabı oluşturun ve iş yükü kimliğini yapılandırın.export TENANT_ID=$(az account show --query tenantId -o tsv) cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ServiceAccount metadata: annotations: azure.workload.identity/client-id: "${MY_IDENTITY_NAME_CLIENT_ID}" azure.workload.identity/tenant-id: "${TENANT_ID}" name: "${SERVICE_ACCOUNT_NAME}" namespace: "${AKS_AIRFLOW_NAMESPACE}" EOFÖrnek çıkış:
serviceaccount/airflow created
Harici Gizli Bilgiler Operatörünü Kurma
Bu bölümde, Dış Gizli Diziler Operatörü'nü kurmak için Helm'i kullanacağız. Dış Gizli Diziler operatörü, Azure Key Vault gibi dış gizli dizi depolarında depolanan dış gizli dizilerin yaşam döngüsünü yöneten bir Kubernetes operatörüdür.
Harici Sırlar Helm deposunu ekleyin ve
helm repo addvehelm repo updatekomutlarını kullanarak depoyu güncelleyin.helm repo add external-secrets https://charts.external-secrets.io helm repo updateÖrnek çıkış:
Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "external-secrets" chart repositoryhelm installkomutunu kullanarak Dış Sırlar Operatörü'nü yükleyin.helm install external-secrets \ external-secrets/external-secrets \ --namespace ${AKS_AIRFLOW_NAMESPACE} \ --create-namespace \ --set installCRDs=true \ --waitÖrnek çıkış:
NAME: external-secrets LAST DEPLOYED: Thu Nov 7 11:16:07 2024 NAMESPACE: airflow STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: external-secrets has been deployed successfully in namespace airflow! In order to begin using ExternalSecrets, you will need to set up a SecretStore or ClusterSecretStore resource (for example, by creating a 'vault' SecretStore). More information on the different types of SecretStores and how to configure them can be found in our Github: https://github.com/external-secrets/external-secrets
Gizli anahtar oluşturma
komutunu kullanarak
SecretStoreanahtar kasanızda depolanan Airflow parolalarına erişmek için birkubectl applykaynak oluşturun.kubectl apply -f - <<EOF apiVersion: external-secrets.io/v1 kind: SecretStore metadata: name: azure-store namespace: ${AKS_AIRFLOW_NAMESPACE} spec: provider: # provider type: azure keyvault azurekv: authType: WorkloadIdentity vaultUrl: "${KEYVAULTURL}" serviceAccountRef: name: ${SERVICE_ACCOUNT_NAME} EOFÖrnek çıkış:
secretstore.external-secrets.io/azure-store createdExternalSecretkomutunu kullanarak, anahtar kasanızda depolananSecretgizlilikleri ileairflowad alanında bir KubernetesAirflowoluşturan birkubectl applykaynağı oluşturun.kubectl apply -f - <<EOF apiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: airflow-aks-azure-logs-secrets namespace: ${AKS_AIRFLOW_NAMESPACE} spec: refreshInterval: 1h secretStoreRef: kind: SecretStore name: azure-store target: name: ${AKS_AIRFLOW_LOGS_STORAGE_SECRET_NAME} creationPolicy: Owner data: # name of the SECRET in the Azure KV (no prefix is by default a SECRET) - secretKey: azurestorageaccountname remoteRef: key: AKS-AIRFLOW-LOGS-STORAGE-ACCOUNT-NAME - secretKey: azurestorageaccountkey remoteRef: key: AKS-AIRFLOW-LOGS-STORAGE-ACCOUNT-KEY EOFÖrnek çıkış:
externalsecret.external-secrets.io/airflow-aks-azure-logs-secrets createdkomutunu kullanarak
az identity federated-credential createbir federasyon kimlik bilgisi oluşturun.az identity federated-credential create \ --name external-secret-operator \ --identity-name ${MY_IDENTITY_NAME} \ --resource-group ${MY_RESOURCE_GROUP_NAME} \ --issuer ${OIDC_URL} \ --subject system:serviceaccount:${AKS_AIRFLOW_NAMESPACE}:${SERVICE_ACCOUNT_NAME} \ --output tableÖrnek çıkış:
Issuer Name ResourceGroup Subject ----------------------------------------------------------------------------------------------------------------------- ------------------------ ----------------------- ------------------------------------- https://$MY_LOCATION.oic.prod-aks.azure.com/c2c2c2c2-dddd-eeee-ffff-a3a3a3a3a3a3/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/ external-secret-operator $MY_RESOURCE_GROUP_NAME system:serviceaccount:airflow:airflowKullanıcı atanmış kimliğe
az keyvault set-policykomutu kullanılarak gizli anahtara erişim izni verin.az keyvault set-policy --name $MY_KEYVAULT_NAME --object-id $MY_IDENTITY_NAME_PRINCIPAL_ID --secret-permissions get --output tableÖrnek çıkış:
Location Name ResourceGroup ------------- ---------------------- ----------------------- $MY_LOCATION $MY_KEYVAULT_NAME $MY_RESOURCE_GROUP_NAME
Apache Airflow günlükleri için kalıcı birim oluşturma
komutunu kullanarak
kubectl applykalıcı bir birim oluşturun.kubectl apply -f - <<EOF apiVersion: v1 kind: PersistentVolume metadata: name: pv-airflow-logs labels: type: local spec: capacity: storage: 5Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain # If set as "Delete" container would be removed after pvc deletion storageClassName: azureblob-fuse-premium mountOptions: - -o allow_other - --file-cache-timeout-in-seconds=120 csi: driver: blob.csi.azure.com readOnly: false volumeHandle: airflow-logs-1 volumeAttributes: resourceGroup: ${MY_RESOURCE_GROUP_NAME} storageAccount: ${AKS_AIRFLOW_LOGS_STORAGE_ACCOUNT_NAME} containerName: ${AKS_AIRFLOW_LOGS_STORAGE_CONTAINER_NAME} nodeStageSecretRef: name: ${AKS_AIRFLOW_LOGS_STORAGE_SECRET_NAME} namespace: ${AKS_AIRFLOW_NAMESPACE} EOFÖrnek çıkış:
persistentvolume/pv-airflow-logs created
Apache Airflow günlükleri için kalıcı birim talebi oluşturma
komutunu kullanarak
kubectl applykalıcı bir birim talebi oluşturun.kubectl apply -f - <<EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-airflow-logs namespace: ${AKS_AIRFLOW_NAMESPACE} spec: storageClassName: azureblob-fuse-premium accessModes: - ReadWriteMany resources: requests: storage: 5Gi volumeName: pv-airflow-logs EOFÖrnek çıkış:
persistentvolumeclaim/pvc-airflow-logs created
Apache Airflow'u Helm ile dağıtmak
Grafiğin varsayılan dağıtım yapılandırmalarını değiştirmek ve görüntülerin kapsayıcı kayıt defterini güncelleştirmek için bir
airflow_values.yamldosya yapılandırın.cat <<EOF> airflow_values.yaml images: airflow: repository: $MY_ACR_REGISTRY.azurecr.io/airflow tag: 3.0.2 # Specifying digest takes precedence over tag. digest: ~ pullPolicy: IfNotPresent # To avoid images with user code, you can turn this to 'true' and # all the 'run-airflow-migrations' and 'wait-for-airflow-migrations' containers/jobs # will use the images from 'defaultAirflowRepository:defaultAirflowTag' values # to run and wait for DB migrations . useDefaultImageForMigration: false # timeout (in seconds) for airflow-migrations to complete migrationsWaitTimeout: 60 pod_template: # Note that `images.pod_template.repository` and `images.pod_template.tag` parameters # can be overridden in `config.kubernetes` section. So for these parameters to have effect # `config.kubernetes.worker_container_repository` and `config.kubernetes.worker_container_tag` # must be not set . repository: $MY_ACR_REGISTRY.azurecr.io/airflow tag: 3.0.2 pullPolicy: IfNotPresent flower: repository: $MY_ACR_REGISTRY.azurecr.io/airflow tag: 3.0.2 pullPolicy: IfNotPresent statsd: repository: $MY_ACR_REGISTRY.azurecr.io/statsd-exporter tag: v0.28.0 pullPolicy: IfNotPresent pgbouncer: repository: $MY_ACR_REGISTRY.azurecr.io/airflow tag: airflow-pgbouncer-2025.03.05-1.23.1 pullPolicy: IfNotPresent pgbouncerExporter: repository: $MY_ACR_REGISTRY.azurecr.io/airflow tag: airflow-pgbouncer-exporter-2025.03.05-0.18.0 pullPolicy: IfNotPresent gitSync: repository: $MY_ACR_REGISTRY.azurecr.io/git-sync tag: v4.3.0 pullPolicy: IfNotPresent # Airflow executor executor: "KubernetesExecutor" # Environment variables for all airflow containers env: - name: ENVIRONMENT value: dev extraEnv: | - name: AIRFLOW__CORE__DEFAULT_TIMEZONE value: 'America/New_York' # Configuration for postgresql subchart # Not recommended for production! Instead, spin up your own Postgresql server and use the `data` attribute in this # yaml file. postgresql: enabled: true image: registry: $MY_ACR_REGISTRY.azurecr.io repository: postgresql tag: 16.1.0-debian-11-r15 # Enable pgbouncer. See https://airflow.apache.org/docs/helm-chart/stable/production-guide.html#pgbouncer pgbouncer: enabled: true dags: gitSync: enabled: true repo: https://github.com/donhighmsft/airflowexamples.git branch: main rev: HEAD depth: 1 maxFailures: 0 subPath: "dags" # sshKeySecret: airflow-git-ssh-secret # knownHosts: | # github.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk= logs: persistence: enabled: true existingClaim: pvc-airflow-logs storageClassName: azureblob-fuse-premium # We disable the log groomer sidecar because we use Azure Blob Storage for logs, with lifecyle policy set. triggerer: logGroomerSidecar: enabled: false scheduler: logGroomerSidecar: enabled: false workers: logGroomerSidecar: enabled: false EOFApache Airflow Helm deposunu ekleyin ve
helm repo addvehelm repo updatekomutlarını kullanarak depoyu güncelleyin.helm repo add apache-airflow https://airflow.apache.org helm repo updateÖrnek çıkış:
"apache-airflow" has been added to your repositories Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "apache-airflow" chart repositoryhelm search repokomutunu kullanarak Helm deposunda Apache Airflow çizelgesini arayın.helm search repo airflowÖrnek çıkış:
NAME CHART VERSION APP VERSION DESCRIPTION apache-airflow/airflow 1.15.0 3.0.2 The official Helm chart to deploy Apache Airflo...komutunu kullanarak Apache Airflow grafiğini
helm installyükleyin.helm install airflow apache-airflow/airflow --version 1.15.0 --namespace airflow --create-namespace -f airflow_values.yaml --debugÖrnek çıkış:
NAME: airflow LAST DEPLOYED: Fri Nov 8 11:59:43 2024 NAMESPACE: airflow STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: Thank you for installing Apache Airflow 3.0.2! Your release is named airflow. You can now access your dashboard(s) by executing the following command(s) and visiting the corresponding port at localhost in your browser: Airflow Webserver: kubectl port-forward svc/airflow-webserver 8080:8080 --namespace airflow Default Webserver (Airflow UI) Login credentials: username: admin password: admin Default Postgres connection credentials: username: postgres password: postgres port: 5432 You can get Fernet Key value by running the following: echo Fernet Key: $(kubectl get secret --namespace airflow airflow-fernet-key -o jsonpath="{.data.fernet-key}" | base64 --decode) ########################################################### # WARNING: You should set a static webserver secret key # ########################################################### You are using a dynamically generated webserver secret key, which can lead to unnecessary restarts of your Airflow components. Information on how to set a static webserver secret key can be found here: https://airflow.apache.org/docs/helm-chart/stable/production-guide.html#webserver-secret-keykomutunu kullanarak
kubectl get podsyüklemeyi doğrulayın.kubectl get pods -n airflowÖrnek çıkış:
NAME READY STATUS RESTARTS AGE airflow-create-user-kklqf 1/1 Running 0 12s airflow-pgbouncer-d7bf9f649-25fnt 2/2 Running 0 61s airflow-postgresql-0 1/1 Running 0 61s airflow-run-airflow-migrations-zns2b 0/1 Completed 0 60s airflow-scheduler-5c45c6dbdd-7t6hv 1/2 Running 0 61s airflow-statsd-6df8564664-6rbw8 1/1 Running 0 61s airflow-triggerer-0 2/2 Running 0 61s airflow-webserver-7df76f944c-vcd5s 0/1 Running 0 61s external-secrets-748f44c8b8-w7qrk 1/1 Running 0 3h6m external-secrets-cert-controller-57b9f4cb7c-vl4m8 1/1 Running 0 3h6m external-secrets-webhook-5954b69786-69rlp 1/1 Running 0 3h6m
Airflow kullanıcı arabirimine erişme
kubectl port-forwardkomutunu kullanarak port forwarding yoluyla Airflow kullanıcı arabirimine güvenli olarak erişin.kubectl port-forward svc/airflow-webserver 8080:8080 -n airflowTarayıcınızı açın ve Airflow kullanıcı arabirimine erişmek için adresine gidin
localhost:8080.Oturum açmak için Airflow Helm grafiği yüklemesi sırasında sağlanan varsayılan web sunucusu URL'sini ve oturum açma kimlik bilgilerini kullanın.
Airflow kullanıcı arabirimi aracılığıyla iş akışlarınızı güvenli bir şekilde keşfedin ve yönetin.
Git'i Airflow ile tümleştirme
Git'i Apache Airflow ile tümleştirmek, iş akışı tanımlarınızın sorunsuz sürüm denetimine ve kolay yönetilmesine olanak sağlayarak tüm DAG'lerin hem düzenli hem de kolay denetlenebilir olmasını sağlar.
- DAG'ler için bir Git deposu ayarlayın. Tüm Airflow DAG tanımlarınızı barındıracak özel bir Git deposu oluşturun. Bu depo, iş akışlarınız için merkezi bir gerçek kaynağı görevi görür ve DAG'leri etkili bir şekilde yönetmenize, izlemenize ve üzerinde işbirliği yapmanızı sağlar.
- Airflow'ı Git'ten DAG'leri eşitlemek için yapılandırın. Git deposu URL'sini ve gerekli kimlik doğrulama kimlik bilgilerini doğrudan Airflow'un yapılandırma dosyalarında veya Helm grafik değerleri aracılığıyla ayarlayarak Git deponuzdan DAG'leri otomatik olarak çekmek için Airflow'un yapılandırmasını güncelleştirin. Bu kurulum, DAG'lerin otomatik olarak eşitlenmesini sağlayarak Airflow'un iş akışlarınızın en son sürümüyle her zaman güncel olmasını sağlar.
Bu tümleştirme, tam sürüm denetimi sunarak, geri almaları etkinleştirerek ve üretim sınıfı bir kurulumda ekip işbirliğini destekleyerek geliştirme ve dağıtım iş akışını geliştirir.
Kubernetes üzerinde Airflow'unuzu üretim seviyesinde yapın
Aşağıdaki en iyi yöntemler, Kubernetes dağıtımında Apache Airflow'unuzu üretim sınıfı yapmanıza yardımcı olabilir:
- Ölçeklenebilirlik, güvenlik ve güvenilirlik odaklı sağlam bir kuruluma sahip olduğunuzdan emin olun.
- Ayrılmış, otomatik ölçeklendirme düğümlerini kullanın ve KubernetesExecutor, CeleryExecutor veya CeleryKubernetesExecutor gibi dayanıklı bir yürütücü seçin.
- MySQL veya PostgreSQL gibi yönetilen ve yüksek kullanılabilirliğe sahip bir veritabanı arka ucu kullanın.
- Performans içgörülerini korumak için kapsamlı izleme ve merkezi günlük kaydı oluşturun.
- Ağ ilkeleri, SSL ve Rol Tabanlı Erişim Denetimi (RBAC) ile ortamınızın güvenliğini sağlayın ve yüksek kullanılabilirlik için Airflow bileşenlerini (Zamanlayıcı, Web Sunucusu, Çalışanlar) yapılandırın.
- Sorunsuz DAG dağıtımı için CI/CD işlem hatlarını uygulayın ve olağanüstü durum kurtarma için düzenli yedeklemeler ayarlayın.
Sonraki adımlar
Azure Kubernetes Service'te (AKS) açık kaynak yazılım dağıtma hakkında daha fazla bilgi edinmek için aşağıdaki makalelere bakın:
- Azure Kubernetes Service'te (AKS) MongoDB kümesi dağıtma
- Azure Kubernetes Service'te (AKS) yüksek oranda kullanılabilir bir PostgreSQL veritabanı dağıtma
- Azure Kubernetes Service'te (AKS) Valkey kümesi dağıtma
Katkıda Bulunanlar
Microsoft bu makaleyi korur. Başlangıçta aşağıdaki katkıda bulunanlar yazdı:
- Don High | Baş Müşteri Mühendisi
- Satya Chandragiri | Kıdemli Dijital Bulut Çözümü Mimarı
- Erin Schaffer | İçerik Geliştirici 2