Esta página mostra como sincronizar gráficos do Helm do Artifact Registry ao criar e enviar um gráfico do Helm para um repositório no Artifact Registry. Ela também contém uma configuração de amostra para sincronizar um gráfico do seu repositório do Helm.
É possível configurar
o Config Sync para sincronização por meio de repositórios do Helm.
É possível armazenar gráficos do Helm no Artifact Registry, que é o
repositório Helm recomendado para o Google Cloud. Para usar esse recurso, você precisa
ativar as
APIs RootSync e RepoSync.
O Config Sync renderiza gráficos do Helm usando helm template
e, portanto, não oferece suporte ao gerenciamento completo do ciclo de vida do Helm.
As versões do Helm e do Kustomize incluídas listam as versões do Kustomize e do Helm incluídas na versão correspondente do Config Sync.
Antes de começar
- Instale o Helm 3.8.0 ou mais recente. Nas versões anteriores do Helm, o suporte a gráficos no formato OCI é um recurso experimental.
- Ativar a federação de identidade da carga de trabalho do GKE nos clusters.
Limitações
Não é possível alterar nenhum campo imutável em uma configuração mudando o valor na fonte da verdade. Se você precisar atualizar um campo imutável, faça a mudança na fonte de verdade e exclua manualmente o objeto no cluster. O Config Sync pode recriar o objeto com o novo valor do campo.
Os gráficos do Helm a seguir incluem jobs e não são recomendados para implantação pelo Config Sync:
Para saber por que não é recomendável usar jobs com o Config Sync, consulte Evitar o gerenciamento de jobs com o Config Sync.
Crie um repositório do Artifact Registry
Nesta seção, você criará um repositório do Artifact Registry. Para saber mais sobre como criar repositórios do Artifact Registry, consulte Criar repositórios.
Ative a API Artifact Registry.
gcloud services enable artifactregistry.googleapis.com --project=PROJECT_ID
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:
PROJECT_ID
: ID do projeto da organização.AR_REPO_NAME
: o ID do repositório.AR_REGION
é o local regional ou multirregional do repositório.
Variáveis usadas nas seguintes seções:
FLEET_HOST_PROJECT_ID
: se você estiver usando a federação de identidade da carga de trabalho do GKE, será igual aPROJECT_ID
. Se você estiver usando a federação de identidade da carga de trabalho da frota para o GKE, esse será o ID do projeto da frota em que o cluster está registrado.GSA_NAME
: o nome da conta de serviço personalizada do Google que você quer usar para se conectar ao Artifact Registry.KSA_NAME
: a conta de serviço do Kubernetes do reconciliador.- Para repositórios raiz, se o nome
RootSync
forroot-sync
, adicioneroot-reconciler
. Caso contrário, adicioneroot-reconciler-ROOT_SYNC_NAME
. - Para repositórios de namespace, se o nome
RepoSync
forrepo-sync
, adicionens-reconciler-NAMESPACE
. Caso contrário, adicionens-reconciler-NAMESPACE-REPO_SYNC_NAME-REPO_SYNC_NAME_LENGTH
, em queREPO_SYNC_NAME_LENGTH
é o número de caracteres emREPO_SYNC_NAME
.
- Para repositórios raiz, se o nome
Conceder permissão de leitor
Se a versão do Config Sync for 1.17.2 ou mais recente no cluster, será possível usar a conta de serviço do Kubernetes para autenticar no Artifact Registry. Caso contrário, use a conta de serviço do Google para autenticação.
Usando a conta de serviço do Kubernetes
Conceda o papel do IAM de leitor do Artifact Registry (roles/artifactregistry.reader
)
à conta de serviço do Kubernetes com o
pool da Federação de Identidade da Carga de Trabalho 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
Usando a conta de serviço do Google
Conceda o papel do IAM de leitor do Artifact Registry (
roles/artifactregistry.reader
) à conta de serviço do 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
Crie uma vinculação de política do IAM entre a conta de serviço do Kubernetes e a conta de serviço do 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
Enviar um gráfico do Helm para o repositório do Artifact Registry
Nesta seção, você faz o download de um gráfico público do Helm e o envia ao Artifact Registry.
Recupere o pacote
mysql-9.3.1.tgz
do repositório público do Helm e faça o download localmente:helm pull mysql --repo https://charts.bitnami.com/bitnami --version 9.3.1
Fazer a autenticação 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
Nesse comando,
oauth2accesstoken
é o nome de usuário a ser usado na autenticação com um token de acesso egcloud auth print-access-token
é o comando para conseguir o token de acesso. Seu token de acesso é a senha para autenticação. A autenticação com um token de acesso é o método de autenticação mais seguro.Envie o gráfico do Helm para o Artifact Registry:
helm push mysql-9.3.1.tgz oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME
Configurar o Config Sync para sincronização no gráfico do Helm
Nesta seção, você criará um objeto RootSync e configurará o Config Sync para fazer a sincronização com o gráfico do Helm.
Se você quiser substituir os valores padrão do gráfico Helm, faça isso
especificando os valores no campo spec.helm.values
ou adicionando uma referência a um
ConfigMap
usando o campo spec.helm.valuesFileRefs
. Para saber mais sobre os campos
opcionais, consulte
Configuração para o repositório do Helm.
values
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 # 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
Substitua
ROOT_SYNC_NAME
pelo nome do objeto RootSync. O nome precisa ser exclusivo no cluster e ter no máximo 26 caracteres. Se você instalou o Config Sync usando o console do Google Cloud ou a Google Cloud CLI, escolha um nome diferente deroot-sync
.Neste exemplo, o gráfico do Helm é implantado no namespace
test
porque os recursos contêmnamespace: {{ .Release.Namespace }}
nos modelos.Use
helm.values
para substituir os valores padrão. Para saber mais sobre os campos opcionais, consulte Configuração para o repositório do Helm.Aplique o objeto RootSync:
kubectl apply -f ROOT_SYNC_NAME.yaml
Verifique se o Config Sync está sincronizando com a imagem:
nomos status --contexts=$(kubectl config current-context)
O resultado será assim:
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
Você sincronizou o gráfico do Helm com o cluster.
valuesFileRefs
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 # 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
Substitua:
ROOT_SYNC_NAME
: o nome do objeto RootSync. O nome precisa ser exclusivo no cluster e ter no máximo 26 caracteres. Se você instalou o Config Sync usando o console do Google Cloud ou a CLI do Google Cloud, escolha um nome diferente deroot-sync
.CONFIGMAP_NAME
: o nome do ConfigMap. Pode ser qualquer nome de ConfigMap válido aceito pelo Kubernetes que seja exclusivo no cluster.- (Opcional)
DATA_KEY
: a chave de dados no ConfigMap em que estão os valores que você quer ler. O padrão évalues.yaml
.
Crie o objeto ConfigMap com 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 você não especificou um valor para
DATA_KEY
no RootSync, ele precisa ser ovalues.yaml
padrão.Aplique o objeto ConfigMap:
kubectl apply -f CONFIGMAP_NAME.yaml
Aplique o objeto RootSync:
kubectl apply -f ROOT_SYNC_NAME.yaml
Verifique se o Config Sync está sincronizando com a imagem:
nomos status --contexts=$(kubectl config current-context)
O resultado será assim:
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
Você sincronizou o gráfico do Helm com o cluster.
Você também pode analisar o
imagePullPolicy
em um dos recursos sincronizados no cluster para verificar se os valores do ConfigMap foram usados a fim de renderizar o gráfico:kubectl get statefulset -n test my-mysql -o yaml | grep imagePullPolicy
Como o ConfigMap é imutável, para alterar os valores, você precisa criar um novo ConfigMap e atualizar
spec.helm.valuesFileRefs
na especificação do RootSync ou do RepoSync a fim de apontar para o novo ConfigMap. A criação de um novo ConfigMap garante que as alterações nos valores façam com que o gráfico Helm seja renderizado novamente, o que é útil quando vários ConfigMaps referenciados emspec.helm.valuesFileRefs
precisam ser atualizados ao mesmo tempo ao realizar novamente a 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
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 # 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
Aplique o objeto ConfigMap:
kubectl apply -f CONFIGMAP_NAME-2.yaml
Aplique o objeto RootSync:
kubectl apply -f ROOT_SYNC_NAME.yaml
Verifique se o Config Sync está sincronizando com a imagem:
nomos status --contexts=$(kubectl config current-context)
Também é possível analisar o
imagePullPolicy
em um dos recursos sincronizados no cluster para verificar se os novos valores do ConfigMap atualizado foram usados na renderização do gráfico:kubectl get statefulset -n test my-mysql -o yaml | grep imagePullPolicy
A seguir
- Saiba mais sobre como instalar o Config Sync.