Mengonfigurasi dan menyebarkan Apache Airflow di Azure Kubernetes Service (AKS)

Dalam artikel ini, Anda mengonfigurasi dan menyebarkan Apache Airflow di Azure Kubernetes Service (AKS) menggunakan Helm.

Mengonfigurasi identitas beban kerja

  1. Buat namespace untuk kluster Airflow menggunakan kubectl create namespace perintah .

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

    Contoh output:

    namespace/airflow created
    
  2. Buat akun layanan dan konfigurasikan identitas beban kerja menggunakan kubectl apply perintah .

    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
    

    Contoh output:

    serviceaccount/airflow created
    

Menginstal Operator Rahasia Eksternal

Di bagian ini, kami menggunakan Helm untuk menginstal Operator Rahasia Eksternal. Operator Rahasia Eksternal adalah operator Kubernetes yang mengelola siklus hidup rahasia eksternal yang disimpan di penyimpanan rahasia eksternal seperti Azure Key Vault.

  1. Tambahkan repositori Helm Rahasia Eksternal dan perbarui repositori menggunakan helm repo add perintah dan helm repo update .

    helm repo add external-secrets https://charts.external-secrets.io
    helm repo update
    

    Contoh output:

    Hang tight while we grab the latest from your chart repositories...
    ...Successfully got an update from the "external-secrets" chart repository
    
  2. Instal Operator Rahasia Eksternal menggunakan helm install perintah .

    helm install external-secrets \
    external-secrets/external-secrets \
    --namespace ${AKS_AIRFLOW_NAMESPACE} \
    --create-namespace \
    --set installCRDs=true \
    --wait
    

    Contoh output:

    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
    

Membuat rahasia

  1. Buat SecretStore sumber daya untuk mengakses kata sandi Airflow yang disimpan di brankas kunci Anda menggunakan kubectl apply perintah .

    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
    

    Contoh output:

    secretstore.external-secrets.io/azure-store created
    
  2. ExternalSecret Buat sumber daya, yang membuat Kubernetes Secret di airflow namespace dengan Airflow rahasia yang disimpan di brankas kunci Anda, menggunakan kubectl apply perintah .

    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
    

    Contoh output:

    externalsecret.external-secrets.io/airflow-aks-azure-logs-secrets created
    
  3. Buat kredensial federasi menggunakan az identity federated-credential create perintah .

    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
    

    Contoh output:

    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. Berikan izin ke identitas yang ditetapkan pengguna untuk mengakses rahasia menggunakan az keyvault set-policy perintah .

    az keyvault set-policy --name $MY_KEYVAULT_NAME --object-id $MY_IDENTITY_NAME_PRINCIPAL_ID --secret-permissions get --output table
    

    Contoh output:

    Location       Name                    ResourceGroup
    -------------  ----------------------  -----------------------
    $MY_LOCATION   $MY_KEYVAULT_NAME       $MY_RESOURCE_GROUP_NAME
    

Membuat volume persisten untuk log Apache Airflow

  • Buat volume persisten menggunakan kubectl apply perintah .

    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
    

    Contoh output:

    persistentvolume/pv-airflow-logs created
    

Membuat klaim volume persisten untuk log Apache Airflow

  • Buat klaim volume persisten menggunakan kubectl apply perintah .

    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
    

    Contoh output:

    persistentvolumeclaim/pvc-airflow-logs created
    

Menyebarkan Apache Airflow menggunakan Helm

  1. Konfigurasikan airflow_values.yaml file untuk mengubah konfigurasi penyebaran default untuk bagan dan memperbarui registri kontainer untuk gambar.

    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. Tambahkan repositori Apache Airflow Helm dan perbarui repositori menggunakan helm repo add perintah dan helm repo update .

    helm repo add apache-airflow https://airflow.apache.org
    helm repo update
    

    Contoh output:

    "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. Cari repositori Helm untuk bagan Apache Airflow menggunakan helm search repo perintah .

    helm search repo airflow
    

    Contoh output:

    NAME                    CHART VERSION   APP VERSION     DESCRIPTION
    apache-airflow/airflow  1.15.0          3.0.2           The official Helm chart to deploy Apache Airflo...
    
  4. Instal bagan Apache Airflow menggunakan helm install perintah .

    helm install airflow apache-airflow/airflow --version 1.15.0 --namespace airflow --create-namespace -f airflow_values.yaml --debug
    

    Contoh output:

    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. Verifikasi penginstalan menggunakan kubectl get pods perintah .

    kubectl get pods -n airflow
    

    Contoh output:

    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
    

Mengakses UI Airflow

  1. Akses UI Airflow dengan aman melalui penerusan port menggunakan kubectl port-forward perintah .

    kubectl port-forward svc/airflow-webserver 8080:8080 -n airflow
    
  2. Buka browser Anda dan navigasi ke localhost:8080 untuk mengakses UI Airflow.

  3. Untuk masuk, gunakan URL server web default serta info masuk yang disediakan selama penginstalan bagan Airflow Helm.

  4. Jelajahi dan kelola alur kerja Anda dengan aman melalui UI Airflow.

Mengintegrasikan Git dengan Airflow

Mengintegrasikan Git dengan Apache Airflow memungkinkan kontrol versi yang mulus dan manajemen definisi alur kerja yang disederhanakan, memastikan bahwa semua DAG diatur dan mudah diaudit.

  1. Siapkan repositori Git untuk DAG. Buat repositori Git khusus untuk menampung semua definisi Airflow DAG Anda. Repositori ini berfungsi sebagai sumber kebenaran terpusat untuk alur kerja Anda, memungkinkan Anda mengelola, melacak, dan berkolaborasi pada DAG secara efektif.
  2. Konfigurasikan Airflow untuk menyinkronkan DAG dari Git. Perbarui konfigurasi Airflow untuk secara otomatis menarik DAG dari repositori Git Anda dengan mengatur URL repositori Git dan kredensial autentikasi yang diperlukan langsung di file konfigurasi Airflow atau melalui nilai bagan Helm. Penyiapan ini memungkinkan sinkronisasi DAG otomatis, memastikan bahwa Airflow selalu diperbarui dengan versi terbaru alur kerja Anda.

Integrasi ini meningkatkan alur kerja pengembangan dan penyebaran dengan memperkenalkan kontrol versi penuh, mengaktifkan pemutaran kembali, dan mendukung kolaborasi tim dalam penyiapan tingkat produksi.

Buat Airflow anda di tingkat produksi Kubernetes

Praktik terbaik berikut dapat membantu Anda membuat Apache Airflow pada tingkat produksi penyebaran Kubernetes :

  • Pastikan Anda memiliki penyiapan yang kuat yang berfokus pada skalabilitas, keamanan, dan keandalan.
  • Gunakan node khusus, penskalaan otomatis, dan pilih eksekutor tangguh seperti KubernetesExecutor, CeleryExecutor, atau CeleryKubernetesExecutor.
  • Gunakan back end database terkelola dengan ketersediaan tinggi seperti MySQL atau PostgreSQL.
  • Tetapkan pemantauan komprehensif dan pengelogan terpusat untuk mempertahankan wawasan performa.
  • Amankan lingkungan Anda dengan kebijakan jaringan, SSL, dan Kontrol Akses Berbasis Peran (RBAC), dan konfigurasikan komponen Airflow (Scheduler, Web Server, Workers) untuk ketersediaan tinggi.
  • Terapkan alur CI/CD untuk penyebaran DAG yang lancar, dan siapkan pencadangan reguler untuk pemulihan bencana.

Langkah berikutnya

Untuk mempelajari selengkapnya tentang menyebarkan perangkat lunak sumber terbuka di Azure Kubernetes Service (AKS), lihat artikel berikut:

Kontributor

Microsoft mempertahankan artikel ini. Kontributor berikut awalnya menulisnya:

  • Don Tinggi | Insinyur Pelanggan Utama
  • Satya Chandragiri | Arsitek Solusi Cloud Digital Senior
  • Erin Schaffer | Pengembang Konten 2