Configurar clusters e objetos com escopo de cluster

Nesta página, explicamos como configurar clusters e objetos com escopo de cluster. Leia também sobre Como configurar namespaces e objetos com escopo de namespace.

Configurar clusters e objetos com escopo de cluster

Em repositórios não estruturados, é possível organizar configs para clusters e objetos com escopo de cluster da maneira que for mais conveniente para você. Todos os configs organizados dessa maneira se aplicam a todos os clusters registrados no Config Sync.

Em repositórios hierárquicos, todos os configs de clusters e objetos com escopo de cluster estão localizados no diretório cluster/. Todos os configs em cluster/ se aplicam a todos os clusters registrados no Config Sync.

Configurar CustomResourceDefinition

O Config Sync permite sincronizar CustomResourceDefinitions (CRDs) do mesmo modo que você sincronizaria qualquer outro recurso. Ao sincronizar CRDs, você precisa considerar alguns fatores.

  • Os CRDs em repositórios hierárquicos, mesmo ao declarar um recurso personalizado com namespace, precisam ser colocados no diretório cluster/.

  • As atualizações nos CRDs e nos respectivos CustomResources não ocorrem em uma ordem previsível. Quando essas modificações são feitas na mesma confirmação, as atualizações de CRD não necessariamente ocorrem antes dos CustomResources. Isso pode fazer com que os nomos status informem um erro transitório por um breve período, até que o CustomResource e o CRD estejam presentes no cluster.

  • No Config Sync não é permitido a remoção de um CRD se qualquer CustomResource no repositório depender dele. Para remover um CRD, você também precisa excluir o respectivo CustomResource. Recomendamos que você os remova na mesma confirmação do repositório.

  • É possível sincronizar apenas um CustomResource, e não o respectivo CRD. Para isso, você precisa garantir que o CRD já exista no cluster.

Como limitar quais clusters um config afeta

Por padrão, o Config Sync aplica um config a cada cluster registrado. No entanto, se for necessário aplicar um config apenas a um subconjunto de clusters, adicione uma anotação cluster-name-selector ou um config ClusterSelector ao seu repositório.

A anotação cluster-name-selector fornece uma maneira simples de especificar um subconjunto de clusters ao qual aplicar uma configuração. Essa opção é compatível apenas com a seleção de clusters por nome.

O objeto ClusterSelector é compatível com a seleção de clusters por rótulos, mas requer configurações mais complexas.

Configurar usando a anotação cluster-name-selector

É possível aplicar um config a um subconjunto de clusters com a anotação configsync.gke.io/cluster-name-selector. É possível usar a anotação para aplicar um config a um conjunto de clusters, indicado pelos nomes dos clusters. O valor da anotação é uma lista separada por vírgulas de nomes de cluster de destino. É possível aplicar a anotação em objetos com escopo de cluster e objetos com escopo de namespace. Os objetos de namespace são selecionados quando a anotação corresponde ao nome do cluster e quando o namespace a que os clusters pertencem também é selecionado.

Selecione um único cluster

Com o config a seguir, você cria um papel chamado namespace-reader que define um conjunto de permissões para a leitura de namespaces. Esse papel só é aplicado no cluster com o nome cluster-1.

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: my-namespace
  name: namespace-reader
  annotations:
    configsync.gke.io/cluster-name-selector: cluster-1
rules:
- apiGroups: [""]
  resources: ["namespaces"]
  verbs: ["get", "watch", "list"]

Selecione uma lista de clusters

A configuração a seguir cria o mesmo papel do exemplo anterior. No entanto, esse papel só é aplicado nos clusters com o nome cluster-1, cluster-2 ou cluster-3.

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: my-namespace
  name: namespace-reader
  annotations:
    configsync.gke.io/cluster-name-selector: cluster-1,cluster-2,cluster-3
rules:
- apiGroups: [""]
  resources: ["namespaces"]
  verbs: ["get", "watch", "list"]

Configurar usando o objeto ClusterSelector

Um ClusterSelector é um tipo especial de config que usa labelSelectors do Kubernetes. Use um ClusterSelector para limitar os clusters a que um config específico é aplicado com base nos rótulos do cluster. Também é possível usar os ClusterSelectors para limitar quais clusters instanciam um objeto com escopo de namespace.

Assim como outros labelSelectors, os ClusterSelectors operam usando a lógica AND. Como os ClusterSelectors usam a lógica AND, os objetos são selecionados apenas quando correspondem a todos os rótulos definidos por você.

Um config ClusterSelector não persiste em um cluster. Na verdade, você o menciona em outro config usando uma anotação, e esse config só é aplicado a clusters que correspondam ao ClusterSelector.

Antes de usar os ClusterSelectors, cada cluster precisa ter um nome exclusivo e um conjunto de rótulos que possam ser selecionados. Os metadados do cluster são especificados em uma configuração de cluster na sua fonte de verdade.

Em seguida, adicione rótulos a um cluster, crie o ClusterSelector e o mencione em outro config.

Adicionar rótulos a um cluster

Para usar os ClusterSelectors, cada cluster precisa ter um conjunto de rótulos selecionável. Em repositórios não estruturados, as configurações do cluster podem ser armazenadas arbitrariamente no diretório de config ou nos respectivos diretórios descendentes. Em repositórios hierárquicos, os configs do cluster são armazenados no diretório clusterregistry/.

Para aplicar configs a um cluster, o campo metadata.name da configuração do cluster precisa corresponder ao campo clusterName do objeto ConfigManagement.

No exemplo de config Cluster a seguir, é declarado que cluster-2 tem os rótulos environment: prod e location: central.

kind: Cluster
apiVersion: clusterregistry.k8s.io/v1alpha1
metadata:
  name: cluster-2
  labels:
    environment: prod
    location: central

Também é possível usar um config Cluster para aplicar anotações.

Criar um ClusterSelector

O ClusterSelector escolhe somente os clusters com um determinado rótulo ou uma combinação de rótulos. Em repositórios não estruturados, os ClusterSelectors podem ser armazenados arbitrariamente no diretório de sincronização ou nos respectivos diretórios descendentes. Em repositórios hierárquicos, os ClusterSelectors são armazenados no diretório de nível superior clusterregistry/ no repositório.

O ClusterSelector a seguir escolhe apenas os clusters com o rótulo environment: prod.

kind: ClusterSelector
apiVersion: configmanagement.gke.io/v1
metadata:
  name: selector-env-prod
spec:
  selector:
    matchLabels:
      environment: prod

O ClusterSelector a seguir escolhe os clusters com os rótulos location: central ou location: west.

kind: ClusterSelector
apiVersion: configmanagement.gke.io/v1
metadata:
  name: selector-central-or-west
spec:
  selector:
    matchExpressions:
      - key: location
        operator: In
        values:
        - central
        - west 

Um ClusterSelector não terá efeito até que você o mencione em outro config.

Indique um ClusterSelector

Para mencionar um ClusterSelector em outro config, defina a anotação configmanagement.gke.io/cluster-selector: CLUSTERSELECTOR-NAME.

Com o config a seguir, você cria um ClusterRole chamado namespace-reader que define um conjunto de permissões para a leitura de namespaces. Ele é instanciado apenas nos clusters que correspondem ao ClusterSelector selector-env-prod.

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: namespace-reader
  annotations:
    configmanagement.gke.io/cluster-selector: selector-env-prod
rules:
- apiGroups: [""]
  resources: ["namespaces"]
  verbs: ["get", "watch", "list"]

Como limitar os clusters impactados por um config com escopo de namespace

Por padrão, o Config Sync aplica configs herdados por um namespace a esse namespace em cada cluster em que ele está incluído. Use um ClusterSelector para aplicar o config a apenas um subconjunto desses clusters.

Por exemplo, defina diferentes configurações nos clusters com base na localização geográfica deles ou dos clientes. Essa configuração é útil em termos de localidade ou conformidade jurídica. Nos exemplos desta seção, são aplicados configs específicos de localidade somente a clusters com o rótulo location: france.

Com o config Cluster a seguir, você adiciona um rótulo location: france a um cluster chamado cluster-1:

kind: Cluster
apiVersion: clusterregistry.k8s.io/v1alpha1
metadata:
  name: cluster-1
  labels:
    location: france

Crie um config ClusterSelector que mencione os rótulos que você quer selecionar. Com o ClusterConfig a seguir, você seleciona o rótulo location: france:

kind: ClusterSelector
apiVersion: configmanagement.gke.io/v1
metadata:
  name: selector-location-france
spec:
  selector:
    matchLabels:
      location: france

Um ClusterSelector não terá efeito até que você o mencione em outro config. Com o config RoleBinding a seguir, você seleciona apenas os clusters que correspondem ao ClusterSelector selector-location-france. Essa configuração pode ser útil, por exemplo, se uma diretriz de conformidade só permitir que uma conta de serviço específica visualize informações sobre clusters em sua região geográfica designada.

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: viewers
  annotations:
    configmanagement.gke.io/cluster-selector: selector-location-france
subjects:
- kind: Group
  name: system:serviceaccounts:foo
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: view
  apiGroup: rbac.authorization.k8s.io

Se você colocar esse config em um namespace abstrato ou em um diretório de namespace, como namespaces/eng, ele será aplicado aos namespaces que o herdarem. No entanto, isso acontece somente nos clusters com o rótulo location: france.

A seguir