Sincroniza gráficos de Helm desde Artifact Registry

En esta página, se muestra cómo sincronizar los gráficos de Helm desde Artifact Registry mediante la creación y el envío de un gráfico de Helm a un repositorio en Artifact Registry. También contiene una configuración de muestra para sincronizar un gráfico desde tu repositorio de Helm.

Puedes configurar el Sincronizador de configuración para que se sincronice desde los repositorios de Helm. Puedes almacenar gráficos de Helm en Artifact Registry, que es el repositorio de Helm recomendado para Google Cloud. Para usar esta función, debes habilitar las APIs de RootSync y RepoSync. El Sincronizador de configuración renderiza gráficos de Helm mediante helm template y, por lo tanto, no admite la administración completa del ciclo de vida de Helm.

En las versiones agrupadas de Helm y Kustomize, se enumeran las versiones de Kustomize y Helm agrupadas con la versión correspondiente del Sincronizador de configuración.

Antes de comenzar

Limitaciones

  • No puedes cambiar ningún campo inmutable en una configuración solo con cambiar el valor en la fuente de información. Si necesitas actualizar un campo inmutable, primero realiza el cambio en la fuente de información y, luego, borra de forma manual el objeto en el clúster. Luego, el Sincronizador de configuración puede volver a crear el objeto con el valor de campo nuevo.

  • En los siguientes gráficos de Helm, se incluyen trabajos, y no se recomienda su implementación mediante el Sincronizador de configuración:

    Para obtener más información sobre por qué no se recomienda usar trabajos con el Sincronizador de configuración, consulta Evita administrar trabajos con el Sincronizador de configuración.

Crea un repositorio de Artifact Registry

En esta sección, crearás un repositorio de Artifact Registry. Para obtener más información sobre cómo crear repositorios de Artifact Registry, consulta Crea repositorios.

  1. Habilita la API de Artifact Registry:

    gcloud services enable artifactregistry.googleapis.com --project=PROJECT_ID
    
  2. Crea un repositorio de Artifact Registry:

    gcloud artifacts repositories create AR_REPO_NAME \
       --repository-format=docker \
       --location=AR_REGION \
       --description="Config Sync Helm repo" \
       --project=PROJECT_ID
    

Reemplaza lo siguiente:

  • PROJECT_ID: El ID del proyecto de la organización
  • AR_REPO_NAME: El ID del repositorio
  • AR_REGION: Es la ubicación regional o multirregional del repositorio.

Las variables usadas en las siguientes secciones:

  • FLEET_HOST_PROJECT_ID: Si usas Workload Identity de GKE, es lo mismo que PROJECT_ID. Si usas Workload Identity de la flota, este es el ID del proyecto de la flota en la que está registrado el clúster.
  • GSA_NAME: Es el nombre de la cuenta de servicio de Google personalizada que deseas usar para conectarte a Artifact Registry.
  • KSA_NAME: Es la cuenta de servicio de Kubernetes para el conciliador.
    • Para los repositorios raíz, si el nombre RootSync es root-sync, agrega root-reconciler. De lo contrario, agrega root-reconciler-ROOT_SYNC_NAME.
    • Para los repositorios de espacios de nombres, si el nombre de RepoSync es repo-sync, agrega ns-reconciler-NAMESPACE. De lo contrario, agrega ns-reconciler-NAMESPACE-REPO_SYNC_NAME-REPO_SYNC_NAME_LENGTH, donde REPO_SYNC_NAME_LENGTH es la cantidad de caracteres en REPO_SYNC_NAME.

Otorgar permiso de lector

Si la versión del Sincronizador de configuración es 1.17.2 o posterior en tu clúster, puedes usar la cuenta de servicio de Kubernetes para autenticarte en Artifact Registry. De lo contrario, usa la cuenta de servicio de Google para la autenticación.

Usa la cuenta de servicio de Kubernetes

Otorga el rol de IAM de lector de Artifact Registry (roles/artifactregistry.reader) a la cuenta de servicio de Kubernetes con el grupo de Workload Identity:

gcloud artifacts repositories add-iam-policy-binding AR_REPO_NAME \
    --location=AR_REGION \
    --member="serviceAccount:FLEET_HOST_PROJECT_ID.svc.id.goog[config-management-system/KSA_NAME]" \
    --role=roles/artifactregistry.reader \
    --project=PROJECT_ID

Usa la cuenta de servicio de Google

  1. Otorga el rol de IAM de lector de Artifact Registry (roles/artifactregistry.reader) a la cuenta de servicio de Google:

    gcloud artifacts repositories add-iam-policy-binding AR_REPO_NAME \
       --location=AR_REGION \
       --member=serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
       --role=roles/artifactregistry.reader \
       --project=PROJECT_ID
    
  2. Crea una vinculación de política de IAM entre la cuenta de servicio de Kubernetes y la cuenta de servicio de Google:

    gcloud iam service-accounts add-iam-policy-binding \
       --role roles/iam.workloadIdentityUser \
       --member "serviceAccount:FLEET_HOST_PROJECT_ID.svc.id.goog[config-management-system/KSA_NAME]" \
       GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
       --project=PROJECT_ID
    

Envía un gráfico de Helm al repositorio de Artifact Registry

En esta sección, descargarás un gráfico público de Helm y lo enviarás a Artifact Registry.

  1. Recupera el paquete mysql-9.3.1.tgz del repositorio público de Helm y descárgalo de forma local:

    helm pull mysql --repo https://charts.bitnami.com/bitnami --version 9.3.1
    
  2. Autentica con un token de acceso:

    Linux/macOS

    gcloud auth print-access-token | helm registry login -u oauth2accesstoken \
    --password-stdin https://AR_REGION-docker.pkg.dev
    

    Windows

    gcloud auth print-access-token
    ya29.8QEQIfY_...
    
    helm registry login -u oauth2accesstoken -p "ya29.8QEQIfY_..." \
    https://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME
    

    En este comando, oauth2accesstoken es el nombre de usuario que se usará cuando se autentique con un token de acceso y gcloud auth print-access-token es el comando para obtener el token de acceso. Tu token de acceso es la contraseña para la autenticación. La autenticación con un token de acceso es el método de autenticación más seguro.

  3. Envía el gráfico de Helm a Artifact Registry:

    helm push mysql-9.3.1.tgz oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME
    

Configura el Sincronizador de configuración para que se sincronice desde tu gráfico de Helm

En esta sección, crearás un objeto RootSync y configurarás el Sincronizador de configuración para que se sincronice desde el gráfico de Helm.

Si deseas anular los valores predeterminados del gráfico de Helm, puedes hacerlo especificando valores en el campo spec.helm.values o agregando una referencia a un ConfigMap con el campo spec.helm.valuesFileRefs (en la versión 1.16.0 y posteriores del Sincronizador de configuración). Para obtener más información sobre los campos opcionales, consulta Configuración del repositorio de Helm.

valores

  1. Crea un objeto RootSync con un nombre único:

    cat <<EOF>> ROOT_SYNC_NAME.yaml
    apiVersion: configsync.gke.io/v1beta1
    kind: RootSync
    metadata:
      name: ROOT_SYNC_NAME
      namespace: config-management-system
    spec:
      sourceFormat: unstructured
      sourceType: helm
      helm:
        repo: oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME
        chart: mysql
        version: 9.3.1
        releaseName: my-mysql
        namespace: test
        # The k8sserviceaccount auth type is available in version 1.17.2 and
        # later. Use `gcpserviceaccount` if using an older version.
        # auth: gcpserviceaccount
        # gcpServiceAccountEmail: GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
        auth: k8sserviceaccount
        # Use the optional field spec.helm.values to override default values.
        # You can use the same format as the default values file to override
        # default values.
        values:
          image:
            pullPolicy: Always
          primary:
            resources:
              limits:
                cpu: 250m
                memory: 256Mi
              requests:
                cpu: 250m
                memory: 256Mi
    EOF
    

    Reemplaza ROOT_SYNC_NAME por el nombre de tu objeto RootSync. El nombre debe ser único en el clúster y no debe tener más de 26 caracteres. Si instalaste el Sincronizador de configuración con la consola de Google Cloud o Google Cloud CLI, elige un nombre que no sea root-sync.

    En este ejemplo, se implementa el gráfico de Helm en el espacio de nombres test porque sus recursos contienen namespace: {{ .Release.Namespace }} en sus plantillas.

    Puedes usar helm.values para anular los valores predeterminados. Para obtener información sobre los campos opcionales, consulta Configuración del repositorio de Helm.

  2. Aplica el objeto RootSync:

    kubectl apply -f ROOT_SYNC_NAME.yaml
    
  3. Verifica que el Sincronizador de configuración se sincronice desde la imagen:

    nomos status --contexts=$(kubectl config current-context)
    

    El resultado es similar al siguiente:

    Connecting to clusters...
    
    *cluster-name
      --------------------
      <root>:root-sync   oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/mysql:9.3.1
      SYNCED             9.3.1
      Managed resources:
          NAMESPACE  NAME                       STATUS    SOURCEHASH
          default    configmap/my-mysql         Current   9.3.1
          default    secret/my-mysql            Current   9.3.1
          default    service/my-mysql           Current   9.3.1
          default    service/my-mysql-headless  Current   9.3.1
          default    serviceaccount/my-mysql    Current   9.3.1
          default    statefulset.apps/my-mysql  Current   9.3.1
    

    Sincronizaste correctamente el gráfico de Helm con tu clúster.

valuesFileRefs

  1. Crea un objeto RootSync con un nombre único:

    cat <<EOF>> ROOT_SYNC_NAME.yaml
    apiVersion: configsync.gke.io/v1beta1
    kind: RootSync
    metadata:
      name: ROOT_SYNC_NAME
      namespace: config-management-system
    spec:
      sourceFormat: unstructured
      sourceType: helm
      helm:
        repo: oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME
        chart: mysql
        version: 9.3.1
        releaseName: my-mysql
        # The k8sserviceaccount auth type is available in version 1.17.2 and
        # later. Use `gcpserviceaccount` if using an older version.
        # auth: gcpserviceaccount
        # gcpServiceAccountEmail: GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
        auth: k8sserviceaccount
        # use the optional field spec.helm.valuesFilesRefs to override default values
        # by referencing a ConfigMap
        valuesFileRefs:
        - name: CONFIGMAP_NAME
          dataKey: DATA_KEY
    
    EOF
    

    Reemplaza lo siguiente:

    • ROOT_SYNC_NAME: Es el nombre de tu objeto RootSync. El nombre debe ser único en el clúster y no debe tener más de 26 caracteres. Si instalaste el Sincronizador de configuración con la consola de Google Cloud o Google Cloud CLI, elige un nombre que no sea root-sync.
    • CONFIGMAP_NAME: Es el nombre de tu ConfigMap. Puede ser cualquier nombre de ConfigMap válido que acepte Kubernetes y que sea único en tu clúster.
    • DATA_KEY: Es la clave de datos de tu ConfigMap de la que deseas leer los valores (opcional). El valor predeterminado es values.yaml.
  2. Crea el objeto ConfigMap con tus valores:

    cat <<EOF>> CONFIGMAP_NAME.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: CONFIGMAP_NAME
      namespace: config-management-system
    immutable: true
    # You can use the same format as the default values file to override
    # default values.
    data:
      DATA_KEY: |-
        image:
          pullPolicy: Always
        primary:
          resources:
            limits:
              cpu: 250m
              memory: 256Mi
            requests:
              cpu: 250m
              memory: 256Mi
    
    EOF
    

    Si no especificaste un valor para DATA_KEY en RootSync, debería ser el valor predeterminado values.yaml.

  3. Aplica el objeto ConfigMap:

    kubectl apply -f CONFIGMAP_NAME.yaml
    
  4. Aplica el objeto RootSync:

    kubectl apply -f ROOT_SYNC_NAME.yaml
    
  5. Verifica que el Sincronizador de configuración se sincronice desde la imagen:

    nomos status --contexts=$(kubectl config current-context)
    

    El resultado es similar al siguiente:

    Connecting to clusters...
    
    *cluster-name
      --------------------
      <root>:root-sync   oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/mysql:9.3.1
      SYNCED             9.3.1
      Managed resources:
          NAMESPACE  NAME                       STATUS    SOURCEHASH
          default    configmap/my-mysql         Current   9.3.1
          default    secret/my-mysql            Current   9.3.1
          default    service/my-mysql           Current   9.3.1
          default    service/my-mysql-headless  Current   9.3.1
          default    serviceaccount/my-mysql    Current   9.3.1
          default    statefulset.apps/my-mysql  Current   9.3.1
    

    Sincronizaste correctamente el gráfico de Helm con tu clúster.

    También puedes ver el imagePullPolicy en uno de los recursos sincronizados del clúster a fin de verificar que los valores del ConfigMap se hayan usado para renderizar el gráfico:

    kubectl get statefulset -n test my-mysql -o yaml | grep imagePullPolicy
    
  6. Debido a que el ConfigMap es inmutable, para cambiar los valores, debes crear un ConfigMap nuevo y actualizar spec.helm.valuesFileRefs en la especificación de RootSync o RepoSync para que apunte al nuevo ConfigMap. La creación de un ConfigMap nuevo garantiza que los cambios en los valores hagan que el gráfico de Helm se vuelva a renderizar, lo cual es útil cuando varios ConfigMaps a los que se hace referencia en spec.helm.valuesFileRefs deben actualizarse al mismo tiempo cuando se vuelven a renderizar. Si deseas cambiar los valores que se usan para renderizar tu gráfico, crea un ConfigMap nuevo con un nombre diferente:

    cat <<EOF>> CONFIGMAP_NAME-2.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: CONFIGMAP_NAME-2
      namespace: config-management-system
    immutable: true
    # You can use the same format as the default values file to override
    # default values.
    data:
      DATA_KEY: |-
        image:
          pullPolicy: Never
        primary:
          resources:
            limits:
              cpu: 100m
              memory: 256Mi
            requests:
              cpu: 250m
              memory: 200Mi
    
    EOF
    
  7. Actualiza tu objeto RootSync para hacer referencia al nuevo ConfigMap:

    cat <<EOF>> ROOT_SYNC_NAME.yaml
    apiVersion: configsync.gke.io/v1beta1
    kind: RootSync
    metadata:
      name: ROOT_SYNC_NAME
      namespace: config-management-system
    spec:
      sourceFormat: unstructured
      sourceType: helm
      helm:
        repo: oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME
        chart: mysql
        version: 9.3.1
        releaseName: my-mysql
        namespace: test
        # The k8sserviceaccount auth type is available in version 1.17.2 and
        # later. Use `gcpserviceaccount` if using an older version.
        # auth: gcpserviceaccount
        # gcpServiceAccountEmail: GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
        auth: k8sserviceaccount
        # use the optional field spec.helm.valuesFilesRefs to override default values
        # by referencing a ConfigMap
        valuesFileRefs:
        - name: CONFIGMAP_NAME-2
          dataKey: DATA_KEY
    
    EOF
    
  8. Aplica el objeto ConfigMap:

    kubectl apply -f CONFIGMAP_NAME-2.yaml
    
  9. Aplica el objeto RootSync:

    kubectl apply -f ROOT_SYNC_NAME.yaml
    
  10. Verifica que el Sincronizador de configuración se sincronice desde la imagen:

    nomos status --contexts=$(kubectl config current-context)
    

    También puedes ver el imagePullPolicy en uno de los recursos sincronizados del clúster a fin de verificar que los valores nuevos del ConfigMap actualizado se hayan usado para renderizar el gráfico:

    kubectl get statefulset -n test my-mysql -o yaml | grep imagePullPolicy
    

¿Qué sigue?