Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1
Esta página descreve como usar o KubernetesPodOperator para implantar pods do Kubernetes do Cloud Composer no cluster do Google Kubernetes Engine que faz parte do seu ambiente do Cloud Composer.
O KubernetesPodOperator inicia pods do Kubernetes no cluster do seu ambiente. Os operadores do Google Kubernetes Engine executam pods do Kubernetes em um cluster especificado, que pode ser um cluster separado não relacionado ao seu ambiente. Também é possível criar e excluir clusters usando os operadores do Google Kubernetes Engine.
O KubernetesPodOperator é uma boa opção se você precisar de:
- Dependências personalizadas do Python que não estão disponíveis no repositório PyPI público.
- Dependências binárias que não estão disponíveis na imagem do worker do Cloud Composer.
Antes de começar
Confira a lista de diferenças entre o KubernetesPodOperator no Cloud Composer 3 e no Cloud Composer 2 e verifique se os DAGs são compatíveis:
Não é possível criar namespaces personalizados no Cloud Composer 3. Os pods sempre são executados no namespace
composer-user-workloads
, mesmo que um namespace diferente seja especificado. Os pods nesse namespace têm acesso aos recursos e à rede VPC do seu projeto (se ativada) sem configuração adicional.Não é possível executar vários contêineres secundários adicionais no Cloud Composer 3. Você pode executar um único contêiner sidecar se ele for chamado de
airflow-xcom-sidecar
.Não é possível criar Secrets e ConfigMaps do Kubernetes usando a API Kubernetes. Em vez disso, o Cloud Composer oferece comandos da Google Cloud CLI, recursos do Terraform e a API Cloud Composer para gerenciar secrets do Kubernetes e ConfigMaps. Para mais informações, consulte Usar secrets e ConfigMaps do Kubernetes.
Não é possível implantar cargas de trabalho personalizadas no Cloud Composer 3. Somente Secrets e ConfigMaps do Kubernetes podem ser modificados. Todas as outras mudanças de configuração não são possíveis.
Os requisitos de recursos (CPU, memória e armazenamento) precisam ser especificados usando valores compatíveis.
Assim como no Cloud Composer 2, a configuração de afinidade de pod não está disponível. Se você quiser usar a afinidade de pod, use os operadores do GKE para iniciar pods em um cluster diferente.
Sobre o KubernetesPodOperator no Cloud Composer 3
Esta seção descreve como o KubernetesPodOperator funciona no Cloud Composer 3.
Uso de recursos
No Cloud Composer 3, o cluster do ambiente é escalonado automaticamente. As cargas de trabalho extras que você executa usando o KubernetesPodOperator são escalonadas independentemente do ambiente. Seu ambiente não é afetado pelo aumento da demanda de recursos, mas o cluster do ambiente aumenta ou diminui dependendo da demanda de recursos.
Os preços das cargas de trabalho extras executadas no cluster do ambiente seguem o modelo de preços do Cloud Composer 3 e usam as SKUs do Cloud Composer 3.
O Cloud Composer 3 usa clusters do Autopilot, que introduzem a noção de classes de computação:
O Cloud Composer é compatível apenas com a classe de computação
general-purpose
.Por padrão, se nenhuma classe for selecionada, a classe
general-purpose
será assumida quando você criar pods usando o KubernetesPodOperator.Cada classe está associada a propriedades e limites de recursos específicos. Leia sobre eles na documentação do Autopilot. Por exemplo, os pods executados na classe
general-purpose
podem usar até 110 GiB de memória.
Acesso aos recursos do projeto
No Cloud Composer 3, o cluster do ambiente está localizado no projeto do locatário, e não é possível configurá-lo. Os pods são executados no cluster do ambiente, em um namespace isolado.
No Cloud Composer 3, os pods sempre são executados no namespace composer-user-workloads
, mesmo que um namespace diferente seja especificado.
Os pods nesse namespace podem acessar recursos Google Cloud
no seu projeto e na sua rede VPC (se
ela estiver ativada) sem configuração adicional.
A conta de serviço do seu ambiente é usada para acessar esses
recursos. Não é possível especificar uma conta de serviço diferente.
Configuração mínima
Para criar um KubernetesPodOperator, somente os parâmetros name
, image
e
task_id
do pod são obrigatórios. O /home/airflow/composer_kube_config
contém credenciais para autenticação no GKE.
Configurações avançadas
Este exemplo mostra outros parâmetros que podem ser configurados no KubernetesPodOperator.
Consulte os seguintes recursos para mais informações:
Para informações sobre como usar Secrets e ConfigMaps do Kubernetes, consulte Usar Secrets e ConfigMaps do Kubernetes.
Para informações sobre como usar modelos Jinja com o KubernetesPodOperator, consulte Usar modelos Jinja.
Para informações sobre valores aceitos para requisitos de recursos (CPU, memória e armazenamento), consulte Requisitos de recursos.
Para informações sobre os parâmetros do KubernetesPodOperator, consulte a referência do operador na documentação do Airflow.
Usar modelos Jinja
O Airflow é compatível com modelos Jinja em DAGs.
Você precisa declarar os parâmetros obrigatórios do Airflow (task_id
, name
e
image
) com o operador. Como mostra o exemplo a seguir,
é possível criar modelos de todos os outros parâmetros com o Jinja, incluindo cmds
,
arguments
, env_vars
e config_file
.
O parâmetro env_vars
no exemplo é definido com base em uma
variável do Airflow chamada my_value
. O DAG de exemplo
recebe o valor da variável de modelo vars
no Airflow. O Airflow tem mais variáveis que fornecem acesso a diferentes tipos de informações. Por exemplo, use a variável de modelo conf
para acessar valores de opções de configuração do Airflow. Para mais informações e a lista de variáveis disponíveis no Airflow, consulte a Referência de modelos na documentação do Airflow.
Sem mudar o DAG ou criar a variável env_vars
, a tarefa
ex-kube-templates
no exemplo falha porque a variável não
existe. Crie essa variável na interface do Airflow ou com a Google Cloud CLI:
IU do Airflow
Acesse a IU do Airflow.
Na barra de ferramentas, selecione Administrador > Variáveis.
Na página Listar variáveis, clique em Adicionar um novo registro.
Na página Adicionar variável, digite as seguintes informações:
- Chave:
my_value
- Val:
example_value
- Chave:
Clique em Save.
gcloud
Digite este comando:
gcloud composer environments run ENVIRONMENT \
--location LOCATION \
variables set -- \
my_value example_value
Substitua:
ENVIRONMENT
pelo nome do ambienteLOCATION
pela região em que o ambiente está localizado;
O exemplo a seguir demonstra como usar modelos Jinja com KubernetesPodOperator:
Usar secrets e ConfigMaps do Kubernetes
Um secret do Kubernetes é um objeto que contém dados sensíveis. Um ConfigMap do Kubernetes é um objeto que contém dados não confidenciais em pares de chave-valor.
No Cloud Composer 3, é possível criar Secrets e ConfigMaps usando a CLI, a API ou o Terraform do Google Cloud e, em seguida, acessar essas informações do KubernetesPodOperator:
- Com a Google Cloud CLI e a API, você fornece um arquivo de configuração YAML.
- Com o Terraform, você define Secrets e ConfigMaps como recursos separados em arquivos de configuração do Terraform.
Sobre arquivos de configuração YAML
Ao criar um secret do Kubernetes ou um ConfigMap usando a Google Cloud CLI e a API, você fornece um arquivo no formato YAML. Esse arquivo precisa seguir o mesmo formato usado por Secrets e ConfigMaps do Kubernetes. A documentação do Kubernetes fornece muitos exemplos de código de ConfigMaps e Secrets. Para começar, consulte as páginas Distribuir credenciais com segurança usando secrets e ConfigMaps.
Assim como nos secrets do Kubernetes, use a representação base64 ao definir valores em secrets.
Para codificar um valor, use o seguinte comando (esta é uma das muitas maneiras de receber um valor codificado em base64):
echo "postgresql+psycopg2://root:example-password@127.0.0.1:3306/example-db" -n | base64
Saída:
cG9zdGdyZXNxbCtwc3ljb3BnMjovL3Jvb3Q6ZXhhbXBsZS1wYXNzd29yZEAxMjcuMC4wLjE6MzMwNi9leGFtcGxlLWRiIC1uCg==
Os dois exemplos de arquivos YAML a seguir são usados em exemplos mais adiante neste guia. Exemplo de arquivo de configuração YAML para um secret do Kubernetes:
apiVersion: v1
kind: Secret
metadata:
name: airflow-secrets
data:
sql_alchemy_conn: cG9zdGdyZXNxbCtwc3ljb3BnMjovL3Jvb3Q6ZXhhbXBsZS1wYXNzd29yZEAxMjcuMC4wLjE6MzMwNi9leGFtcGxlLWRiIC1uCg==
Outro exemplo que demonstra como incluir arquivos. Assim como no exemplo
anterior, primeiro codifique o conteúdo de um arquivo (cat ./key.json | base64
) e
forneça esse valor no arquivo YAML:
apiVersion: v1
kind: Secret
metadata:
name: service-account
data:
service-account.json: |
ewogICJ0eXBl...mdzZXJ2aWNlYWNjb3VudC5jb20iCn0K
Um exemplo de arquivo de configuração YAML para um ConfigMap. Não é necessário usar a representação base64 em ConfigMaps:
apiVersion: v1
kind: ConfigMap
metadata:
name: example-configmap
data:
example_key: example_value
Gerenciar secrets do Kubernetes
gcloud
Criar um secret
Para criar um secret do Kubernetes, execute o seguinte comando:
gcloud beta composer environments user-workloads-secrets create \
--environment ENVIRONMENT_NAME \
--location LOCATION \
--secret-file-path SECRET_FILE
Substitua:
ENVIRONMENT_NAME
: o nome do ambiente;LOCATION
: a região em que o ambiente está localizado.SECRET_FILE
: caminho para um arquivo YAML local que contém a configuração do Secret.
Exemplo:
gcloud beta composer environments user-workloads-secrets create \
--environment example-environment \
--location us-central1 \
--secret-file-path ./secrets/example-secret.yaml
Atualizar um Secret
Para atualizar um secret do Kubernetes, execute o seguinte comando: O nome do secret será extraído do arquivo YAML especificado, e o conteúdo dele será substituído.
gcloud beta composer environments user-workloads-secrets update \
--environment ENVIRONMENT_NAME \
--location LOCATION \
--secret-file-path SECRET_FILE
Substitua:
ENVIRONMENT_NAME
: o nome do ambiente;LOCATION
: a região em que o ambiente está localizado.SECRET_FILE
: caminho para um arquivo YAML local que contém a configuração do Secret. Especifique o nome do Secret no campometadata
>name
desse arquivo.
Listar chaves secretas
Para conferir uma lista de Secrets e os campos deles em um ambiente, execute o comando a seguir. Os valores de chave na saída serão substituídos por asteriscos.
gcloud beta composer environments user-workloads-secrets list \
--environment ENVIRONMENT_NAME \
--location LOCATION
Substitua:
ENVIRONMENT_NAME
: o nome do ambiente;LOCATION
: a região em que o ambiente está localizado.
Conferir detalhes do secret
Para ver informações detalhadas sobre um secret, execute o seguinte comando: Os valores de chave na saída serão substituídos por asteriscos.
gcloud beta composer environments user-workloads-secrets describe \
SECRET_NAME \
--environment ENVIRONMENT_NAME \
--location LOCATION
Substitua:
SECRET_NAME
: o nome do Secret, conforme definido no campometadata
>name
do arquivo YAML com a configuração do Secret.ENVIRONMENT_NAME
: o nome do ambiente;LOCATION
: a região em que o ambiente está localizado.
Excluir um secret
Para excluir um secret, execute o seguinte comando:
gcloud beta composer environments user-workloads-secrets delete \
SECRET_NAME \
--environment ENVIRONMENT_NAME \
--location LOCATION
SECRET_NAME
: o nome do Secret, conforme definido no campometadata
>name
do arquivo YAML com a configuração do Secret.ENVIRONMENT_NAME
: o nome do ambiente;LOCATION
: a região em que o ambiente está localizado.
API
Criar um secret
Crie uma solicitação de API
environments.userWorkloadsSecrets.create
.Nesta solicitação:
- No corpo da solicitação, no campo
name
, especifique o URI do novo Secret. - No corpo da solicitação, no campo
data
, especifique chaves e valores codificados em base64 para o Secret.
- No corpo da solicitação, no campo
Exemplo:
// 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="
}
}
Atualizar um Secret
Crie uma solicitação de API
environments.userWorkloadsSecrets.update
.Nesta solicitação:
- No corpo da solicitação, no campo
name
, especifique o URI do Secret. - No corpo da solicitação, no campo
data
, especifique chaves e valores codificados em base64 para o Secret. Os valores serão substituídos.
- No corpo da solicitação, no campo
Exemplo:
// 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=="
}
}
Listar chaves secretas
Crie uma solicitação de API environments.userWorkloadsSecrets.list
. Os valores de chave na saída serão substituídos por asteriscos. É
possível usar a paginação com essa solicitação. Consulte a referência dela para
mais detalhes.
Exemplo:
// GET https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment/userWorkloadsSecrets
Conferir detalhes do secret
Crie uma solicitação de API environments.userWorkloadsSecrets.get
. Os valores de chave na saída serão substituídos por asteriscos.
Exemplo:
// GET https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment/userWorkloadsSecrets/example-secret
Excluir um secret
Crie uma solicitação de API
environments.userWorkloadsSecrets.delete
.
Exemplo:
// DELETE https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment/userWorkloadsSecrets/example-secret
Terraform
O recurso google_composer_user_workloads_secret
define um secret do Kubernetes, com chaves e valores definidos no bloco
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
: o nome do recurso do ambiente, que contém a definição do ambiente no Terraform. O nome do ambiente real também é especificado nesse recurso.LOCATION
: a região em que o ambiente está localizado.SECRET_NAME
: o nome do secret.KEY_NAME
: uma ou mais chaves para esse Secret.KEY_VALUE
: valor codificado em base64 para a chave. É possível usar a funçãobase64encode
para codificar o valor (consulte o exemplo).
Os dois exemplos a seguir de Secrets do Kubernetes são usados em amostras mais adiante neste guia.
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")
}
}
Outro exemplo que demonstra como incluir arquivos. Use a função file
para ler o conteúdo do arquivo como uma string e codificá-lo em 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"))
}
}
Usar secrets do Kubernetes nos seus DAGs
Neste exemplo, mostramos duas maneiras de usar os Kubernetes Secrets: como uma variável de ambiente e como um volume ativado pelo pod.
O primeiro secret, airflow-secrets
, é definido
como uma variável de ambiente do Kubernetes chamada SQL_CONN
(em vez de uma variável de ambiente do Airflow
ou do Cloud Composer).
O segundo secret, service-account
, instala service-account.json
, um arquivo
com um token de conta de serviço, em /var/secrets/google
.
Veja como são os objetos Secret:
O nome do primeiro secret do Kubernetes é definido na variável secret_env
.
Esse secret é chamado de airflow-secrets
. O parâmetro deploy_type
especifica que ele precisa ser exposto como uma variável de ambiente. O nome da variável de ambiente é SQL_CONN
, conforme especificado no parâmetro deploy_target
. Por fim, o valor da variável de ambiente SQL_CONN
é definido como o valor da chave sql_alchemy_conn
.
O nome do segundo secret do Kubernetes é definido na variável secret_volume
. Esse secret é chamado de service-account
. Ele é exposto como um
volume, conforme especificado no parâmetro deploy_type
. O caminho do arquivo a ser
ativado, deploy_target
, é /var/secrets/google
. Por fim, o key
do
secret armazenado no deploy_target
é service-account.json
.
Veja como é a configuração do operador:
Gerenciar ConfigMaps do Kubernetes
gcloud
Criar um ConfigMap
Para criar um ConfigMap, execute o seguinte comando:
gcloud beta composer environments user-workloads-config-maps create \
--environment ENVIRONMENT_NAME \
--location LOCATION \
--config-map-file-path CONFIG_MAP_FILE
Substitua:
ENVIRONMENT_NAME
: o nome do ambiente;LOCATION
: a região em que o ambiente está localizado.CONFIG_MAP_FILE
: caminho para um arquivo YAML local que contém a configuração do ConfigMap.
Exemplo:
gcloud beta composer environments user-workloads-config-maps create \
--environment example-environment \
--location us-central1 \
--config-map-file-path ./configs/example-configmap.yaml
Atualizar um ConfigMap
Para atualizar um ConfigMap, execute o seguinte comando: O nome do ConfigMap será extraído do arquivo YAML especificado, e o conteúdo do ConfigMap será substituído.
gcloud beta composer environments user-workloads-config-maps update \
--environment ENVIRONMENT_NAME \
--location LOCATION \
--config-map-file-path CONFIG_MAP_FILE
Substitua:
ENVIRONMENT_NAME
: o nome do ambiente;LOCATION
: a região em que o ambiente está localizado.CONFIG_MAP_FILE
: caminho para um arquivo YAML local que contém a configuração do ConfigMap. Especifique o nome do ConfigMap no campometadata
>name
desse arquivo.
Listar ConfigMaps
Para ver uma lista de ConfigMaps e seus campos em um ambiente, execute o comando a seguir. Os valores de chave na saída serão mostrados como estão.
gcloud beta composer environments user-workloads-config-maps list \
--environment ENVIRONMENT_NAME \
--location LOCATION
Substitua:
ENVIRONMENT_NAME
: o nome do ambiente;LOCATION
: a região em que o ambiente está localizado.
Receber detalhes do ConfigMap
Para informações detalhadas sobre um ConfigMap, execute o seguinte comando: Os valores de chave na saída serão mostrados como estão.
gcloud beta composer environments user-workloads-config-maps describe \
CONFIG_MAP_NAME \
--environment ENVIRONMENT_NAME \
--location LOCATION
Substitua:
CONFIG_MAP_NAME
: o nome do ConfigMap, conforme definido no campometadata
>name
do arquivo YAML com a configuração do ConfigMap.ENVIRONMENT_NAME
: o nome do ambiente;LOCATION
: a região em que o ambiente está localizado.
Excluir um ConfigMap
Para excluir um ConfigMap, execute o seguinte comando:
gcloud beta composer environments user-workloads-config-maps delete \
CONFIG_MAP_NAME \
--environment ENVIRONMENT_NAME \
--location LOCATION
CONFIG_MAP_NAME
: o nome do ConfigMap, conforme definido no campometadata
>name
do arquivo YAML com a configuração do ConfigMap.ENVIRONMENT_NAME
: o nome do ambiente;LOCATION
: a região em que o ambiente está localizado.
API
Criar um ConfigMap
Crie uma solicitação de API
environments.userWorkloadsConfigMaps.create
.Nesta solicitação:
- No corpo da solicitação, no campo
name
, especifique o URI do novo ConfigMap. - No corpo da solicitação, no campo
data
, especifique chaves e valores para o ConfigMap.
- No corpo da solicitação, no campo
Exemplo:
// 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"
}
}
Atualizar um ConfigMap
Crie uma solicitação de API
environments.userWorkloadsConfigMaps.update
.Nesta solicitação:
- No corpo da solicitação, no campo
name
, especifique o URI do ConfigMap. - No corpo da solicitação, no campo
data
, especifique chaves e valores para o ConfigMap. Os valores serão substituídos.
- No corpo da solicitação, no campo
Exemplo:
// 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"
}
}
Listar ConfigMaps
Crie uma solicitação de API
environments.userWorkloadsConfigMaps.list
. Os valores de chave na saída serão mostrados como estão. É possível usar a paginação com essa solicitação. Consulte a referência da solicitação para mais detalhes.
Exemplo:
// GET https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment/userWorkloadsConfigMaps
Receber detalhes do ConfigMap
Crie uma solicitação de API
environments.userWorkloadsConfigMaps.get
. Os valores de chave na saída serão mostrados como estão.
Exemplo:
// GET https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment/userWorkloadsConfigMaps/example-configmap
Excluir um ConfigMap
Crie uma solicitação de API
environments.userWorkloadsConfigMaps.delete
.
Exemplo:
// DELETE https://composer.googleapis.com/v1beta1/projects/example-project/
// locations/us-central1/environments/example-environment/userWorkloadsConfigMaps/example-configmap
Terraform
O recurso
google_composer_user_workloads_config_map
define um ConfigMap, com chaves e valores definidos no bloco
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
: o nome do recurso do ambiente, que contém a definição do ambiente no Terraform. O nome do ambiente real também é especificado nesse recurso.LOCATION
: a região em que o ambiente está localizado.CONFIG_MAP_NAME
: o nome do ConfigMap.KEY_NAME
: uma ou mais chaves para este ConfigMap.KEY_VALUE
: valor da chave.
Exemplo:
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"
}
}
Usar ConfigMaps nos seus DAGs
Este exemplo mostra como usar ConfigMaps nos seus DAGs.
No exemplo a seguir, um ConfigMap é transmitido no parâmetro configmaps
.
Todas as chaves deste ConfigMap estão disponíveis como variáveis de ambiente:
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",
)
O exemplo a seguir mostra como montar um ConfigMap como um 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",
)
Informações sobre o provedor do Kubernetes da CNCF
O KubernetesPodOperator é implementado no provedor
apache-airflow-providers-cncf-kubernetes
.
Para notas de lançamento detalhadas do provedor do Kubernetes da CNCF, consulte o site do provedor do Kubernetes da CNCF.
Recursos necessários
O Cloud Composer 3 aceita os seguintes valores para requisitos de recursos. Para ver um exemplo de como usar requisitos de recursos, consulte Configuração adicional.
Recurso | Mínimo | Máximo | Etapa |
---|---|---|---|
CPU | 0,25 | 32 | Valores de intervalo: 0,25, 0,5, 1, 2, 4, 6, 8, 10, ..., 32. Os valores solicitados são arredondados para o valor de etapa compatível mais próximo (por exemplo, de 5 para 6). |
Memória | 2G (GB) | 128G (GB) | Valores de intervalo: 2, 3, 4, 5, ..., 128. Os valores solicitados são arredondados para o valor de etapa compatível mais próximo (por exemplo, 3,5G para 4G). |
Armazenamento | - | 100G (GB) | Qualquer valor Se mais de 100 GB forem solicitados, apenas 100 GB serão fornecidos. |
Para mais informações sobre unidades de recursos no Kubernetes, consulte Unidades de recursos no Kubernetes.
Solução de problemas
Esta seção oferece dicas para solucionar problemas comuns do KubernetesPodOperator:
Ver registros
Ao resolver problemas, verifique os registros na seguinte ordem:
Registros de tarefas do Airflow:
No console Google Cloud , acesse a página Ambientes.
Na lista de ambientes, clique no nome do seu ambiente. A página Detalhes do ambiente é aberta.
Acesse a guia DAGs.
Clique no nome do DAG e depois na execução para conferir os detalhes e os registros.
Registros do programador do Airflow:
Acesse a página Detalhes do ambiente.
Acesse a guia Registros.
Inspecione os registros do agendador do Airflow.
Registros de cargas de trabalho do usuário:
Acesse a página Detalhes do ambiente.
Acesse a guia Monitoramento.
Selecione Cargas de trabalho do usuário.
Inspecione a lista de cargas de trabalho executadas. É possível conferir os registros e as informações de utilização de recursos de cada carga de trabalho.
Códigos de retorno diferentes de zero
Ao usar o KubernetesPodOperator (e o GKEStartPodOperator), o código de retorno do ponto de entrada do contêiner determina se a tarefa é considerada bem-sucedida ou não. Os códigos de retorno diferentes de zero indicam a falha.
Um padrão comum é executar um script de shell como o ponto de entrada do contêiner para agrupar várias operações dentro dele.
Se você estiver escrevendo esse script, recomendamos que inclua o comando
set -e
na parte de cima para que comandos com falha encerrem o script
e propaguem a falha para a instância de tarefa do Airflow.
Tempos limite do pod
O tempo limite padrão para KubernetesPodOperator é de 120 segundos, o que pode resultar na ocorrência de tempos limite antes do download de imagens maiores. É possível aumentar o tempo limite alterando o parâmetro startup_timeout_seconds
ao criar o KubernetesPodOperator.
Quando um pod expira, o registro específico da tarefa fica disponível na IU do Airflow. Exemplo:
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
Os tempos limite do pod também podem ocorrer quando a conta de serviço do Cloud Composer não tiver as permissões necessárias do IAM para executar a tarefa em questão. Para verificar isso, veja os erros no nível do pod usando os painéis do GKE para analisar os registros para uma carga de trabalho específica, ou use o Cloud Logging.
As tarefas do KubernetesPodOperator falham quando um grande número de tarefas é executado
Quando o ambiente executa um grande número de tarefas KubernetesPodOperator ou KubernetesExecutor ao mesmo tempo, o Cloud Composer 3 não aceita novas tarefas até que algumas das tarefas atuais sejam concluídas.
Para mais informações sobre como resolver esse problema, consulte Solução de problemas de tarefas do KubernetesExecutor.