Como parar e retomar configurações de sincronização

Em algumas situações, pode ser necessário interromper rapidamente a sincronização do Config Sync das configurações do repositório. Por exemplo, se alguém confirma no repositório uma configuração que é válida em termos de sintática, mas está incorreta, e você quer limitar os efeitos dela nos clusters em execução enquanto a configuração é removida ou corrigida.

Pré-requisitos

O usuário que executa os comandos discutidos neste tópico precisa das seguintes permissões de RBAC do Kubernetes no kube-system (obrigatório apenas para versões anteriores a 1.9.0) e nos namespaces config-management-system em todos os clusters o local onde você quer interromper a sincronização:

- apiGroups: ["extensions"]
  resources: ["deployments", "deployments/scale"]
  verbs: ["get", "update"]
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["list", "watch"]

Namespace config-management-operator

O config-management-operator estava no namespace kube-system para as versões do Anthos Config Management anteriores à 1.9.0. No Anthos Config Management 1.9.0, o config-management-operator foi movido para o namespace config-management-system. Antes de executar qualquer um dos comandos a seguir, defina uma variável de ambiente para indicar o namespace específico da versão.

Para o Anthos Config Management versões 1.9.0 ou mais recentes:

export OPERATOR_NAMESPACE=config-management-system

Para versões anteriores à 1.9.0:

export OPERATOR_NAMESPACE=kube-system

Como interromper e retomar a sincronização de repositórios únicos

Esta seção serve para repositórios únicos e mostra como interromper a sincronização rapidamente e retomar a sincronização quando o problema for resolvido. Para saber como interromper a sincronização de vários repositórios, consulte Como interromper e retomar a sincronização de vários repositórios.

Como interromper a sincronização

Para interromper a sincronização, execute os seguintes comandos, que são apresentados como um comando único para sua conveniência, mas que também podem ser executados separadamente:

kubectl scale -n $OPERATOR_NAMESPACE deployment config-management-operator --replicas=0 \
&& kubectl wait -n $OPERATOR_NAMESPACE --for=delete pods -l k8s-app=config-management-operator \
&& kubectl scale -n config-management-system deployment --replicas=0 --all \
&& kubectl wait -n config-management-system --for=delete pods --all

Veja a seguir os que os comandos fazem, em sequência. Se um comando falhar, os demais não serão executados.

  1. Reduza a contagem replicas no Config Management Operator Deployment para 0.
  2. Reduza para 0 a contagem de replicas de todos os pods em execução no namespace config-management-system. O conjunto exato de pods afetados varia de acordo com a versão do produto.

Todas as implantações ainda estão no cluster, mas nenhuma réplica do operador ou de qualquer um dos processos responsáveis pela sincronização estão disponíveis. Portanto, as configurações não são sincronizadas a partir do repositório.

Como interromper a sincronização em todos os clusters registrados

Se você precisa interromper a sincronização em todos os clusters registrados em um único projeto do Google Cloud, em vez de um cluster por vez, crie um script que use o comando nomos status para receber a lista de todos os clusters registrados. Em seguida, o script cria um contexto kubectl para cada cluster usando o comando gcloud container clusters get-credentials e executa os comandos acima em cada um deles. Veja a seguir um exemplo simples desse script:

#!/bin/bash

nomos status |grep SYNCED | awk {'print $1'} |while read i; do

  gcloud container clusters get-credentials "$i"

  kubectl scale -n $OPERATOR_NAMESPACE deployment config-management-operator --replicas=0 \
  && kubectl wait -n $OPERATOR_NAMESPACE --for=delete pods -l k8s-app=config-management-operator \
  && kubectl scale -n config-management-system deployment --replicas=0 --all \
  && kubectl wait -n config-management-system --for=delete pods --all

done

Como retomar a sincronização

Para retomar a sincronização, execute o seguinte comando:

kubectl -n $OPERATOR_NAMESPACE scale deployment config-management-operator --replicas=1

Esse comando escalona a implantação do operador para uma réplica. Em seguida, o operador reconhece que os pods no Deployment do namespace config-management-system são dimensionados incorretamente e os escalona para a contagem apropriada de réplicas.

Como retomar a sincronização em todos os clusters registrados

Se você precisa retomar a sincronização de todos os clusters registrados em um projeto do Google Cloud, em vez de um cluster por vez, crie um script que use nomos status para ver a lista de todos os clusters registrados. Em seguida, o script cria um contexto kubectl para cada cluster usando o comando gcloud container clusters get-credentials e executa o comando acima em cada um deles. Veja a seguir um exemplo simples desse script:

#!/bin/bash

nomos status |grep SYNCED | awk {'print $1'} |while read i; do

  gcloud container clusters get-credentials "$i"

  kubectl -n $OPERATOR_NAMESPACE scale deployment config-management-operator --replicas=1

done

Como parar e retomar a sincronização de vários repositórios

Esta seção serve para vários repositórios e mostra como parar temporariamente e retomar a sincronização de vários repositórios. Talvez seja necessário fazer isso se uma configuração incorreta estiver confirmada acidentalmente para seu repositório. Para saber como parar a sincronização de repositórios únicos, consulte Como interromper e retomar a sincronização de repositórios únicos.

Apenas um administrador central pode interromper a sincronização no repositório raiz.

A capacidade de interromper a sincronização em repositórios de namespace depende do método de configuração usado para seus repositórios de namespace.

  • Se o método Controlar repositórios de namespace no repositório raiz foi usado, um administrador central é o único que poderá parar e retomar a sincronização.

  • Se o método Controlar repositórios de namespace com a API Kubernetes for usado, os operadores do aplicativo poderão parar e retomar a sincronização dos repositórios de namespace em que eles trabalham.

Como interromper a sincronização

As seções a seguir mostram como parar de sincronizar os repositórios de raiz e de repositórios. Para impedir que o Reconciler Manager reverta a alteração, é necessário interromper o Reconciler Manager primeiro. Basta executar os seguintes comandos:

kubectl -n $OPERATOR_NAMESPACE scale deployment config-management-operator --replicas=0 \
&& kubectl wait -n $OPERATOR_NAMESPACE --for=delete pods -l k8s-app=config-management-operator --timeout=60s \
&& kubectl scale deployment -n config-management-system reconciler-manager --replicas=0 \
&& kubectl wait -n config-management-system --for=delete pods -l app=reconciler-manager

Veja a seguir os que os comandos fazem, em sequência. Se um comando falhar, os demais não serão executados.

  1. Reduza a contagem replicas no Config Management Operator Deployment para 0.
  2. Reduza a contagem de replicas na implantação do Reconciler Manager para 0 (zero).

Como interromper a sincronização do repositório raiz

Para interromper a sincronização do repositório raiz, um administrador central pode executar o seguinte comando:

kubectl -n config-management-system scale deployment root-reconciler --replicas=0

Esse comando reduz a contagem de replicas na implantação root-reconciler para 0.

Como interromper a sincronização de repositórios de namespace

Selecione a guia do método de repositório raiz ou do método da API Kubernetes para ver as instruções relevantes.

Método do repositório raiz

Se o método Controlar repositórios de namespace no repositório raiz foi usado, os administradores centrais poderão executar os seguintes comandos para interromper a sincronização de um repositório de namespace:

kubectl -n config-management-system scale deployment ns-reconciler-NAMESPACE --replicas=0

O comando reduz a contagem de réplicas na implantação ns-reconciler-NAMESPACE para 0.

Método da API Kubernetes

Se o método Controlar repositórios de namespace com a API Kubernetes for usado, os operadores do aplicativo poderão interromper a sincronização executando os seguintes comandos:

  1. Recupere e salve a configuração RepoSync para usá-la mais tarde, quando quiser retomar a sincronização:

    kubectl -n NAMESPACE get reposyncs repo-sync -oyaml > repo-sync.yaml
    

    Substitua NAMESPACE pelo namespace do objeto RepoSync.

  2. Exclua a configuração RepoSync:

    kubectl -n NAMESPACE delete reposyncs repo-sync
    

    Este comando aciona o Reconciler Manager para remover o conciliador de namespace (ns-reconciler-NAMESPACE) de NAMESPACE e parar a sincronização.

Como impedir que o webhook de admissão impeça deslocamentos (opcional)

Para interromper a execução da prevenção de deslocamento do Config Sync, depois de interromper os reconciliadores, interrompa o webhook de admissão executando o seguinte comando:

kubectl delete validatingwebhookconfigurations.admissionregistration.k8s.io admission-webhook.configsync.gke.io

Essa etapa é opcional e só será necessária quando você precisar fazer alterações conflitantes em recursos gerenciados no cluster. Isso requer que o reconciliador de raiz seja interrompido primeiro. Caso contrário, o reconciliador de raiz tentará gerar as configurações do webhook após a exclusão.

Como interromper a sincronização de todos os repositórios

Para interromper a sincronização de todos os repositórios, incluindo o repositório de raiz e os repositórios de namespace, execute os seguintes comandos:

kubectl scale deployment -n config-management-system -l app=reconciler --replicas=0 \
&& kubectl wait -n config-management-system --for=delete pods -l app=reconciler

Os comandos reduzem a contagem de replicas de todos os pods do reconciliador em execução no namespace config-management-system para 0 e aguardam até que todos os pods do reconciliador sejam excluídos.

Todas as implantações do reconciliador ainda estão no cluster, mas nenhuma réplica do reconciliador ou de qualquer um dos processos responsáveis pela sincronização estão disponíveis. Portanto, as configurações não são sincronizadas do repositório.

Como interromper a sincronização em todos os clusters registrados

Se você precisa interromper a sincronização em todos os clusters registrados em um único projeto do Google Cloud, em vez de um cluster por vez, crie um script que use o comando nomos status para receber a lista de todos os clusters registrados. Em seguida, o script cria um contexto kubectl para cada cluster usando o comando gcloud container clusters get-credentials e executa os comandos acima em cada um deles. Veja a seguir um exemplo simples desse script:

#!/bin/bash

nomos status | grep SYNCED | awk {'print $1'} | while read i; do

  gcloud container clusters get-credentials "$i"

  kubectl scale -n $OPERATOR_NAMESPACE deployment config-management-operator --replicas=0 \
  && kubectl wait -n $OPERATOR_NAMESPACE --for=delete pods -l k8s-app=config-management-operator --timeout=60s \
  && kubectl scale deployment -n config-management-system reconciler-manager --replicas=0 \
  && kubectl wait -n config-management-system --for=delete pods -l app=reconciler-manager \
  && kubectl scale deployment -n config-management-system -l app=reconciler --replicas=0 \
  && kubectl wait -n config-management-system --for=delete pods -l app=reconciler

done

Como retomar a sincronização

Nesta seção, você verá como retomar a sincronização do repositório raiz e dos repositórios de namespace.

Como retomar a sincronização do repositório raiz

Para retomar a sincronização a partir de um repositório raiz, um administrador central pode executar o seguinte comando:

kubectl -n config-management-system scale deployment root-reconciler --replicas=1

Esse comando escalona a implantação root-reconciler do operador para uma réplica.

Como retomar a sincronização de um repositório de namespace

Selecione a guia do método de repositório raiz ou do método da API Kubernetes para ver as instruções relevantes.

Método do repositório raiz

Se você usou o método Controlar repositórios de namespace no repositório raiz, um administrador central poderá executar o comando a seguir:

kubectl -n config-management-system scale deployment ns-reconciler-NAMESPACE --replicas=1

Este comando escalona a implantação ns-conciliation-NAMESPACE para uma réplica.

Método da API Kubernetes

Se você usou o método Controlar repositórios de namespace com a API Kubernetes, os operadores de aplicativo poderão retomar a sincronização reaplicando repo-sync.yaml, que contém a configuração RepoSync:

kubectl apply -f repo-sync.yaml

Esse comando aciona o Reconciler Manager para criar um processo de reconciliação de namespace e criar uma implantação ns-reconciler-NAMESPACE.

Como retomar o webhook de admissão

Depois que o reconciliador raiz for retomado, as configurações do webhook são geradas automaticamente. Para confirmar se ele foi gerado com êxito, execute o seguinte comando:

kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io admission-webhook.configsync.gke.io

Como retomar a sincronização de todos os repositórios

Para retomar a sincronização de todos os repositórios, execute o seguinte comando:

kubectl -n $OPERATOR_NAMESPACE scale deployment config-management-operator --replicas=1

Esse comando escalona a implantação do operador para uma réplica. Em seguida, o operador reconhece que a implantação do Reconciler Manager está escalonada incorretamente e a escalona para a contagem de réplicas apropriada. No final, o Reconciler Manager redimensiona as reconciliações de raiz e de namespace para a contagem de réplicas correspondente.

  # scale the root-reconciler Deployment to 1 replica.
  kubectl -n config-management-system scale deployment root-reconciler --replicas=1

  # scale the ns-reconciler-NAMESPACE Deployment to 1 replica.
  kubectl -n config-management-system scale deployment ns-reconciler-NAMESPACE --replicas=1

Como retomar a sincronização em todos os clusters registrados

Se você precisa retomar a sincronização de todos os clusters registrados em um projeto do Google Cloud, em vez de um cluster por vez, crie um script que use nomos status para ver a lista de todos os clusters registrados. Em seguida, o script cria um contexto kubectl para cada cluster usando o comando gcloud container clusters get-credentials e executa o comando acima em cada um deles. Veja a seguir um exemplo simples desse script:

#!/bin/bash

nomos status |grep SYNCED | awk {'print $1'} |while read i; do

  gcloud container clusters get-credentials "$i"

  kubectl -n $OPERATOR_NAMESPACE scale deployment config-management-operator --replicas=1

done

A seguir