En esta página se muestra cómo sincronizar gráficos de Helm desde Artifact Registry creando y enviando un gráfico de Helm a un repositorio de Artifact Registry. También contiene una configuración de ejemplo para sincronizar un gráfico de tu repositorio de Helm.
Puedes configurar Config Sync para que se sincronice desde 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 RootSync y RepoSync.
Config Sync renderiza gráficos de Helm mediante
helm template
y, por lo tanto, no admite la gestión completa del ciclo de vida de Helm.
En Versiones de Helm y Kustomize incluidas se indican las versiones de Kustomize y Helm incluidas en la versión correspondiente de Config Sync.
Antes de empezar
- Instala Helm 3.8.0 o una versión posterior. En versiones anteriores de Helm, la compatibilidad con gráficos en formato OCI es una función experimental.
- Habilita Workload Identity Federation para GKE en tu clúster.
Limitaciones
No puedes cambiar ningún campo inmutable de una configuración simplemente cambiando el valor en la fuente de información veraz. Si necesita actualizar un campo inmutable, primero haga el cambio en la fuente de información y, a continuación, elimine manualmente el objeto del clúster. Config Sync puede volver a crear el objeto con el nuevo valor del campo.
Los siguientes gráficos de Helm incluyen tareas y no se recomiendan para la implementación con Config Sync:
Para obtener más información sobre por qué no se recomienda usar Jobs con Config Sync, consulta Evitar gestionar Jobs con Config Sync.
Crear 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 el artículo Crear repositorios.
Habilita la API de Artifact Registry:
gcloud services enable artifactregistry.googleapis.com --project=PROJECT_ID
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
Haz los cambios siguientes:
PROJECT_ID
: el ID del proyecto de la organización.AR_REPO_NAME
: el ID del repositorio.AR_REGION
: la ubicación regional o multirregional del repositorio.
Variables usadas en las siguientes secciones:
FLEET_HOST_PROJECT_ID
: si usas GKE Workload Identity Federation for GKE, es lo mismo quePROJECT_ID
. Si usas la federación de identidades de carga de trabajo de flota para GKE, este es el ID del proyecto de la flota en la que está registrado tu clúster.GSA_NAME
: el nombre de la cuenta de servicio de Google personalizada que quieras usar para conectarte a Artifact Registry.KSA_NAME
: la cuenta de servicio de Kubernetes del reconciliador.- En el caso de los repositorios raíz, si el nombre de
RootSync
esroot-sync
, añaderoot-reconciler
. De lo contrario, añaderoot-reconciler-ROOT_SYNC_NAME
. - En el caso de los repositorios de espacios de nombres, si el nombre de
RepoSync
esrepo-sync
, añadens-reconciler-NAMESPACE
. De lo contrario, añadens-reconciler-NAMESPACE-REPO_SYNC_NAME-REPO_SYNC_NAME_LENGTH
, dondeREPO_SYNC_NAME_LENGTH
es el número de caracteres deREPO_SYNC_NAME
.
- En el caso de los repositorios raíz, si el nombre de
Conceder permiso de lectura
Para autenticarte en Artifact Registry con una cuenta de servicio de Kubernetes, sigue estos pasos:
Concede el rol de IAM Lector de Artifact Registry (roles/artifactregistry.reader
) a la cuenta de servicio de Kubernetes que tenga el grupo de federación de Workload Identity para GKE:
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
Enviar un gráfico de Helm al repositorio de Artifact Registry
En esta sección, descargarás un gráfico de Helm público y lo enviarás a Artifact Registry.
Recupera el paquete
mysql-9.3.1.tgz
del repositorio público de Helm y descárgalo localmente:helm pull mysql --repo https://charts.bitnami.com/bitnami --version 9.3.1
Autenticarse con un token de acceso:
Linux o 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 va a usar al autenticarte con un token de acceso ygcloud 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.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
Configurar Config Sync para sincronizar desde tu gráfico de Helm
En esta sección, crearás un objeto RootSync y configurarás Config Sync para que se sincronice desde el gráfico de Helm.
Si quieres anular los valores predeterminados del gráfico de Helm, puedes hacerlo especificando valores en el campo spec.helm.values
o añadiendo una referencia a un ConfigMap mediante el campo spec.helm.valuesFileRefs
. Para obtener más información sobre los campos opcionales, consulta Configuración del repositorio de Helm.
valores
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 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
Sustituye
ROOT_SYNC_NAME
por el nombre de tu objeto RootSync. El nombre debe ser único en el clúster y no tener más de 26 caracteres. Si has instalado Config Sync con la Google Cloud consola o la CLI de Google Cloud, elige un nombre que no searoot-sync
.En este ejemplo, el gráfico de Helm se despliega en el espacio de nombres
test
porque sus recursos contienennamespace: {{ .Release.Namespace }}
en sus plantillas.Puede usar
helm.values
para anular los valores predeterminados. Para obtener información sobre los campos opcionales, consulta Configuración del repositorio de Helm.Aplica el objeto RootSync:
kubectl apply -f ROOT_SYNC_NAME.yaml
Verifica que Config Sync se esté sincronizando desde la imagen:
nomos status --contexts=$(kubectl config current-context)
El resultado debería ser 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
Ahora ya has sincronizado correctamente el gráfico de Helm con tu clúster.
valuesFileRefs
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 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
Haz los cambios siguientes:
ROOT_SYNC_NAME
: el nombre de tu objeto RootSync. El nombre debe ser único en el clúster y no tener más de 26 caracteres. Si has instalado Config Sync con la consola Google Cloud o la CLI de Google Cloud, elige un nombre que no searoot-sync
.CONFIGMAP_NAME
: el nombre de tu ConfigMap. Puede ser cualquier nombre de ConfigMap válido aceptado por Kubernetes que sea único en tu clúster.- (Opcional)
DATA_KEY
: la clave de datos de tu ConfigMap de la que quieres leer los valores. El valor predeterminado esvalues.yaml
.
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 has especificado ningún valor para
DATA_KEY
en RootSync, debería ser el valor predeterminadovalues.yaml
.Aplica el objeto ConfigMap:
kubectl apply -f CONFIGMAP_NAME.yaml
Aplica el objeto RootSync:
kubectl apply -f ROOT_SYNC_NAME.yaml
Verifica que Config Sync se esté sincronizando desde la imagen:
nomos status --contexts=$(kubectl config current-context)
El resultado debería ser 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
Ahora ya has sincronizado correctamente el gráfico de Helm con tu clúster.
También puedes consultar el
imagePullPolicy
de uno de los recursos sincronizados del clúster para verificar que los valores de ConfigMap se han usado para renderizar el gráfico:kubectl get statefulset -n test my-mysql -o yaml | grep imagePullPolicy
Como ConfigMap es inmutable, para cambiar los valores, debes crear un nuevo ConfigMap y actualizar
spec.helm.valuesFileRefs
en la especificación de RootSync o RepoSync para que apunte al nuevo ConfigMap. Al crear un ConfigMap, los cambios en los valores hacen que el gráfico de Helm se vuelva a renderizar, lo que resulta útil cuando se hace referencia a varios ConfigMaps enspec.helm.valuesFileRefs
y es necesario actualizarlos al mismo tiempo al volver a renderizar. Para cambiar los valores que se usan para renderizar el gráfico, crea un nuevo ConfigMap con otro nombre: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
Actualiza el objeto RootSync para que haga 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 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
Aplica el objeto ConfigMap:
kubectl apply -f CONFIGMAP_NAME-2.yaml
Aplica el objeto RootSync:
kubectl apply -f ROOT_SYNC_NAME.yaml
Verifica que Config Sync se esté sincronizando desde la imagen:
nomos status --contexts=$(kubectl config current-context)
También puede consultar el
imagePullPolicy
de uno de los recursos sincronizados del clúster para verificar que los nuevos valores del ConfigMap actualizado se han usado para renderizar el gráfico:kubectl get statefulset -n test my-mysql -o yaml | grep imagePullPolicy