Menggunakan KubernetesPodOperator

Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1

Halaman ini menjelaskan cara menggunakan KubernetesPodOperator untuk men-deploy Pod Kubernetes dari Cloud Composer ke cluster Google Kubernetes Engine yang merupakan bagian dari lingkungan Cloud Composer Anda.

KubernetesPodOperator meluncurkan Pod Kubernetes di cluster lingkungan Anda. Sebagai perbandingan, operator Google Kubernetes Engine menjalankan Pod Kubernetes di cluster yang ditentukan, yang dapat berupa cluster terpisah yang tidak terkait dengan lingkungan Anda. Anda juga dapat membuat dan menghapus cluster menggunakan operator Google Kubernetes Engine.

KubernetesPodOperator adalah opsi yang tepat jika Anda memerlukan:

  • Dependensi Python kustom yang tidak tersedia melalui repositori PyPI publik.
  • Dependensi biner yang tidak tersedia di image worker Cloud Composer bawaan.

Sebelum memulai

Periksa daftar perbedaan berikut antara KubernetesPodOperator di Cloud Composer 3 dan Cloud Composer 2, lalu pastikan DAG Anda kompatibel:

  • Namespace kustom tidak dapat dibuat di Cloud Composer 3. Pod selalu berjalan di namespace composer-user-workloads, meskipun namespace lain ditentukan. Pod di namespace ini memiliki akses ke resource dan jaringan VPC project Anda (jika diaktifkan) tanpa konfigurasi tambahan.

  • Anda tidak dapat menjalankan beberapa penampung file bantuan tambahan di Cloud Composer 3. Anda dapat menjalankan satu container sidecar jika diberi nama airflow-xcom-sidecar.

  • Secret dan ConfigMap Kubernetes tidak dapat dibuat menggunakan Kubernetes API. Sebagai gantinya, Cloud Composer menyediakan perintah Google Cloud CLI, resource Terraform, dan Cloud Composer API untuk mengelola Secret dan ConfigMap Kubernetes. Untuk mengetahui informasi selengkapnya, lihat Menggunakan Secret dan ConfigMap Kubernetes.

  • Workload kustom tidak dapat di-deploy di Cloud Composer 3. Hanya Secret dan ConfigMap Kubernetes yang dapat diubah, tetapi semua perubahan konfigurasi lainnya tidak dapat dilakukan.

  • Persyaratan resource (CPU, memori, dan penyimpanan) harus ditentukan menggunakan nilai yang didukung.

  • Sama seperti di Cloud Composer 2, konfigurasi afinitas Pod tidak tersedia. Jika Anda ingin menggunakan afinitas Pod, gunakan operator GKE untuk meluncurkan Pod di cluster yang berbeda.

Tentang KubernetesPodOperator di Cloud Composer 3

Bagian ini menjelaskan cara kerja KubernetesPodOperator di Cloud Composer 3.

Penggunaan resource

Di Cloud Composer 3, cluster lingkungan Anda menskalakan secara otomatis. Beban kerja tambahan yang Anda jalankan menggunakan KubernetesPodOperator diskalakan secara independen dari lingkungan Anda. Lingkungan Anda tidak terpengaruh oleh peningkatan permintaan resource, tetapi cluster lingkungan Anda akan di-scale up dan di-scale down bergantung pada permintaan resource.

Harga untuk beban kerja tambahan yang Anda jalankan di cluster lingkungan mengikuti model penetapan harga Cloud Composer 3 dan menggunakan SKU Cloud Composer 3.

Cloud Composer 3 menggunakan cluster Autopilot yang memperkenalkan konsep class komputasi:

  • Cloud Composer hanya mendukung class komputasi general-purpose.

  • Secara default, jika tidak ada class yang dipilih, class general-purpose akan diasumsikan saat Anda membuat Pod menggunakan KubernetesPodOperator.

  • Setiap class dikaitkan dengan properti dan batas resource tertentu. Anda dapat membacanya di dokumentasi Autopilot. Misalnya, Pod yang berjalan dalam class general-purpose dapat menggunakan memori hingga 110 GiB.

Akses ke resource project

Di Cloud Composer 3, cluster lingkungan Anda berada di project tenant, dan tidak dapat dikonfigurasi. Pod dieksekusi di cluster lingkungan, dalam namespace yang terisolasi.

Di Cloud Composer 3, Pod selalu berjalan di namespace composer-user-workloads, meskipun namespace lain ditentukan. Pod di namespace ini dapat mengakses Google Cloud resource di project Anda dan jaringan VPC Anda (jika diaktifkan) tanpa konfigurasi tambahan. Akun layanan lingkungan Anda digunakan untuk mengakses resource ini. Akun layanan lain tidak dapat ditentukan.

Konfigurasi minimal

Untuk membuat KubernetesPodOperator, hanya parameter name, image yang akan digunakan, dan task_id Pod yang diperlukan. /home/airflow/composer_kube_config berisi kredensial untuk mengautentikasi ke GKE.

kubernetes_min_pod = KubernetesPodOperator(
    # The ID specified for the task.
    task_id="pod-ex-minimum",
    # Name of task you want to run, used to generate Pod ID.
    name="pod-ex-minimum",
    # Entrypoint of the container, if not specified the Docker container's
    # entrypoint is used. The cmds parameter is templated.
    cmds=["echo"],
    # The namespace to run within Kubernetes. In Composer 2 environments
    # after December 2022, the default namespace is
    # `composer-user-workloads`. Always use the
    # `composer-user-workloads` namespace with Composer 3.
    namespace="composer-user-workloads",
    # Docker image specified. Defaults to hub.docker.com, but any fully
    # qualified URLs will point to a custom repository. Supports private
    # gcr.io images if the Composer Environment is under the same
    # project-id as the gcr.io images and the service account that Composer
    # uses has permission to access the Google Container Registry
    # (the default service account has permission)
    image="gcr.io/gcp-runtimes/ubuntu_20_0_4",
    # Specifies path to kubernetes config. The config_file is templated.
    config_file="/home/airflow/composer_kube_config",
    # Identifier of connection that should be used
    kubernetes_conn_id="kubernetes_default",
)

Konfigurasi tambahan

Contoh ini menunjukkan parameter tambahan yang dapat Anda konfigurasi di KubernetesPodOperator.

Lihat referensi berikut untuk mengetahui informasi selengkapnya:

kubernetes_full_pod = KubernetesPodOperator(
    task_id="ex-all-configs",
    name="pi",
    namespace="composer-user-workloads",
    image="perl:5.34.0",
    # Entrypoint of the container, if not specified the Docker container's
    # entrypoint is used. The cmds parameter is templated.
    cmds=["perl"],
    # Arguments to the entrypoint. The Docker image's CMD is used if this
    # is not provided. The arguments parameter is templated.
    arguments=["-Mbignum=bpi", "-wle", "print bpi(2000)"],
    # The secrets to pass to Pod, the Pod will fail to create if the
    # secrets you specify in a Secret object do not exist in Kubernetes.
    secrets=[],
    # Labels to apply to the Pod.
    labels={"pod-label": "label-name"},
    # Timeout to start up the Pod, default is 600.
    startup_timeout_seconds=600,
    # The environment variables to be initialized in the container.
    # The env_vars parameter is templated.
    env_vars={"EXAMPLE_VAR": "/example/value"},
    # If true, logs stdout output of container. Defaults to True.
    get_logs=True,
    # Determines when to pull a fresh image, if 'IfNotPresent' will cause
    # the Kubelet to skip pulling an image if it already exists. If you
    # want to always pull a new image, set it to 'Always'.
    image_pull_policy="Always",
    # Annotations are non-identifying metadata you can attach to the Pod.
    # Can be a large range of data, and can include characters that are not
    # permitted by labels.
    annotations={"key1": "value1"},
    # Optional resource specifications for Pod, this will allow you to
    # set both cpu and memory limits and requirements.
    # Prior to Airflow 2.3 and the cncf providers package 5.0.0
    # resources were passed as a dictionary. This change was made in
    # https://github.com/apache/airflow/pull/27197
    # Additionally, "memory" and "cpu" were previously named
    # "limit_memory" and "limit_cpu"
    # resources={'limit_memory': "250M", 'limit_cpu': "100m"},
    container_resources=k8s_models.V1ResourceRequirements(
        requests={"cpu": "1000m", "memory": "10G", "ephemeral-storage": "10G"},
        limits={"cpu": "1000m", "memory": "10G", "ephemeral-storage": "10G"},
    ),
    # Specifies path to kubernetes config. The config_file is templated.
    config_file="/home/airflow/composer_kube_config",
    # If true, the content of /airflow/xcom/return.json from container will
    # also be pushed to an XCom when the container ends.
    do_xcom_push=False,
    # List of Volume objects to pass to the Pod.
    volumes=[],
    # List of VolumeMount objects to pass to the Pod.
    volume_mounts=[],
    # Identifier of connection that should be used
    kubernetes_conn_id="kubernetes_default",
    # Affinity determines which nodes the Pod can run on based on the
    # config. For more information see:
    # https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
    # Pod affinity with the KubernetesPodOperator
    # is not supported with Composer 2
    # instead, create a cluster and use the GKEStartPodOperator
    # https://cloud.google.com/composer/docs/using-gke-operator
    affinity={},
)

Menggunakan template Jinja

Airflow mendukung template Jinja di DAG.

Anda harus mendeklarasikan parameter Airflow yang diperlukan (task_id, name, dan image) dengan operator. Seperti yang ditunjukkan dalam contoh berikut, Anda dapat membuat template semua parameter lainnya dengan Jinja, termasuk cmds, arguments, env_vars, dan config_file.

Parameter env_vars dalam contoh ditetapkan dari variabel Airflow bernama my_value. DAG contoh mendapatkan nilainya dari variabel template vars di Airflow. Airflow memiliki lebih banyak variabel yang memberikan akses ke berbagai jenis informasi. Misalnya, Anda dapat menggunakan variabel template conf untuk mengakses nilai opsi konfigurasi Airflow. Untuk mengetahui informasi selengkapnya dan daftar variabel yang tersedia di Airflow, lihat Referensi template dalam dokumentasi Airflow.

Tanpa mengubah DAG atau membuat variabel env_vars, tugas ex-kube-templates dalam contoh akan gagal karena variabel tidak ada. Buat variabel ini di UI Airflow atau dengan Google Cloud CLI:

UI Airflow

  1. Buka UI Airflow.

  2. Di toolbar, pilih Admin > Variabel.

  3. Di halaman List Variable, klik Add a new record.

  4. Di halaman Tambahkan Variabel, masukkan informasi berikut:

    • Kunci:my_value
    • Val: example_value
  5. Klik Simpan.

gcloud

Masukkan perintah berikut:

gcloud composer environments run ENVIRONMENT \
    --location LOCATION \
    variables set -- \
    my_value example_value

Ganti:

  • ENVIRONMENT dengan nama lingkungan.
  • LOCATION dengan region tempat lingkungan berada.

Contoh berikut menunjukkan cara menggunakan template Jinja dengan KubernetesPodOperator:

kubernetes_template_ex = KubernetesPodOperator(
    task_id="ex-kube-templates",
    name="ex-kube-templates",
    namespace="composer-user-workloads",
    image="bash",
    # All parameters below can be templated with Jinja. For more information
    # and the list of variables available in Airflow, see
    # the Airflow templates reference:
    # https://airflow.apache.org/docs/apache-airflow/stable/templates-ref.html
    # Entrypoint of the container, if not specified the Docker container's
    # entrypoint is used. The cmds parameter is templated.
    cmds=["echo"],
    # DS in Jinja is the execution date as YYYY-MM-DD, this Docker image
    # will echo the execution date. Arguments to the entrypoint. The Docker
    # image's CMD is used if this is not provided. The arguments parameter
    # is templated.
    arguments=["{{ ds }}"],
    # The var template variable allows you to access variables defined in
    # Airflow UI. In this case we are getting the value of my_value and
    # setting the environment variable `MY_VALUE`. The pod will fail if
    # `my_value` is not set in the Airflow UI. The env_vars parameter
    # is templated.
    env_vars={"MY_VALUE": "{{ var.value.my_value }}"},
    # Specifies path to Kubernetes config. The config_file is templated.
    config_file="/home/airflow/composer_kube_config",
    # Identifier of connection that should be used
    kubernetes_conn_id="kubernetes_default",
)

Menggunakan Secret dan ConfigMaps Kubernetes

Secret Kubernetes adalah objek yang berisi data sensitif. ConfigMap Kubernetes adalah objek yang berisi data tidak rahasia dalam pasangan nilai kunci.

Di Cloud Composer 3, Anda dapat membuat Secret dan ConfigMap menggunakan Google Cloud CLI, API, atau Terraform, lalu mengaksesnya dari KubernetesPodOperator:

  • Dengan Google Cloud CLI dan API, Anda menyediakan file konfigurasi YAML.
  • Dengan Terraform, Anda menentukan Secret dan ConfigMap sebagai resource terpisah dalam file konfigurasi Terraform.

Tentang file konfigurasi YAML

Saat membuat Secret atau ConfigMap Kubernetes menggunakan Google Cloud CLI dan API, Anda memberikan file dalam format YAML. File ini harus mengikuti format yang sama seperti yang digunakan oleh Secret dan ConfigMap Kubernetes. Dokumentasi Kubernetes menyediakan banyak contoh kode ConfigMap dan Secret. Untuk memulai, Anda dapat melihat halaman Mendistribusikan Kredensial dengan Aman Menggunakan Secret dan ConfigMaps.

Sama seperti di Secret Kubernetes, gunakan representasi base64 saat Anda menentukan nilai di Secret.

Untuk mengenkode nilai, Anda dapat menggunakan perintah berikut (ini adalah salah satu dari banyak cara untuk mendapatkan nilai yang dienkode base64):

echo "postgresql+psycopg2://root:example-password@127.0.0.1:3306/example-db" -n | base64

Output:

cG9zdGdyZXNxbCtwc3ljb3BnMjovL3Jvb3Q6ZXhhbXBsZS1wYXNzd29yZEAxMjcuMC4wLjE6MzMwNi9leGFtcGxlLWRiIC1uCg==

Dua contoh file YAML berikut digunakan dalam contoh di bagian selanjutnya dalam panduan ini. Contoh file konfigurasi YAML untuk Secret Kubernetes:

apiVersion: v1
kind: Secret
metadata:
  name: airflow-secrets
data:
  sql_alchemy_conn: cG9zdGdyZXNxbCtwc3ljb3BnMjovL3Jvb3Q6ZXhhbXBsZS1wYXNzd29yZEAxMjcuMC4wLjE6MzMwNi9leGFtcGxlLWRiIC1uCg==

Contoh lain yang menunjukkan cara menyertakan file. Sama seperti contoh sebelumnya, pertama-tama encode konten file (cat ./key.json | base64), lalu berikan nilai ini dalam file YAML:

apiVersion: v1
kind: Secret
metadata:
  name: service-account
data:
  service-account.json: |
    ewogICJ0eXBl...mdzZXJ2aWNlYWNjb3VudC5jb20iCn0K

Contoh file konfigurasi YAML untuk ConfigMap. Anda tidak perlu menggunakan representasi base64 dalam ConfigMaps:

apiVersion: v1
kind: ConfigMap
metadata:
  name: example-configmap
data:
  example_key: example_value

Mengelola Secret Kubernetes

gcloud

Membuat Secret

Untuk membuat Secret Kubernetes, jalankan perintah berikut:

gcloud beta composer environments user-workloads-secrets create \
  --environment ENVIRONMENT_NAME \
  --location LOCATION \
  --secret-file-path SECRET_FILE

Ganti kode berikut:

  • ENVIRONMENT_NAME: nama lingkungan Anda.
  • LOCATION: region tempat lingkungan berada.
  • SECRET_FILE: jalur ke file YAML lokal yang berisi konfigurasi Secret.

Contoh:

gcloud beta composer environments user-workloads-secrets create \
  --environment example-environment \
  --location us-central1 \
  --secret-file-path ./secrets/example-secret.yaml

Memperbarui Secret

Untuk memperbarui Secret Kubernetes, jalankan perintah berikut. Nama Secret akan diambil dari file YAML yang ditentukan dan konten Secret akan diganti.

gcloud beta composer environments user-workloads-secrets update \
  --environment ENVIRONMENT_NAME \
  --location LOCATION \
  --secret-file-path SECRET_FILE

Ganti kode berikut:

  • ENVIRONMENT_NAME: nama lingkungan Anda.
  • LOCATION: region tempat lingkungan berada.
  • SECRET_FILE: jalur ke file YAML lokal yang berisi konfigurasi Secret. Tentukan nama Secret di kolom metadata > name dalam file ini.

Mencantumkan Secret

Untuk mendapatkan daftar Secret dan kolomnya untuk suatu lingkungan, jalankan perintah berikut. Nilai kunci dalam output akan diganti dengan tanda bintang.

gcloud beta composer environments user-workloads-secrets list \
  --environment ENVIRONMENT_NAME \
  --location LOCATION

Ganti kode berikut:

  • ENVIRONMENT_NAME: nama lingkungan Anda.
  • LOCATION: region tempat lingkungan berada.

Mendapatkan detail Secret

Untuk mendapatkan informasi mendetail tentang Secret, jalankan perintah berikut. Nilai kunci dalam output akan diganti dengan tanda bintang.

gcloud beta composer environments user-workloads-secrets describe \
  SECRET_NAME \
  --environment ENVIRONMENT_NAME \
  --location LOCATION

Ganti kode berikut:

  • SECRET_NAME: nama Secret, seperti yang ditentukan di kolom metadata > name dalam file YAML dengan konfigurasi Secret.
  • ENVIRONMENT_NAME: nama lingkungan Anda.
  • LOCATION: region tempat lingkungan berada.

Menghapus Secret

Untuk menghapus Secret, jalankan perintah berikut:

gcloud beta composer environments user-workloads-secrets delete \
  SECRET_NAME \
  --environment ENVIRONMENT_NAME \
  --location LOCATION
  • SECRET_NAME: nama Secret, seperti yang ditentukan di kolom metadata > name dalam file YAML dengan konfigurasi Secret.
  • ENVIRONMENT_NAME: nama lingkungan Anda.
  • LOCATION: region tempat lingkungan berada.

API

Membuat Secret

  1. Buat permintaan environments.userWorkloadsSecrets.create API.

  2. Dalam permintaan ini:

    1. Dalam isi permintaan, di kolom name, tentukan URI untuk Secret baru.
    2. Dalam isi permintaan, di kolom data, tentukan kunci dan nilai berenkode base64 untuk Secret.

Contoh:

// POST https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment/userWorkloadsSecrets

{
  "name": "projects/example-project/locations/us-central1/environments/example-environment/userWorkloadsSecrets/example-secret",
  "data": {
    "example": "ZXhhbXBsZV92YWx1ZSAtbgo="
  }
}

Memperbarui Secret

  1. Buat permintaan environments.userWorkloadsSecrets.update API.

  2. Dalam permintaan ini:

    1. Di isi permintaan, di kolom name, tentukan URI Secret.
    2. Dalam isi permintaan, di kolom data, tentukan kunci dan nilai berenkode base64 untuk Secret. Nilai akan diganti.

Contoh:

// PUT https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment/userWorkloadsSecrets/example-secret

{
  "name": "projects/example-project/locations/us-central1/environments/example-environment/userWorkloadsSecrets/example-secret",
  "data": {
    "example": "ZXhhbXBsZV92YWx1ZSAtbgo=",
    "another-example": "YW5vdGhlcl9leGFtcGxlX3ZhbHVlIC1uCg=="
  }
}

Mencantumkan Secret

Buat permintaan environments.userWorkloadsSecrets.list API. Nilai kunci dalam output akan diganti dengan tanda bintang. Anda dapat menggunakan penomoran halaman dengan permintaan ini. Lihat referensi permintaan untuk mengetahui detail selengkapnya.

Contoh:

// GET https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment/userWorkloadsSecrets

Mendapatkan detail Secret

Buat permintaan environments.userWorkloadsSecrets.get API. Nilai kunci dalam output akan diganti dengan tanda bintang.

Contoh:

// GET https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment/userWorkloadsSecrets/example-secret

Menghapus Secret

Buat permintaan environments.userWorkloadsSecrets.delete API.

Contoh:

// DELETE https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment/userWorkloadsSecrets/example-secret

Terraform

Resource google_composer_user_workloads_secret menentukan Secret Kubernetes, dengan kunci dan nilai yang ditentukan di blok data.

resource "google_composer_user_workloads_secret" "example_secret" {
  provider = google-beta
  environment = google_composer_environment.ENVIRONMENT_RESOURCE_NAME.name
  name = "SECRET_NAME"
  region = "LOCATION"

  data = {
    KEY_NAME: "KEY_VALUE"
  }
}
  • ENVIRONMENT_RESOURCE_NAME: nama resource lingkungan, yang berisi definisi lingkungan di Terraform. Nama lingkungan sebenarnya juga ditentukan dalam resource ini.
  • LOCATION: region tempat lingkungan berada.
  • SECRET_NAME: nama Secret.
  • KEY_NAME: satu atau beberapa kunci untuk Secret ini.
  • KEY_VALUE: nilai berenkode base64 untuk kunci. Anda dapat menggunakan fungsi base64encode untuk mengenkode nilai (lihat contoh).

Dua contoh Secret Kubernetes berikut digunakan dalam contoh di bagian selanjutnya dalam panduan ini.

resource "google_composer_user_workloads_secret" "example_secret" {
  provider = google-beta

  name = "airflow-secrets"

  environment = google_composer_environment.example_environment.name
  region = "us-central1"

  data = {
    sql_alchemy_conn: base64encode("postgresql+psycopg2://root:example-password@127.0.0.1:3306/example-db")
  }
}

Contoh lain yang menunjukkan cara menyertakan file. Anda dapat menggunakan fungsi file untuk membaca isi file sebagai string, lalu mengenkodenya dengan base64:

resource "google_composer_user_workloads_secret" "service_account_secret" {
  provider = google-beta

  name = "service-account"

  environment = google_composer_environment.example_environment.name
  region = "us-central1"

  data = {
    "service-account.json": base64encode(file("./key.json"))
  }
}

Menggunakan Secret Kubernetes di DAG Anda

Contoh ini menunjukkan dua cara menggunakan Secret Kubernetes: sebagai variabel lingkungan, dan sebagai volume yang di-mount oleh Pod.

Secret pertama, airflow-secrets, ditetapkan ke variabel lingkungan Kubernetes bernama SQL_CONN (bukan variabel lingkungan Airflow atau Cloud Composer).

Secret kedua, service-account, memasang service-account.json, file dengan token akun layanan, ke /var/secrets/google.

Berikut tampilan objek Secret:

secret_env = Secret(
    # Expose the secret as environment variable.
    deploy_type="env",
    # The name of the environment variable, since deploy_type is `env` rather
    # than `volume`.
    deploy_target="SQL_CONN",
    # Name of the Kubernetes Secret
    secret="airflow-secrets",
    # Key of a secret stored in this Secret object
    key="sql_alchemy_conn",
)
secret_volume = Secret(
    deploy_type="volume",
    # Path where we mount the secret as volume
    deploy_target="/var/secrets/google",
    # Name of Kubernetes Secret
    secret="service-account",
    # Key in the form of service account file name
    key="service-account.json",
)

Nama Kubernetes Secret pertama ditentukan dalam variabel secret_env. Secret ini diberi nama airflow-secrets. Parameter deploy_type menentukan bahwa parameter tersebut harus diekspos sebagai variabel lingkungan. Nama variabel lingkungannya adalah SQL_CONN, seperti yang ditentukan dalam parameter deploy_target. Terakhir, nilai variabel lingkungan SQL_CONN ditetapkan ke nilai kunci sql_alchemy_conn.

Nama Secret Kubernetes kedua ditentukan dalam variabel secret_volume. Secret ini diberi nama service-account. Objek ini diekspos sebagai volume, seperti yang ditentukan dalam parameter deploy_type. Jalur file yang akan di-mount, deploy_target, adalah /var/secrets/google. Terakhir, key dari Secret yang disimpan di deploy_target adalah service-account.json.

Berikut tampilan konfigurasi operator:

kubernetes_secret_vars_ex = KubernetesPodOperator(
    task_id="ex-kube-secrets",
    name="ex-kube-secrets",
    namespace="composer-user-workloads",
    image="gcr.io/gcp-runtimes/ubuntu_20_0_4",
    startup_timeout_seconds=300,
    # The secrets to pass to Pod, the Pod will fail to create if the
    # secrets you specify in a Secret object do not exist in Kubernetes.
    secrets=[secret_env, secret_volume],
    # Entrypoint of the container, if not specified the Docker container's
    # entrypoint is used. The cmds parameter is templated.
    cmds=["echo"],
    # env_vars allows you to specify environment variables for your
    # container to use. The env_vars parameter is templated.
    env_vars={
        "EXAMPLE_VAR": "/example/value",
        "GOOGLE_APPLICATION_CREDENTIALS": "/var/secrets/google/service-account.json",
    },
    # Specifies path to kubernetes config. The config_file is templated.
    config_file="/home/airflow/composer_kube_config",
    # Identifier of connection that should be used
    kubernetes_conn_id="kubernetes_default",
)

Mengelola ConfigMaps Kubernetes

gcloud

Buat ConfigMap

Untuk membuat ConfigMap, jalankan perintah berikut:

gcloud beta composer environments user-workloads-config-maps create \
  --environment ENVIRONMENT_NAME \
  --location LOCATION \
  --config-map-file-path CONFIG_MAP_FILE

Ganti kode berikut:

  • ENVIRONMENT_NAME: nama lingkungan Anda.
  • LOCATION: region tempat lingkungan berada.
  • CONFIG_MAP_FILE: jalur ke file YAML lokal yang berisi konfigurasi ConfigMap.

Contoh:

gcloud beta composer environments user-workloads-config-maps create \
  --environment example-environment \
  --location us-central1 \
  --config-map-file-path ./configs/example-configmap.yaml

Memperbarui ConfigMap

Untuk mengupdate ConfigMap, jalankan perintah berikut. Nama ConfigMap akan diambil dari file YAML yang ditentukan dan konten ConfigMap akan diganti.

gcloud beta composer environments user-workloads-config-maps update \
  --environment ENVIRONMENT_NAME \
  --location LOCATION \
  --config-map-file-path CONFIG_MAP_FILE

Ganti kode berikut:

  • ENVIRONMENT_NAME: nama lingkungan Anda.
  • LOCATION: region tempat lingkungan berada.
  • CONFIG_MAP_FILE: jalur ke file YAML lokal yang berisi konfigurasi ConfigMap. Tentukan nama ConfigMap di kolom metadata > name dalam file ini.

Mencantumkan ConfigMap

Untuk mendapatkan daftar ConfigMap dan kolomnya untuk lingkungan, jalankan perintah berikut. Nilai utama dalam output akan ditampilkan apa adanya.

gcloud beta composer environments user-workloads-config-maps list \
  --environment ENVIRONMENT_NAME \
  --location LOCATION

Ganti kode berikut:

  • ENVIRONMENT_NAME: nama lingkungan Anda.
  • LOCATION: region tempat lingkungan berada.

Mendapatkan detail ConfigMap

Untuk mendapatkan informasi mendetail tentang ConfigMap, jalankan perintah berikut. Nilai kunci dalam output akan ditampilkan apa adanya.

gcloud beta composer environments user-workloads-config-maps describe \
  CONFIG_MAP_NAME \
  --environment ENVIRONMENT_NAME \
  --location LOCATION

Ganti kode berikut:

  • CONFIG_MAP_NAME: nama ConfigMap, seperti yang ditentukan di kolom metadata > name dalam file YAML dengan konfigurasi ConfigMap.
  • ENVIRONMENT_NAME: nama lingkungan Anda.
  • LOCATION: region tempat lingkungan berada.

Menghapus ConfigMap

Untuk menghapus ConfigMap, jalankan perintah berikut:

gcloud beta composer environments user-workloads-config-maps delete \
  CONFIG_MAP_NAME \
  --environment ENVIRONMENT_NAME \
  --location LOCATION
  • CONFIG_MAP_NAME: nama ConfigMap, seperti yang ditentukan di kolom metadata > name dalam file YAML dengan konfigurasi ConfigMap.
  • ENVIRONMENT_NAME: nama lingkungan Anda.
  • LOCATION: region tempat lingkungan berada.

API

Buat ConfigMap

  1. Buat permintaan environments.userWorkloadsConfigMaps.create API.

  2. Dalam permintaan ini:

    1. Di isi permintaan, di kolom name, tentukan URI untuk ConfigMap baru.
    2. Di isi permintaan, di kolom data, tentukan kunci dan nilai untuk ConfigMap.

Contoh:

// POST https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment/userWorkloadsConfigMaps

{
  "name": "projects/example-project/locations/us-central1/environments/example-environment/userWorkloadsConfigMaps/example-configmap",
  "data": {
    "example_key": "example_value"
  }
}

Memperbarui ConfigMap

  1. Buat permintaan environments.userWorkloadsConfigMaps.update API.

  2. Dalam permintaan ini:

    1. Di isi permintaan, di kolom name, tentukan URI ConfigMap.
    2. Di isi permintaan, di kolom data, tentukan kunci dan nilai untuk ConfigMap. Nilai akan diganti.

Contoh:

// PUT https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment/userWorkloadsConfigMaps/example-configmap

{
  "name": "projects/example-project/locations/us-central1/environments/example-environment/userWorkloadsConfigMaps/example-configmap",
  "data": {
    "example_key": "example_value",
    "another_key": "another_value"
  }
}

Mencantumkan ConfigMap

Buat permintaan environments.userWorkloadsConfigMaps.list API. Nilai kunci dalam output akan ditampilkan apa adanya. Anda dapat menggunakan penomoran halaman dengan permintaan ini. Lihat referensi permintaan untuk mengetahui detail selengkapnya.

Contoh:

// GET https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment/userWorkloadsConfigMaps

Mendapatkan detail ConfigMap

Buat permintaan environments.userWorkloadsConfigMaps.get API. Nilai utama dalam output akan ditampilkan apa adanya.

Contoh:

// GET https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment/userWorkloadsConfigMaps/example-configmap

Menghapus ConfigMap

Buat permintaan environments.userWorkloadsConfigMaps.delete API.

Contoh:

// DELETE https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment/userWorkloadsConfigMaps/example-configmap

Terraform

Resource google_composer_user_workloads_config_map menentukan ConfigMap, dengan kunci dan nilai yang ditentukan dalam blok data.

resource "google_composer_user_workloads_config_map" "example_config_map" {
  provider = google-beta
  environment = google_composer_environment.ENVIRONMENT_RESOURCE_NAME.name
  name = "CONFIG_MAP_NAME"
  region = "LOCATION"

  data = {
    KEY_NAME: "KEY_VALUE"
  }
}
  • ENVIRONMENT_RESOURCE_NAME: nama resource lingkungan, yang berisi definisi lingkungan di Terraform. Nama lingkungan sebenarnya juga ditentukan dalam resource ini.
  • LOCATION: region tempat lingkungan berada.
  • CONFIG_MAP_NAME: nama ConfigMap.
  • KEY_NAME: satu atau beberapa kunci untuk ConfigMap ini.
  • KEY_VALUE: Nilai untuk kunci.

Contoh:

resource "google_composer_user_workloads_config_map" "example_config_map" {
  provider = google-beta

  name = "example-config-map"

  environment = google_composer_environment.example_environment.name
  region = "us-central1"

  data = {
    "example_key": "example_value"
  }
}

Menggunakan ConfigMap di DAG

Contoh ini menunjukkan cara menggunakan ConfigMap di DAG Anda.

Dalam contoh berikut, ConfigMap diteruskan dalam parameter configmaps. Semua kunci ConfigMap ini tersedia sebagai variabel lingkungan:

import datetime

from airflow import models
from airflow.providers.cncf.kubernetes.operators.pod import KubernetesPodOperator

with models.DAG(
    dag_id="composer_kubernetes_pod_configmap",
    schedule_interval=None,
    start_date=datetime.datetime(2024, 1, 1),
) as dag:

  KubernetesPodOperator(
    task_id='kpo_configmap_env_vars',
    image='busybox:1.28',
    cmds=['sh'],
    arguments=[
        '-c',
        'echo "Value: $example_key"',
    ],
    configmaps=["example-configmap"],
    config_file="/home/airflow/composer_kube_config",
  )

Contoh berikut menunjukkan cara memasang ConfigMap sebagai volume:

import datetime

from airflow import models
from kubernetes.client import models as k8s
from airflow.providers.cncf.kubernetes.operators.pod import KubernetesPodOperator

volume_mount = k8s.V1VolumeMount(name='confmap-example',
  mount_path='/config',
  sub_path=None,
  read_only=False)

volume = k8s.V1Volume(name='confmap-example',
  config_map=k8s.V1ConfigMapVolumeSource(name='example-configmap'))

with models.DAG(
    dag_id="composer_kubernetes_pod_configmap",
    schedule_interval=None,
    start_date=datetime.datetime(2024, 1, 1),
) as dag:

  KubernetesPodOperator(
    task_id='kpo_configmap_volume_mount',
    image='busybox:1.28',
    cmds=['sh'],
    arguments=[
        '-c',
        'ls /config'
    ],
    volumes=[volume],
    volume_mounts=[volume_mount],
    configmaps=["example-configmap"],
    config_file="/home/airflow/composer_kube_config",
  )

Informasi tentang Penyedia Kubernetes CNCF

KubernetesPodOperator diimplementasikan di penyedia apache-airflow-providers-cncf-kubernetes.

Untuk catatan rilis mendetail penyedia CNCF Kubernetes, lihat situs Penyedia CNCF Kubernetes.

Persyaratan resource

Cloud Composer 3 mendukung nilai berikut untuk persyaratan resource. Untuk contoh penggunaan persyaratan resource, lihat Konfigurasi tambahan.

Resource Minimum Maksimum Langkah
CPU 0,25 32 Nilai langkah: 0,25, 0,5, 1, 2, 4, 6, 8, 10, ..., 32. Nilai yang diminta dibulatkan ke atas ke nilai langkah yang didukung terdekat (misalnya, 5 menjadi 6).
Memori 2G (GB) 128G (GB) Nilai langkah: 2, 3, 4, 5, ..., 128. Nilai yang diminta dibulatkan ke atas ke nilai langkah yang didukung terdekat (misalnya, 3,5G ke 4G).
Penyimpanan - 100G (GB) Semua nilai. Jika lebih dari 100 GB diminta, hanya 100 GB yang akan diberikan.

Untuk mengetahui informasi selengkapnya tentang unit resource di Kubernetes, lihat Unit resource di Kubernetes.

Pemecahan masalah

Bagian ini memberikan saran untuk memecahkan masalah umum KubernetesPodOperator:

Melihat log

Saat memecahkan masalah, Anda dapat memeriksa log dalam urutan berikut:

  1. Log Tugas Airflow:

    1. Di konsol Google Cloud , buka halaman Environments.

      Buka Lingkungan

    2. Dalam daftar lingkungan, klik nama lingkungan Anda. Halaman Environment details akan terbuka.

    3. Buka tab DAG.

    4. Klik nama DAG, lalu klik eksekusi DAG untuk melihat detail dan log.

  2. Log penjadwal Airflow:

    1. Buka halaman Detail lingkungan.

    2. Buka tab Log.

    3. Periksa log penjadwal Airflow.

  3. Log Workload Pengguna:

    1. Buka halaman Detail lingkungan.

    2. Buka tab Monitoring.

    3. Pilih Beban Kerja Pengguna.

    4. Periksa daftar beban kerja yang dieksekusi. Anda dapat melihat log dan informasi penggunaan resource untuk setiap beban kerja.

Kode pengembalian bukan nol

Saat menggunakan KubernetesPodOperator (dan GKEStartPodOperator), kode yang ditampilkan dari titik entri container menentukan apakah tugas dianggap berhasil atau tidak. Kode kembalian selain nol menunjukkan kegagalan.

Pola umum adalah menjalankan skrip shell sebagai titik entri container untuk mengelompokkan beberapa operasi dalam container.

Jika Anda menulis skrip seperti itu, sebaiknya sertakan perintah set -e di bagian atas skrip sehingga perintah yang gagal dalam skrip menghentikan skrip dan menyebarkan kegagalan ke instance tugas Airflow.

Waktu tunggu pod

Waktu tunggu default untuk KubernetesPodOperator adalah 120 detik, yang dapat menyebabkan waktu tunggu habis sebelum image yang lebih besar didownload. Anda dapat memperpanjang waktu tunggu dengan mengubah parameter startup_timeout_seconds saat membuat KubernetesPodOperator.

Jika Pod mengalami waktu tunggu habis, log khusus tugas tersedia di UI Airflow. Contoh:

Executing <Task(KubernetesPodOperator): ex-all-configs> on 2018-07-23 19:06:58.133811
Running: ['bash', '-c', u'airflow run kubernetes-pod-example ex-all-configs 2018-07-23T19:06:58.133811 --job_id 726 --raw -sd DAGS_FOLDER/kubernetes_pod_operator_sample.py']
Event: pod-name-9a8e9d06 had an event of type Pending
...
...
Event: pod-name-9a8e9d06 had an event of type Pending
Traceback (most recent call last):
  File "/usr/local/bin/airflow", line 27, in <module>
    args.func(args)
  File "/usr/local/lib/python2.7/site-packages/airflow/bin/cli.py", line 392, in run
    pool=args.pool,
  File "/usr/local/lib/python2.7/site-packages/airflow/utils/db.py", line 50, in wrapper
    result = func(*args, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/airflow/models.py", line 1492, in _run_raw_task
    result = task_copy.execute(context=context)
  File "/usr/local/lib/python2.7/site-packages/airflow/contrib/operators/kubernetes_pod_operator.py", line 123, in execute
    raise AirflowException('Pod Launching failed: {error}'.format(error=ex))
airflow.exceptions.AirflowException: Pod Launching failed: Pod took too long to start

Waktu Tunggu Pod juga dapat terjadi saat Akun Layanan Cloud Composer tidak memiliki izin IAM yang diperlukan untuk melakukan tugas yang sedang dikerjakan. Untuk memverifikasi hal ini, lihat error tingkat Pod menggunakan Dasbor GKE untuk melihat log Workload tertentu, atau gunakan Cloud Logging.

Tugas KubernetesPodOperator gagal saat sejumlah besar tugas dijalankan

Saat lingkungan Anda menjalankan sejumlah besar tugas KubernetesPodOperator atau KubernetesExecutor secara bersamaan, Cloud Composer 3 tidak akan menerima tugas baru hingga beberapa tugas yang ada selesai.

Untuk mengetahui informasi selengkapnya tentang pemecahan masalah ini, lihat Memecahkan masalah tugas KubernetesExecutor.

Langkah berikutnya