Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

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.

Em repositórios não estruturados, é possível organizar configurações para clusters e objetos com escopo de cluster no repositório da maneira que for mais conveniente. Se você não incluir um ClusterSelector no respositório, todas as configurações de objetos com escopo de cluster serão aplicadas a todos os clusters inscritos 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/ de um repositório hierárquico. Se você não incluir um ClusterSelector em seu repo, um config em cluster/ será aplicado a todos os clusters registrados no Config Sync.

Como limitar quais clusters um config afeta

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

No entanto, se você precisar aplicar um config a um subconjunto de clusters, poderá adicionar uma anotação ou ClusterSelector às configurações. Para saber como usar esses recursos, consulte Usar ClusterSelectors.

Configurar os identificadores do cluster

É possível usar um config de cluster para definir os rótulos e as anotações de um cluster. Se você usar ClusterSelectors, cada cluster precisará de um conjunto de rótulos que o ClusterSelector possa selecionar. Ainda que você possa rotular clusters manualmente, recomendamos configurar rótulos usando um config de Cluster.

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.

Configurar um subconjunto de clusters

É 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ó é instanciado 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ó é instanciado 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"]

Use ClusterSelectors

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. É 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.

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. Em repositórios não estruturados, as configurações do cluster podem ser armazenadas arbitrariamente no diretório de sincronização ou nos respectivos diretórios descendentes. Em repositórios hierárquicos, os configs de cluster são armazenados no diretório clusterregistry/ do repo do Git.

O campo clusterName do arquivo config-management.yaml deve corresponder ao campo de metadata.name de pelo menos uma das configurações de cluster.

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

É possível rotular cada cluster relevante manualmente, mas esse processo 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. 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