Konfigurera och distribuera Apache Airflow på Azure Kubernetes Service (AKS)

I den här artikeln konfigurerar och distribuerar du Apache Airflow på Azure Kubernetes Service (AKS) med hjälp av Helm.

Konfigurera arbetsbelastningsidentitet

  1. Skapa ett namnområde för Airflow-klustret med kommandot kubectl create namespace .

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

    Exempel på utdata>

    namespace/airflow created
    
  2. Skapa ett tjänstkonto och konfigurera arbetsbelastningsidentitet med hjälp av kubectl apply kommandot .

    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
    

    Exempel på utdata>

    serviceaccount/airflow created
    

Installera External Secrets Operator

I det här avsnittet använder vi Helm för att installera operatorn External Secrets. Externhemlighetsoperatören är en Kubernetes-operator som hanterar livscykeln för externa hemligheter som lagras i externa hemlighetsförråd som Azure Key Vault.

  1. Lägg till Helm-lagringsplatsen för externa hemligheter och uppdatera lagringsplatsen med hjälp av kommandona helm repo add och helm repo update.

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

    Exempel på utdata>

    Hang tight while we grab the latest from your chart repositories...
    ...Successfully got an update from the "external-secrets" chart repository
    
  2. Installera External Secrets Operator med hjälp av kommandot helm install.

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

    Exempel på utdata>

    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
    

Skapa hemligheter

  1. Skapa en SecretStore resurs för att komma åt Airflow-lösenorden som lagras i nyckelvalvet med hjälp av kubectl apply kommandot .

    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
    

    Exempel på utdata>

    secretstore.external-secrets.io/azure-store created
    
  2. Skapa en ExternalSecret-resurs, som genererar en Kubernetes Secret i airflow-namnområdet, med Airflow-hemligheter som lagras i ditt nyckelvalv, genom att använda kubectl apply-kommandot.

    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
    

    Exempel på utdata>

    externalsecret.external-secrets.io/airflow-aks-azure-logs-secrets created
    
  3. Skapa en federerad autentiseringsuppgift med kommandot az identity federated-credential create .

    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
    

    Exempel på utdata>

    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. Ge den användartilldelade identiteten behörighet att komma åt hemligheten med hjälp av az keyvault set-policy kommandot .

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

    Exempel på utdata>

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

Skapa en beständig volym för Apache Airflow-loggar

  • Skapa en beständig volym med kommandot kubectl apply .

    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
    

    Exempel på utdata>

    persistentvolume/pv-airflow-logs created
    

Skapa ett ihållande volymkrav för Apache Airflow-loggar

  • Skapa en beständig volymkrav med kommandot kubectl apply.

    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
    

    Exempel på utdata>

    persistentvolumeclaim/pvc-airflow-logs created
    

Sätt upp Apache Airflow med Helm

  1. Konfigurera en airflow_values.yaml fil för att ändra standarddistributionskonfigurationerna för diagrammet och uppdatera containerregistret för avbildningarna.

    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. Lägg till Apache Airflow Helm-lagringsplatsen och uppdatera lagringsplatsen med hjälp av helm repo add kommandona och helm repo update .

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

    Exempel på utdata>

    "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. Sök i Helm-lagringsplatsen efter Apache Airflow-diagrammet med hjälp av helm search repo kommandot .

    helm search repo airflow
    

    Exempel på utdata>

    NAME                    CHART VERSION   APP VERSION     DESCRIPTION
    apache-airflow/airflow  1.15.0          3.0.2           The official Helm chart to deploy Apache Airflo...
    
  4. Installera Apache Airflow-diagrammet med kommandot helm install .

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

    Exempel på utdata>

    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. Kontrollera installationen med hjälp av kubectl get pods kommandot .

    kubectl get pods -n airflow
    

    Exempel på utdata>

    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
    

Access Airflow-användargränssnitt

  1. Få säker åtkomst till Airflow-användargränssnittet via portvidarebefordring med hjälp av kubectl port-forward kommandot .

    kubectl port-forward svc/airflow-webserver 8080:8080 -n airflow
    
  2. Öppna webbläsaren och gå till localhost:8080 för att komma åt airflow-användargränssnittet.

  3. Om du vill logga in använder du standardwebbserverns URL och inloggningsuppgifter som angavs under installationen av Airflow Helm-diagrammet.

  4. Utforska och hantera dina arbetsflöden på ett säkert sätt via airflow-användargränssnittet.

Integrera Git med Airflow

Integreringen av Git med Apache Airflow möjliggör sömlös versionskontroll och effektiv hantering av arbetsflödesdefinitioner, vilket säkerställer att alla DAG:er både är ordnade och lätt att granska.

  1. Konfigurera en Git-lagringsplats för DAG:er. Skapa en dedikerad Git-lagringsplats för alla dina Airflow DAG-definitioner. Den här lagringsplatsen fungerar som den centrala sanningskällan för dina arbetsflöden, så att du effektivt kan hantera, spåra och samarbeta i DAG:er.
  2. Konfigurera Airflow för att synkronisera DAG:er från Git. Uppdatera Airflows konfiguration för att automatiskt hämta DAG:er från git-lagringsplatsen genom att ange Git-lagringsplatsens URL och eventuella nödvändiga autentiseringsuppgifter direkt i Airflows konfigurationsfiler eller via Helm-diagramvärden. Den här konfigurationen möjliggör automatisk synkronisering av DAG:er, vilket säkerställer att Airflow alltid är uppdaterat med den senaste versionen av dina arbetsflöden.

Den här integreringen förbättrar arbetsflödet för utveckling och distribution genom att införa fullständig versionskontroll, aktivera återställningar och stödja teamsamarbete i en konfiguration i produktionsklass.

Gör ditt Airflow på Kubernetes redo för produktion

Följande metodtips kan hjälpa dig att göra din Apache Airflow på Kubernetes-distributionen i produktionsklass:

  • Se till att du har en robust konfiguration som fokuserar på skalbarhet, säkerhet och tillförlitlighet.
  • Använd dedikerade, autoskalande noder och välj en elastisk utörare som KubernetesExecutor, CeleryExecutor eller CeleryKubernetesExecutor.
  • Använd en hanterad databasserverdel med hög tillgänglighet som MySQL eller PostgreSQL.
  • Upprätta omfattande övervakning och centraliserad loggning för att upprätthålla prestandainsikter.
  • Skydda din miljö med nätverksprinciper, SSL och rollbaserad åtkomstkontroll (RBAC) och konfigurera Airflow-komponenter (Scheduler, Webbserver, Arbetare) för hög tillgänglighet.
  • Implementera CI/CD-pipelines för sömlös DAG-distribution och konfigurera regelbundna säkerhetskopior för katastrofåterställning.

Nästa steg

Mer information om hur du distribuerar programvara med öppen källkod i Azure Kubernetes Service (AKS) finns i följande artiklar:

Deltagare

Microsoft underhåller den här artikeln. Följande deltagare skrev den ursprungligen:

  • Don High | Huvudkundtekniker
  • Satya Chandragiri | Senior Digital Cloud Solution Architect
  • Erin Schaffer | Innehållsutvecklare 2