Azure Kubernetes Service'te (AKS) Apache Airflow yapılandırma ve dağıtma

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

  1. komutunu kullanarak Airflow kümesi için bir ad alanı kubectl create namespace oluşturun.

    kubectl create namespace ${AKS_AIRFLOW_NAMESPACE} --dry-run=client --output yaml | kubectl apply -f -
    

    Örnek çıkış:

    namespace/airflow created
    
  2. Komutunu kullanarak kubectl apply bir 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.

  1. Harici Sırlar Helm deposunu ekleyin ve helm repo add ve helm repo update komutları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 repository
    
  2. helm install komutunu 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

  1. komutunu kullanarak SecretStore anahtar kasanızda depolanan Airflow parolalarına erişmek için bir kubectl apply kaynak 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 created
    
  2. ExternalSecret komutunu kullanarak, anahtar kasanızda depolanan Secret gizlilikleri ile airflow ad alanında bir Kubernetes Airflow oluşturan bir kubectl apply kaynağı 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 created
    
  3. komutunu kullanarak az identity federated-credential create bir 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:airflow
    
  4. Kullanıcı atanmış kimliğe az keyvault set-policy komutu 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 apply kalı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 apply kalı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

  1. 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.yaml dosya 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
    
    EOF
    
  2. Apache Airflow Helm deposunu ekleyin ve helm repo add ve helm repo update komutları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 repository
    
  3. helm search repo komutunu 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...
    
  4. komutunu kullanarak Apache Airflow grafiğini helm install yü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-key
    
  5. komutunu kullanarak kubectl get pods yü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

  1. kubectl port-forward komutunu kullanarak port forwarding yoluyla Airflow kullanıcı arabirimine güvenli olarak erişin.

    kubectl port-forward svc/airflow-webserver 8080:8080 -n airflow
    
  2. Tarayıcınızı açın ve Airflow kullanıcı arabirimine erişmek için adresine gidin localhost:8080 .

  3. 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.

  4. 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.

  1. 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.
  2. 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:

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