Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
Utwórz przestrzeń nazw dla klastra Airflow przy użyciu
kubectl create namespacepolecenia .kubectl create namespace ${AKS_AIRFLOW_NAMESPACE} --dry-run=client --output yaml | kubectl apply -f -Przykładowe wyjście:
namespace/airflow createdUtwó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}" EOFPrzykł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.
Dodaj repozytorium Helm Zewnętrznych Sekretów i zaktualizuj repozytorium przy użyciu poleceń
helm repo addihelm repo update.helm repo add external-secrets https://charts.external-secrets.io helm repo updatePrzykładowe wyjście:
Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "external-secrets" chart repositoryZainstaluj 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 \ --waitPrzykł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
Utwórz zasób
SecretStore, aby uzyskać dostęp do haseł Airflow przechowywanych w magazynie kluczy za pomocą poleceniakubectl 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} EOFPrzykładowe wyjście:
secretstore.external-secrets.io/azure-store createdUtwórz zasób, który w przestrzeni nazw
ExternalSecretw ramach platformy KubernetesSecrettworzy zbiory danych z tajnymi danymi przechowywanymi w magazynie kluczy, przy użyciu poleceniaairflow.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 EOFPrzykładowe wyjście:
externalsecret.external-secrets.io/airflow-aks-azure-logs-secrets createdUtwó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 tablePrzykł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:airflowNadaj 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 tablePrzykł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 applypolecenia .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} EOFPrzykł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 EOFPrzykładowe wyjście:
persistentvolumeclaim/pvc-airflow-logs created
Wdrażanie systemu Apache Airflow przy użyciu programu Helm
airflow_values.yamlSkonfiguruj 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 EOFDodaj repozytorium Helm Apache Airflow i zaktualizuj je, używając poleceń
helm repo addihelm repo update.helm repo add apache-airflow https://airflow.apache.org helm repo updatePrzykł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 repositoryWyszukaj repozytorium Helm dla wykresu Apache Airflow przy użyciu
helm search repopolecenia .helm search repo airflowPrzykł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...Zainstaluj wykres Apache Airflow przy użyciu
helm installpolecenia .helm install airflow apache-airflow/airflow --version 1.15.0 --namespace airflow --create-namespace -f airflow_values.yaml --debugPrzykł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-keyZweryfikuj instalację przy użyciu polecenia
kubectl get pods.kubectl get pods -n airflowPrzykł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
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 airflowOtwórz przeglądarkę i przejdź do
localhost:8080witryny , aby uzyskać dostęp do interfejsu użytkownika aplikacji Airflow.Aby się zalogować, użyj domyślnego adresu URL serwera WWW i poświadczeń logowania podanych podczas instalacji pakietu Helm Airflow.
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.
- 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.
- 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:
- Wdrażanie klastra bazy danych MongoDB w usłudze Azure Kubernetes Service (AKS)
- Wdrażanie bazy danych PostgreSQL o wysokiej dostępności w usłudze Azure Kubernetes Service (AKS)
- Wdrażanie klastra Valkey w usłudze Azure Kubernetes Service (AKS)
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