Evitar desvios na configuração
O Config Sync reduz o risco de "operações de sombra" com a detecção de deslocamento. Quando alterações não verificadas são enviadas para clusters ativos, o Config Sync detecta e corrige qualquer deslocamento da fonte de verdade no Git. Além disso, o Config Sync fornece um webhook de admissão que rejeita alterações conflitantes de serem enviadas a clusters ativos. Esse webhook oferece um melhor feedback quando são feitas alterações manuais, em vez de permitir e corrigir a mudança silenciosamente. Além disso, esse webhook de admissão impede a modificação manual dos metadados e das anotações do Config Sync, o que causaria erros na configuração dos webhooks ou dos reconciliadores de admissão. Por padrão, o webhook protege apenas o repositório raiz. No entanto, é possível ativar o webhook de admissão em repositórios de namespace.
Quando o webhook de admissão do Config Sync estiver desativado, o Config Sync não rejeitará deslocamentos de configuração e alterações nos metadados do Config Sync, mas ainda detectará e corrigirá esses deslocamentos.
Para usar esse recurso, você precisa ativar as APIs RootSync e RepoSync.
Ativar a prevenção de deslocamento
Conclua as etapas a seguir para ativar a prevenção de deslocamento:
Defina o campo
preventDrift
no arquivo de configuração comotrue
e aplique o arquivo de configuração.gcloud
Ative a prevenção de deslocamento usando a CLI gcloud se você tiver instalado o Config Sync usando o Console do Google Cloud ou a CLI gcloud. Atualize a CLI gcloud para a versão mais recente. Defina o campo
spec.configSync.preventDrift
do arquivo de configuração da gcloud comotrue
e aplique o arquivo de configuração da gcloud.kubectl
Ative a prevenção de deslocamento usando
kubectl
se tiver instalado o Config Sync manualmente usandokubectl
. Defina o campospec.preventDrift
do objetoConfigManagement
comotrue
e aplique o objetoConfigManagement
.Aguarde até que o objeto
ValidateWebhookConfiguration
do Config Sync seja criado pelo Config Management Operator.kubectl get validatingwebhookconfiguration admission-webhook.configsync.gke.io
O resultado será semelhante a:
NAME WEBHOOKS AGE admission-webhook.configsync.gke.io 0 2m15s
Confirme uma nova alteração no repositório do Git para ser sincronizada para que a implantação
root-reconciler
possa adicionar webhooks ao objeto ValidatingWebhookConfiguration do Config Sync. Uma alternativa é excluir a Implantaçãoroot-reconcilier
para acionar uma reconciliação. A nova Implantaçãoroot-reconciler
atualizará o objeto ValidatingWebhookConfiguration do Config Sync.Aguarde até que o servidor do webhook esteja pronto. O registro de implantação do webhook de admissão do Config Sync precisa incluir
serving webhook server
. Isso pode levar alguns minutos.kubectl logs -n config-management-system -l app=admission-webhook --tail=-1 | grep "serving webhook server"
O resultado será semelhante a:
I1201 18:05:41.805531 1 deleg.go:130] controller-runtime/webhook "level"=0 "msg"="serving webhook server" "host"="" "port"=10250 I1201 18:07:04.626199 1 deleg.go:130] controller-runtime/webhook "level"=0 "msg"="serving webhook server" "host"="" "port"=10250
Desativar a prevenção de deslocamento
gcloud
Desative a prevenção de desvio usando a CLI gcloud se você tiver instalado o Config Sync usando o Console do Google Cloud ou a CLI gcloud.
Atualize a CLI gcloud para a
versão mais recente.
Defina o campo spec.configSync.preventDrift
do arquivo de configuração da gcloud como
false
ou remova o campo e, em seguida, aplique o arquivo de configuração da gcloud.
kubectl
Desative a prevenção de desvio usando kubectl
se tiver instalado o Config Sync manualmente usando kubectl
.
Defina o campo spec.preventDrift
do objeto ConfigManagement
como
false
ou remova o campo e, em seguida, aplique o objeto ConfigManagement
.
Isso excluirá todos os recursos de webhook de admissão do Config Sync. Como o objeto ValidatingWebhookConfiguration do Config Syncnão existe mais, os reconciliadores do Config Sync não geram mais as configurações do webhook para recursos gerenciados.
Ativar o webhook de admissão em repositórios de namespace
Os repositórios de namespace não são totalmente protegidos pelo webhook. O reconciliador do Config Sync para cada repositório de namespace não tem permissão para ler ou atualizar os objetos ValidatingWebhookConfiguration no nível do cluster.
Essa falta de permissão resulta em um erro nos registros de reconciliadores do namespace, semelhante ao exemplo a seguir:
Failed to update admission webhook: KNV2013: applying changes to
admission webhook: Insufficient permission. To fix, make sure the reconciler has
sufficient permissions.:
validatingwebhookconfigurations.admissionregistration.k8s.io "admission-
webhook.configsync.gke.io" is forbidden: User "system:serviceaccount:config-
management-system:ns-reconciler-NAMESPACE" cannot update resource
"validatingwebhookconfigurations" in API group "admissionregistration.k8s.io" at
the cluster scope
Esse erro pode ser ignorado se você não quiser usar a proteção de webhook para seu repositório de namespace. No entanto, se você quiser usar o webhook, conceda a seguinte permissão ao reconciliaçãor para cada repositório de namespace depois de configurar a sincronização em repositórios de namespace:
No repositório raiz, declare uma nova configuração do ClusterRole que conceda permissão ao webhook de admissão do Config Sync. Este ClusterRole só precisa ser definido uma vez por cluster:
# ROOT_REPO/cluster-roles/webhook-role.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: admission-webhook-role rules: - apiGroups: ["admissionregistration.k8s.io"] resources: ["validatingwebhookconfigurations"] resourceNames: ["admission-webhook.configsync.gke.io"] verbs: ["get", "update"]
Para cada repositório de namespace em que a permissão do webhook de admissão precise ser concedida, declare uma configuração ClusterRoleBinding para conceder acesso ao webhook de admissão:
# ROOT_REPO/NAMESPACE/sync-webhook-rolebinding.yaml kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: syncs-webhook subjects: - kind: ServiceAccount name: ns-reconciler-NAMESPACE namespace: config-management-system roleRef: kind: ClusterRole name: admission-webhook-role apiGroup: rbac.authorization.k8s.io
Substitua
NAMESPACE
pelo namespace em que você criou seu repositório de namespace.Confirme antes as mudanças no repositório:
git add . git commit -m 'Providing namespace repository the permission to update the admission webhook.' git push
Para verificar, use
kubectl get
para garantir que o ClusterRole e o ClusterRoleBinding foram criados:kubectl get clusterrole admission-webhook-role kubectl get clusterrolebindings syncs-webhook