En esta página se explica cómo usar Config Sync y Terraform para crear dinámicamente recursos con ámbito de equipo en una flota de clústeres. Config Sync amplía las funciones de gestión de equipos de flotas para crear y gestionar configuraciones de infraestructura y de clústeres en tus flotas.
En esta guía se da por hecho que ya conoces los conceptos de gestión de equipos de flotas, como los permisos de equipo y los espacios de nombres de flotas. Para obtener más información, consulta el resumen de la gestión de equipos de la flota.
Para ver un tutorial completo con configuraciones de ejemplo, consulta el tutorial sobre el alquiler de flotas en el repositorio de ejemplos.
Para ver una lista de los campos admitidos por Config Sync en Terraform, consulta la documentación de referencia de Terraform sobre las funciones de flotas de GKE.
Ejemplo de flujo de trabajo
Eres un administrador de la plataforma que quiere crear recursos de forma dinámica en una flota de clústeres
en la que diferentes equipos tienen necesidades distintas. Por ejemplo, puede que quieras aplicar un
NetworkPolicy
a los espacios de nombres de tu equipo de backend, pero no a los de tu equipo de frontend.
En este caso, el procedimiento para crear recursos con ámbito de equipo en un espacio de nombres es el siguiente:
- Elige o crea la flota en la que quieras gestionar los recursos de los equipos.
Configura tu fuente de información veraz. La fuente de información contiene los objetos
NamespaceSelector
que usas para seleccionar espacios de nombres a nivel de flota en los ámbitos de tu equipo, así como los recursos (como unNetworkPolicy
) que quieras sincronizar en estos espacios de nombres.Crea la configuración predeterminada a nivel de flota para Config Sync. Config Sync usa estos ajustes predeterminados al sincronizar desde la fuente de información creada en el paso anterior. Estos ajustes de Config Sync se aplican a los nuevos clústeres creados en la flota.
Crea clústeres en tu flota.
Crea los ámbitos y espacios de nombres de los equipos de frontend y backend para que Config Sync pueda detectar y conciliar los recursos de tus espacios de nombres.
Una vez que hayas completado estos pasos, Config Sync creará y aplicará el NetworkPolicy
en función del NamespaceSelector
a los espacios de nombres del equipo de backend. Si cambia o añade algún recurso, Config Sync detecta y aplica continuamente los cambios en los archivos de configuración, los ámbitos de equipo, los espacios de nombres de la flota y los miembros de la flota.
Precios
Las funciones de Config Sync y de gestión de equipos de flotas están disponibles en GKE. Para obtener más información sobre los precios, consulta la página de precios de GKE.
Antes de empezar
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
Install the Google Cloud CLI.
-
Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init
-
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
Install the Google Cloud CLI.
-
Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init
-
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
- Crea o ten acceso a una fuente fiable (un repositorio de Git o una imagen de OCI) donde puedas almacenar tus archivos de configuración. En los ejemplos de esta guía se usa un repositorio de Git.
-
Gestionar recursos de la flota:
Administrador de la flota (antes Administrador de GKE Hub) (
roles/gkehub.admin
) -
Crear clústeres de GKE:
Administrador de clústeres de Kubernetes Engine (
roles/container.clusterAdmin
) Crea un directorio para los archivos de Terraform de configuración de la flota. Añade a ese directorio un archivo
main.tf
y un archivovariables.tf
.En el archivo
variables.tf
, añade las siguientes variables:En el archivo
main.tf
, añade los siguientes recursos:Exporta la variable PROJECT_ID:
export TF_VAR_project=PROJECT_ID
Sustituye
PROJECT_ID
por el ID del proyecto en el que quieras crear tu flota.Inicializa Terraform en el directorio que has creado:
terraform init
Comprueba que los cambios que propones con Terraform coinciden con el plan esperado:
terraform plan
Crea la flota, habilita las APIs y crea la cuenta de servicio:
terraform apply
A veces, puede tardar unos minutos en habilitar todos los servicios.
En tu fuente de información veraz, crea un directorio para los archivos de configuración que quieras que Config Sync sincronice.
Cree un objeto
NamespaceSelector
para cada equipo en el directorio de configuración:apiVersion: configmanagement.gke.io/v1 kind: NamespaceSelector metadata: name: NAMESPACE_SELECTOR_NAME spec: mode: dynamic selector: matchLabels: fleet.gke.io/fleet-scope: SCOPE_NAME
Haz los cambios siguientes:
NAMESPACE_SELECTOR_NAME
: nombre del objetoNamespaceSelector
, por ejemplo,backend-scope
.SCOPE_NAME
: el nombre de tu ámbito de equipo, por ejemplo,backend
.
Los espacios de nombres que forman parte de un espacio de nombres de flota tienen automáticamente la etiqueta
fleet.gke.io/fleet-scope: SCOPE_NAME
. El comandoNamespaceSelector
selecciona todos los espacios de nombres de flota de un permiso de equipo que usen esa etiqueta. Para ver más ejemplos sobre cómo incluir o excluir espacios de nombres, consulta los ejemplos deNamespaceSelector
.Crea los objetos que quieras sincronizar entre espacios de nombres.
Para sincronizar un objeto solo con un equipo concreto, define la siguiente anotación en los metadatos de ese objeto:
annotations: configmanagement.gke.io/namespace-selector: NAMESPACE_SELECTOR_NAME
Por ejemplo, un
NetworkPolicy
del equipo de backend podría ser similar al siguiente:Crea un directorio para los archivos de Terraform de la configuración predeterminada de la flota. Añade a ese directorio un archivo
main.tf
y un archivovariables.tf
.En el archivo
variables.tf
, añade las siguientes variables:En el archivo
main.tf
, añade el siguiente recurso para configurar los ajustes de Config Sync:git
terraform { required_providers { google = { source = "hashicorp/google" version = ">=5.16.0" } } } provider "google" { project = var.project } resource "google_gke_hub_feature" "feature" { name = "configmanagement" location = "global" provider = google fleet_default_member_config { configmanagement { version = "VERSION" config_sync { source_format = "unstructured" git { sync_repo = "REPO" sync_branch = "BRANCH" policy_dir = "DIRECTORY" secret_type = "SECRET" } } } } }
Haz los cambios siguientes:
VERSION
: (opcional) el número de versión de Config Sync. Si se deja en blanco, se usará la versión más reciente.REPO
: la URL del repositorio que contiene los archivos de configuración.BRANCH
: la rama del repositorio, por ejemplo,main
.DIRECTORY
: la ruta del repositorio de Git que representa el nivel superior del repositorio que quieres sincronizar.SECRET
: el tipo de autenticación secreta.
Para ver la lista completa de ajustes admitidos en el bloque
git
de Config Sync, consulta la documentación de referencia de Terraform sobre las funciones de GKE Hub.OCI
terraform { required_providers { google = { source = "hashicorp/google" version = ">=5.16.0" } } } provider "google" { project = var.project } resource "google_gke_hub_feature" "feature" { name = "configmanagement" location = "global" provider = google fleet_default_member_config { configmanagement { version = "VERSION" config_sync { source_format = "unstructured" oci { sync_repo = "REPO" policy_dir = "DIRECTORY" secret_type = "SECRET" } } } } }
Haz los cambios siguientes:
VERSION
: el número de versión de Config Sync. Si se deja en blanco, se usará la versión más reciente.REPO
: la URL del repositorio de imágenes de OCI que contiene los archivos de configuración.DIRECTORY
: la ruta absoluta del directorio que contiene los recursos que quieres sincronizar. Déjalo en blanco para usar el directorio raíz.SECRET
: el tipo de autenticación secreta.
Para ver la lista completa de ajustes admitidos en el bloque
oci
de Config Sync, consulta la documentación de referencia de Terraform sobre las funciones de GKE Hub.Por ejemplo, el siguiente archivo
main.tf
configura Config Sync para sincronizar datos desde un repositorio de Git y sincroniza todos los objetos presentes en el directorioconfig
:Inicializa Terraform en el directorio que has creado:
terraform init
Comprueba que los cambios que propones con Terraform coinciden con el plan esperado:
terraform plan
Crea las configuraciones predeterminadas de los miembros de la flota:
terraform apply
Crea un directorio para los archivos de Terraform de configuración del clúster. Añade a ese directorio un archivo
main.tf
y un archivovariables.tf
.En el archivo
variables.tf
, añade las siguientes variables:Crea un archivo
cluster.tf
que contenga los valores predeterminados que se usan en todos tus clústeres, como los IDs de proyecto y de flota:variable "location" { type = string } variable "cluster_name" { type = string } data "google_project" "project" { provider = google } resource "google_container_cluster" "cluster" { provider = google name = var.cluster_name location = var.location initial_node_count = 3 project = data.google_project.project.project_id fleet { project = data.google_project.project.project_id } workload_identity_config { workload_pool = "${data.google_project.project.project_id}.svc.id.goog" } deletion_protection = false }
En el archivo
main.tf
, añade los siguientes recursos:terraform { required_providers { google = { source = "hashicorp/google" version = ">=5.16.0" } } } provider "google" { project = var.project } module "MODULE_NAME" { source = "CLUSTER_CONFIGURATION_FILEPATH" cluster_name = "CLUSTER_NAME" location="CLUSTER_LOCATION" }
Haz los cambios siguientes:
MODULE_NAME
: el nombre que quieras dar al módulo del clúster. MODULE_NAME y CLUSTER_NAME pueden tener el mismo valor, por ejemplo,us-east-cluster
.CLUSTER_CONFIGURATION_FILEPATH
: la ruta relativa al archivocluster.tf
que has creado.CLUSTER_NAME
: el nombre de tu clúster. MODULE_NAME y CLUSTER_NAME pueden tener el mismo valor, por ejemplo,us-east-cluster
.CLUSTER_LOCATION
: la ubicación de tu clúster, por ejemplo,us-east1
.
Puedes crear tantos clústeres como quieras. Por ejemplo, el siguiente archivo
main.tf
crea 3 clústeres en diferentes regiones:Inicializa Terraform en el directorio que has creado:
terraform init
Comprueba que los cambios que propones con Terraform coinciden con el plan esperado:
terraform plan
Crea los clústeres:
terraform apply
Crea un directorio para los archivos de configuración de Terraform del ámbito del equipo y del espacio de nombres. Añade a ese directorio un archivo
main.tf
y un archivovariables.tf
.En el archivo
variables.tf
, añade las siguientes variables:En el archivo
main.tf
, añade los siguientes recursos:Añade la información del proveedor:
terraform { required_providers { google = { source = "hashicorp/google" version = ">=5.16.0" } } } provider "google" { project = var.project }
Añade el recurso de ámbito de equipo:
resource "google_gke_hub_scope" "scope" { provider = google for_each = toset([ "SCOPE_NAME", "SCOPE_NAME_2", ]) scope_id = each.value }
Haz los cambios siguientes:
SCOPE_NAME
: el nombre de tu ámbito de equipo, por ejemplo,backend
.SCOPE_NAME_2
: un ámbito de equipo adicional si has creado uno.
Puedes añadir todos los ámbitos de equipo que necesites. Cuando se crea un espacio de nombres de flota en el clúster, se etiqueta automáticamente con
fleet.gke.io/fleet-scope: SCOPE_NAME
, lo que permite que Config Sync seleccione espacios de nombres en función de las etiquetasNamespaceSelector
presentes al sincronizar recursos de Kubernetes.Por ejemplo, un recurso de Terraform de ámbito de equipo que incluya un ámbito para los equipos Frontend y Backend podría ser similar al siguiente:
Añade un enlace de pertenencia a la flota para cada clúster que quieras aplicar a un ámbito de equipo:
resource "google_gke_hub_membership_binding" "membership-binding" { provider = google for_each = { MEMBERSHIP_BINDING_NAME = { membership_binding_id = "MEMBERSHIP_BINDING_ID" scope = google_gke_hub_scope.scope["SCOPE_NAME"].name membership_id = "CLUSTER_NAME" location = "CLUSTER_LOCATION" } MEMBERSHIP_BINDING_NAME_2 = { membership_binding_id = "MEMBERSHIP_BINDING_ID_2" scope = google_gke_hub_scope.scope["SCOPE_NAME_2"].name membership_id = "CLUSTER_NAME_2" location = "CLUSTER_LOCATION_2" } } membership_binding_id = each.value.membership_binding_id scope = each.value.scope membership_id = each.value.membership_id location = each.value.location depends_on = [google_gke_hub_scope.scope] }
Haz los cambios siguientes:
MEMBERSHIP_BINDING_NAME
: el nombre de enlace de la membresía, por ejemplo,us-east-backend
.MEMBERSIP_BINDING_ID
: el ID de vinculación de la suscripción. Puede ser la misma que la de MEMBERSHIP_BINDING_NAME.SCOPE_NAME
: el selector de etiquetas que asignaste a tu equipo cuando creaste unNamespaceSelector
, por ejemplo,backend
.CLUSTER_NAME
: el nombre del clúster que has creado al crear clústeres, por ejemplo,us-east-cluster
.CLUSTER_LOCATION
: la ubicación del clúster, por ejemplo,us-east1
.
Debes definir un enlace de pertenencia a la flota para cada clúster. Si no defines un ámbito de equipo para un clúster, ese clúster no se creará para ese espacio de nombres. Por ejemplo, si tienes tres clústeres en las regiones
us-east1
,us-west1
yus-central1
, pero el clústerus-central1
es solo para el equipo de frontend, tu recurso MembershipBinding sería similar al siguiente:Añade los espacios de nombres que quieras definir para tus equipos:
resource "google_gke_hub_namespace" "fleet_namespace" { provider = google for_each = { FLEET_NAMESPACE = { scope_id = "SCOPE_NAME" scope_namespace_id = "FLEET_NAMESPACE_ID" scope = google_gke_hub_scope.scope["SCOPE_NAME"].name } FLEET_NAMESPACE_2 = { scope_id = "SCOPE_NAME" scope_namespace_id = "FLEET_NAMESPACE_ID_2" scope = google_gke_hub_scope.scope["SCOPE_NAME"].name } } scope_namespace_id = each.value.scope_namespace_id scope_id = each.value.scope_id scope = each.value.scope depends_on = [google_gke_hub_scope.scope] }
Haz los cambios siguientes:
FLEET_NAMESPACE
: el nombre que quieras dar al espacio de nombres, por ejemplo,backend-a
.SCOPE_NAME
: el selector de etiquetas que asignaste a tu equipo cuando creaste unNamespaceSelector
, por ejemplo,backend
.FLEET_NAMESPACE_ID
: el ID del espacio de nombres. Puede tener el mismo valor que FLEET_NAMESPACE.
Por ejemplo, si quieres que los equipos Frontend y Backend tengan dos espacios de nombres cada uno, el recurso de espacio de nombres de tu flota podría ser similar al siguiente:
Inicializa Terraform en el directorio que has creado:
terraform init
Comprueba que los cambios que propones con Terraform coinciden con el plan esperado:
terraform plan
Crea los ámbitos y los espacios de nombres de la flota:
terraform apply
Roles obligatorios
Para obtener los permisos que necesitas para crear recursos de equipo para tu flota, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos en tu proyecto:
Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.
También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.
Adquirir credenciales de usuario
Para ejecutar los comandos de Terraform de esta guía en tu entorno local, ejecuta el siguiente comando para obtener nuevas credenciales de usuario:
gcloud auth application-default login
Configurar tu flota
En esta sección, creará su flota y habilitará los servicios necesarios.
Para configurar tu flota, sigue estos pasos:
Configurar la fuente de información veraz
En esta sección, se añaden archivos de configuración a una fuente de información veraz.
Necesitas un objeto NamespaceSelector
para cada ámbito de equipo que quieras usar.
Por ejemplo, si tienes los equipos Frontend y Backend, debes crear un NamespaceSelector
objeto para cada equipo. El objeto NamespaceSelector
selecciona todos o algunos de los espacios de nombres de un equipo. Puedes añadir recursos adicionales del equipo a tu fuente de información veraz, como un NetworkPolicy
. Cuando creas estos recursos, haces referencia al NamespaceSelector
para que Config Sync pueda desplegar y sincronizar esos recursos de forma dinámica en los espacios de nombres.
Para configurar tu fuente de información veraz, sigue estos pasos:
Crear valores predeterminados a nivel de flota para Config Sync
En esta sección, creará valores predeterminados a nivel de flota para Config Sync, lo que aplicará la misma configuración de Config Sync a todos los clústeres creados en su flota.
Para crear una configuración predeterminada a nivel de flota para Config Sync, sigue estos pasos:
Crear clústeres en tu flota
En esta sección, creará una configuración de clúster compartida y, a continuación, creará clústeres en su flota.
Para crear y registrar nuevos clústeres en tu flota, sigue estos pasos:
Configurar ámbitos de equipo y espacios de nombres de flota
En esta sección, creará los ámbitos de su equipo y asociará sus clústeres a esos ámbitos. A continuación, cree los espacios de nombres de la flota que necesite (por ejemplo, uno para cada equipo) en cada ámbito y Config Sync creará los recursos en sus espacios de nombres.
Para configurar los ámbitos y los espacios de nombres de los equipos, sigue estos pasos:
Después de crear ámbitos de flota y espacios de nombres, Config Sync detecta esos nuevos espacios de nombres y sus ámbitos, selecciona recursos en los espacios de nombres de la flota y los reconcilia con los archivos de configuración.
Para comprobar que los recursos se han aplicado al clúster correcto, puedes usar nomos status
o ir a la pestaña Paquetes de Config Sync en la consola de Google Cloud y cambiar el botón de radio Ver por a Clúster.
Config Sync sincroniza tus recursos en los espacios de nombres en función de los ámbitos de tu equipo, según la configuración almacenada en tu fuente de información veraz. Cada vez que añadas un recurso nuevo, Config Sync reconciliará automáticamente ese recurso en los espacios de nombres de tu equipo, siempre que incluyas la anotación NamespaceSelector
correcta.
Si quieres aplicar la configuración de Config Sync a tus clústeres, consulta las instrucciones para configurar valores predeterminados a nivel de flota en la guía de instalación de Config Sync.