Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I den här artikeln konfigurerar och distribuerar du Apache Airflow på Azure Kubernetes Service (AKS) med hjälp av Helm.
Konfigurera arbetsbelastningsidentitet
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 createdSkapa ett tjänstkonto och konfigurera arbetsbelastningsidentitet med hjälp av
kubectl applykommandot .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}" EOFExempel 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.
Lägg till Helm-lagringsplatsen för externa hemligheter och uppdatera lagringsplatsen med hjälp av kommandona
helm repo addochhelm repo update.helm repo add external-secrets https://charts.external-secrets.io helm repo updateExempel på utdata>
Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "external-secrets" chart repositoryInstallera 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 \ --waitExempel 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
Skapa en
SecretStoreresurs för att komma åt Airflow-lösenorden som lagras i nyckelvalvet med hjälp avkubectl applykommandot .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} EOFExempel på utdata>
secretstore.external-secrets.io/azure-store createdSkapa en
ExternalSecret-resurs, som genererar en KubernetesSecretiairflow-namnområdet, medAirflow-hemligheter som lagras i ditt nyckelvalv, genom att användakubectl 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 EOFExempel på utdata>
externalsecret.external-secrets.io/airflow-aks-azure-logs-secrets createdSkapa 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 tableExempel 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:airflowGe den användartilldelade identiteten behörighet att komma åt hemligheten med hjälp av
az keyvault set-policykommandot .az keyvault set-policy --name $MY_KEYVAULT_NAME --object-id $MY_IDENTITY_NAME_PRINCIPAL_ID --secret-permissions get --output tableExempel 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} EOFExempel 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 EOFExempel på utdata>
persistentvolumeclaim/pvc-airflow-logs created
Sätt upp Apache Airflow med Helm
Konfigurera en
airflow_values.yamlfil 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 EOFLägg till Apache Airflow Helm-lagringsplatsen och uppdatera lagringsplatsen med hjälp av
helm repo addkommandona ochhelm repo update.helm repo add apache-airflow https://airflow.apache.org helm repo updateExempel 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 repositorySök i Helm-lagringsplatsen efter Apache Airflow-diagrammet med hjälp av
helm search repokommandot .helm search repo airflowExempel 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...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 --debugExempel 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-keyKontrollera installationen med hjälp av
kubectl get podskommandot .kubectl get pods -n airflowExempel 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
Få säker åtkomst till Airflow-användargränssnittet via portvidarebefordring med hjälp av
kubectl port-forwardkommandot .kubectl port-forward svc/airflow-webserver 8080:8080 -n airflowÖppna webbläsaren och gå till
localhost:8080för att komma åt airflow-användargränssnittet.Om du vill logga in använder du standardwebbserverns URL och inloggningsuppgifter som angavs under installationen av Airflow Helm-diagrammet.
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.
- 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.
- 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:
- Distribuera ett MongoDB-kluster i Azure Kubernetes Service (AKS)
- Distribuera en PostgreSQL-databas med hög tillgänglighet i Azure Kubernetes Service (AKS)
- Distribuera ett Valkey-kluster i Azure Kubernetes Service (AKS)
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