Synchroniser des charts Helm à partir d'Artifact Registry

Cette page explique comment synchroniser des charts Helm à partir d'Artifact Registry en créant et en transférant un chart Helm vers un dépôt dans Artifact Registry. Il contient également un exemple de configuration permettant de synchroniser un chart à partir de votre dépôt Helm.

Vous pouvez configurer Config Sync pour la synchronisation à partir de dépôts Helm. Vous pouvez stocker des charts Helm dans Artifact Registry, qui est le dépôt Helm recommandé pour Google Cloud. Pour utiliser cette fonctionnalité, vous devez activer les API RootSync et RepoSync. Config Sync affiche les charts Helm à l'aide de helm template et n'est donc pas compatible avec la gestion complète du cycle de vie Helm.

La page Versions groupées de Helm et Kustomize répertorie les versions de Kustomize et Helm fournies avec la version correspondante de Config Sync.

Avant de commencer

Limites

  • Vous ne pouvez pas modifier un champ immuable dans une configuration en modifiant simplement la valeur dans la source de vérité. Si vous devez mettre à jour un champ immuable, apportez d'abord la modification à la source de vérité, puis supprimez manuellement l'objet dans le cluster. Config Sync peut ensuite recréer l'objet avec la nouvelle valeur de champ.

  • Les charts Helm suivants incluent des jobs et ne sont pas recommandés pour le déploiement par Config Sync :

    Pour en savoir plus sur la raison pour laquelle les tâches ne sont pas recommandées pour une utilisation avec Config Sync, consultez la section Éviter de gérer les tâches avec Config Sync.

Créer un dépôt Artifact Registry

Dans cette section, vous allez créer un dépôt Artifact Registry. Pour en savoir plus sur la création de dépôts Artifact Registry, consultez la section Créer des dépôts.

  1. Activez l'API Artifact Registry :

    gcloud services enable artifactregistry.googleapis.com --project=PROJECT_ID
    
  2. Créer un dépôt Artifact Registry :

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

Remplacez les éléments suivants :

  • PROJECT_ID : ID de projet de l'organisation.
  • AR_REPO_NAME : ID du dépôt.
  • AR_REGION : emplacement régional ou multirégional du dépôt.

Variables utilisées dans les sections suivantes :

  • FLEET_HOST_PROJECT_ID : si vous utilisez Workload Identity de GKE, ce champ d'application est identique à PROJECT_ID. Si vous utilisez Workload Identity pour parc, il s'agit de l'ID du projet dans lequel votre cluster est enregistré.
  • GSA_NAME : nom du compte de service Google personnalisé que vous souhaitez utiliser pour vous connecter à Artifact Registry.
  • KSA_NAME : compte de service Kubernetes pour le rapprochement.
    • Pour les dépôts racine, si le nom RootSync est root-sync, ajoutez root-reconciler. Sinon, ajoutez root-reconciler-ROOT_SYNC_NAME.
    • Pour les dépôts d'espaces de noms, si le nom RepoSync est repo-sync, ajoutez ns-reconciler-NAMESPACE. Sinon, ajoutez ns-reconciler-NAMESPACE-REPO_SYNC_NAME-REPO_SYNC_NAME_LENGTH, où REPO_SYNC_NAME_LENGTH correspond au nombre de caractères dans REPO_SYNC_NAME.

Accorder l'autorisation de lecture

Si la version de Config Sync est 1.17.2 ou ultérieure sur votre cluster, vous pouvez utiliser le compte de service Kubernetes pour vous authentifier auprès d'Artifact Registry. Sinon, utilisez le compte de service Google pour l'authentification.

Utiliser le compte de service Kubernetes

Attribuez le rôle IAM de lecteur Artifact Registry (roles/artifactregistry.reader) au compte de service Kubernetes avec le pool d'identités de charge de travail :

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

Utiliser le compte de service Google

  1. Attribuez le rôle IAM de lecteur Artifact Registry (roles/artifactregistry.reader) au compte de service 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. Créez une liaison de stratégie IAM entre le compte de service Kubernetes et le compte de service 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
    

Transférer un chart Helm vers le dépôt Artifact Registry

Dans cette section, vous allez télécharger un chart Helm public et le transférer dans Artifact Registry.

  1. Récupérez le package mysql-9.3.1.tgz à partir du dépôt Helm public et téléchargez-le localement :

    helm pull mysql --repo https://charts.bitnami.com/bitnami --version 9.3.1
    
  2. Authentification avec un jeton d'accès :

    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
    

    Dans cette commande, oauth2accesstoken est le nom d'utilisateur à utiliser pour s'authentifier avec un jeton d'accès, et gcloud auth print-access-token est la commande permettant d'obtenir le jeton d'accès. Votre jeton d'accès est le mot de passe d'authentification. L'authentification à l'aide d'un jeton d'accès est la méthode d'authentification la plus sûre.

  3. Transférez le chart Helm vers Artifact Registry :

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

Configurer Config Sync pour la synchronisation à partir de votre chart Helm

Dans cette section, vous allez créer un objet RootSync et configurer Config Sync pour la synchronisation à partir du chart Helm.

Si vous souhaitez remplacer les valeurs par défaut du chart Helm, vous pouvez pour ce faire spécifier des valeurs dans le champ spec.helm.values ou ajouter une référence à un fichier ConfigMap à l'aide du champ spec.helm.valuesFileRefs (dans Config Sync 1.16.0 et versions ultérieures). Pour en savoir plus sur les champs facultatifs, consultez la section Configuration du dépôt Helm.

valeurs

  1. Créez un objet RootSync avec un nom unique :

    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
    

    Remplacez ROOT_SYNC_NAME par le nom de votre objet RootSync. Le nom doit être unique dans le cluster et ne pas dépasser 26 caractères. Si vous avez installé Config Sync à l'aide de la console Google Cloud ou de Google Cloud CLI, choisissez un nom autre que root-sync.

    Dans cet exemple, le chart Helm est déployé dans l'espace de noms test, car ses ressources contiennent namespace: {{ .Release.Namespace }} dans ses modèles.

    Vous pouvez utiliser helm.values pour remplacer les valeurs par défaut. Pour en savoir plus sur les champs facultatifs, consultez la section Configuration pour le dépôt Helm.

  2. Appliquez l'objet RootSync :

    kubectl apply -f ROOT_SYNC_NAME.yaml
    
  3. Vérifiez que Config Sync est synchronisé à partir de l'image :

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

    Le résultat ressemble à ce qui suit :

    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
    

    Vous venez de synchroniser le chart Helm avec votre cluster.

valuesFileRefs

  1. Créez un objet RootSync avec un nom unique :

    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
    

    Remplacez les éléments suivants :

    • ROOT_SYNC_NAME : nom de votre objet RootSync. Le nom doit être unique dans le cluster et ne pas dépasser 26 caractères. Si vous avez installé Config Sync à l'aide de la console Google Cloud ou de Google Cloud CLI, choisissez un nom autre que root-sync.
    • CONFIGMAP_NAME : nom de votre ConfigMap. Il peut s'agir de n'importe quel nom ConfigMap valide accepté par Kubernetes et unique dans votre cluster.
    • (facultatif) DATA_KEY : clé de données de votre ConfigMap dont vous souhaitez lire les valeurs. La valeur par défaut est values.yaml.
  2. Créez l'objet ConfigMap avec vos valeurs :

    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 vous n'avez pas spécifié de valeur pour DATA_KEY dans l'objet RootSync, il doit s'agir de la valeur par défaut values.yaml.

  3. Appliquez l'objet ConfigMap :

    kubectl apply -f CONFIGMAP_NAME.yaml
    
  4. Appliquez l'objet RootSync :

    kubectl apply -f ROOT_SYNC_NAME.yaml
    
  5. Vérifiez que Config Sync est synchronisé à partir de l'image :

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

    Le résultat ressemble à ce qui suit :

    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
    

    Vous venez de synchroniser le chart Helm avec votre cluster.

    Vous pouvez également consulter le fichier imagePullPolicy dans l'une des ressources synchronisées du cluster pour vérifier que les valeurs du fichier ConfigMap ont été utilisées pour afficher le graphique :

    kubectl get statefulset -n test my-mysql -o yaml | grep imagePullPolicy
    
  6. Comme l'objet ConfigMap est immuable, pour modifier les valeurs, vous devez créer un nouveau ConfigMap et mettre à jour spec.helm.valuesFileRefs dans la spécification RootSync ou RepoSync de sorte qu'il pointe vers le nouveau ConfigMap. La création d'un ConfigMap garantit que les modifications apportées aux valeurs entraînent un nouveau rendu du chart Helm, ce qui est utile lorsque plusieurs ConfigMaps référencés dans spec.helm.valuesFileRefs doivent être mis à jour en même temps lors du nouveau rendu. Pour modifier les valeurs utilisées pour afficher votre graphique, créez un objet ConfigMap avec un autre nom :

    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. Mettez à jour votre objet RootSync pour référencer le nouveau 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. Appliquez l'objet ConfigMap :

    kubectl apply -f CONFIGMAP_NAME-2.yaml
    
  9. Appliquez l'objet RootSync :

    kubectl apply -f ROOT_SYNC_NAME.yaml
    
  10. Vérifiez que Config Sync est synchronisé à partir de l'image :

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

    Vous pouvez également consulter le fichier imagePullPolicy dans l'une des ressources synchronisées du cluster pour vérifier que les nouvelles valeurs du fichier ConfigMap mis à jour ont été utilisées pour effectuer le rendu du graphique :

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

Étapes suivantes