Como gerenciar objetos de cluster atuais

Quando o Anthos Config Management gerencia um objeto de cluster, ele observa o objeto e o conjunto de configs no repo que afetam o objeto e garante que eles estejam sincronizados. 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 é gerenciado pelo Anthos Config Management se tiver a anotação configmanagement.gke.io/managed: enabled.

Se um objeto não tiver o rótulo configmanagement.gke.io/managed ou se estiver definido como algo diferente de enabled, ele não será gerenciado.

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

Como gerenciar ou não um objeto Kubernetes usando o Anthos Config Management

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

  1. Quero gerenciar um objeto. O objeto tem uma configuração no repositório?
    • Não: crie uma configuração para o objeto. O Anthos Config Management define a anotação configmanagement.gke.io/managed: enabled e começa a gerenciar o objeto.
    • Sim: a configuração define a anotação configmanagement.gke.io/managed: disabled?
      • Não: o objeto é gerenciado por padrão.
      • Sim: edite a configuração para remover a anotação configmanagement.gke.io/managed: disabled. Quando a alteração é enviada por push ao repo de origem, o Anthos Config Management percebe a alteração, aplica a anotação configmanagement.gke.io/managed: enabled e aplica o config.
  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 no config é detectada, o Anthos Config Management para 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 Anthos Config Management exclui o objeto de todos os clusters ou namespaces a que a configuração se aplica.

Além da anotação configmanagement.gke.io/managed: enabled, o Anthos Config Management aplica o rótulo app.kubernetes.io/managed-by: configmanagement.gke.io a todos os objetos que gerencia. Esse rótulo permite listar facilmente todos os objetos pelo Anthos Config Management.

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

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

Antes de começar

Os exemplos a seguir são baseados 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 Anthos Config Management em um determinado cluster ou namespace, use um seletor de rótulo como este:

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

Para listar todos os objetos não gerenciados pelo Anthos Config Management, use um seletor de etiquetas como este:

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

Por exemplo, este comando lista RoleBindings no namespace shipping-dev que é gerenciado pelo Anthos Config Management:

kubectl get rolebindings -n shipping-dev \
    -l "app.kubernetes.io/managed-by=configmanagement.gke.io"
NAME           AGE
job-creators   12m
pod-creators   12m
sre-admin      12m
viewers        12m

Este comando lista RoleBindings no namespace kube-system que não gerenciado pelo Anthos Config Management:

kubectl get rolebindings -n kube-system \
    -l "app.kubernetes.io/managed-by!=configmanagement.gke.io"
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

Neste exemplo, você cria um Papel manualmente e começa a gerenciá-la com o Anthos Config Management.

  1. Crie o papel myrole no namespace audit:

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

    kubectl describe role -n audit 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. Nesse ponto, o Papel existe no cluster, mas o Anthos Config Management não sabe sobre isso.

    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 namespaces/audit/myrole.yaml.

      kubectl get role myrole -n audit -o yaml > namespaces/audit/myrole.yaml
      
    3. Edite o arquivo 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: audit
      rules:
      - apiGroups:
        - ""
        resources:
        - pods
        verbs:
        - get
        - list
      
    4. Confirme a alteração no repositório.

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

      kubectl describe role myrole -n audit
      

Observe a anotação configmanagement.gke.io/managed: enabled, que indica que o objeto é gerenciado pelo Anthos Config Management. Observe também as anotações que mostram o caminho e o nome do arquivo no repositório que causou a alteração de configuração mais recente para o objeto e o hash do Git que representa a confirmação.

Name:         myrole
Labels:       app.kubernetes.io/managed-by=configmanagement.gke.io
Annotations:  configmanagement.gke.io/cluster-name: example-cluster-name
              configmanagement.gke.io/managed: enabled
              configmanagement.gke.io/source-path: namespaces/audit/myrole.yaml
              configmanagement.gke.io/token: 0836805a09f160f12aa934b9042527e7283c7030
PolicyRule:
Resources  Non-Resource URLs  Resource Names  Verbs
---------  -----------------  --------------  -----
pods       []                 []              [get list]

Parar de gerenciar um objeto gerenciado

Este exemplo mostra como parar de gerenciar um objeto que o Anthos Config Management está gerenciando no momento, como o papel myrole em Começar a gerenciar um objeto atual.

  1. Edite o arquivo namespaces/online/shipping-app-backend/shipping-dev/job-creator-rolebinding.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:
       name: job-creators
     subjects:
     - kind: User
       name: sam@foo-corp.com
       apiGroup: rbac.authorization.k8s.io
     roleRef:
       kind: Role
       name: job-creator
       apiGroup: rbac.authorization.k8s.io
     annotations:
       configmanagement.gke.io/managed: disabled
    

    Salve o arquivo.

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

  3. Aguarde alguns instantes até o Anthos Config Management perceber e aplicar a nova confirmação.

  4. Use o comando a seguir para listar todas as anotações no RoleBinding job-creators. A resposta está truncada para facilitar a leitura.

    kubectl get rolebinding job-creators -n audit -o yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      annotations:
        configmanagement.gke.io/cluster-name: my-cluster
        configmanagement.gke.io/managed: disabled
        configmanagement.gke.io/source-path: namespaces/viewers-rolebinding.yaml
        configmanagement.gke.io/sync-token: fabdb51587d51a81c7e419eeb983aafcf293dc83
    ...
    

Depois de verificar se o objeto está desativado, será possível remover a configuração e verificar se o objeto now-unagedaged não foi excluído do namespace. Se você quiser gerenciar o objeto novamente, recrie a configuração dele. 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 job-creators.

  1. Se você excluiu o RoleBinding job-creators do seu 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 namespaces/online/shipping-app-backend/shipping-dev/job-creator-rolebinding.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 Anthos Config Management faz o seguinte:

    • Nota a alteração
    • Aplica a anotação configmanagement.gke.io/managed: enabled. 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 job-creators -n audit -o yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      annotations:
        configmanagement.gke.io/cluster-name: my-cluster
        configmanagement.gke.io/managed: enabled
    ...
    

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 à configuração do namespace e a todas as configurações 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, a sincronização registrará erros, mas outras configurações continuarão sendo sincronizadas normalmente.

A seguir