Udostępnij przez


Konfigurowanie i wdrażanie platformy Apache Airflow w usłudze Azure Kubernetes Service (AKS)

W tym artykule skonfigurujesz i wdrożysz platformę Apache Airflow w usłudze Azure Kubernetes Service (AKS) przy użyciu programu Helm.

Konfigurowanie tożsamości obciążenia

  1. Utwórz przestrzeń nazw dla klastra Airflow przy użyciu kubectl create namespace polecenia .

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

    Przykładowe wyjście:

    namespace/airflow created
    
  2. Utwórz konto usługi i skonfiguruj tożsamość obciążeniową przy użyciu polecenia kubectl apply.

    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
    

    Przykładowe wyjście:

    serviceaccount/airflow created
    

Instalacja Operatora Zewnętrznych Sekretów

W tej sekcji użyjemy programu Helm do zainstalowania Operatora Zewnętrznych Sekretów. Operator zewnętrznych wpisów tajnych jest operatorem Kubernetes, który zarządza cyklem życia zewnętrznych wpisów tajnych przechowywanych w zewnętrznych magazynach wpisów tajnych, takich jak Azure Key Vault.

  1. Dodaj repozytorium Helm Zewnętrznych Sekretów i zaktualizuj repozytorium przy użyciu poleceń helm repo add i helm repo update.

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

    Przykładowe wyjście:

    Hang tight while we grab the latest from your chart repositories...
    ...Successfully got an update from the "external-secrets" chart repository
    
  2. Zainstaluj External Secrets Operator przy użyciu polecenia helm install.

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

    Przykładowe wyjście:

    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
    

Twórz tajemnice

  1. Utwórz zasób SecretStore, aby uzyskać dostęp do haseł Airflow przechowywanych w magazynie kluczy za pomocą polecenia kubectl apply.

    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
    

    Przykładowe wyjście:

    secretstore.external-secrets.io/azure-store created
    
  2. Utwórz zasób, który w przestrzeni nazw ExternalSecret w ramach platformy Kubernetes Secret tworzy zbiory danych z tajnymi danymi przechowywanymi w magazynie kluczy, przy użyciu polecenia airflow.

    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
    

    Przykładowe wyjście:

    externalsecret.external-secrets.io/airflow-aks-azure-logs-secrets created
    
  3. Utwórz poświadczenia federacyjne za pomocą polecenia 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
    

    Przykładowe wyjście:

    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. Nadaj uprawnienia tożsamości przypisanej przez użytkownika, aby uzyskać dostęp do sekretu za pomocą polecenia az keyvault set-policy.

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

    Przykładowe wyjście:

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

Tworzenie trwałego woluminu dla dzienników systemu Apache Airflow

  • Utwórz wolumin trwały przy użyciu kubectl apply polecenia .

    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
    

    Przykładowe wyjście:

    persistentvolume/pv-airflow-logs created
    

Utwórz trwałe żądanie zasobu pamięci dla dzienników Apache Airflow

  • Utwórz żądanie trwałego woluminu za pomocą polecenia 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
    

    Przykładowe wyjście:

    persistentvolumeclaim/pvc-airflow-logs created
    

Wdrażanie systemu Apache Airflow przy użyciu programu Helm

  1. airflow_values.yaml Skonfiguruj plik, aby zmienić domyślne konfiguracje wdrożenia dla wykresu i zaktualizować rejestr kontenerów dla obrazów.

    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. Dodaj repozytorium Helm Apache Airflow i zaktualizuj je, używając poleceń helm repo add i helm repo update.

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

    Przykładowe wyjście:

    "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. Wyszukaj repozytorium Helm dla wykresu Apache Airflow przy użyciu helm search repo polecenia .

    helm search repo airflow
    

    Przykładowe wyjście:

    NAME                    CHART VERSION   APP VERSION     DESCRIPTION
    apache-airflow/airflow  1.15.0          3.0.2           The official Helm chart to deploy Apache Airflo...
    
  4. Zainstaluj wykres Apache Airflow przy użyciu helm install polecenia .

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

    Przykładowe wyjście:

    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. Zweryfikuj instalację przy użyciu polecenia kubectl get pods.

    kubectl get pods -n airflow
    

    Przykładowe wyjście:

    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
    

Uzyskiwanie dostępu do interfejsu użytkownika przepływu powietrza

  1. Bezpieczny dostęp do interfejsu użytkownika Airflow za pomocą przekierowania portów przy użyciu polecenia kubectl port-forward.

    kubectl port-forward svc/airflow-webserver 8080:8080 -n airflow
    
  2. Otwórz przeglądarkę i przejdź do localhost:8080 witryny , aby uzyskać dostęp do interfejsu użytkownika aplikacji Airflow.

  3. Aby się zalogować, użyj domyślnego adresu URL serwera WWW i poświadczeń logowania podanych podczas instalacji pakietu Helm Airflow.

  4. Bezpiecznie eksploruj i zarządzaj swoimi przepływami pracy za pomocą interfejsu użytkownika Airflow.

Integrowanie usługi Git z rozwiązaniem Airflow

Integracja usługi Git z usługą Apache Airflow umożliwia bezproblemową kontrolę wersji i usprawnione zarządzanie definicjami przepływu pracy, zapewniając, że wszystkie grupy DAG są zorganizowane i łatwe do inspekcji.

  1. Konfigurowanie repozytorium Git dla grup DAG. Utwórz dedykowane repozytorium Git, aby pomieścić wszystkie definicje grupy DAG platformy Airflow. To repozytorium służy jako główne źródło informacji dla przepływów pracy, co umożliwia efektywne zarządzanie, śledzenie i współpracę nad DAG-ami.
  2. Konfigurowanie funkcji Airflow do synchronizowania grup DAG z usługi Git. Zaktualizuj konfigurację Airflow, aby automatycznie ściągać DAGi z repozytorium Git, ustawiając adres URL repozytorium Git i wszelkie wymagane poświadczenia uwierzytelniania bezpośrednio w plikach konfiguracji Airflow lub za pomocą wartości chartu Helm. Ta konfiguracja umożliwia automatyczną synchronizację grup DAG, zapewniając, że funkcja Airflow jest zawsze aktualna z najnowszą wersją przepływów pracy.

Ta integracja usprawnia cykl rozwoju i wdrażania, wprowadzając pełną kontrolę wersji, umożliwiając wycofywanie zmian i wspierając współpracę zespołową na poziomie produkcyjnym.

Tworzenie przepływu powietrza na platformie Kubernetes klasy produkcyjnej

Poniższe najlepsze rozwiązania mogą pomóc w działaniu platformy Apache Airflow na platformie Kubernetes w środowisku produkcyjnym:

  • Upewnij się, że masz niezawodną konfigurację skoncentrowaną na skalowalności, bezpieczeństwie i niezawodności.
  • Użyj dedykowanych, autoskalujących się węzłów i wybierz odporny wykonawca, taki jak KubernetesExecutor, CeleryExecutor lub CeleryKubernetesExecutor.
  • Użyj zarządzanego zaplecza bazy danych o wysokiej dostępności, takiego jak MySQL lub PostgreSQL.
  • Ustanów kompleksowe monitorowanie i scentralizowane rejestrowanie, aby zachować szczegółowe informacje o wydajności.
  • Zabezpiecz swoje środowisko przy użyciu zasad sieciowych, SSL i kontroli dostępu opartej na rolach (RBAC), oraz skonfiguruj komponenty Airflow (Scheduler, Serwer WWW, Procesory) w celu zapewnienia wysokiej dostępności.
  • Zaimplementuj potoki CI/CD w celu bezproblemowego wdrożenia DAG i skonfiguruj regularne kopie zapasowe na potrzeby odzyskiwania po awarii.

Następne kroki

Aby dowiedzieć się więcej na temat wdrażania oprogramowania typu open source w usłudze Azure Kubernetes Service (AKS), zobacz następujące artykuły:

Współautorzy

Firma Microsoft utrzymuje ten artykuł. Następujący współautorzy pierwotnie to napisali:

  • Don High | Główny inżynier klienta
  • Satya Chandragiri | Starszy architekt rozwiązań w chmurze cyfrowej
  • Erin Schaffer | Content Developer 2