Az Apache Airflow konfigurálása és üzembe helyezése az Azure Kubernetes Service-ben (AKS)

Ebben a cikkben az Apache Airflow konfigurálása és üzembe helyezése az Azure Kubernetes Service-ben (AKS) a Helm használatával.

Számítási feladat identitásának konfigurálása

  1. Hozzon létre egy névteret az Airflow-fürthöz a kubectl create namespace paranccsal.

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

    A kimenet példája:

    namespace/airflow created
    
  2. Hozzon létre egy szolgáltatásfiókot, és konfigurálja a számítási feladat identitását a kubectl apply paranccsal.

    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
    

    A kimenet példája:

    serviceaccount/airflow created
    

A Külső titkos kódok operátor telepítése

Ebben a szakaszban a Helm használatával telepítjük a Külső titkos kódok operátort. A Külső titkos kódok operátor egy Kubernetes-operátor, amely a külső titkos kulcstárolókban, például az Azure Key Vaultban tárolt külső titkos kulcsok életciklusát kezeli.

  1. Adja hozzá az External Secrets Helm-adattárat, és frissítse az adattárat a helm repo add és helm repo update parancsok használatával.

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

    A kimenet példája:

    Hang tight while we grab the latest from your chart repositories...
    ...Successfully got an update from the "external-secrets" chart repository
    
  2. Telepítse a Külső titkos kódok operátort a helm install paranccsal.

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

    A kimenet példája:

    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
    

Titkos kulcsok létrehozása

  1. Hozzon létre egy erőforrást SecretStore a kulcstartóban tárolt Airflow-jelszavak eléréséhez a kubectl apply parancs használatával.

    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
    

    A kimenet példája:

    secretstore.external-secrets.io/azure-store created
    
  2. Hozzon létre egy erőforrást ExternalSecret , amely létrehoz egy Kubernetes-t Secret a airflow névtérben a Airflow kulcstartóban tárolt titkos kódokkal a kubectl apply parancs használatával.

    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
    

    A kimenet példája:

    externalsecret.external-secrets.io/airflow-aks-azure-logs-secrets created
    
  3. Hozzon létre egy összevont hitelesítő adatot a az identity federated-credential create paranccsal.

    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
    

    A kimenet példája:

    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. Adjon engedélyt a felhasználó által hozzárendelt identitásnak, hogy hozzáférjen a titkos kódhoz a az keyvault set-policy parancs használatával.

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

    A kimenet példája:

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

Állandó kötet létrehozása Apache Airflow-naplókhoz

  • Hozzon létre egy állandó kötetet a kubectl apply paranccsal.

    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
    

    A kimenet példája:

    persistentvolume/pv-airflow-logs created
    

Állandó mennyiségi jogcím létrehozása Apache Airflow-naplókhoz

  • Hozzon létre egy állandó mennyiségi jogcímet a kubectl apply parancs használatával.

    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
    

    A kimenet példája:

    persistentvolumeclaim/pvc-airflow-logs created
    

Az Apache Airflow üzembe helyezése a Helm használatával

  1. Konfiguráljon egy airflow_values.yaml fájlt a diagram alapértelmezett üzembehelyezési konfigurációinak módosításához és a lemezképek tárolóregisztrációs adatbázisának frissítéséhez.

    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. Adja hozzá az Apache Airflow Helm-adattárat, és frissítse az adattárat a parancsok és helm repo add a helm repo update parancsok használatával.

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

    A kimenet példája:

    "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. Keresse meg a Helm-adattárban az Apache Airflow-diagramot a helm search repo paranccsal.

    helm search repo airflow
    

    A kimenet példája:

    NAME                    CHART VERSION   APP VERSION     DESCRIPTION
    apache-airflow/airflow  1.15.0          3.0.2           The official Helm chart to deploy Apache Airflo...
    
  4. Telepítse az Apache Airflow-diagramot a helm install paranccsal.

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

    A kimenet példája:

    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. Ellenőrizze a telepítést a kubectl get pods paranccsal.

    kubectl get pods -n airflow
    

    A kimenet példája:

    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
    

Az Airflow felhasználói felületének elérése

  1. A parancs használatával biztonságosan elérheti az Airflow felhasználói felületét porttovábbítással kubectl port-forward .

    kubectl port-forward svc/airflow-webserver 8080:8080 -n airflow
    
  2. Nyissa meg a böngészőt, és navigáljon localhost:8080 az Airflow felhasználói felületének eléréséhez.

  3. A bejelentkezéshez használja az Airflow Helm-diagram telepítése során megadott alapértelmezett webkiszolgálói URL-címet és bejelentkezési hitelesítő adatokat.

  4. Az Airflow felhasználói felületén keresztül biztonságosan megismerheti és kezelheti munkafolyamatait.

A Git integrálása az Airflow-jal

A Git és az Apache Airflow integrálása zökkenőmentes verziókövetést és a munkafolyamat-definíciók egyszerűbb kezelését teszi lehetővé, biztosítva, hogy az összes DAG rendszerezett és könnyen naplózható legyen.

  1. Állítson be egy Git-adattárat a DAG-k számára. Hozzon létre egy dedikált Git-adattárat az Airflow DAG-definíciók tárolásához. Ez az adattár szolgál a munkafolyamatok igazságforrásaként, lehetővé téve a DAG-k hatékony kezelését, nyomon követését és együttműködését.
  2. Konfigurálja az Airflow-t a GIT-ből származó DAG-k szinkronizálásához. Frissítse az Airflow konfigurációját, hogy automatikusan lekérje a Git-adattárból a DAG-ket a Git-adattár URL-címének és a szükséges hitelesítési hitelesítő adatoknak közvetlenül az Airflow konfigurációs fájljaiban vagy a Helm-diagram értékein keresztül történő beállításával. Ez a beállítás lehetővé teszi a DAG-k automatikus szinkronizálását, biztosítva, hogy az Airflow mindig naprakész legyen a munkafolyamatok legújabb verziójával.

Ez az integráció a teljes verziókövetés bevezetésével, a visszaállítások engedélyezésével és a csapat együttműködésének támogatásával javítja a fejlesztési és üzembe helyezési munkafolyamatot egy éles környezetben.

Az Airflow létrehozása a Kubernetes éles üzemű állapotában

Az alábbi ajánlott eljárások segíthetnek az Apache Airflow éles környezetben történő üzembe helyezésében :

  • Győződjön meg arról, hogy a méretezhetőségre, a biztonságra és a megbízhatóságra összpontosító robusztus beállítással rendelkezik.
  • Használjon dedikált, automatikus skálázási csomópontokat, és válasszon egy rugalmas végrehajtót, például a KubernetesExecutort, a CeleryExecutort vagy a CeleryKubernetesExecutort.
  • Használjon felügyelt, magas rendelkezésre állású adatbázis háttérrendszert, például MySQL-t vagy PostgreSQL-t.
  • Átfogó monitorozási és központosított naplózás létrehozása a teljesítményelemzések fenntartása érdekében.
  • Biztonságossá teheti környezetét hálózati házirendekkel, SSL-ekkel és Role-Based hozzáférés-vezérléssel (RBAC), és konfigurálhatja az Airflow-összetevőket (Scheduler, Web Server, Workers) a magas rendelkezésre állás érdekében.
  • CI-/CD-folyamatokat implementálhat a DAG zökkenőmentes üzembe helyezéséhez, és rendszeres biztonsági mentéseket állíthat be a vészhelyreállításhoz.

Következő lépések

A nyílt forráskódú szoftverek Azure Kubernetes Service-ben (AKS) való üzembe helyezéséről az alábbi cikkekben olvashat bővebben:

Contributors

A Microsoft fenntartja ezt a cikket. Eredetileg a következő közreműködők írták:

  • Don High | Fő ügyfélmérnök
  • Satya Chandragiri | Vezető digitálisfelhő-megoldástervező
  • Erin Schaffer | Tartalomfejlesztő 2