Como configurar apenas um subconjunto de clusters

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

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.

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. Você nomeia o cluster ao configurar o Config Sync Operator. É possível aplicar rótulos a cada cluster manualmente, mas é recomendável usar um config Cluster.

Depois, crie o ClusterSelector e o mencione em outro config.

Como adicionar rótulos a um cluster

Para usar os ClusterSelectors, cada cluster precisa ter um conjunto de rótulos selecionável. É possível rotular cada cluster manualmente, mas é recomendável usar um config Cluster para isso. Esses configs são armazenados no diretório clusterregistry/ do repo.

No exemplo de config Cluster a seguir, é declarado que cluster-2 tem o rótulo environment: prod.

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

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

Como criar um ClusterSelector

O ClusterSelector escolhe somente os clusters com um determinado rótulo ou uma combinação de rótulos. Os ClusterSelectors são armazenados no diretório de nível superior clusterregistry/ no repo.

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

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

Como mencionar 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. Isso é ú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

É possível rotular cada cluster relevante manualmente, mas isso pode gerar erros e não é recomendado.

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. Isso é útil, por exemplo, se uma diretriz de conformidade só permitir que os auditores examinem informações sobre clusters na 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:audit
  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/online/shipping-app-backend/, ele será aplicado aos namespaces que o herdarem. No entanto, isso acontece somente nos clusters com o rótulo location: france.

A seguir