Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit artikel configureert en implementeert u Apache Airflow in Azure Kubernetes Service (AKS) met behulp van Helm.
Workloadidentiteit configureren
Maak een naamruimte voor het Airflow-cluster met behulp van de
kubectl create namespaceopdracht.kubectl create namespace ${AKS_AIRFLOW_NAMESPACE} --dry-run=client --output yaml | kubectl apply -f -Voorbeelduitvoer:
namespace/airflow createdMaak een serviceaccount en configureer de workloadidentiteit met behulp van de
kubectl applyopdracht.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}" EOFVoorbeelduitvoer:
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.
Voeg de Helm-opslagplaats voor externe geheimen toe en werk de opslagplaats bij met behulp van de
helm repo addenhelm repo updateopdrachten.helm repo add external-secrets https://charts.external-secrets.io helm repo updateVoorbeelduitvoer:
Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "external-secrets" chart repositoryInstalleer de operator Externe geheimen met behulp van de
helm installopdracht.helm install external-secrets \ external-secrets/external-secrets \ --namespace ${AKS_AIRFLOW_NAMESPACE} \ --create-namespace \ --set installCRDs=true \ --waitVoorbeelduitvoer:
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
Maak een
SecretStoreresource voor toegang tot de Airflow-wachtwoorden die zijn opgeslagen in uw sleutelkluis met behulp van dekubectl applyopdracht.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} EOFVoorbeelduitvoer:
secretstore.external-secrets.io/azure-store createdMaak een
ExternalSecretresource die een KubernetesSecretmaakt in deairflownaamruimte met deAirflowgeheimen die zijn opgeslagen in uw sleutelkluis met behulp van dekubectl applyopdracht.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 EOFVoorbeelduitvoer:
externalsecret.external-secrets.io/airflow-aks-azure-logs-secrets createdMaak een federatieve referentie met behulp van de
az identity federated-credential createopdracht.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 tableVoorbeelduitvoer:
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:airflowGeef toestemming voor de door de gebruiker toegewezen identiteit om toegang te krijgen tot het geheim met behulp van de
az keyvault set-policyopdracht.az keyvault set-policy --name $MY_KEYVAULT_NAME --object-id $MY_IDENTITY_NAME_PRINCIPAL_ID --secret-permissions get --output tableVoorbeelduitvoer:
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 applyopdracht.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} EOFVoorbeelduitvoer:
persistentvolume/pv-airflow-logs created
Een permanente volumeclaim maken voor Apache Airflow-logboeken
Maak een permanente volumeclaim met behulp van de
kubectl applyopdracht.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 EOFVoorbeelduitvoer:
persistentvolumeclaim/pvc-airflow-logs created
Apache Airflow implementeren met Helm
Configureer een
airflow_values.yamlbestand 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 EOFVoeg de Apache Airflow Helm-opslagplaats toe en werk de opslagplaats bij met behulp van de
helm repo addenhelm repo updateopdrachten.helm repo add apache-airflow https://airflow.apache.org helm repo updateVoorbeelduitvoer:
"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 repositoryZoek in de Helm-opslagplaats naar de Apache Airflow-grafiek met behulp van de
helm search repoopdracht.helm search repo airflowVoorbeelduitvoer:
NAME CHART VERSION APP VERSION DESCRIPTION apache-airflow/airflow 1.15.0 3.0.2 The official Helm chart to deploy Apache Airflo...Installeer de Apache Airflow-grafiek met behulp van de
helm installopdracht.helm install airflow apache-airflow/airflow --version 1.15.0 --namespace airflow --create-namespace -f airflow_values.yaml --debugVoorbeelduitvoer:
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-keyControleer de installatie met behulp van de
kubectl get podsopdracht.kubectl get pods -n airflowVoorbeelduitvoer:
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
Open de gebruikersinterface van Airflow veilig via port-forwarding met behulp van de
kubectl port-forwardopdracht.kubectl port-forward svc/airflow-webserver 8080:8080 -n airflowOpen uw browser en navigeer naar
localhost:8080toegang tot de gebruikersinterface van Airflow.Als u zich wilt aanmelden, gebruikt u de standaard webserver URL en inloggegevens die zijn opgegeven tijdens de installatie van de Airflow Helm-chart.
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.
- 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.
- 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):
- Een MongoDB-cluster implementeren in Azure Kubernetes Service (AKS)
- Een maximaal beschikbare PostgreSQL-database implementeren in Azure Kubernetes Service (AKS)
- Een Valkey-cluster implementeren 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