Sincronize objetos com vários espaços de nomes

Esta página explica como usar o Config Sync para gerir espaços de nomes e escolher que objetos o Config Sync sincroniza com os seus espaços de nomes.

Os objetos de recursos do Kubernetes podem ter âmbito de cluster ou âmbito de espaço de nomes, dependendo do tipo de recurso. Seleciona o cluster configurando o cliente para comunicar com um cluster específico. Selecione o espaço de nomes configurando o campo metadata.namespace no manifesto do objeto. O Config Sync adiciona capacidades adicionais: seletores de clusters e seletores de espaços de nomes, que lhe permitem refinar ainda mais os objetos sincronizados.

Antes de ler esta página, já deve estar familiarizado com os seguintes conceitos do Kubernetes:

Acerca da definição do âmbito de objetos com o Config Sync

Por predefinição, quando instala o Config Sync num cluster ou como predefinição da frota, o Config Sync sincroniza todos os objetos Kubernetes na sua fonte de verdade com clusters com o Config Sync instalado ou todos os clusters numa frota. No entanto, ao restringir objetos a um cluster ou a um espaço de nomes, pode controlar que objetos são sincronizados com um cluster ou um espaço de nomes.

O Config Sync oferece os seguintes métodos para definir o âmbito dos seus objetos:

Use espaços de nomes explícitos

Recomendamos que use a declaração explícita do espaço de nomes ao configurar o Config Sync, porque permite gerir os metadados do espaço de nomes e eliminar espaços de nomes mais tarde, se necessário.

A predefinição é implicit, mas pode alterar a estratégia de espaço de nomes no objeto RootSync ou RepoSync definindo o campo namespaceStrategy como explicit. Para mais informações, consulte a estratégia de espaço de nomes.

Acerca dos seletores de espaço de nomes

Os seletores de namespace são uma funcionalidade do Config Sync que lhe permite implementar objetos de recursos idênticos de outra forma em vários namespaces.

A utilização de seletores de espaço de nomes é semelhante à utilização de seletores de etiquetas do Kubernetes para mapear um serviço a um conjunto de pods, mas com uma camada adicional de indireção. Como não pode adicionar campos personalizados a tipos de recursos existentes, define o seletor num objeto NamespaceSelector. Em seguida, faz referência a esse seletor pelo nome numa anotação nos objetos que quer usar esse seletor.

Para usar seletores de espaço de nomes:

  1. Adicione ou escolha uma etiqueta existente nos espaços de nomes para os quais quer implementar.
  2. Defina um objeto de recurso NamespaceSelector na sua fonte de informação. O Config Sync não sincroniza objetos NamespaceSelector com o cluster.
  3. Para cada objeto que quer sincronizar com um ou mais espaços de nomes, modifique a configuração do objeto para remover o campo metadata.namespace e adicione a anotação configmanagement.gke.io/namespace-selector com um valor que corresponda ao metadata.name do seu NamespaceSelector.

Os exemplos na secção seguinte fornecem mais detalhes sobre como definir objetos NamespaceSelectore anotar outros objetos para usar o NamespaceSelector.

Antes de começar

Use seletores de espaço de nomes

Os seletores de espaço de nomes são definidos com requisitos baseados na igualdade ou requisitos baseados no conjunto. Pode combinar vários requisitos.

Exemplo de seletor de etiquetas baseado na igualdade

O exemplo seguinte mostra como usar seletores baseados na igualdade para selecionar os espaços de nomes aos quais uma configuração se aplica:

  1. Adicione uma etiqueta a um ou mais namespaces:

    kubectl label namespace NAMESPACE app=gamestore
    

    Substitua NAMESPACE pelo nome do seu espaço de nomes.

    Execute este comando para cada espaço de nomes que quer etiquetar.

  2. Crie um seletor de espaço de nomes denominado gamestore-selector.

    kind: NamespaceSelector
    apiVersion: configmanagement.gke.io/v1
    metadata:
      name: gamestore-selector
    spec:
      selector:
        matchLabels:
          app: gamestore
    

    Se a configuração de outro objeto fizer referência a este seletor de espaço de nomes, essa configuração só pode ser aplicada a objetos em espaços de nomes que tenham a etiqueta app: gamestore.

  3. Um seletor de espaço de nomes não tem efeito até que faça referência ao mesmo noutra configuração. Crie uma quota de objetos de exemplo que faça referência ao seletor de espaço de nomes:

    kind: ResourceQuota
    apiVersion: v1
    metadata:
      name: quota
      annotations:
        configmanagement.gke.io/namespace-selector: gamestore-selector
    spec:
      hard:
        pods: "1"
        cpu: "200m"
        memory: "200Mi"
    

    A quota de recursos é criada apenas em espaços de nomes que tenham a etiqueta app: gamestore.

Exemplo de seletor de etiquetas baseado em conjuntos

O exemplo seguinte mostra como usar seletores baseados em conjuntos para isentar espaços de nomes de herdar objetos:

  1. Adicione uma etiqueta a um ou mais namespaces:

    kubectl label namespace NAMESPACE quota-exempt=exempt
    

    Substitua NAMESPACE pelo nome do seu espaço de nomes.

    Execute este comando para cada espaço de nomes que quer etiquetar.

  2. Crie um seletor de espaço de nomes denominado exclude-exempt-namespaces:

    kind: NamespaceSelector
    apiVersion: configmanagement.gke.io/v1
    metadata:
      name: excludes-exempt-namespaces
    spec:
      selector:
        matchExpressions:
          - key: quota-exempt
            operator: NotIn
              values:
                - exempt
    

    Se a configuração de outro objeto fizer referência a este seletor de espaço de nomes, essa configuração é aplicada a todos os espaços de nomes exceto àqueles com o par chave-valor quota-exempt: exempt.

  3. Um seletor de espaço de nomes não tem efeito até que faça referência ao mesmo noutra configuração. Crie uma quota de objetos de exemplo que faça referência ao seletor de espaço de nomes:

    kind: ResourceQuota
    apiVersion: v1
    metadata:
      name: quota
      annotations:
        configmanagement.gke.io/namespace-selector: exclude-exempt-namespaces
    spec:
      hard:
        pods: "1"
        cpu: "200m"
        memory: "200Mi"
    

    A quota de recursos é criada em todos os espaços de nomes, exceto nos que têm o par chave-valor quota-exempt: exempt.

Integração com âmbitos de equipa e espaços de nomes de frotas

Os espaços de nomes de frotas criados Google Cloud têm automaticamente a etiquetafleet.gke.io/fleet-scope: your-scope. Todos os espaços de nomes também têm a etiqueta Kubernetes kubernetes.io/metadata.name: your-namespace. Pode usar estas etiquetas predefinidas para configurar um seletor de espaço de nomes para selecionar espaços de nomes da frota.

O tutorial de posse da frota explica mais detalhadamente como usar seletores de espaço de nomes com frotas e âmbitos de equipa para gerir seletivamente objetos para diferentes equipas.

Objetos com âmbito do espaço de nomes com modo hierárquico

Embora os repositórios não estruturados sejam recomendados para a maioria dos exemplos de utilização, pode usar seletores de espaço de nomes para restringir os seus objetos com um repositório hierárquico. A utilização de seletores de espaço de nomes é a mesma, mas existem limitações e requisitos adicionais sobre como organiza a configuração do espaço de nomes na sua fonte de dados fidedigna.

Limitações

Quando usa uma configuração do seletor de espaço de nomes com um repositório hierárquico, tenha em atenção as seguintes limitações e requisitos:

  • Tem de armazenar todos os ficheiros de configuração para espaços de nomes e objetos com âmbito de espaço de nomes no diretório namespaces/ do repositório hierárquico e nos respetivos diretórios descendentes.
  • Tem de especificar explicitamente uma configuração do espaço de nomes no subdiretório namespaces/NAMESPACE, em que NAMESPACE corresponde ao nome do espaço de nomes. Todos os outros objetos com âmbito de espaço de nomes têm de ser armazenados no mesmo subdiretório. Se faltar uma configuração de espaço de nomes, o Config Sync devolve um erro KNV1044.
  • Os recursos que fazem referência a um seletor de espaço de nomes são aplicados a espaços de nomes que herdam uma determinada configuração de um espaço de nomes abstrato, independentemente da estrutura de diretórios do diretório namespaces/.

Localização do seletor de espaço de nomes

Num repositório hierárquico, pode colocar uma configuração do seletor de espaço de nomes em qualquer diretório de espaço de nomes abstrato, mas não num diretório de espaço de nomes.

A arquitetura do repositório de exemplo seguinte mostra localizações válidas e inválidas para seletores de espaço de nomes:

namespace-inheritance
...
├── namespaces
│   ├── eng
│   │   ├── gamestore
│   │   │   ├── namespace.yaml
│   │   │   └── ns_selector.yaml  # invalid
│   │   └── ns_selector.yaml  # valid
│   ├── ns_selector.yaml  # valid
│   ├── rnd
│   │   ├── incubator-1
│   │   │   ├── namespace.yaml
│   │   │   └── ns_selector.yaml  # invalid
│   │   └── ns_selector.yaml  # valid

Uma vez que os diretórios namespaces, eng e rnd representam espaços de nomes abstratos, pode colocar um seletor neles. No entanto, uma vez que os diretórios gamestore e incubator-1 representam espaços de nomes reais, não pode colocar um seletor de espaço de nomes nos mesmos.

Configure um espaço de nomes abstrato

Com um repositório hierárquico, pode usar espaços de nomes abstratos opcionalmente.

O exemplo seguinte mostra como mover o diretório do espaço de nomes para um espaço de nomes abstrato que contém configurações adicionais herdadas pelo espaço de nomes:

  1. No seu repositório, crie um diretório de espaço de nomes abstrato. O diretório do espaço de nomes abstrato não contém configurações para espaços de nomes, mas os diretórios do espaço de nomes descendentes contêm configurações.

  2. No diretório do espaço de nomes abstrato que criou, crie uma configuração para uma função que conceda autorizações get e list em todos os objetos em qualquer espaço de nomes que herde a função:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: ROLE_NAME
    rules:
    - apiGroups: [""]
      resources: ["*"]
      verbs: ["get", "list"]
    

    Substitua ROLE_NAME pelo nome da função.

  3. Crie uma configuração para uma associação de funções que associe a função a um grupo de email:

    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: ROLE_NAME
    subjects:
    - kind: Group
      name: group@example.com
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: Role
      name:  ROLEBINDING_NAME
      apiGroup: rbac.authorization.k8s.io
    

    Substitua ROLEBINDING_NAME pelo nome da função.

  4. Mova a configuração do espaço de nomes que criou na secção anterior do diretório namespaces/ para o diretório do espaço de nomes abstrato que criou nesta secção.

Desative a herança para objetos

Pode desativar seletivamente a herança para qualquer configuração definindo o campo hierarchyMode como none. Os HierarchyConfigs são armazenados no diretório system/ do repositório. Este exemplo desativa a herança para associações de funções:

# 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