Apache Airflow configureren en implementeren in Azure Kubernetes Service (AKS)

In dit artikel configureert en implementeert u Apache Airflow in Azure Kubernetes Service (AKS) met behulp van Helm.

Workloadidentiteit configureren

  1. Maak een naamruimte voor het Airflow-cluster met behulp van de kubectl create namespace opdracht.

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

    Voorbeelduitvoer:

    namespace/airflow created
    
  2. Maak een serviceaccount en configureer de workloadidentiteit met behulp van de kubectl apply opdracht.

    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
    

    Voorbeelduitvoer:

    serviceaccount/airflow created
    

De operator Externe geheimen installeren

In deze sectie gebruiken we Helm om de operator Externe geheimen te installeren. De operator Externe geheimen is een Kubernetes-operator die de levenscyclus beheert van externe geheimen die zijn opgeslagen in externe geheime archieven, zoals Azure Key Vault.

  1. Voeg de Helm-opslagplaats voor externe geheimen toe en werk de opslagplaats bij met behulp van de helm repo add en helm repo update opdrachten.

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

    Voorbeelduitvoer:

    Hang tight while we grab the latest from your chart repositories...
    ...Successfully got an update from the "external-secrets" chart repository
    
  2. Installeer de operator Externe geheimen met behulp van de helm install opdracht.

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

    Voorbeelduitvoer:

    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
    

Geheimen maken

  1. Maak een SecretStore resource voor toegang tot de Airflow-wachtwoorden die zijn opgeslagen in uw sleutelkluis met behulp van de kubectl apply opdracht.

    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
    

    Voorbeelduitvoer:

    secretstore.external-secrets.io/azure-store created
    
  2. Maak een ExternalSecret resource die een Kubernetes Secret maakt in de airflow naamruimte met de Airflow geheimen die zijn opgeslagen in uw sleutelkluis met behulp van de kubectl apply opdracht.

    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
    

    Voorbeelduitvoer:

    externalsecret.external-secrets.io/airflow-aks-azure-logs-secrets created
    
  3. Maak een federatieve referentie met behulp van de az identity federated-credential create opdracht.

    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
    

    Voorbeelduitvoer:

    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. Geef toestemming voor de door de gebruiker toegewezen identiteit om toegang te krijgen tot het geheim met behulp van de az keyvault set-policy opdracht.

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

    Voorbeelduitvoer:

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

Een permanent volume maken voor Apache Airflow-logboeken

  • Maak een permanent volume met behulp van de kubectl apply opdracht.

    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
    

    Voorbeelduitvoer:

    persistentvolume/pv-airflow-logs created
    

Een permanente volumeclaim maken voor Apache Airflow-logboeken

  • Maak een permanente volumeclaim met behulp van de kubectl apply opdracht.

    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
    

    Voorbeelduitvoer:

    persistentvolumeclaim/pvc-airflow-logs created
    

Apache Airflow implementeren met Helm

  1. Configureer een airflow_values.yaml bestand om de standaardimplementatieconfiguraties voor de grafiek te wijzigen en het containerregister voor de installatiekopieƫn bij te werken.

    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. Voeg de Apache Airflow Helm-opslagplaats toe en werk de opslagplaats bij met behulp van de helm repo add en helm repo update opdrachten.

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

    Voorbeelduitvoer:

    "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. Zoek in de Helm-opslagplaats naar de Apache Airflow-grafiek met behulp van de helm search repo opdracht.

    helm search repo airflow
    

    Voorbeelduitvoer:

    NAME                    CHART VERSION   APP VERSION     DESCRIPTION
    apache-airflow/airflow  1.15.0          3.0.2           The official Helm chart to deploy Apache Airflo...
    
  4. Installeer de Apache Airflow-grafiek met behulp van de helm install opdracht.

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

    Voorbeelduitvoer:

    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. Controleer de installatie met behulp van de kubectl get pods opdracht.

    kubectl get pods -n airflow
    

    Voorbeelduitvoer:

    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
    

Toegang tot de gebruikersinterface van Airflow

  1. Open de gebruikersinterface van Airflow veilig via port-forwarding met behulp van de kubectl port-forward opdracht.

    kubectl port-forward svc/airflow-webserver 8080:8080 -n airflow
    
  2. Open uw browser en navigeer naar localhost:8080 toegang tot de gebruikersinterface van Airflow.

  3. Als u zich wilt aanmelden, gebruikt u de standaard webserver URL en inloggegevens die zijn opgegeven tijdens de installatie van de Airflow Helm-chart.

  4. Verken en beheer uw werkstromen veilig via de gebruikersinterface van Airflow.

Git integreren met Airflow

Door Git te integreren met Apache Airflow kunt u naadloos versiebeheer en gestroomlijnd beheer van uw werkstroomdefinities mogelijk maken, zodat alle DAG's zowel georganiseerd als eenvoudig kunnen worden gecontroleerd.

  1. Een Git-opslagplaats instellen voor DAG's. Maak een toegewezen Git-opslagplaats voor al uw Airflow DAG-definities. Deze opslagplaats fungeert als de centrale bron van waarheid voor uw werkstromen, zodat u DAG's effectief kunt beheren, bijhouden en samenwerken.
  2. Configureer Airflow om DAG's vanuit Git te synchroniseren. Werk de configuratie van Airflow bij om AUTOMATISCH DAG's op te halen uit uw Git-opslagplaats door de URL van de Git-opslagplaats en de vereiste verificatiereferenties rechtstreeks in de configuratiebestanden van Airflow of via Helm-grafiekwaarden in te stellen. Met deze installatie kunt u geautomatiseerde synchronisatie van DAG's uitvoeren, zodat Airflow altijd up-to-date is met de nieuwste versie van uw werkstromen.

Deze integratie verbetert de ontwikkel- en implementatiewerkstroom door volledig versiebeheer te introduceren, terugdraaiacties mogelijk te maken en ondersteuning te bieden voor teamsamenwerking in een productieomgeving.

Uw Airflow op kubernetes-productieniveau maken

De volgende aanbevolen procedures kunnen u helpen uw Apache Airflow te maken op Kubernetes-implementatie op productieniveau:

  • Zorg ervoor dat u een robuuste instelling hebt die is gericht op schaalbaarheid, beveiliging en betrouwbaarheid.
  • Gebruik toegewezen, automatisch schalende knooppunten en selecteer een tolerante uitvoerder zoals KubernetesExecutor, CeleryExecutor of CeleryKubernetesExecutor.
  • Gebruik een beheerde back-end voor hoge beschikbaarheid, zoals MySQL of PostgreSQL.
  • Uitgebreide bewaking en gecentraliseerde logboekregistratie instellen om inzicht in prestaties te behouden.
  • Beveilig uw omgeving met netwerkbeleid, SSL en op rollen gebaseerd toegangsbeheer (RBAC) en configureer Airflow-onderdelen (Scheduler, Webserver, Workers) voor hoge beschikbaarheid.
  • Implementeer CI/CD-pijplijnen voor een soepele DAG-implementatie en stel regelmatige back-ups in voor herstel na noodgevallen.

Volgende stappen

Zie de volgende artikelen voor meer informatie over het implementeren van opensource-software in Azure Kubernetes Service (AKS):

Medewerkers

Microsoft onderhoudt dit artikel. De volgende inzenders hebben het oorspronkelijk geschreven:

  • Hoog | Principal Customer Engineer
  • Satya Chandragiri | Senior Digital Cloud Solution Architect
  • Erin Schaffer | Inhoudsontwikkelaar 2