Administra clústeres de GKE con el controlador de configuración

En este instructivo, se muestra cómo usar el plano del clúster de GKE para aprovisionar un clúster de Google Kubernetes Engine (GKE) con el controlador de configuración. Síguelo si eres un operador de clústeres de GKE y deseas administrar de forma declarativa la configuración de tu clúster.

El controlador de configuración es un servicio alojado para aprovisionar y organizar recursos de Anthos y Google Cloud. Ofrece un extremo de API que puede aprovisionar, activar y organizar recursos de Google Cloud como parte de Anthos Config Management.

Los planos de KRM son una forma de empaquetar los recursos que se suelen usar juntos y codificar las prácticas recomendadas que se pueden lanzar en toda tu organización.

El plano de clúster de GKE es un plano de KRM que incluye todos los recursos que necesitas para administrar un clúster de GKE, además de una red de Google Cloud existente. Puedes crear una instancia del plano varias veces para configurar varios clústeres.

Objetivos

  • Configurar un clúster de GKE de forma declarativa.
  • Aplicar la configuración mediante el controlador de configuración.

Costos

En este instructivo, se usan los siguientes componentes facturables de Google Cloud:

Para obtener una lista completa de los recursos incluidos en el plano del clúster de GKE, consulta la sección Recursos del paquete de GKE y sus subpaquetes.

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.

Cuando finalices este instructivo, puedes borrar los recursos creados para evitar que se te siga facturando. Para obtener más información, consulta Realiza una limpieza.

Requisitos

Antes de comenzar

  1. En Cloud Console, activa Cloud Shell.

    Activar Cloud Shell

    En la parte inferior de Cloud Console, se inicia una sesión de Cloud Shell en la que se muestra una ventana de línea de comandos. Cloud Shell es un entorno de shell que tiene el SDK de Cloud preinstalado, incluida la herramienta de línea de comandos de gcloud, y valores ya establecidos para el proyecto actual. La inicialización de la sesión puede tomar unos minutos.

  2. Ejecuta todos los comandos de este instructivo desde Cloud Shell.

Configure el entorno

En Cloud Shell, ejecute los siguientes comandos:

  1. Instala kubectl, la interfaz principal de línea de comandos para Kubernetes:

    gcloud components install kubectl
    
  2. Instala kpt, la interfaz principal de línea de comandos para los planos de KRM:

    gcloud components install kpt
    
  3. Configura kubectl y kpt para conectarte con el controlador de configuración:

    gcloud alpha anthos config controller get-credentials CONFIG_CONTROLLER_NAME \
        --location COMPUTE_REGION \
        --project CONFIG_CONTROLLER_PROJECT_ID
    

    Reemplaza lo siguiente:

    • CONFIG_CONTROLLER_NAME: El nombre de tu clúster del controlador de configuración:

    • COMPUTE_REGION: La región del clúster del controlador de configuración (por ejemplo, us-central1).

    • CONFIG_CONTROLLER_PROJECT_ID: El ID del proyecto de tu clúster del controlador de configuración.

  4. Habilita la API de Resource Manager:

    gcloud services enable cloudresourcemanager.googleapis.com \
        --project PROJECT_ID
    

    Reemplaza PROJECT_ID por el ID de tu proyecto.

  5. Instala la CRD de ResourceGroup, si aún no está instalada:

    kpt live install-resource-group
    
  6. Verifica que Config Connector esté configurado y en buen estado en el espacio de nombres del proyecto:

    kubectl get ConfigConnectorContext -n PROJECT_NAMESPACE \
        -o "custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,HEALTHY:.status.healthy"
    

    Reemplaza PROJECT_NAMESPACE por el espacio de nombres que deseas usar para administrar los recursos del proyecto (por ejemplo, config-control).

    Resultado de ejemplo:

    NAMESPACE        NAME                                                HEALTHY
    config-control   configconnectorcontext.core.cnrm.cloud.google.com   true
    

Configurar un clúster de GKE

Para configurar un clúster de GKE con el plano de clúster de GKE, ejecuta los siguientes comandos.

  1. Obtén el plano del clúster de GKE con kpt desde el directorio de trabajo deseado:

    kpt pkg get \
        https://github.com/GoogleCloudPlatform/blueprints.git/catalog/gke@v0.3.0 \
        CLUSTER_NAME
    

    Reemplaza CLUSTER_NAME por el nombre que desees usar para el clúster de GKE (por ejemplo, hello-cluster).

  2. Ingresa al directorio del clúster:

    cd ./CLUSTER_NAME/
    
  3. Para configurar el paquete, modifica el archivo setters.yaml:

    cat > setters.yaml << EOF
    apiVersion: v1
    kind: ConfigMap
    metadata: # kpt-merge: /setters
      name: setters
    data:
      # The cluster name
      cluster-name: CLUSTER_NAME
      # The environment (set as a label on the cluster)
      environment: dev
      # The compute location (region or zone)
      location: us-central1
      # The project in which to manage cluster resources
      platform-project-id: PROJECT_ID
      # The namespace in which to manage cluster resources
      platform-namespace: PROJECT_NAMESPACE
      # The name of the VPC in which to create a dedicated subnet
      network-name: default
      # The project that the VPC is in
      network-project-id: PROJECT_ID
      # The namespace in which to manage network resources
      networking-namespace: PROJECT_NAMESPACE
      # The private IP range for masters to use when peering to the VPC
      master-ip-range: 192.168.0.0/28
      # The private IP range for nodes to use, allocated to the dedicated subnet
      node-ip-range: 10.4.0.0/22
      # The private IP range for pods to use, allocated to the dedicated subnet
      pod-ip-range: 10.5.0.0/16
      # The private IP range for services to use, allocated to the dedicated subnet
      service-ip-range: 10.6.0.0/16
      # The namespace in which to manage service enablement resources
      projects-namespace: PROJECT_NAMESPACE
      # The group in which to manage the list of groups that can be used for RBAC.
      # Must be named exactly 'gke-security-groups'.
      security-group: gke-security-groups@YOUR_DOMAIN
    EOF
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID de tu proyecto.

      En este instructivo, el clúster y la red se implementan en el mismo proyecto.

    • PROJECT_NAMESPACE: Es el espacio de nombres que se usará para administrar los recursos del proyecto (por ejemplo, config-control).

      Para este instructivo, la habilitación del clúster, la red y el servicio se administran en el mismo espacio de nombres.

    • YOUR_DOMAIN: Es el dominio que usan tus grupos (por ejemplo, example.com).

    Todos los demás campos de datos se pueden reconfigurar como se desee.

    Los valores predeterminados proporcionados deben funcionar en un proyecto que, de lo contrario, estará vacío con la red predeterminada.

  4. Procesa los valores del modo set en los recursos con plantilla:

    kpt fn render
    

    Resultado de ejemplo:

    Package "example/cluster":
    [RUNNING] "gcr.io/kpt-fn/apply-setters:v0.1"
    [PASS] "gcr.io/kpt-fn/apply-setters:v0.1"
      Results:
        [INFO] set field value to "example-us-west4" in file "cluster/cluster.yaml" in field "metadata.name"
        [INFO] set field value to "config-control" in file "cluster/cluster.yaml" in field "metadata.namespace"
        [INFO] set field value to "dev" in file "cluster/cluster.yaml" in field "metadata.labels.gke.io/environment"
        [INFO] set field value to "platform-project-id" in file "cluster/cluster.yaml" in field "metadata.annotations.cnrm.cloud.google.com/project-id"
        ...(10 line(s) truncated, use '--truncate-output=false' to disable)
    
    Package "example/nodepools/primary":
    [RUNNING] "gcr.io/kpt-fn/apply-setters:v0.1"
    [PASS] "gcr.io/kpt-fn/apply-setters:v0.1"
      Results:
        [INFO] set field value to "gke-example-us-east4-primary" in file "nodepools/primary/node-iam.yaml" in field "metadata.name"
        [INFO] set field value to "config-control" in file "nodepools/primary/node-iam.yaml" in field "metadata.namespace"
        [INFO] set field value to "platform-project-id" in file "nodepools/primary/node-iam.yaml" in field "metadata.annotations.cnrm.cloud.google.com/project-id"
        [INFO] set field value to "gke-example-us-east4-primary" in file "nodepools/primary/node-iam.yaml" in field "spec.displayName"
        ...(23 line(s) truncated, use '--truncate-output=false' to disable)
    
    Package "example/subnet":
    [RUNNING] "gcr.io/kpt-fn/apply-setters:v0.1"
    [PASS] "gcr.io/kpt-fn/apply-setters:v0.1"
      Results:
        [INFO] set field value to "platform-project-id-example-us-west4" in file "subnet/subnet.yaml" in field "metadata.name"
        [INFO] set field value to "networking" in file "subnet/subnet.yaml" in field "metadata.namespace"
        [INFO] set field value to "network-project-id" in file "subnet/subnet.yaml" in field "metadata.annotations.cnrm.cloud.google.com/project-id"
        [INFO] set field value to "platform-project-id-example-us-west4" in file "subnet/subnet.yaml" in field "spec.description"
        ...(5 line(s) truncated, use '--truncate-output=false' to disable)
    
    Package "example":
    [RUNNING] "gcr.io/kpt-fn/apply-setters:v0.1"
    [PASS] "gcr.io/kpt-fn/apply-setters:v0.1"
      Results:
        [INFO] set field value to "example" in file "cluster/cluster.yaml" in field "metadata.name"
        [INFO] set field value to "config-control" in file "cluster/cluster.yaml" in field "metadata.namespace"
        [INFO] set field value to "dev" in file "cluster/cluster.yaml" in field "metadata.labels.gke.io/environment"
        [INFO] set field value to "example-project-1234" in file "cluster/cluster.yaml" in field "metadata.annotations.cnrm.cloud.google.com/project-id"
        ...(44 line(s) truncated, use '--truncate-output=false' to disable)
    
    Successfully executed 4 function(s) in 4 package(s).
    

Aplica cambios de configuración

Los cambios locales en los pasos anteriores no afectan la nube hasta que se apliquen.

Para aplicar los cambios de configuración, ejecuta los siguientes comandos:

  1. Inicializa el directorio de trabajo con kpt, que crea un recurso para realizar un seguimiento de los cambios:

    kpt live init --namespace PROJECT_NAMESPACE
    

    Reemplaza PROJECT_NAMESPACE por el espacio de nombres que se usa para administrar los recursos del proyecto (por ejemplo, config-control).

  2. Obtén una vista previa de los recursos que se crearán:

    kpt live apply --dry-run
    

    Todos los recursos deben decir “fecha de creación (prueba de validación)”.

    Resultado de ejemplo:

    service.serviceusage.cnrm.cloud.google.com/example-project-1234-example-container created (dry-run)
    computesubnetwork.compute.cnrm.cloud.google.com/example-project-1234-example created (dry-run)
    containercluster.container.cnrm.cloud.google.com/example created (dry-run)
    containernodepool.container.cnrm.cloud.google.com/example-primary created (dry-run)
    iampolicymember.iam.cnrm.cloud.google.com/artifactreader-gke-example-primary created (dry-run)
    iampolicymember.iam.cnrm.cloud.google.com/logwriter-gke-example-primary created (dry-run)
    iampolicymember.iam.cnrm.cloud.google.com/metricwriter-gke-example-primary created (dry-run)
    iamserviceaccount.iam.cnrm.cloud.google.com/gke-example-primary created (dry-run)
    8 resource(s) applied. 8 created, 0 unchanged, 0 configured, 0 failed (dry-run)
    0 resource(s) pruned, 0 skipped, 0 failed (dry-run)
    
  3. Aplica los recursos con kpt:

    kpt live apply
    

    Todos los recursos deben decir “creado”.

    Resultado de ejemplo:

    service.serviceusage.cnrm.cloud.google.com/example-project-1234-example-container created
    computesubnetwork.compute.cnrm.cloud.google.com/example-project-1234-example created
    containercluster.container.cnrm.cloud.google.com/example created
    containernodepool.container.cnrm.cloud.google.com/example-primary created
    iampolicymember.iam.cnrm.cloud.google.com/artifactreader-gke-example-primary created
    iampolicymember.iam.cnrm.cloud.google.com/logwriter-gke-example-primary created
    iampolicymember.iam.cnrm.cloud.google.com/metricwriter-gke-example-primary created
    iamserviceaccount.iam.cnrm.cloud.google.com/gke-example-primary created
    8 resource(s) applied. 8 created, 0 unchanged, 0 configured, 0 failed
    0 resource(s) pruned, 0 skipped, 0 failed
    

Verifica el éxito

Para verificar que los cambios se apliquen y que se aprovisionen los recursos que especifiquen, ejecuta los comandos siguientes.

  1. Espera hasta que los recursos estén listos:

    kpt live status --output table --poll-until current
    

    Este comando sondeará hasta que todos los recursos tengan el estado Current y la condición Ready.

    Usa ctrl-c para interrumpir, si es necesario.

    Resultado de ejemplo:

    NAMESPACE   RESOURCE                                  STATUS      CONDITIONS      AGE     MESSAGE
    config-con  ComputeSubnetwork/example-project-1234-e  Current     Ready           41m     Resource is Ready
    config-con  ContainerCluster/example                  Current     Ready           41m     Resource is Ready
    config-con  ContainerNodePool/example-primary         Current     Ready           41m     Resource is Ready
    config-con  IAMPolicyMember/artifactreader-gke-examp  Current     Ready           41m     Resource is Ready
    config-con  IAMPolicyMember/logwriter-gke-example-pr  Current     Ready           41m     Resource is Ready
    config-con  IAMPolicyMember/metricwriter-gke-example  Current     Ready           41m     Resource is Ready
    config-con  IAMServiceAccount/gke-example-primary     Current     Ready           41m     Resource is Ready
    config-con  Service/example-project-1234-example-con  Current     Ready           41m     Resource is Ready
    
  2. En el caso de error, usa el resultado del evento predeterminado para ver los mensajes de error completos:

    kpt live status
    

Preguntas frecuentes

Realice una limpieza

Si decides dejar de usar el controlador de configuración, primero debes limpiar todos los recursos que creaste con él y, luego, borrarlo.

  1. Borra los recursos con kpt, desde el directorio de trabajo:

    kpt live destroy
    
  2. Espera hasta que se borren todos los recursos:

    until [ -z "$(kubectl get -R -f . --ignore-not-found | tee /dev/fd/2)" ]; \
    do sleep 1; done
    

    Este comando sondeará hasta que todos los recursos tengan el estado Deleted.

    Usa ctrl-c para interrumpir, si es necesario.

¿Qué sigue?