Configure clusters e objetos com âmbito de cluster

Esta página explica como configurar clusters e objetos com âmbito de cluster. Também pode ler sobre a configuração de espaços de nomes e objetos com âmbito de espaço de nomes.

Configure clusters e objetos com âmbito de cluster

Nos repositórios não estruturados, pode organizar as configurações para clusters e objetos com âmbito de cluster da forma mais conveniente para si. Todas as configurações organizadas desta forma aplicam-se a todos os clusters inscritos no Config Sync.

Nos repositórios hierárquicos, todas as configurações dos clusters e dos objetos com âmbito de cluster estão localizadas no diretório cluster/. Todas as configurações em cluster/ aplicam-se a todos os clusters inscritos no Config Sync.

Configure CustomResourceDefinitions

A sincronização de configuração permite-lhe sincronizar CustomResourceDefinitions (CRDs) da mesma forma que sincronizaria qualquer outro recurso. Existem alguns aspetos a ter em conta ao sincronizar CRDs:

  • Os CRDs em repositórios hierárquicos, mesmo quando declaram um recurso personalizado com espaço de nomes, têm de ser colocados no diretório cluster/.

  • As atualizações aos CRDs e aos respetivos CustomResources não ocorrem por nenhuma ordem previsível. Se modificar CRDs e os CustomResources correspondentes no mesmo commit, não se espera que as atualizações de CRDs ocorram antes das atualizações de recursos personalizados. Isto pode fazer com que o nomos status comunique um erro transitório durante um breve período, até que o CustomResource e o CRD estejam presentes no cluster.

  • O Config Sync não permite a remoção de um CRD se algum CustomResource no repositório depender dele. Para remover um CRD, também tem de remover o respetivo CustomResource. Recomendamos que os remova ambos na mesma confirmação para o repositório.

  • Pode sincronizar um CustomResource sem sincronizar o respetivo CRD, desde que possa garantir que o CRD já existe no cluster.

Limite os clusters que uma configuração afeta

Por predefinição, o Config Sync aplica uma configuração a todos os clusters inscritos. No entanto, se precisar de aplicar uma configuração apenas a um subconjunto de clusters, pode adicionar uma anotação cluster-name-selector ou uma configuração ClusterSelector ao seu repositório.

A anotação cluster-name-selector oferece uma forma simples de especificar um subconjunto de clusters ao qual aplicar uma configuração. Esta opção só suporta a seleção de clusters por nomes.

O objeto ClusterSelector suporta a seleção de clusters por etiquetas, mas requer configurações mais complexas.

Configure com a anotação cluster-name-selector

Pode aplicar uma configuração a um subconjunto de clusters com a anotação configsync.gke.io/cluster-name-selector. Pode usar esta anotação para aplicar uma configuração a um conjunto de clusters, indicados pelos nomes dos clusters. O valor da anotação é uma lista separada por vírgulas de nomes de clusters de destino. Pode aplicar a anotação a objetos com âmbito de cluster e objetos com âmbito de espaço de nomes. Os objetos de espaço de nomes são selecionados quando a anotação corresponde ao nome do cluster e quando o espaço de nomes ao qual os clusters pertencem também está selecionado.

Selecione um único cluster

A configuração seguinte cria uma função denominada namespace-reader que define um conjunto de autorizações para ler espaços de nomes. Esta função só é aplicada no cluster que tem 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 seguinte cria a mesma função que no exemplo anterior, mas esta função só é aplicada 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"]

Configure através do objeto ClusterSelector

Um ClusterSelector é um tipo especial de configuração que usa labelSelectors do Kubernetes. Pode usar um ClusterSelector para limitar os clusters aos quais uma determinada configuração se aplica, com base nas etiquetas do cluster. Também pode usar ClusterSelectors para limitar os clusters que instanciam um objeto com âmbito de espaço de nomes.

Tal como outros labelSelectors, os ClusterSelectors funcionam com a lógica E. Uma vez que os ClusterSelectors usam a lógica AND, os objetos só são selecionados quando correspondem a todas as etiquetas que definir.

Uma configuração ClusterSelector não persiste num cluster. Em vez disso, faz referência à mesma noutra configuração através de uma anotação, e essa configuração aplica-se apenas aos clusters que correspondem ao ClusterSelector.

Antes de poder usar ClusterSelectors, cada cluster tem de ter um nome exclusivo e um conjunto de etiquetas que podem ser selecionadas. Os metadados do cluster são especificados numa configuração do cluster na sua fonte de informações verdadeiras.

Em seguida, adiciona etiquetas a um cluster, cria o ClusterSelector e, depois, faz referência ao mesmo noutra configuração.

Adicione etiquetas a um cluster

Para usar ClusterSelectors, cada cluster tem de ter um conjunto de etiquetas que podem ser selecionadas. Em repositórios não estruturados, as configurações de clusters podem ser armazenadas arbitrariamente no diretório de configuração ou nos respetivos diretórios descendentes. Em repositórios hierárquicos, as configurações de clusters são armazenadas no diretório clusterregistry/.

Para aplicar configurações a um cluster, o campo metadata.name do Cluster config tem de corresponder ao campo clusterName do seu objeto ConfigManagement.

A configuração do cluster de exemplo seguinte declara que cluster-2 tem as etiquetas environment: prod e location: central.

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

Também pode aplicar anotações através de uma configuração de cluster.

Crie um ClusterSelector

Um ClusterSelector seleciona apenas clusters com uma determinada etiqueta ou combinação de etiquetas. Em repositórios não estruturados, os ClusterSelectors podem ser armazenados arbitrariamente no diretório de sincronização ou nos respetivos diretórios descendentes. Nos repositórios hierárquicos, os ClusterSelectors são armazenados no diretório clusterregistry/ de nível superior no repositório.

O ClusterSelector seguinte seleciona apenas clusters com a etiqueta environment: prod.

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

O ClusterSelector seguinte seleciona todos os clusters com as etiquetas 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 tem efeito até o referenciar noutra configuração.

Faça referência a um ClusterSelector

Para fazer referência a um ClusterSelector noutra configuração, defina a anotação configmanagement.gke.io/cluster-selector: CLUSTERSELECTOR-NAME.

A configuração seguinte cria um ClusterRole denominado namespace-reader que define um conjunto de autorizações para ler espaços de nomes. Este ClusterRole só é instanciado em clusters que correspondem ao selector-env-prod ClusterSelector.

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"]

Limite os clusters que uma configuração com âmbito de espaço de nomes afeta

Por predefinição, o Config Sync aplica as configurações herdadas por um espaço de nomes a esse espaço de nomes em cada cluster onde existe. Pode usar um ClusterSelector para aplicar a configuração apenas a um subconjunto desses clusters.

Por exemplo, pode configurar os clusters de forma diferente com base na respetiva localização geográfica ou na localização geográfica dos respetivos clientes. Esta configuração pode ser útil para a localização ou para a conformidade legal. Os exemplos nesta secção aplicam configurações específicas da região apenas a clusters com a etiqueta location: france.

A configuração do cluster seguinte adiciona uma etiqueta location: france a um cluster denominado cluster-1:

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

Crie uma configuração ClusterSelector que faça referência às etiquetas que quer selecionar. A ClusterConfig seguinte seleciona a etiqueta location: france:

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

Um ClusterSelector não tem efeito até que faça referência ao mesmo noutra configuração. A configuração RoleBinding seguinte seleciona apenas clusters que correspondem ao selector-location-france ClusterSelector. Esta configuração pode ser útil, por exemplo, se uma diretriz de conformidade apenas permitir que uma conta de serviço específica veja informações sobre clusters na respetiva 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 colocar esta configuração num espaço de nomes abstrato ou num diretório de espaços de nomes, como namespaces/eng, é aplicada aos espaços de nomes que a herdam, mas apenas em clusters com a etiqueta location: france.

O que se segue?