Esta página explica como usar o Config Sync para gerir espaços de nomes e escolher que objetos o Config Sync sincroniza com os seus espaços de nomes.
Os objetos de recursos do Kubernetes podem ter âmbito de cluster ou âmbito de espaço de nomes, dependendo do tipo de recurso. Seleciona o cluster configurando o cliente para comunicar com um cluster específico. Selecione o espaço de nomes configurando o campo metadata.namespace
no manifesto do objeto. O Config Sync adiciona capacidades adicionais: seletores de clusters e seletores de espaços de nomes, que lhe permitem refinar ainda mais os objetos sincronizados.
Antes de ler esta página, já deve estar familiarizado com os seguintes conceitos do Kubernetes:
Acerca da definição do âmbito de objetos com o Config Sync
Por predefinição, quando instala o Config Sync num cluster ou como predefinição da frota, o Config Sync sincroniza todos os objetos Kubernetes na sua fonte de verdade com clusters com o Config Sync instalado ou todos os clusters numa frota. No entanto, ao restringir objetos a um cluster ou a um espaço de nomes, pode controlar que objetos são sincronizados com um cluster ou um espaço de nomes.
O Config Sync oferece os seguintes métodos para definir o âmbito dos seus objetos:
- Configure objetos com âmbito de cluster com um seletor de cluster
- Configure objetos com âmbito de cluster com etiquetas de pacotes de frotas (Pré-visualização)
- Configure objetos com âmbito de espaço de nomes com um seletor de espaço de nomes (esta página)
Use espaços de nomes explícitos
Recomendamos que use a declaração explícita do espaço de nomes ao configurar o Config Sync, porque permite gerir os metadados do espaço de nomes e eliminar espaços de nomes mais tarde, se necessário.
A predefinição é implicit
, mas pode alterar a estratégia de espaço de nomes no objeto RootSync
ou RepoSync
definindo o campo namespaceStrategy
como explicit
. Para mais informações, consulte a estratégia de espaço de nomes.
Acerca dos seletores de espaço de nomes
Os seletores de namespace são uma funcionalidade do Config Sync que lhe permite implementar objetos de recursos idênticos de outra forma em vários namespaces.
A utilização de seletores de espaço de nomes é semelhante à utilização de
seletores de etiquetas do Kubernetes
para mapear um serviço a um conjunto de pods, mas com uma camada adicional de indireção.
Como não pode adicionar campos personalizados a tipos de recursos existentes, define o seletor num objeto NamespaceSelector
. Em seguida, faz referência a esse seletor pelo nome numa anotação nos objetos que quer usar esse seletor.
Para usar seletores de espaço de nomes:
- Adicione ou escolha uma etiqueta existente nos espaços de nomes para os quais quer implementar.
- Defina um objeto de recurso
NamespaceSelector
na sua fonte de informação. O Config Sync não sincroniza objetosNamespaceSelector
com o cluster. - Para cada objeto que quer sincronizar com um ou mais espaços de nomes, modifique a configuração do objeto para remover o campo
metadata.namespace
e adicione a anotaçãoconfigmanagement.gke.io/namespace-selector
com um valor que corresponda aometadata.name
do seuNamespaceSelector
.
Os exemplos na secção seguinte fornecem mais detalhes sobre como definir objetos NamespaceSelector
e anotar outros objetos para usar o NamespaceSelector
.
Antes de começar
- Instale o Config Sync.
- Criar ou ter acesso a uma fonte de informação onde armazena os seus ficheiros de configuração.
- Se ainda não tiver um ou mais namespaces, crie os namespaces aos quais quer restringir os seus recursos. Pode criar o espaço de nomes diretamente no cluster ou na sua fonte de verdade.
Use seletores de espaço de nomes
Os seletores de espaço de nomes são definidos com requisitos baseados na igualdade ou requisitos baseados no conjunto. Pode combinar vários requisitos.
Exemplo de seletor de etiquetas baseado na igualdade
O exemplo seguinte mostra como usar seletores baseados na igualdade para selecionar os espaços de nomes aos quais uma configuração se aplica:
Adicione uma etiqueta a um ou mais namespaces:
kubectl label namespace NAMESPACE app=gamestore
Substitua
NAMESPACE
pelo nome do seu espaço de nomes.Execute este comando para cada espaço de nomes que quer etiquetar.
Crie um seletor de espaço de nomes denominado
gamestore-selector
.kind: NamespaceSelector apiVersion: configmanagement.gke.io/v1 metadata: name: gamestore-selector spec: selector: matchLabels: app: gamestore
Se a configuração de outro objeto fizer referência a este seletor de espaço de nomes, essa configuração só pode ser aplicada a objetos em espaços de nomes que tenham a etiqueta
app: gamestore
.Um seletor de espaço de nomes não tem efeito até que faça referência ao mesmo noutra configuração. Crie uma quota de objetos de exemplo que faça referência ao seletor de espaço de nomes:
kind: ResourceQuota apiVersion: v1 metadata: name: quota annotations: configmanagement.gke.io/namespace-selector: gamestore-selector spec: hard: pods: "1" cpu: "200m" memory: "200Mi"
A quota de recursos é criada apenas em espaços de nomes que tenham a etiqueta
app: gamestore
.
Exemplo de seletor de etiquetas baseado em conjuntos
O exemplo seguinte mostra como usar seletores baseados em conjuntos para isentar espaços de nomes de herdar objetos:
Adicione uma etiqueta a um ou mais namespaces:
kubectl label namespace NAMESPACE quota-exempt=exempt
Substitua
NAMESPACE
pelo nome do seu espaço de nomes.Execute este comando para cada espaço de nomes que quer etiquetar.
Crie um seletor de espaço de nomes denominado
exclude-exempt-namespaces
:kind: NamespaceSelector apiVersion: configmanagement.gke.io/v1 metadata: name: excludes-exempt-namespaces spec: selector: matchExpressions: - key: quota-exempt operator: NotIn values: - exempt
Se a configuração de outro objeto fizer referência a este seletor de espaço de nomes, essa configuração é aplicada a todos os espaços de nomes exceto àqueles com o par chave-valor
quota-exempt: exempt
.Um seletor de espaço de nomes não tem efeito até que faça referência ao mesmo noutra configuração. Crie uma quota de objetos de exemplo que faça referência ao seletor de espaço de nomes:
kind: ResourceQuota apiVersion: v1 metadata: name: quota annotations: configmanagement.gke.io/namespace-selector: exclude-exempt-namespaces spec: hard: pods: "1" cpu: "200m" memory: "200Mi"
A quota de recursos é criada em todos os espaços de nomes, exceto nos que têm o par chave-valor
quota-exempt: exempt
.
Integração com âmbitos de equipa e espaços de nomes de frotas
Os espaços de nomes de frotas criados Google Cloud têm automaticamente a etiquetafleet.gke.io/fleet-scope: your-scope
. Todos os espaços de nomes também têm a etiqueta Kubernetes
kubernetes.io/metadata.name: your-namespace
. Pode usar estas etiquetas predefinidas para configurar um seletor de espaço de nomes para selecionar espaços de nomes da frota.
O tutorial de posse da frota explica mais detalhadamente como usar seletores de espaço de nomes com frotas e âmbitos de equipa para gerir seletivamente objetos para diferentes equipas.
Objetos com âmbito do espaço de nomes com modo hierárquico
Embora os repositórios não estruturados sejam recomendados para a maioria dos exemplos de utilização, pode usar seletores de espaço de nomes para restringir os seus objetos com um repositório hierárquico. A utilização de seletores de espaço de nomes é a mesma, mas existem limitações e requisitos adicionais sobre como organiza a configuração do espaço de nomes na sua fonte de dados fidedigna.
Limitações
Quando usa uma configuração do seletor de espaço de nomes com um repositório hierárquico, tenha em atenção as seguintes limitações e requisitos:
- Tem de armazenar todos os ficheiros de configuração para espaços de nomes e objetos com âmbito de espaço de nomes no diretório
namespaces/
do repositório hierárquico e nos respetivos diretórios descendentes. - Tem de especificar explicitamente uma configuração do espaço de nomes no subdiretório
namespaces/NAMESPACE
, em queNAMESPACE
corresponde ao nome do espaço de nomes. Todos os outros objetos com âmbito de espaço de nomes têm de ser armazenados no mesmo subdiretório. Se faltar uma configuração de espaço de nomes, o Config Sync devolve um erro KNV1044. - Os recursos que fazem referência a um seletor de espaço de nomes são aplicados a espaços de nomes que herdam uma determinada configuração de um espaço de nomes abstrato, independentemente da estrutura de diretórios do diretório
namespaces/
.
Localização do seletor de espaço de nomes
Num repositório hierárquico, pode colocar uma configuração do seletor de espaço de nomes em qualquer diretório de espaço de nomes abstrato, mas não num diretório de espaço de nomes.
A arquitetura do repositório de exemplo seguinte mostra localizações válidas e inválidas para seletores de espaço de nomes:
namespace-inheritance
...
├── namespaces
│ ├── eng
│ │ ├── gamestore
│ │ │ ├── namespace.yaml
│ │ │ └── ns_selector.yaml # invalid
│ │ └── ns_selector.yaml # valid
│ ├── ns_selector.yaml # valid
│ ├── rnd
│ │ ├── incubator-1
│ │ │ ├── namespace.yaml
│ │ │ └── ns_selector.yaml # invalid
│ │ └── ns_selector.yaml # valid
Uma vez que os diretórios namespaces
, eng
e rnd
representam espaços de nomes abstratos, pode colocar um seletor neles. No entanto, uma vez que os diretórios gamestore
e incubator-1
representam espaços de nomes reais, não pode colocar um seletor de espaço de nomes nos mesmos.
Configure um espaço de nomes abstrato
Com um repositório hierárquico, pode usar espaços de nomes abstratos opcionalmente.
O exemplo seguinte mostra como mover o diretório do espaço de nomes para um espaço de nomes abstrato que contém configurações adicionais herdadas pelo espaço de nomes:
No seu repositório, crie um diretório de espaço de nomes abstrato. O diretório do espaço de nomes abstrato não contém configurações para espaços de nomes, mas os diretórios do espaço de nomes descendentes contêm configurações.
No diretório do espaço de nomes abstrato que criou, crie uma configuração para uma função que conceda autorizações
get
elist
em todos os objetos em qualquer espaço de nomes que herde a função:apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: ROLE_NAME rules: - apiGroups: [""] resources: ["*"] verbs: ["get", "list"]
Substitua
ROLE_NAME
pelo nome da função.Crie uma configuração para uma associação de funções que associe a função a um grupo de email:
kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: ROLE_NAME subjects: - kind: Group name: group@example.com apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: ROLEBINDING_NAME apiGroup: rbac.authorization.k8s.io
Substitua
ROLEBINDING_NAME
pelo nome da função.Mova a configuração do espaço de nomes que criou na secção anterior do diretório
namespaces/
para o diretório do espaço de nomes abstrato que criou nesta secção.
Desative a herança para objetos
Pode desativar seletivamente a herança para qualquer configuração definindo o campo hierarchyMode
como none
. Os HierarchyConfigs são armazenados no diretório system/
do repositório. Este exemplo desativa a herança para associações de funções:
# system/hierarchy-config.yaml
kind: HierarchyConfig
apiVersion: configmanagement.gke.io/v1
metadata:
name: rbac
spec:
resources:
# Configure role to only be allowed in leaf namespaces.
- group: rbac.authorization.k8s.io
kinds: [ "RoleBinding" ]
hierarchyMode: none