Como configurar namespaces e objetos com escopo de namespace

Este tópico ilustra como usar o Anthos Config Management para gerenciar namespaces e objetos com escopo para Namespaces. Você também encontra informações sobre como configurar clusters e objetos com escopo de cluster.

Como configurar um namespace

Todas as configurações de namespaces e objetos com escopo de namespace estão localizados no diretório namespaces/ do repositório e nos respectivos diretórios descendentes.

Siga estas etapas para configurar um namespace chamado audit em cada cluster inscrito.

  1. No clone local do repo, crie um diretório de namespace. Um diretório de namespace que contém uma configuração de um namespace. O nome do diretório de namespace precisa ser igual ao do namespace. Neste exemplo, o diretório é chamado namespaces/audit:

    mkdir namespaces/audit
    
  2. No diretório de namespace, crie um arquivo audit.yaml, com o conteúdo a seguir. O metadata.name precisa ser igual ao nome do namespace e do diretório de namespace.

    apiVersion: v1
    kind: Namespace
    metadata:
      name: audit
    
  3. Crie uma confirmação que inclua o config audit.yaml e a envie ao repositório remoto.

    git add namespaces/audit/audit.yaml
    git commit -m "Created audit namespace config"
    git push [NAME-OF-REMOTE] [BRANCH-NAME]
    
  4. Depois de alguns instantes, o namespace audit é criado em cada cluster inscrito. Para verificar a criação, descreva o namespace:

    kubectl describe namespace audit
    
  5. Para remover a configuração e excluir o namespace audit dos clusters registrados, crie uma nova confirmação que remova o arquivo e a envie ao repositório remoto.

Como configurar um namespace abstrato

Este exemplo amplia as informações fornecidas na seção Como configurar um namespace. Isso é feito ao mover o diretório de namespace audit para um namespace abstrato que contém mais configs herdados pelo audit.

  1. No clone local do repo, crie um diretório de namespace abstrato chamado regulatory. O diretório de namespace abstrato não contém um config de um namespace, mas sim os respectivos diretórios de namespace descendente.

    mkdir namespaces/regulatory
    
  2. No diretório de namespace abstrato regulatory, crie um config de um papel chamado regulator. Ele concede get e list a todos os recursos em qualquer namespace que herdar esse papel.

    # namespaces/regulatory/regulator_role.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: regulator
    rules:
    - apiGroups: [""]
      resources: ["*"]
      verbs: ["get", "list"]
    
  3. Crie um config de um RoleBinding chamado regulatory-admin. Ele vincula o papel regulator ao grupo regulators@example.com:

    # namespaces/regulatory/regulator_rolebinding.yaml
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: regulatory-admin
    subjects:
    - kind: Group
      name: regulators@example.com
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: Role
      name: regulator
      apiGroup: rbac.authorization.k8s.io
    
  4. Mova o diretório de namespace audit de namespaces/ para namespaces/regulatory/:

    mv namespaces/audit/ namespaces/regulatory/
    
  5. Confirme todas as alterações e as envie ao repo remoto.

O Config Management Operator reconhece a alteração e aplica o novo papel e o RoleBinding ao namespace audit em todos os clusters inscritos.

Para remover os configs e excluir o namespace audit dos clusters inscritos, crie uma nova confirmação que remova todo o namespace abstrato regulatory e envie ao repositório remoto.

Como limitar quais clusters são impactados por um config

Normalmente, o Anthos Config Management aplica um config a cada cluster registrado. Se o config estiver no subdiretório namespaces/, o Anthos Config Management primeiro o namespace em cada cluster. Depois, ele aplicará todos os configs herdados a esse namespace.

Para limitar quais clusters são impactados por um config específico com base nos rótulos de cada um deles, consulte a seção Como aplicar configs a um subconjunto de clusters.

Como limitar os namespaces impactados por um config

Um NamespaceSelector é um tipo especial de config que usa labelSelectors do Kubernetes. Utilize um NamespaceSelector com um config em namespaces/ para limitar os namespaces que podem herdar esse config.

Com os configs a seguir, você cria um NamespaceSelector chamado sre-supported. Se outro config mencionar esse NamespaceSelector, ele só poderá ser aplicado a objetos em namespaces com o rótulo env: prod.

kind: NamespaceSelector
apiVersion: configmanagement.gke.io/v1
metadata:
  name: sre-supported
spec:
  selector:
    matchLabels:
      env: prod

Para mencionar um NamespaceSelector em um config, defina a anotação configmanagement.gke.io/namespace-selector como o nome do NamespaceSelector.

Um NamespaceSelector não terá efeito até que você o referencie em outro config. Se o NamespaceSelector sre-supported estiver na mesma hierarquia que o RoleBinding sre-admin a seguir, o RoleBinding será criado somente nos namespaces que tiverem o rótulo env: prod:

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: sre-admin
  annotations:
    configmanagement.gke.io/namespace-selector: sre-supported
subjects:
- kind: Group
  name: sre@foo-corp.com
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: admin
  apiGroup: rbac.authorization.k8s.io

Para resumir, usar um NamespaceSelector é um processo de três etapas:

  1. Adicionar rótulos aos namespaces.
  2. Criar um config NamespaceSelector.
  3. Consultar o objeto NamespaceSelector em outro config.

Como desativar a herança para um tipo de objeto

É possível desativar seletivamente a herança dos configs. Basta definir o campo hierarchyMode como none. Os HierarchyConfigs são armazenados no diretório system/ do repo. Este exemplo desativa a herança para o RoleBindings.

# system/hierarchy-config.yaml
kind: HierarchyConfig
apiVersion: configmanagement.gke.io/v1
metadata:
  name: rbac
spec:
  resources:
  # Configure Role to only be allowed in leaf namespaces.
  - group: rbac.authorization.k8s.io
    kinds: [ "RoleBinding" ]
    hierarchyMode: none

A seguir