Utilizar Config Sync con Kustomize y Helm

En este tutorial, añadirás configuraciones de Kustomize que hagan referencia a charts de Helm en tu repositorio y, a continuación, usarás Config Sync para sincronizar tu clúster con tu repositorio.

Cuando usas Config Sync, las configuraciones de Kustomize y los gráficos de Helm que colocas en tu repositorio de Git se renderizan automáticamente. La renderización automática te ofrece las siguientes ventajas:

  • Ya no necesitas una canalización de hidratación externa. Si no usas el renderizado automático, tendrás que renderizar manualmente las configuraciones con Kustomize y Helm en tu estación de trabajo, o bien configurar un paso para activar el proceso de hidratación en tus sistemas de integración continua. Con el renderizado automático, Config Sync se encarga de la ejecución.

  • Se reducen los costes de mantenimiento. Si no se usa el renderizado automático, tienes que mantener un repositorio de Git con las configuraciones de Kustomize y los gráficos de Helm originales, y otro repositorio de Git con el resultado generado por la hidratación externa. Después, debes configurar Config Sync para que se sincronice desde el repositorio de Git con el resultado renderizado. Con el renderizado automático, solo tienes que mantener un repositorio con las configuraciones originales.

  • Tu flujo de trabajo de desarrollo se simplifica. Sin el renderizado automático, los cambios que se hagan en las configuraciones originales deben revisarse dos veces antes de combinarse: una vez en el repositorio original y otra en el repositorio renderizado. Con el renderizado automático, Config Sync genera las configuraciones renderizadas y solo tienes que revisar los cambios en las configuraciones originales.

Objetivos

  • Configura tu repositorio con configuraciones de Kustomize que hagan referencia a un chart de Helm predefinido para cert-manager. cert-manager es una herramienta para Kubernetes que te ayuda a gestionar tus certificados.
  • Previsualiza y valida las configuraciones que crees.
  • Usa Config Sync para renderizar automáticamente tu gráfico y sincronizar tu clúster con tu repositorio.
  • Verifica que la instalación se ha realizado correctamente.

Costes

En este documento, se utilizan los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costes basada en el uso previsto, utiliza la calculadora de precios.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

Cuando termines las tareas que se describen en este documento, puedes evitar que se te siga facturando eliminando los recursos que has creado. Para obtener más información, consulta la sección Limpiar.

Antes de empezar

  1. In the Google Cloud console, on the project selector page, select or create 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. Crea un clúster o asegúrate de tener acceso a uno que cumpla los requisitos de Config Sync y que use los siguientes ajustes de Config Sync:
  4. Registre su clúster en una flota.
  5. Instala la herramienta de línea de comandos nomos. Si ya has instalado la herramienta nomos, asegúrate de actualizarla a la versión 1.9.0 o a una posterior.
  6. Instala Helm.

También es útil tener conocimientos de Git, Kustomize y Helm.

Configurar un repositorio

En las siguientes tareas se muestra cómo preparar un repositorio de Git con configuraciones que combinen configuraciones de Kustomize con charts de Helm:

  1. Crea un repositorio de Git o asegúrate de tener acceso a uno. Como tu repositorio usa Kustomize y Helm, debe ser un repositorio no estructurado.

  2. En la raíz de tu repositorio de Git, crea un archivo llamado kustomization.yaml y pega el siguiente código en él:

    # ./kustomization.yaml
    resources:
    - base
    
    patches:
    - path: ignore-deployment-mutation-patch.yaml
      target:
        kind: Deployment
    

    Este archivo es una superposición de Kustomize que apunta a la base de Kustomize. Esta superposición incluye un parche para la base del gráfico de Helm que añade la anotación client.lifecycle.config.k8s.io/mutation: ignore a todos los objetos Deployment. La anotación hace que Config Sync ignore cualquier cambio conflictivo en este objeto del clúster después de que lo hayas creado.

  3. En tu repositorio de Git, crea un directorio llamado base:

    mkdir base
    
  4. En el directorio base, crea otro archivo llamado kustomization.yaml y pega el siguiente código en él:

    # ./base/kustomization.yaml
    helmCharts:
    - name: cert-manager
      repo: https://charts.jetstack.io
      version: v1.5.3
      releaseName: my-cert-manager
      namespace: cert-manager
    

    Este archivo es la base de Kustomize, que renderiza el gráfico de Helm remoto.

  5. Vuelve a la raíz de tu repositorio de Git, crea un archivo llamado ignore-deployment-mutation-patch.yaml y pega el siguiente código en él:

    # ./ignore-deployment-mutation-patch.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
     name: any
     annotations:
       client.lifecycle.config.k8s.io/mutation: ignore
    

    Este archivo es un parche que se aplica al gráfico de Helm base. Añade la anotación client.lifecycle.config.k8s.io/mutation: ignore a todas las implementaciones del directorio base.

  6. Confirma los cambios en tu repositorio:

    git add .
    git commit -m 'Set up manifests.'
    git push
    

El repositorio de ejemplos incluye un ejemplo de cómo sería un repositorio de este tipo.

Previsualizar y validar las configuraciones renderizadas

Antes de que Config Sync renderice las configuraciones y las sincronice con el clúster, asegúrate de que sean precisas. Para ello, ejecuta nomos hydrate para previsualizar la configuración renderizada y nomos vet para validar que el formato sea correcto.

  1. Ejecuta el siguiente nomos hydrate con las siguientes marcas:

    nomos hydrate \
        --source-format=unstructured \
        --output=OUTPUT_DIRECTORY
    

    En este comando:

    • --source-format=unstructured permite que nomos hydrate funcione en un repositorio no estructurado. Como usas configuraciones de Kustomize y charts de Helm, debes usar un repositorio no estructurado y añadir esta marca.
    • --output=OUTPUT_DIRECTORY te permite definir una ruta a las configuraciones renderizadas. Sustituye OUTPUT_DIRECTORY por la ubicación en la que quieras guardar el resultado.
  2. Comprueba la sintaxis y la validez de tus configuraciones ejecutando nomos vet con las siguientes marcas:

    nomos vet \
        --source-format=unstructured \
        --keep-output=true \
        --output=OUTPUT_DIRECTORY
    

    En este comando:

    • --source-format=unstructured permite que nomos vet funcione en un repositorio no estructurado.
    • --keep-output=true guarda las configuraciones renderizadas.
    • --output=OUTPUT_DIRECTORY es la ruta a las configuraciones renderizadas.

Configurar la sincronización desde el repositorio de Git

Ahora que has creado un repositorio con las configuraciones que quieres usar, puedes configurar la sincronización desde tu clúster hasta tu repositorio.

  1. Para configurar el objeto RootSync, crea un archivo root-sync.yaml:

    # root-sync.yaml
    apiVersion: configsync.gke.io/v1beta1
    kind: RootSync
    metadata:
      name: root-sync
      namespace: config-management-system
    spec:
      sourceFormat: unstructured
      git:
        repo: YOUR_GIT_REPOSITORY
        branch: main
        auth: none
      override:
        enableShellInRendering: true
    

    Sustituye YOUR_GIT_REPOSITORY por la URL de tu repositorio de Git.

  2. Aplica el archivo root-sync.yaml a tu clúster:

    kubectl apply -f root-sync.yaml
    

Verificar la instalación

Una vez que hayas instalado y configurado Config Sync, puedes verificar que la instalación se haya completado correctamente.

  1. Verifica que no haya otros errores con nomos status:

    nomos status
    

    Ejemplo:

    *CLUSTER_NAME
    --------------------
    <root>   https:/github.com/GoogleCloudPlatform/anthos-config-management-samples.git/helm-component/manifests@init
    SYNCED   fd17dd5a
    
  2. Verifica si el componente Helm se ha instalado correctamente:

    kubectl get all -n cert-manager
    

    Ejemplo:

    NAME                                              READY   STATUS    RESTARTS   AGE
    pod/my-cert-manager-54f5ccf74-wfzs4               1/1     Running   0          10m
    pod/my-cert-manager-cainjector-574bc8678c-rh7mq   1/1     Running   0          10m
    pod/my-cert-manager-webhook-7454f4c77d-rkct8      1/1     Running   0          10m
    
    NAME                              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
    service/my-cert-manager           ClusterIP   10.76.9.35     <none>        9402/TCP   10m
    service/my-cert-manager-webhook   ClusterIP   10.76.11.205   <none>        443/TCP    10m
    
    NAME                                         READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/my-cert-manager              1/1     1            1           10m
    deployment.apps/my-cert-manager-cainjector   1/1     1            1           10m
    deployment.apps/my-cert-manager-webhook      1/1     1            1           10m
    
    NAME                                                    DESIRED   CURRENT   READY   AGE
    replicaset.apps/my-cert-manager-54f5ccf74               1         1         1       10m
    replicaset.apps/my-cert-manager-cainjector-574bc8678c   1         1         1       10m
    replicaset.apps/my-cert-manager-webhook-7454f4c77d      1         1         1       10m
    

Limpieza

Para evitar que los recursos utilizados en este tutorial se cobren en tu cuenta de Google Cloud, elimina el proyecto que contiene los recursos o conserva el proyecto y elimina los recursos.

Eliminar el proyecto

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Eliminar recursos concretos

Elimina los manifiestos de tu repositorio

Para evitar que se eliminen elementos por error, Config Sync no te permite eliminar todos los espacios de nombres ni los recursos con ámbito de clúster en una sola confirmación. Sigue estas instrucciones para desinstalar el componente correctamente y eliminar el espacio de nombres en confirmaciones independientes:

  1. Elimina el componente cert-manager de tu repositorio:

    git rm -rf manifests/cert-manager \
        && git commit -m "uninstall cert-manager" \
        && git push origin BRANCH
    

    Sustituye BRANCH por la rama en la que has creado tu repositorio.

  2. Elimina el espacio de nombres cert-manager:

    git rm manifests/namespace-cert-manager.yaml \
        && git commit -m "remove the cert-manager namespace" \
        && git push origin BRANCH
    
  3. Verifica que el espacio de nombres cert-manager no exista:

    kubectl get namespace cert-namespace
    

    Ejemplo:

    Error from server (NotFound): namespaces "cert-namespace" not found
    

Elimina el clúster

Para eliminar el clúster, ejecuta los siguientes comandos:

Consola

Para eliminar un clúster mediante la consola Google Cloud , completa las siguientes tareas:

  1. En la Google Cloud consola, ve a la página de GKE.

    Ir a GKE

  2. Junto al clúster que quieras eliminar, haz clic en Acciones y, a continuación, en Eliminar.

  3. Cuando se te solicite confirmación, vuelve a hacer clic en Eliminar.

gcloud

Para eliminar un clúster con la CLI de Google Cloud, ejecuta el siguiente comando:

gcloud container clusters delete CLUSTER_NAME

Para obtener más información, consulta la documentación de gcloud container clusters delete.

Siguientes pasos