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
- Saiba mais sobre como configurar namespaces e objetos com escopo de namespace