feat(agent): publish the k8s scope env to every k8s worker and take cluster_name as input - #578
Conversation
…luster_name as input The deploy/DNS env used to be hardcoded into a patch for the containers package only. Any other package running the k8s scope code under an overlay (scheduled task, datadog) needed a hand-written patch in the root module, and CLUSTER_NAME could only reach the worker via extra_envs. - worker_k8s_packages (default ["containers"]): one env patch per listed package, replacing worker_container_patch. - cluster_name: published as CLUSTER_NAME to those workers when set; omitted when empty so it cannot shadow a value passed via extra_envs. Default output is unchanged. Four new tests.
035f404 to
751b531
Compare
…f the k8s env extra_envs is merged last, so a value passed there always wins; and create_role reads $CLUSTER_NAME directly, for which empty and unset are the same. The conditional bought nothing.
|
Simplificado: |
|
Probado en una instalación real (EKS, agent 3.0.0 / aws-0.11.1-nonroot, scopes v1.16.2), apuntando el
Tests del módulo 33/33, CI en verde. |
…mpty The k8s scope needs it to resolve the EKS OIDC provider; an empty value only surfaced inside create-scope as an AWS error. Same precondition pattern as aws_iam_role_arn; extra_envs.CLUSTER_NAME is still accepted so existing installations keep working.
|
Tomado el comentario sobre el default de |
🤖 I have created a release *beep* *boop* --- ## [7.7.0](v7.6.0...v7.7.0) (2026-09-09) ### Features * **agent:** publish the k8s scope env to every k8s worker and take cluster_name as input ([#578](#578)) ([cd1fc41](cd1fc41)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
El problema
El módulo arma un patch con el env que necesita el scope k8s (
DNS_TYPE,K8S_NAMESPACE, las tres rutas de templates,TRAFFIC_CONTAINER_IMAGE, los gateways, másextra_envs) y lo aplica a un solo package, hardcodeado:containers.Eso asume que el scope k8s corre únicamente en el worker de
containers. No es así. Ennullplatform/scopeshay un solo código de scope k8s, y varios packages lo ejecutan:containerslo corre tal cual: imagenscopes/containers,NP_SERVICE_PATH=/app/pkg/k8s.scheduled-taskcorre el mismo código con un overlay: la imagenscopes/scheduled-taskhorneaNP_SERVICE_PATH=/app/pkg/k8syNP_OVERRIDES_PATH=/app/pkg/scheduled_task. El overlay solo reemplaza algunos pasos (CronJob en vez de Deployment, saltea networking); todo lo demás esk8s/leyendo las mismas variables.containers-datadoges el mismo patrón conNP_OVERRIDES_PATH=/app/pkg/datadog.Es decir: dos packages distintos, dos imágenes distintas, dos workers distintos, pero el código que lee
DNS_TYPE,K8S_NAMESPACEoCLUSTER_NAMEes exactamente el mismo archivo dek8s/. El módulo hoy le da ese env a uno y al otro nada.La única salida para una instalación con scheduled task es escribir a mano en su root module un patch como este:
Con dos problemas que medimos en una instalación real:
DNS_TYPEel default esroute53, y el create del scheduled task se quedó 300 segundos enwait for albhasta el timeout, porque ese paso solo se saltea cuandoDNS_TYPEes otro valor. Cada instalación tiene que adivinar qué subconjunto del env del módulo necesita el overlay, y equivocarse cuesta un timeout por acción.CLUSTER_NAMEno tiene input en el módulo.scope/iam/create_rolelo lee del env para encontrar el OIDC provider del cluster. Hoy la única manera de que llegue al worker es colarlo porextra_envs, que está pensado para lo que el módulo no conoce, no para una variable que el propio scope k8s exige.Qué cambia
Dos inputs nuevos en
nullplatform/agent:worker_k8s_packages,list(string), default["containers"]. El módulo genera el patch de env una vez por cada package de la lista, en lugar del patch único paracontainers. La pregunta que responde la lista es "¿qué packages corren el código del scope k8s?", y la respuesta la conoce quien instala, no el módulo.cluster_name,string, obligatorio cuandocloud_provider = "aws". Se publica comoCLUSTER_NAMEa esos workers, una entrada más del mismo mapa queDNS_TYPEoK8S_NAMESPACE. Como el scope lo necesita para armar el OIDC del rol IAM, una precondition (el mismo patrón queaws_iam_role_arn) hace fallar el plan si falta, en vez de descubrirlo dentro decreate-scopecon un error de AWS. Quien todavía lo pasa porextra_envs.CLUSTER_NAMEsigue pasando la validación y sigue funcionando, porqueextra_envsse mergea último.worker_orchestrated_packagesno cambia de significado: sigue diciendo qué packages corren como worker (service account, memoria).worker_k8s_packagesdice cuáles de esos, además, corren el scope k8s.Qué ganamos
worker_k8s_packages = ["containers", "scheduled-task"]. Y ya no hay un subconjunto que adivinar: cada worker k8s recibe todo lo que el código dek8s/puede leer.CLUSTER_NAMEdeja de ser un truco. Es un input con nombre y descripción, al lado denamespaceydns_type, en vez de una clave suelta enextra_envsque nadie sabe por qué está.Compatibilidad
Con los defaults, el patch de env sigue siendo uno solo, con target
containers, y la única diferencia en los values es la líneaCLUSTER_NAMEen ese patch. Una instalación AWS existente ya pasaCLUSTER_NAMEporextra_envs(era la única forma), así que pasa la precondition y no cambia de comportamiento con solo bumpear la versión; la única que falla en el plan es la que no lo pasaba por ningún lado, y esa hoy falla en runtime en cada create-scope.Tests
Cinco runs nuevos en
agent_values.tftest.hcl: por default el env llega solo acontainersy a ningún otro package; con["containers", "scheduled-task"]llega a los dos;cluster_name = "my-eks"aparece comoCLUSTER_NAMEen el worker; sincluster_nameen AWS el plan falla en la precondition; conextra_envs.CLUSTER_NAMEsigue pasando. La suite del módulo queda en 34/34.Relacionado
Es la segunda de las tres cosas que salieron de migrar una instalación a workers y que obligan a copiar internals del módulo en el root module. La primera fue #576 (
worker_ingress), ya publicada en 7.6.0; este branch está rebaseado sobre ella.