Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1
Auf dieser Seite wird beschrieben, wie Sie mit KubernetesPodOperator Kubernetes-Pods von Cloud Composer in den Google Kubernetes Engine-Cluster Ihrer Cloud Composer-Umgebung bereitstellen.
KubernetesPodOperator startet Kubernetes-Pods im Cluster Ihrer Umgebung. Mit Google Kubernetes Engine-Operatoren werden dagegen Kubernetes-Pods in einem bestimmten Cluster ausgeführt. Dabei kann es sich um einen separaten Cluster handeln, der nicht mit Ihrer Umgebung in Verbindung steht. Sie können Cluster auch mit Google Kubernetes Engine-Operatoren erstellen und löschen.
KubernetesPodOperator ist eine gute Option, wenn Sie Folgendes benötigen:
- Benutzerdefinierte Python-Abhängigkeiten, die nicht über das öffentliche PyPI-Repository verfügbar sind.
- Binäre Abhängigkeiten, die im Cloud Composer-Worker-Image nicht verfügbar sind.
Hinweis
In der folgenden Liste finden Sie die Unterschiede zwischen KubernetesPodOperator in Cloud Composer 3 und Cloud Composer 2. Prüfen Sie, ob Ihre DAGs kompatibel sind:
In Cloud Composer 3 können keine benutzerdefinierten Namespaces erstellt werden. Pods werden immer im Namespace
composer-user-workloads
ausgeführt, auch wenn ein anderer Namespace angegeben ist. Pods in diesem Namespace haben ohne zusätzliche Konfiguration Zugriff auf die Ressourcen Ihres Projekts und das VPC-Netzwerk (falls aktiviert).Kubernetes-Secrets und ConfigMaps können nicht mit der Kubernetes API erstellt werden. Stattdessen bietet Cloud Composer Google Cloud CLI-Befehle, Terraform-Ressourcen und die Cloud Composer API zum Verwalten von Kubernetes-Secrets und ConfigMaps. Weitere Informationen finden Sie unter Kubernetes-Secrets und ConfigMaps verwenden.
In Cloud Composer 3 können keine benutzerdefinierten Arbeitslasten bereitgestellt werden. Nur Kubernetes-Secrets und ConfigMaps können geändert werden. Alle anderen Konfigurationsänderungen sind nicht möglich.
Die Ressourcenanforderungen (CPU, Arbeitsspeicher und Speicher) müssen mit unterstützten Werten angegeben werden.
Wie in Cloud Composer 2 ist die Pod-Affinitätskonfiguration nicht verfügbar. Wenn Sie die Pod-Affinität verwenden möchten, verwenden Sie stattdessen die GKE-Operatoren, um Pods in einem anderen Cluster zu starten.
KubernetesPodOperator in Cloud Composer 3
In diesem Abschnitt wird beschrieben, wie KubernetesPodOperator in Cloud Composer 3 funktioniert.
Ressourcennutzung
In Cloud Composer 3 wird der Cluster Ihrer Umgebung automatisch skaliert. Zusätzliche Arbeitslasten, die Sie mit KubernetesPodOperator ausführen, werden unabhängig von Ihrer Umgebung skaliert. Ihre Umgebung ist nicht von der erhöhten Ressourcennachfrage betroffen, aber der Cluster Ihrer Umgebung wird je nach Ressourcenbedarf skaliert.
Die Preise für zusätzliche Arbeitslasten, die Sie im Cluster Ihrer Umgebung ausführen, richten sich nach dem Cloud Composer 3-Preismodell und verwenden Cloud Composer 3-SKUs.
Cloud Composer 3 verwendet Autopilot-Cluster, die das Konzept von Compute-Klassen einführen:
Cloud Composer unterstützt nur die Compute-Klasse
general-purpose
.Wenn keine Klasse ausgewählt ist, wird standardmäßig die Klasse
general-purpose
verwendet, wenn Sie Pods mit KubernetesPodOperator erstellen.Jede Klasse ist mit bestimmten Eigenschaften und Ressourcenlimits verknüpft. Weitere Informationen finden Sie in der Autopilot-Dokumentation. Pods, die in der
general-purpose
-Klasse ausgeführt werden, können beispielsweise bis zu 110 GiB Arbeitsspeicher verbrauchen.
Zugriff auf die Ressourcen des Projekts
In Cloud Composer 3 befindet sich der Cluster Ihrer Umgebung im Kundenprojekt. Pods werden im Cluster der Umgebung in einem isolierten Namespace ausgeführt.
In Cloud Composer 3 werden Pods immer im Namespace composer-user-workloads
ausgeführt, auch wenn ein anderer Namespace angegeben ist.
Pods in diesem Namespace können ohne zusätzliche Konfiguration auf Google CloudRessourcen in Ihrem Projekt und auf Ihr VPC-Netzwerk (falls aktiviert) zugreifen.
Der Zugriff auf diese Ressourcen erfolgt über das Dienstkonto Ihrer Umgebung. Es ist nicht möglich, ein anderes Dienstkonto anzugeben.
Minimalkonfiguration
Zum Erstellen eines KubernetesPodOperator sind nur die Pod-Parameter name
, image
und task_id
erforderlich. Die /home/airflow/composer_kube_config
enthält Anmeldedaten für die Authentifizierung bei GKE.
Zusätzliche Konfiguration
In diesem Beispiel sind zusätzliche Parameter zu sehen, die Sie im KubernetesPodOperator konfigurieren können.
Weitere Informationen finden Sie in den folgenden Ressourcen:
Informationen zur Verwendung von Kubernetes-Secrets und ConfigMaps finden Sie unter Kubernetes-Secrets und ConfigMaps verwenden.
Informationen zur Verwendung von Jinja-Vorlagen mit KubernetesPodOperator finden Sie unter Jinja-Vorlagen verwenden.
Informationen zu unterstützten Werten für Ressourcenanforderungen (CPU, Arbeitsspeicher und Speicher) finden Sie unter Ressourcenanforderungen.
Informationen zu den Parametern von KubernetesPodOperator finden Sie in der Referenz für den Operator in der Airflow-Dokumentation.
Jinja-Vorlagen verwenden
Airflow unterstützt Jinja-Vorlagen in DAGs.
Sie müssen die erforderlichen Airflow-Parameter (task_id
, name
und image
) mit dem Operator deklarieren. Wie im folgenden Beispiel gezeigt, können Sie alle anderen Parameter mit Jinja als Vorlage verwenden, einschließlich cmds
, arguments
, env_vars
und config_file
.
Der Parameter env_vars
wird im Beispiel über eine Airflow-Variable namens my_value
festgelegt. Der Beispiel-DAG bezieht seinen Wert aus der Vorlagenvariablen vars
in Airflow. Airflow bietet mehr Variablen, die Zugriff auf verschiedene Arten von Informationen bieten. So können Sie beispielsweise mit der Vorlagenvariablen conf
auf Werte der Airflow-Konfigurationsoptionen zugreifen. Weitere Informationen und eine Liste der in Airflow verfügbaren Variablen finden Sie in der Airflow-Dokumentation unter Referenz zu Vorlagen.
Ohne den DAG zu ändern oder die Variable env_vars
zu erstellen, schlägt die Aufgabe ex-kube-templates
im Beispiel fehl, da die Variable nicht vorhanden ist. Erstellen Sie diese Variable in der Airflow-Benutzeroberfläche oder mit der Google Cloud CLI:
Airflow-UI
Rufen Sie die Airflow-UI auf.
Klicken Sie in der Symbolleiste auf Verwaltung > Variablen.
Klicken Sie auf der Seite Listenvariable auf Neuen Eintrag hinzufügen.
Geben Sie auf der Seite Add Variable (Variable hinzufügen) die folgenden Informationen ein:
- Key:
my_value
- Val:
example_value
- Key:
Klicken Sie auf Speichern.
gcloud
Geben Sie den folgenden Befehl ein:
gcloud composer environments run ENVIRONMENT \
--location LOCATION \
variables set -- \
my_value example_value
Ersetzen Sie:
ENVIRONMENT
durch den Namen der Umgebung.LOCATION
durch die Region, in der sich die Umgebung befindet.
Das folgende Beispiel zeigt, wie Jinja-Vorlagen mit KubernetesPodOperator verwendet werden:
Kubernetes-Secrets und ConfigMaps verwenden
Ein Kubernetes-Secret ist ein Objekt, das sensible Daten enthält. Eine Kubernetes-ConfigMap ist ein Objekt, das nicht vertrauliche Daten in Schlüssel/Wert-Paaren enthält.
In Cloud Composer 3 können Sie Secrets und ConfigMaps mit der Google Cloud CLI, der API oder Terraform erstellen und dann über den KubernetesPodOperator darauf zugreifen:
- Bei der Google Cloud CLI und API geben Sie eine YAML-Konfigurationsdatei an.
- Mit Terraform definieren Sie Secrets und ConfigMaps als separate Ressourcen in Terraform-Konfigurationsdateien.
YAML-Konfigurationsdateien
Wenn Sie ein Kubernetes-Secret oder ein ConfigMap mit der Google Cloud CLI und API erstellen, müssen Sie eine Datei im YAML-Format angeben. Diese Datei muss demselben Format entsprechen wie bei Kubernetes-Secrets und ConfigMaps. Die Kubernetes-Dokumentation enthält viele Codebeispiele für ConfigMaps und Secrets. Sehen Sie sich als Erstes die Seite Anmeldedaten mit Secrets sicher verteilen und ConfigMaps an.
Wie bei Kubernetes-Secrets sollten Sie die Base64-Darstellung verwenden, wenn Sie Werte in Secrets definieren.
Sie können einen Wert mit dem folgenden Befehl codieren. Dies ist eine von vielen Möglichkeiten, einen base64-codierten Wert zu erhalten:
echo "postgresql+psycopg2://root:example-password@127.0.0.1:3306/example-db" -n | base64
Ausgabe:
cG9zdGdyZXNxbCtwc3ljb3BnMjovL3Jvb3Q6ZXhhbXBsZS1wYXNzd29yZEAxMjcuMC4wLjE6MzMwNi9leGFtcGxlLWRiIC1uCg==
Die folgenden beiden YAML-Dateibeispiele werden später in diesem Leitfaden in Beispielen verwendet. Beispiel für eine YAML-Konfigurationsdatei für ein Kubernetes-Secret:
apiVersion: v1
kind: Secret
metadata:
name: airflow-secrets
data:
sql_alchemy_conn: cG9zdGdyZXNxbCtwc3ljb3BnMjovL3Jvb3Q6ZXhhbXBsZS1wYXNzd29yZEAxMjcuMC4wLjE6MzMwNi9leGFtcGxlLWRiIC1uCg==
Ein weiteres Beispiel, das zeigt, wie Dateien eingefügt werden. Wie im vorherigen Beispiel: Codieren Sie zuerst den Inhalt einer Datei (cat ./key.json | base64
) und geben Sie diesen Wert dann in der YAML-Datei an:
apiVersion: v1
kind: Secret
metadata:
name: service-account
data:
service-account.json: |
ewogICJ0eXBl...mdzZXJ2aWNlYWNjb3VudC5jb20iCn0K
Beispiel für eine YAML-Konfigurationsdatei für eine ConfigMap. Sie müssen die Base64-Darstellung in ConfigMaps nicht verwenden:
apiVersion: v1
kind: ConfigMap
metadata:
name: example-configmap
data:
example_key: example_value
Kubernetes-Secrets verwalten
gcloud
Secret erstellen
Führen Sie den folgenden Befehl aus, um ein Kubernetes-Secret zu erstellen:
gcloud beta composer environments user-workloads-secrets create \
--environment ENVIRONMENT_NAME \
--location LOCATION \
--secret-file-path SECRET_FILE
Ersetzen Sie Folgendes:
ENVIRONMENT_NAME
: der Name Ihrer UmgebungLOCATION
: die Region, in der sich die Umgebung befindet.SECRET_FILE
: Pfad zu einer lokalen YAML-Datei, die die Konfiguration des Geheimnisses enthält.
Beispiel:
gcloud beta composer environments user-workloads-secrets create \
--environment example-environment \
--location us-central1 \
--secret-file-path ./secrets/example-secret.yaml
Secret aktualisieren
Führen Sie den folgenden Befehl aus, um ein Kubernetes-Secret zu aktualisieren. Der Name des Secrets wird aus der angegebenen YAML-Datei übernommen und der Inhalt des Secrets wird ersetzt.
gcloud beta composer environments user-workloads-secrets update \
--environment ENVIRONMENT_NAME \
--location LOCATION \
--secret-file-path SECRET_FILE
Ersetzen Sie Folgendes:
ENVIRONMENT_NAME
: der Name Ihrer UmgebungLOCATION
: die Region, in der sich die Umgebung befindet.SECRET_FILE
: Pfad zu einer lokalen YAML-Datei, die die Konfiguration des Geheimnisses enthält. Geben Sie den Namen des Geheimnisses in diesem Feld an:metadata
>name
.
Secrets auflisten
Führen Sie den folgenden Befehl aus, um eine Liste der Secrets und ihrer Felder für eine Umgebung abzurufen. Schlüsselwerte in der Ausgabe werden durch Sternchen ersetzt.
gcloud beta composer environments user-workloads-secrets list \
--environment ENVIRONMENT_NAME \
--location LOCATION
Ersetzen Sie Folgendes:
ENVIRONMENT_NAME
: der Name Ihrer UmgebungLOCATION
: die Region, in der sich die Umgebung befindet.
Details zum Secret abrufen
Führen Sie den folgenden Befehl aus, um ausführliche Informationen zu einem Secret zu erhalten. Schlüsselwerte in der Ausgabe werden durch Sternchen ersetzt.
gcloud beta composer environments user-workloads-secrets describe \
SECRET_NAME \
--environment ENVIRONMENT_NAME \
--location LOCATION
Ersetzen Sie Folgendes:
SECRET_NAME
: der Name des Secrets, wie er im Feldmetadata
>name
in der YAML-Datei mit der Konfiguration des Secrets definiert wurde.ENVIRONMENT_NAME
: der Name Ihrer UmgebungLOCATION
: die Region, in der sich die Umgebung befindet.
Secret löschen
Führen Sie den folgenden Befehl aus, um ein Secret zu löschen:
gcloud beta composer environments user-workloads-secrets delete \
SECRET_NAME \
--environment ENVIRONMENT_NAME \
--location LOCATION
SECRET_NAME
: der Name des Secrets, wie er im Feldmetadata
>name
in der YAML-Datei mit der Konfiguration des Secrets definiert wurde.ENVIRONMENT_NAME
: der Name Ihrer UmgebungLOCATION
: die Region, in der sich die Umgebung befindet.
API
Secret erstellen
Erstellen Sie eine
environments.userWorkloadsSecrets.create
-API-Anfrage.In dieser Anfrage:
- Geben Sie im Anfragetext im Feld
name
den URI für das neue Secret an. - Geben Sie im Anfragetext im Feld
data
Schlüssel und base64-codierte Werte für das Secret an.
- Geben Sie im Anfragetext im Feld
Beispiel:
// 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="
}
}
Secret aktualisieren
Erstellen Sie eine
environments.userWorkloadsSecrets.update
-API-Anfrage.In dieser Anfrage:
- Geben Sie im Anfragetext im Feld
name
den URI des Geheimnisses an. - Geben Sie im Anfragetext im Feld
data
Schlüssel und base64-codierte Werte für das Secret an. Die Werte werden ersetzt.
- Geben Sie im Anfragetext im Feld
Beispiel:
// 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=="
}
}
Secrets auflisten
Erstellen Sie eine environments.userWorkloadsSecrets.list
-API-Anfrage. Schlüsselwerte in der Ausgabe werden durch Sternchen ersetzt. Für diese Anfrage kann die Paginierung verwendet werden. Weitere Informationen finden Sie in der Referenz der Anfrage.
Beispiel:
// GET https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment/userWorkloadsSecrets
Details zum Secret abrufen
Erstellen Sie eine environments.userWorkloadsSecrets.get
-API-Anfrage. Schlüsselwerte in der Ausgabe werden durch Sternchen ersetzt.
Beispiel:
// GET https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment/userWorkloadsSecrets/example-secret
Secret löschen
Erstellen Sie eine environments.userWorkloadsSecrets.delete
-API-Anfrage.
Beispiel:
// DELETE https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment/userWorkloadsSecrets/example-secret
Terraform
Die Ressource google_composer_user_workloads_secret
definiert ein Kubernetes-Secret mit Schlüsseln und Werten, die im Block data
definiert sind.
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
: Der Name der Ressourcen der Umgebung, die die Definition der Umgebung in Terraform enthält. Der Name der tatsächlichen Umgebung wird ebenfalls in dieser Ressource angegeben.LOCATION
: die Region, in der sich die Umgebung befindet.SECRET_NAME
: der Name des Secrets.KEY_NAME
: mindestens ein Schlüssel für dieses Secret.KEY_VALUE
: Base64-codierter Wert für den Schlüssel. Sie können den Wert mit der Funktionbase64encode
codieren (siehe Beispiel).
Die folgenden beiden Beispiele für Kubernetes-Secrets werden später in diesem Leitfaden in Beispielen verwendet.
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")
}
}
Ein weiteres Beispiel, das zeigt, wie Dateien eingefügt werden. Mit der Funktion file
können Sie den Inhalt der Datei als String lesen und dann mit Base64 codieren:
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"))
}
}
Kubernetes-Secrets in DAGs verwenden
Dieses Beispiel zeigt zwei Möglichkeiten für die Verwendung von Kubernetes Secrets: als Umgebungsvariable und als vom Pod bereitgestelltes Volume.
Das erste Secret, airflow-secrets
, ist auf eine Kubernetes-Umgebungsvariable namens SQL_CONN
festgelegt (nicht auf eine Airflow- oder Cloud Composer-Umgebungsvariable).
Das zweite Secret, service-account
, stellt service-account.json
, eine Datei mit einem Dienstkontotoken, in /var/secrets/google
bereit.
Die Secret-Objekte sehen so aus:
Der Name des ersten Kubernetes-Secrets wird in der Variablen secret_env
definiert.
Dieses Secret heißt airflow-secrets
. Der Parameter deploy_type
gibt an, dass er als Umgebungsvariable verfügbar gemacht werden muss. Der Name der Umgebungsvariablen lautet SQL_CONN
, wie im Parameter deploy_target
angegeben. Schließlich wird der Wert der Umgebungsvariablen SQL_CONN
auf den Wert des Schlüssels sql_alchemy_conn
festgelegt.
Der Name des zweiten Kubernetes-Secrets wird in der Variablen secret_volume
definiert. Dieses Secret heißt service-account
. Es wird als Volume bereitgestellt, wie im Parameter deploy_type
angegeben. Der Pfad der bereitzustellenden Datei (deploy_target
) lautet /var/secrets/google
. Schließlich lautet der key
des Secrets, das in deploy_target
gespeichert ist, service-account.json
.
Die Operatorkonfiguration sieht so aus:
Kubernetes-ConfigMaps verwalten
gcloud
ConfigMap erstellen
Führen Sie den folgenden Befehl aus, um eine ConfigMap zu erstellen:
gcloud beta composer environments user-workloads-config-maps create \
--environment ENVIRONMENT_NAME \
--location LOCATION \
--config-map-file-path CONFIG_MAP_FILE
Ersetzen Sie Folgendes:
ENVIRONMENT_NAME
: der Name Ihrer UmgebungLOCATION
: die Region, in der sich die Umgebung befindet.CONFIG_MAP_FILE
: Pfad zu einer lokalen YAML-Datei, die die Konfiguration des ConfigMaps enthält.
Beispiel:
gcloud beta composer environments user-workloads-config-maps create \
--environment example-environment \
--location us-central1 \
--config-map-file-path ./configs/example-configmap.yaml
ConfigMap aktualisieren
Führen Sie den folgenden Befehl aus, um eine ConfigMap zu aktualisieren. Der Name der ConfigMap wird aus der angegebenen YAML-Datei übernommen und der Inhalt der ConfigMap wird ersetzt.
gcloud beta composer environments user-workloads-config-maps update \
--environment ENVIRONMENT_NAME \
--location LOCATION \
--config-map-file-path CONFIG_MAP_FILE
Ersetzen Sie Folgendes:
ENVIRONMENT_NAME
: der Name Ihrer UmgebungLOCATION
: die Region, in der sich die Umgebung befindet.CONFIG_MAP_FILE
: Pfad zu einer lokalen YAML-Datei, die die Konfiguration des ConfigMaps enthält. Geben Sie den Namen der ConfigMap in dieser Datei im Feldmetadata
>name
an.
ConfigMaps auflisten
Führen Sie den folgenden Befehl aus, um eine Liste der ConfigMaps und ihrer Felder für eine Umgebung abzurufen. Schlüsselwerte in der Ausgabe werden unverändert angezeigt.
gcloud beta composer environments user-workloads-config-maps list \
--environment ENVIRONMENT_NAME \
--location LOCATION
Ersetzen Sie Folgendes:
ENVIRONMENT_NAME
: der Name Ihrer UmgebungLOCATION
: die Region, in der sich die Umgebung befindet.
Details der ConfigMap abrufen
Führen Sie den folgenden Befehl aus, um ausführliche Informationen zu einer ConfigMap zu erhalten. Schlüsselwerte in der Ausgabe werden unverändert angezeigt.
gcloud beta composer environments user-workloads-config-maps describe \
CONFIG_MAP_NAME \
--environment ENVIRONMENT_NAME \
--location LOCATION
Ersetzen Sie Folgendes:
CONFIG_MAP_NAME
: der Name der ConfigMap, wie er im Feldmetadata
>name
in der YAML-Datei mit der Konfiguration der ConfigMap definiert wurde.ENVIRONMENT_NAME
: der Name Ihrer UmgebungLOCATION
: die Region, in der sich die Umgebung befindet.
ConfigMap löschen
Führen Sie den folgenden Befehl aus, um eine ConfigMap zu löschen:
gcloud beta composer environments user-workloads-config-maps delete \
CONFIG_MAP_NAME \
--environment ENVIRONMENT_NAME \
--location LOCATION
CONFIG_MAP_NAME
: der Name der ConfigMap, wie er im Feldmetadata
>name
in der YAML-Datei mit der Konfiguration der ConfigMap definiert wurde.ENVIRONMENT_NAME
: der Name Ihrer UmgebungLOCATION
: die Region, in der sich die Umgebung befindet.
API
ConfigMap erstellen
Erstellen Sie eine
environments.userWorkloadsConfigMaps.create
-API-Anfrage.In dieser Anfrage:
- Geben Sie im Anfragetext im Feld
name
den URI für die neue ConfigMap an. - Geben Sie im Anfragetext im Feld
data
Schlüssel und Werte für die ConfigMap an.
- Geben Sie im Anfragetext im Feld
Beispiel:
// 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"
}
}
ConfigMap aktualisieren
Erstellen Sie eine
environments.userWorkloadsConfigMaps.update
-API-Anfrage.In dieser Anfrage:
- Geben Sie im Anfragetext im Feld
name
den URI der ConfigMap an. - Geben Sie im Anfragetext im Feld
data
Schlüssel und Werte für die ConfigMap an. Die Werte werden ersetzt.
- Geben Sie im Anfragetext im Feld
Beispiel:
// 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"
}
}
ConfigMaps auflisten
Erstellen Sie eine environments.userWorkloadsConfigMaps.list
-API-Anfrage. Schlüsselwerte in der Ausgabe werden unverändert angezeigt. Bei dieser Anfrage kann die Paginierung verwendet werden. Weitere Informationen finden Sie in der Referenz der Anfrage.
Beispiel:
// GET https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment/userWorkloadsConfigMaps
Details der ConfigMap abrufen
Erstellen Sie eine environments.userWorkloadsConfigMaps.get
-API-Anfrage. Schlüsselwerte in der Ausgabe werden unverändert angezeigt.
Beispiel:
// GET https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment/userWorkloadsConfigMaps/example-configmap
ConfigMap löschen
Erstellen Sie eine environments.userWorkloadsConfigMaps.delete
-API-Anfrage.
Beispiel:
// DELETE https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment/userWorkloadsConfigMaps/example-configmap
Terraform
Die Ressource google_composer_user_workloads_config_map
definiert eine ConfigMap mit Schlüsseln und Werten, die im Block data
definiert sind.
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
: Der Name der Ressourcen der Umgebung, die die Definition der Umgebung in Terraform enthält. Der Name der tatsächlichen Umgebung wird ebenfalls in dieser Ressource angegeben.LOCATION
: die Region, in der sich die Umgebung befindet.CONFIG_MAP_NAME
: der Name der ConfigMap.KEY_NAME
: einen oder mehrere Schlüssel für diese ConfigMap.KEY_VALUE
: Wert für den Schlüssel.
Beispiel:
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"
}
}
ConfigMaps in Ihren DAGs verwenden
In diesem Beispiel wird gezeigt, wie Sie ConfigMaps in Ihren DAGs verwenden.
Im folgenden Beispiel wird ein ConfigMap über den Parameter configmaps
übergeben.
Alle Schlüssel dieser ConfigMap sind als Umgebungsvariablen verfügbar:
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",
)
Das folgende Beispiel zeigt, wie eine ConfigMap als Volume bereitgestellt wird:
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",
)
Informationen zum CNCF-Kubernetes-Anbieter
KubernetesPodOperator ist im apache-airflow-providers-cncf-kubernetes
-Anbieter implementiert.
Ausführliche Versionshinweise für CNCF-Kubernetes-Anbieter finden Sie auf der Website des CNCF-Kubernetes-Anbieters.
Ressourcenanforderungen
Cloud Composer 3 unterstützt die folgenden Werte für die Ressourcenanforderungen. Ein Beispiel für die Verwendung von Ressourcenanforderungen finden Sie unter Zusätzliche Konfiguration.
Ressource | Minimum | Maximum | Schritt |
---|---|---|---|
CPU | 0,25 | 32 | Schrittwerte: 0,25, 0,5, 1, 2, 4, 6, 8, 10, …, 32. Angeforderte Werte werden auf den nächsten unterstützten Schrittwert aufgerundet (z. B. von 5 auf 6). |
Speicher | 2G (GB) | 128 G (GB) | Schrittwerte: 2, 3, 4, 5, …, 128. Angeforderte Werte werden auf den nächsten unterstützten Schrittwert aufgerundet (z. B. 3, 5G auf 4G). |
Speicher | - | 100 G (GB) | Beliebiger Wert. Wenn mehr als 100 GB angefordert werden, werden nur 100 GB bereitgestellt. |
Weitere Informationen zu Ressourceneinheiten in Kubernetes finden Sie unter Ressourceneinheiten in Kubernetes.
Fehlerbehebung
In diesem Abschnitt finden Sie Tipps zur Behebung häufiger Probleme mit KubernetesPodOperator:
Logs ansehen
Prüfen Sie bei der Fehlerbehebung die Protokolle in der folgenden Reihenfolge:
Airflow-Task-Logs:
Rufen Sie in der Google Cloud Console die Seite Umgebungen auf.
Klicken Sie in der Liste der Umgebungen auf den Namen Ihrer Umgebung. Die Seite Umgebungsdetails wird geöffnet.
Rufen Sie den Tab DAGs auf.
Klicken Sie auf den Namen des DAG und dann auf die DAG-Ausführung, um die Details und Protokolle aufzurufen.
Airflow-Planer-Logs:
Rufen Sie die Seite Umgebungsdetails auf.
Rufen Sie den Tab Protokolle auf.
Prüfen Sie die Logs des Airflow-Planers.
Logs für Nutzerarbeitslasten:
Rufen Sie die Seite Umgebungsdetails auf.
Rufen Sie den Tab Monitoring auf.
Wählen Sie Nutzerarbeitslasten aus.
Prüfen Sie die Liste der ausgeführten Arbeitslasten. Sie können sich die Protokolle und Informationen zur Ressourcennutzung für jede Arbeitslast ansehen.
Rückgabecodes ungleich null
Wenn Sie KubernetesPodOperator (und GKEStartPodOperator) verwenden, bestimmt der Rückgabecode des Einstiegspunkts des Containers, ob die Aufgabe als erfolgreich betrachtet wird oder nicht. Rückgabecodes mit einem Wert ungleich null weisen auf einen Fehler hin.
Ein gängiges Muster besteht darin, ein Shell-Script als Container-Einstiegspunkt auszuführen, um mehrere Vorgänge innerhalb des Containers zusammenzufassen.
Wenn Sie ein solches Skript schreiben, sollten Sie den Befehl set -e
oben im Skript einfügen, sodass fehlgeschlagene Befehle im Skript das Skript beenden und den Fehler an die Airflow-Aufgabeninstanz weiterleiten.
Pod-Zeitüberschreitungen
Das Standardzeitlimit für KubernetesPodOperator beträgt 120 Sekunden. Dies kann zu Zeitüberschreitungen führen, bevor größere Images heruntergeladen sind. Sie können das Zeitlimit erhöhen, wenn Sie beim Erstellen des KubernetesPodOperators den Parameter startup_timeout_seconds
ändern.
Wenn eine Pod-Zeitüberschreitung auftritt, ist das aufgabenspezifische Log in der Airflow-UI verfügbar. Beispiel:
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
Pod-Zeitüberschreitungen können auch auftreten, wenn das Cloud Composer-Dienstkonto nicht die erforderlichen IAM-Berechtigungen zum Ausführen der jeweiligen Aufgabe hat. Das können Sie prüfen, wenn Sie sich in den GKE-Dashboards die Fehler auf Pod-Ebene in den Logs für die jeweilige Arbeitslast ansehen oder Cloud Logging verwenden.
KubernetesPodOperator-Aufgaben schlagen fehl, wenn eine große Anzahl von Aufgaben ausgeführt wird
Wenn in Ihrer Umgebung gleichzeitig eine große Anzahl von KubernetesPodOperator- oder KubernetesExecutor-Aufgaben ausgeführt wird, akzeptiert Cloud Composer 3 erst dann neue Aufgaben, wenn einige der vorhandenen Aufgaben abgeschlossen sind.
Weitere Informationen zur Fehlerbehebung bei diesem Problem finden Sie unter Fehlerbehebung bei KubernetesExecutor-Aufgaben.