Sincronize gráficos Helm a partir do Artifact Registry

Esta página mostra como sincronizar gráficos Helm do Artifact Registry criando e enviando um gráfico Helm para um repositório no Artifact Registry. Também contém uma configuração de exemplo para sincronizar um gráfico do seu repositório Helm.

Pode configurar o Config Sync para sincronizar a partir de repositórios do Helm. Pode armazenar gráficos Helm no Artifact Registry, que é o repositório Helm recomendado para o Google Cloud. Para usar esta funcionalidade, tem de ativar as APIs RootSync e RepoSync. O Config Sync renderiza gráficos Helm através de helm template e, por isso, não suporta a gestão completa do ciclo de vida do Helm.

A lista de versões do Helm e do Kustomize incluídas apresenta as versões do Kustomize e do Helm incluídas na versão correspondente do Config Sync.

Antes de começar

Limitações

  • Não pode alterar nenhum campo imutável numa configuração apenas alterando o valor na fonte de dados fidedigna. Se precisar de atualizar um campo imutável, primeiro faça a alteração na fonte de dados fidedigna e, em seguida, elimine manualmente o objeto no cluster. Em seguida, a sincronização de configuração pode recriar o objeto com o novo valor do campo.

  • Os seguintes gráficos Helm incluem tarefas e não são recomendados para implementação pelo Config Sync:

    Para saber mais sobre o motivo pelo qual não é recomendado usar Jobs com a sincronização de configuração, consulte o artigo Evite gerir Jobs com a sincronização de configuração.

Crie um repositório do Artifact Registry

Nesta secção, cria um repositório do Artifact Registry. Para saber como criar repositórios do Artifact Registry, consulte Criar repositórios.

  1. Ative a API Artifact Registry:

    gcloud services enable artifactregistry.googleapis.com --project=PROJECT_ID
    
  2. Crie um repositório do Artifact Registry:

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

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto da organização.
  • AR_REPO_NAME: o ID do repositório.
  • AR_REGION: a localização regional ou multirregional do repositório.

Variáveis usadas nas seguintes secções:

  • FLEET_HOST_PROJECT_ID: se estiver a usar a Workload Identity Federation do GKE para o GKE, é o mesmo que PROJECT_ID. Se estiver a usar a Workload Identity Federation para o GKE, este é o ID do projeto da frota no qual o seu cluster está registado.
  • GSA_NAME: o nome da conta de serviço Google personalizada que quer usar para estabelecer ligação ao Artifact Registry.
  • KSA_NAME: a conta de serviço do Kubernetes para o reconciliador.
    • Para repositórios raiz, se o nome RootSync for root-sync, adicione root-reconciler. Caso contrário, adicione root-reconciler-ROOT_SYNC_NAME.
    • Para repositórios de espaços de nomes, se o nome RepoSync for repo-sync, adicione ns-reconciler-NAMESPACE. Caso contrário, adicione ns-reconciler-NAMESPACE-REPO_SYNC_NAME-REPO_SYNC_NAME_LENGTH, onde REPO_SYNC_NAME_LENGTH é o número de carateres em REPO_SYNC_NAME.

Conceda autorização de leitor

Use uma conta de serviço do Kubernetes para fazer a autenticação no Artifact Registry concluindo os seguintes passos:

Conceda a função de IAM leitor do Artifact Registry (roles/artifactregistry.reader) à conta de serviço do Kubernetes que tem a federação de identidades da carga de trabalho para o pool do 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

Envie um gráfico Helm para o repositório do Artifact Registry

Nesta secção, transfere um gráfico Helm público e envia-o para o Artifact Registry.

  1. Obtenha o pacote mysql-9.3.1.tgz do repositório Helm público e transfira-o localmente:

    helm pull mysql --repo https://charts.bitnami.com/bitnami --version 9.3.1
    
  2. Autentique com um token de acesso:

    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
    

    Neste comando, oauth2accesstoken é o nome de utilizador a usar quando se autentica com uma chave de acesso e gcloud auth print-access-token é o comando para obter a chave de acesso. A chave de acesso é a palavra-passe para autenticação. A autenticação com um token de acesso é o método de autenticação mais seguro.

  3. Envie o gráfico Helm para o Artifact Registry:

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

Configure o Config Sync para sincronizar a partir do seu gráfico Helm

Nesta secção, cria um objeto RootSync e configura o Config Sync para sincronizar a partir do gráfico Helm.

Se quiser substituir os valores predefinidos do gráfico Helm, pode fazê-lo especificando valores no campo spec.helm.values ou adicionando uma referência a um ConfigMap através do campo spec.helm.valuesFileRefs. Para saber mais acerca dos campos opcionais, consulte a configuração do repositório Helm.

valores

  1. Crie um objeto RootSync com um nome exclusivo:

    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
    

    Substitua ROOT_SYNC_NAME pelo nome do objeto RootSync. O nome deve ser exclusivo no cluster e não ter mais de 26 carateres. Se instalou o Config Sync através da Google Cloud consola ou da CLI do Google Cloud, escolha um nome diferente de root-sync.

    Neste exemplo, o gráfico Helm é implementado no espaço de nomes test porque os respetivos recursos contêm namespace: {{ .Release.Namespace }} nos respetivos modelos.

    Pode usar helm.values para substituir os valores predefinidos. Para saber mais acerca dos campos opcionais, consulte o artigo Configuração para o repositório Helm.

  2. Aplique o objeto RootSync:

    kubectl apply -f ROOT_SYNC_NAME.yaml
    
  3. Verifique se o Config Sync está a sincronizar a partir da imagem:

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

    O resultado é semelhante ao seguinte:

    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
    

    Agora, sincronizou com êxito o gráfico Helm com o seu cluster.

valuesFileRefs

  1. Crie um objeto RootSync com um nome exclusivo:

    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
    

    Substitua o seguinte:

    • ROOT_SYNC_NAME: o nome do objeto RootSync. O nome deve ser exclusivo no cluster e não ter mais de 26 carateres. Se instalou o Config Sync através da Google Cloud consola ou da CLI do Google Cloud, escolha um nome diferente de root-sync.
    • CONFIGMAP_NAME: o nome do seu ConfigMap. Pode ser qualquer nome de ConfigMap válido aceite pelo Kubernetes que seja único no seu cluster.
    • (opcional) DATA_KEY: a chave de dados no seu ConfigMap a partir da qual quer ler os valores. A predefinição é values.yaml.
  2. Crie o objeto ConfigMap com os seus 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
    

    Se não especificou um valor para DATA_KEY no RootSync, deve ser o valor predefinido values.yaml.

  3. Aplique o objeto ConfigMap:

    kubectl apply -f CONFIGMAP_NAME.yaml
    
  4. Aplique o objeto RootSync:

    kubectl apply -f ROOT_SYNC_NAME.yaml
    
  5. Verifique se o Config Sync está a sincronizar a partir da imagem:

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

    O resultado é semelhante ao seguinte:

    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
    

    Agora, sincronizou com êxito o gráfico Helm com o seu cluster.

    Também pode consultar o imagePullPolicy num dos recursos sincronizados no cluster para verificar se os valores do ConfigMap foram usados para renderizar o gráfico:

    kubectl get statefulset -n test my-mysql -o yaml | grep imagePullPolicy
    
  6. Uma vez que o ConfigMap é imutável, para alterar os valores, tem de criar um novo ConfigMap e atualizar spec.helm.valuesFileRefs na especificação RootSync ou RepoSync para apontar para o novo ConfigMap. A criação de um novo ConfigMap garante que as alterações aos valores fazem com que o gráfico Helm seja renderizado novamente, o que é útil quando vários ConfigMaps referenciados em spec.helm.valuesFileRefs precisam de ser atualizados ao mesmo tempo durante a nova renderização. Para alterar os valores usados para renderizar o gráfico, crie um novo ConfigMap com um nome 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. Atualize o objeto RootSync para fazer referência ao novo 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
    
  8. Aplique o objeto ConfigMap:

    kubectl apply -f CONFIGMAP_NAME-2.yaml
    
  9. Aplique o objeto RootSync:

    kubectl apply -f ROOT_SYNC_NAME.yaml
    
  10. Verifique se o Config Sync está a sincronizar a partir da imagem:

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

    Também pode consultar o imagePullPolicy num dos recursos sincronizados no cluster para verificar se os novos valores do ConfigMap atualizado foram usados para renderizar o gráfico:

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

O que se segue?