Como gerenciar objetos de cluster atuais

Quando o Config Sync gerencia um objeto de cluster, ele observa o objeto e o conjunto de configurações que afetam o objeto no repositório e garante que eles estejam em sincronia. Neste tópico, você verá como começar a gerenciar um objeto atual e como parar de gerenciar um objeto que é gerenciado atualmente sem excluí-lo.

Visão geral

Um objeto em um cluster será gerenciado pelo Config Sync se tiver a anotação configmanagement.gke.io/managed: enabled e a anotação configsync.gke.io/resource-id, que rastreia as informações de grupo, tipo, namespace e nome de o objeto está correto.

O formato da anotação configsync.gke.io/resource-id é GROUP_KIND_NAMESPACE_NAME para um objeto com escopo de namespace e GROUP_KIND_NAME para um objeto com escopo de cluster.

O fluxograma a seguir descreve algumas situações que fazem com que um objeto seja gerenciado ou não:

Como ativar ou cancelar o gerenciamento de um objeto do Kubernetes usando o Config Sync

O gráfico contém três fluxos separados: começar a gerenciar um objeto, parar de gerenciar um objeto e excluir um objeto gerenciado.

  1. Quero gerenciar um objeto. O objeto tem um config no repo?
    • Não: crie um config para o objeto. O Config Sync define a anotação configmanagement.gke.io/managed: enabled, define a anotação configsync.gke.io/resource-id para corresponder ao objeto e começa a gerenciá-lo.
    • Sim: o config define a anotação configmanagement.gke.io/managed: disabled?
      • Não: o objeto é gerenciado por padrão.
      • Sim: edite o config para remover a anotação configmanagement.gke.io/managed: disabled. Quando a alteração é enviada ao repositório de origem, o Config Sync percebe a alteração, aplica a anotação configmanagement.gke.io/managed: enabled e a anotação configsync.gke.io/resource-id e aplica a configuração.
  2. Quero parar de gerenciar um objeto, mas não excluí-lo.
    • Edite a configuração do objeto no repositório e defina a anotação configmanagement.gke.io/managed: disabled. Quando a alteração da configuração é detectada, o Config Sync deixa de gerenciar o objeto.
  3. Quero parar de gerenciar um objeto e excluí-lo.
    • Exclua a configuração do objeto do repositório. Quando você exclui uma configuração de um objeto gerenciado anteriormente, o Config Sync exclui o objeto de todos os clusters ou namespaces a que a configuração se aplica.

Além das anotações configmanagement.gke.io/managed: enabled e configsync.gke.io/resource-id, o Config Sync aplica o rótulo app.kubernetes.io/managed-by: configmanagement.gke.io a todos os objetos gerenciados por ele. Esse rótulo permite que você liste todos os objetos com facilidade por Config Sync.

Por que não aplicar a anotação manualmente?

O Config Sync usa um modelo declarativo para aplicar alterações de configuração aos clusters lendo a configuração pretendida no seu repositório. Se você tentar aplicar a anotação manualmente (usando o comando kubectl ou a API Kubernetes), o Config Sync substituirá o manual automaticamente pelo conteúdo do seu repositório.

Antes de começar

Os exemplos a seguir se baseiam no guia de início rápido. Antes de iniciar as próximas etapas, siga o guia de início rápido e conclua todas as etapas antes de Examinar o cluster e o repositório.

Listar todos os objetos gerenciados

Para listar todos os objetos gerenciados pelo Config Sync em um determinado cluster ou namespace, use um seletor de rótulo como este:

kubectl get object-type -n namespace -l "app.kubernetes.io/managed-by=configmanagement.gke.io"

Para listar todos os objetos não gerenciados pelo Config Sync, use um seletor de rótulos como este:

kubectl get object-type -n namespace -l "app.kubernetes.io/managed-by!=configmanagement.gke.io"

Por exemplo, este comando lista RoleBindings no namespace gamestore que são gerenciados pelo Config Sync:

kubectl get rolebindings -n gamestore \
    -l "app.kubernetes.io/managed-by=configmanagement.gke.io"

Saída de exemplo: ```none NAME ROLE AGE configsync.gke.io:ns-reconciler ClusterRole/configsync.gke.io:ns-reconciler 34h gamestore-admin ClusterRole/admin 34h gamestore-webstore-admin ClusterRole/webstore-admin 34h


This command lists RoleBindings in the `kube-system` namespace that are **not**
managed by Config Sync:

<pre class="devsite-click-to-copy">
kubectl get rolebindings -n kube-system \
    -l "app.kubernetes.io/managed-by!=configmanagement.gke.io"
</pre>

Example output:
```none
NAME                                             AGE
fluentd-gcp-scaler-binding                       2d21h
gce:cloud-provider                               2d21h
heapster-binding                                 2d21h
metrics-server-auth-reader                       2d21h
system::leader-locking-kube-controller-manager   2d21h
system::leader-locking-kube-scheduler            2d21h
system:controller:bootstrap-signer               2d21h
system:controller:cloud-provider                 2d21h
system:controller:token-cleaner                  2d21h

Começar a gerenciar um objeto atual

É possível criar uma configuração de um objeto atual do Kubernetes, como um namespace que já existia no cluster antes de instalar o Config Sync. No entanto, essa configuração será ignorada a menos que o objeto tenha a anotação configmanagement.gke.io/managed: enabled e a anotação configsync.gke.io/resource-id correta. Em um objeto atual, você precisa aplicar a anotação manualmente.

No caso específico dos namespaces, o Config Sync aplica configurações que criam novos objetos em um namespace não anotado e inclui neles as anotações configmanagement.gke.io/managed: enabled e configsync.gke.io/resource-id. No entanto, o Config Sync não modifica ou remove os objetos com escopo de cluster sem anotações incluídos em um cluster. Isso é ilustrado no diagrama em Como trabalhar com configurações ao longo do tempo.

O exemplo a seguir mostra como gerenciar um objeto Role existente. Primeiro, crie um objeto Role manualmente e comece a gerenciá-lo com o Config Sync.

  1. Crie o papel myrole no namespace gamestore:

    kubectl create role -n gamestore myrole --verb=get --resource=pods
  2. Veja as permissões concedidas pelo papel myrole:

    kubectl describe role -n gamestore myrole
    Name:         myrole
    Labels:       <none>
    Annotations:  <none>
    PolicyRule:
      Resources  Non-Resource URLs  Resource Names  Verbs
      ---------  -----------------  --------------  -----
      pods       []                 []              [get]
    

    O papel só tem permissão para pods get.

  3. No momento, o papel existe no cluster, mas a configuração do Config Sync não sabe sobre ele.

    1. Em um terminal, acesse o clone local do seu repositório.
    2. Use o comando a seguir para criar um manifesto YAML para myrole e salvar o manifesto em um novo arquivo chamado gamestore-myrole.yaml.

      kubectl get role myrole -n gamestore -o yaml > gamestore-myrole.yaml
      
    3. Edite o arquivo gamestore-myrole.yaml.

      1. Remova todos os campos da chave metadata, exceto name e namespace.
      2. Adicione o verbo list depois de get no campo de lista rules.verbs.

      Salve as alterações. O arquivo resultante tem o seguinte conteúdo:

      apiVersion: rbac.authorization.k8s.io/v1
      kind: Role
      metadata:
        name: myrole
        namespace: gamestore
      rules:
      - apiGroups:
        - ""
        resources:
        - pods
        verbs:
        - get
        - list
      
    4. Confirme a alteração no repo.

    5. Aguarde alguns instantes até que o Config Management Operator perceba a confirmação. Para conferir se o papel myrole agora é gerenciado pelo Config Sync, execute kubectl describe novamente.

      kubectl describe role myrole -n gamestore
      

Observe a anotação configmanagement.gke.io/managed: enabled, que indica que o objeto é gerenciado pelo Config Sync, e a anotação configsync.gke.io/resource-id, que rastreia as informações de grupo, tipo, namespace e nome. Observe também as anotações que mostram o caminho e o nome do arquivo no repo que causaram a alteração de configuração mais recente no objeto, e o hash do Git que representa a confirmação.

Name:         myrole
Labels:       app.kubernetes.io/managed-by=configmanagement.gke.io
              configsync.gke.io/declared-version=v1
Annotations:  config.k8s.io/owning-inventory: config-management-system_root-sync
              configmanagement.gke.io/cluster-name: my-cluster
              configmanagement.gke.io/managed: enabled
              configmanagement.gke.io/source-path: quickstart/multirepo/root/gamestore-myrole.yaml
              configmanagement.gke.io/token: 747b843a7ddbd945c0616034a935cf648b58e7b5
              configsync.gke.io/declared-fields: {"f:rules":{}}
              configsync.gke.io/git-context: {"repo":"https://github.com/GoogleCloudPlatform/anthos-config-management-samples","branch":"main","rev":"HEAD"}
              configsync.gke.io/manager: :root
              configsync.gke.io/resource-id: rbac.authorization.k8s.io_role_gamestore_myrole
PolicyRule:
  Resources  Non-Resource URLs  Resource Names  Verbs
  ---------  -----------------  --------------  -----
  pods       []                 []              [get list]

Parar de gerenciar um objeto gerenciado

Neste exemplo, mostramos como parar de gerenciar um objeto que o Config Sync está gerenciando no momento, como o papel myrole em Começar a gerenciar um objeto atual.

  1. Edite o arquivo quickstart/multirepo/root/rolebinding-gamestore-webstore-admin.yaml no clone local de seu repositório e adicione uma seção annotations: que corresponda ao texto em negrito abaixo:

     kind: RoleBinding
     apiVersion: rbac.authorization.k8s.io/v1
     metadata:
       annotations:
         configmanagement.gke.io/managed: disabled
       name: gamestore-webstore-admin
       namespace: gamestore
     subjects:
     - kind: ServiceAccount
       name: ns-reconciler-gamestore
       namespace: config-management-system
     roleRef:
       kind: ClusterRole
       name: webstore-admin
       apiGroup: rbac.authorization.k8s.io
    

    Salve o arquivo.

  2. Crie uma confirmação do Git com suas alterações e envie para seu repositório.

  3. Aguarde alguns instantes para que o Config Sync perceba e aplique a nova confirmação.

  4. Use o comando a seguir para verificar se as anotações e os rótulos do RoleBinding gamestore-webstore-admin estão vazios. O Config Sync não define a anotação configmanagement.gke.io/managed como disabled no objeto.

    kubectl get rolebinding gamestore-webstore-admin -n gamestore -o yaml
    
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      annotations:
      name: gamestore-webstore-admin
      namespace: gamestore
    subjects:
    - kind: ServiceAccount
      name: ns-reconciler-gamestore
      namespace: config-management-system
    roleRef:
      kind: ClusterRole
      name: webstore-admin
      apiGroup: rbac.authorization.k8s.io
    

Depois de verificar se o objeto está desativado, será possível remover a configuração do repositório e verificar se o objeto now-unagedaged não foi excluído do namespace. Se você quiser gerenciar o objeto novamente, você precisará adicionar sua configuração de volta ao seu repositório. Por isso, talvez você queira gerenciar objetos e deixar os configs no repositório.

Agora que o objeto não é gerenciado, ele não é criado ou recriado em clusters novos ou atuais e não é removido, mesmo que exista. Para retomar o gerenciamento de um objeto que você parou de gerenciar anteriormente, consulte o próximo exemplo, Retomar o gerenciamento de um objeto anteriormente não gerenciado.

Retomar o gerenciamento de um objeto anteriormente não gerenciado

Neste exemplo, você verá como retomar o gerenciamento de um objeto removido anteriormente, como em Parar de gerenciar um objeto atual. Ele presume que você não removeu a configuração do RoleBinding gamestore-webstore-admin.

  1. Se você excluiu o RoleBinding gamestore-webstore-admin do repositório na última confirmação, execute as etapas a seguir.

    1. Use git revert para reverter a última confirmação:

      git revert HEAD~1
      

      Você precisará confirmar a operação de reversão.

    2. Envie a confirmação de reversão para seu repositório.

      git push
      
  2. Edite o arquivo quickstart/multirepo/root/rolebinding-gamestore-webstore-admin.yaml no clone local do seu repositório e remova a anotação configmanagement.gke.io/managed: disabled. Salve o arquivo.

  3. Confirme e envie sua alteração. O Config Sync faz o seguinte:

    • Nota a alteração
    • Aplica a anotação configmanagement.gke.io/managed: enabled e a anotação configsync.gke.io/resource-id. O objeto agora é gerenciado.
    • Aplica a configuração, como aconteceria com qualquer objeto gerenciado.
  4. Para verificar se o objeto agora é gerenciado, liste suas anotações:

    kubectl get rolebinding gamestore-webstore-admin -n gamestore -o yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      annotations:
        configmanagement.gke.io/cluster-name: my-cluster
        configmanagement.gke.io/managed: enabled
        configsync.gke.io/resource-id: rbac.authorization.k8s.io_rolebinding_gamestore_gamestore-webstore-admin
    ...
    

Parar de gerenciar um namespace

É possível parar de gerenciar um namespace da mesma forma que você para de gerenciar qualquer tipo de objeto. Se você quiser parar de gerenciar outros recursos no namespace, execute as etapas a seguir:

  1. Adicione a anotação configmanagement.gke.io/managed:disabled ao config do namespace e a todos os configs no mesmo namespace.

  2. Confirme e envie suas alterações para o repositório. Aguarde a sincronização do operador com o repositório.

  3. Exclua os recursos não gerenciados do repositório.

Se houver configurações gerenciadas dentro de um diretório de namespace não gerenciado, o reconciliador registrará erros, mas outras configurações continuarão sendo sincronizadas normalmente.

Impedir a exclusão de objetos do Kubernetes

Depois que você remover um objeto do Kubernetes de um repositório Git gerenciado pelo Config Sync, esse objeto também será excluído do cluster quando a nova confirmação for sincronizada com o cluster.

Se você quiser evitar a exclusão do objeto de cluster quando a configuração dele for removida do repositório Git, siga estas etapas:

  1. Adicione a anotação client.lifecycle.config.k8s.io/deletion: detach à configuração do objeto no repositório do Git.

  2. Confirme e envie a alteração no repositório Git.

  3. Aguarde a alteração ser sincronizada com o cluster.

Como ignorar um objeto no repositório Git

Configs vezes, talvez você queira que o Config Sync ignore um objeto no repositório Git. Por exemplo, uma configuração de função kpt nunca deve ser aplicada ao cluster. Para esse tipo de objeto, adicione a anotação config.kubernetes.io/local-config: "true" ao objeto. Depois de adicionar essa anotação, o Config Sync ignorará esse objeto como se ele fosse removido do repositório Git.

A seguir