Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Dalam artikel ini, Anda mengonfigurasi dan menyebarkan Apache Airflow di Azure Kubernetes Service (AKS) menggunakan Helm.
Mengonfigurasi identitas beban kerja
Buat namespace untuk kluster Airflow menggunakan
kubectl create namespaceperintah .kubectl create namespace ${AKS_AIRFLOW_NAMESPACE} --dry-run=client --output yaml | kubectl apply -f -Contoh output:
namespace/airflow createdBuat akun layanan dan konfigurasikan identitas beban kerja menggunakan
kubectl applyperintah .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}" EOFContoh output:
serviceaccount/airflow created
Menginstal Operator Rahasia Eksternal
Di bagian ini, kami menggunakan Helm untuk menginstal Operator Rahasia Eksternal. Operator Rahasia Eksternal adalah operator Kubernetes yang mengelola siklus hidup rahasia eksternal yang disimpan di penyimpanan rahasia eksternal seperti Azure Key Vault.
Tambahkan repositori Helm Rahasia Eksternal dan perbarui repositori menggunakan
helm repo addperintah danhelm repo update.helm repo add external-secrets https://charts.external-secrets.io helm repo updateContoh output:
Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "external-secrets" chart repositoryInstal Operator Rahasia Eksternal menggunakan
helm installperintah .helm install external-secrets \ external-secrets/external-secrets \ --namespace ${AKS_AIRFLOW_NAMESPACE} \ --create-namespace \ --set installCRDs=true \ --waitContoh output:
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
Membuat rahasia
Buat
SecretStoresumber daya untuk mengakses kata sandi Airflow yang disimpan di brankas kunci Anda menggunakankubectl applyperintah .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} EOFContoh output:
secretstore.external-secrets.io/azure-store createdExternalSecretBuat sumber daya, yang membuat KubernetesSecretdiairflownamespace denganAirflowrahasia yang disimpan di brankas kunci Anda, menggunakankubectl applyperintah .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 EOFContoh output:
externalsecret.external-secrets.io/airflow-aks-azure-logs-secrets createdBuat kredensial federasi menggunakan
az identity federated-credential createperintah .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 tableContoh output:
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:airflowBerikan izin ke identitas yang ditetapkan pengguna untuk mengakses rahasia menggunakan
az keyvault set-policyperintah .az keyvault set-policy --name $MY_KEYVAULT_NAME --object-id $MY_IDENTITY_NAME_PRINCIPAL_ID --secret-permissions get --output tableContoh output:
Location Name ResourceGroup ------------- ---------------------- ----------------------- $MY_LOCATION $MY_KEYVAULT_NAME $MY_RESOURCE_GROUP_NAME
Membuat volume persisten untuk log Apache Airflow
Buat volume persisten menggunakan
kubectl applyperintah .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} EOFContoh output:
persistentvolume/pv-airflow-logs created
Membuat klaim volume persisten untuk log Apache Airflow
Buat klaim volume persisten menggunakan
kubectl applyperintah .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 EOFContoh output:
persistentvolumeclaim/pvc-airflow-logs created
Menyebarkan Apache Airflow menggunakan Helm
Konfigurasikan
airflow_values.yamlfile untuk mengubah konfigurasi penyebaran default untuk bagan dan memperbarui registri kontainer untuk gambar.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 EOFTambahkan repositori Apache Airflow Helm dan perbarui repositori menggunakan
helm repo addperintah danhelm repo update.helm repo add apache-airflow https://airflow.apache.org helm repo updateContoh output:
"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 repositoryCari repositori Helm untuk bagan Apache Airflow menggunakan
helm search repoperintah .helm search repo airflowContoh output:
NAME CHART VERSION APP VERSION DESCRIPTION apache-airflow/airflow 1.15.0 3.0.2 The official Helm chart to deploy Apache Airflo...Instal bagan Apache Airflow menggunakan
helm installperintah .helm install airflow apache-airflow/airflow --version 1.15.0 --namespace airflow --create-namespace -f airflow_values.yaml --debugContoh output:
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-keyVerifikasi penginstalan menggunakan
kubectl get podsperintah .kubectl get pods -n airflowContoh output:
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
Mengakses UI Airflow
Akses UI Airflow dengan aman melalui penerusan port menggunakan
kubectl port-forwardperintah .kubectl port-forward svc/airflow-webserver 8080:8080 -n airflowBuka browser Anda dan navigasi ke
localhost:8080untuk mengakses UI Airflow.Untuk masuk, gunakan URL server web default serta info masuk yang disediakan selama penginstalan bagan Airflow Helm.
Jelajahi dan kelola alur kerja Anda dengan aman melalui UI Airflow.
Mengintegrasikan Git dengan Airflow
Mengintegrasikan Git dengan Apache Airflow memungkinkan kontrol versi yang mulus dan manajemen definisi alur kerja yang disederhanakan, memastikan bahwa semua DAG diatur dan mudah diaudit.
- Siapkan repositori Git untuk DAG. Buat repositori Git khusus untuk menampung semua definisi Airflow DAG Anda. Repositori ini berfungsi sebagai sumber kebenaran terpusat untuk alur kerja Anda, memungkinkan Anda mengelola, melacak, dan berkolaborasi pada DAG secara efektif.
- Konfigurasikan Airflow untuk menyinkronkan DAG dari Git. Perbarui konfigurasi Airflow untuk secara otomatis menarik DAG dari repositori Git Anda dengan mengatur URL repositori Git dan kredensial autentikasi yang diperlukan langsung di file konfigurasi Airflow atau melalui nilai bagan Helm. Penyiapan ini memungkinkan sinkronisasi DAG otomatis, memastikan bahwa Airflow selalu diperbarui dengan versi terbaru alur kerja Anda.
Integrasi ini meningkatkan alur kerja pengembangan dan penyebaran dengan memperkenalkan kontrol versi penuh, mengaktifkan pemutaran kembali, dan mendukung kolaborasi tim dalam penyiapan tingkat produksi.
Buat Airflow anda di tingkat produksi Kubernetes
Praktik terbaik berikut dapat membantu Anda membuat Apache Airflow pada tingkat produksi penyebaran Kubernetes :
- Pastikan Anda memiliki penyiapan yang kuat yang berfokus pada skalabilitas, keamanan, dan keandalan.
- Gunakan node khusus, penskalaan otomatis, dan pilih eksekutor tangguh seperti KubernetesExecutor, CeleryExecutor, atau CeleryKubernetesExecutor.
- Gunakan back end database terkelola dengan ketersediaan tinggi seperti MySQL atau PostgreSQL.
- Tetapkan pemantauan komprehensif dan pengelogan terpusat untuk mempertahankan wawasan performa.
- Amankan lingkungan Anda dengan kebijakan jaringan, SSL, dan Kontrol Akses Berbasis Peran (RBAC), dan konfigurasikan komponen Airflow (Scheduler, Web Server, Workers) untuk ketersediaan tinggi.
- Terapkan alur CI/CD untuk penyebaran DAG yang lancar, dan siapkan pencadangan reguler untuk pemulihan bencana.
Langkah berikutnya
Untuk mempelajari selengkapnya tentang menyebarkan perangkat lunak sumber terbuka di Azure Kubernetes Service (AKS), lihat artikel berikut:
- Menyebarkan kluster MongoDB di Azure Kubernetes Service (AKS)
- Menyebarkan database PostgreSQL yang sangat tersedia di Azure Kubernetes Service (AKS)
- Menyebarkan kluster Valkey pada Azure Kubernetes Service (AKS)
Kontributor
Microsoft mempertahankan artikel ini. Kontributor berikut awalnya menulisnya:
- Don Tinggi | Insinyur Pelanggan Utama
- Satya Chandragiri | Arsitek Solusi Cloud Digital Senior
- Erin Schaffer | Pengembang Konten 2