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 usas la renderización automatizada, tendrás 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 realizados 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.

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 de 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