Questa pagina illustra come utilizzare Config Sync per gestire gli spazi dei nomi e gli oggetti con ambito di spazio dei nomi.
Configura uno spazio dei nomi
La configurazione di uno spazio dei nomi funziona in modo diverso per i repository non strutturati e gerarchici. I seguenti esempi mettono in evidenza le differenze.
Repository non strutturato
Le configurazioni per gli spazi dei nomi e gli oggetti con ambito di spazio dei nomi possono trovarsi ovunque nella directory o nelle sottodirectory del repository.
Completa i seguenti passaggi per configurare un ambito denominato gamestore
in ogni cluster registrato:
Crea un file
namespace-gamestore.yaml
con i seguenti contenuti:apiVersion: v1 kind: Namespace metadata: name: gamestore
Devi creare un solo file YAML contenente la configurazione dello spazio dei nomi.
Crea un commit che includa la configurazione
namespace-gamestore.yaml
e pusha il commit nel repository remoto:git add multirepo/root/namespace-gamestore.yaml git commit -m "Created gamestore namespace config" git push REMOTE_NAME BRANCH_NAME
Sostituisci quanto segue:
REMOTE_NAME
: il nome del repository remoto.BRANCH_NAME
: il ramo a cui vuoi eseguire il commit.
Questo esempio aggiunge il file alla directory principale, ma puoi spostarlo in una delle sottodirectory del repository.
Repository gerarchico
Tutte le configurazioni per gli spazi dei nomi e gli oggetti con ambito di spazio dei nomi si trovano nella directory namespaces/
del repository gerarchico e nelle relative directory discendenti.
Per configurare uno spazio dei nomi denominato gamestore
in ogni cluster registrato:
Nel clone locale del repository, crea una directory dello spazio dei nomi. Una directory dello spazio dei nomi contiene una configurazione per uno spazio dei nomi. Il nome della directory dello spazio dei nomi deve corrispondere al nome dello spazio dei nomi. In questo esempio, la directory si chiama
namespaces/gamestore
:mkdir namespaces/gamestore
Nella directory dello spazio dei nomi, crea un file
gamestore.yaml
con i seguenti contenuti:apiVersion: v1 kind: Namespace metadata: name: gamestore
metadata.name
deve corrispondere al nome della directory dello spazio dei nomi.Crea un commit che includa la configurazione
gamestore.yaml
ed esegui il push del commit nel repository remoto:git add namespaces/gamestore/gamestore.yaml git commit -m "Created gamestore namespace config" git push REMOTE_NAME BRANCH_NAME
Sostituisci quanto segue:
REMOTE_NAME
: il nome del repository remoto.BRANCH_NAME
: il ramo a cui vuoi eseguire il commit.
Dopo alcuni istanti, lo spazio dei nomi gamestore
viene creato in ogni cluster registrato.
Per verificare, descrivi lo spazio dei nomi:
kubectl describe namespace gamestore
Per rimuovere la configurazione ed eliminare lo spazio dei nomi gamestore
dai cluster registrati,
crea un nuovo commit che rimuove il file e invialo al repository remoto. Non rimuovere la configurazione se vuoi configurare uno spazio dei nomi astratto per un repository gerarchico.
Configurare un oggetto con ambito di spazio dei nomi
Nei repository non strutturati, puoi archiviare oggetti con ambito di spazio dei nomi in qualsiasi directory o sottodirectory senza richiedere una configurazione dello spazio dei nomi. Se manca una configurazione dello spazio dei nomi, Config Sync crea automaticamente un oggetto Namespace implicito e applica tutte le configurazioni a questo spazio dei nomi.
Questo comportamento può essere modificato utilizzando il campo namespaceStrategy
. Se namespaceStrategy
è impostato su explicit
, Config Sync non creerà automaticamente un oggetto Namespace implicito. Per saperne di più, consulta la strategia dello spazio dei nomi.
Nei repository gerarchici, devi specificare esplicitamente una configurazione dello spazio dei nomi nella sottodirectory namespaces/NAMESPACE
, dove NAMESPACE
deve corrispondere al nome dello spazio dei nomi. Tutte le altre configurazioni basate sullo spazio dei nomi devono essere archiviate anche nella stessa sottodirectory. Se manca una configurazione dello spazio dei nomi,
Config Sync restituisce un errore KNV1044 che indica una configurazione dello spazio dei nomi mancante.
Configura uno spazio dei nomi astratto
Questa sezione si applica solo ai repository gerarchici perché gli spazi dei nomi astratti non sono supportati nei repository non strutturati.
Questo esempio estende l'esempio nella configurazione di uno spazio dei nomi
spostando la directory dello spazio dei nomi gamestore
in uno spazio dei nomi astratto
contenente configurazioni aggiuntive ereditate dallo spazio dei nomi gamestore
.
Nel clone locale del repository, crea una directory dello spazio dei nomi astratta chiamata
eng
:mkdir namespaces/eng
Una directory dello spazio dei nomi astratto non contiene un file di configurazione per uno spazio dei nomi, ma le relative directory degli spazi dei nomi discendenti sì.
Nella directory dello spazio dei nomi astratto
eng
, crea una configurazione per un ruolo chiamatoeng-viewer
che assegnaget
elist
a tutte le risorse di qualsiasi spazio dei nomi che alla fine eredita il ruolo:# namespaces/eng/eng-role.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: eng-viewer rules: - apiGroups: [""] resources: ["*"] verbs: ["get", "list"]
Crea una configurazione per un RoleBinding denominato
eng-admin
che associa il ruoloeng-viewer
al gruppoeng@example.com
:# namespaces/eng/eng-rolebinding.yaml kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: eng-admin subjects: - kind: Group name: eng@example.com apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: eng-viewer apiGroup: rbac.authorization.k8s.io
Sposta la directory dello spazio dei nomi
gamestore
dalla directorynamespaces/
alla directorynamespaces/eng/
:mv namespaces/gamestore /namespaces/eng/
Esegui il commit di tutte le modifiche e inviale al server remoto per il repository.
Config Sync rileva la modifica e applica il nuovo ruolo e la nuova assegnazione del ruolo allo spazio dei nomi gamestore
su tutti i cluster registrati.
Per rimuovere le configurazioni ed eliminare lo spazio dei nomi gamestore
dai cluster registrati,
puoi creare un nuovo commit che rimuove l'intero spazio dei nomi astrattoeng
e spingerlo nel repository remoto.
Limitare i cluster interessati da una configurazione
In genere, Config Sync applica una configurazione a ogni cluster registrato. Tuttavia, se la configurazione si trova nella sottodirectory namespaces/
di un repository gerarchico, Config Sync crea prima lo spazio dei nomi all'interno di ogni cluster e poi applica tutte le configurazioni ereditate a questo spazio dei nomi. Per limitare i cluster interessati da una determinata configurazione in base alle etichette di ciascun cluster, utilizza un ClusterSelector. Per scoprire di più, consulta
Utilizzare ClusterSelectors.
Limitare gli spazi dei nomi interessati da una configurazione
Per limitare gli spazi dei nomi interessati da una configurazione, utilizza un selettore di spazi dei nomi. Un NamespaceSelector è un tipo speciale di configurazione che utilizza i labelSelectors di Kubernetes. Puoi dichiarare NamespaceSelectors in combinazione con le configurazioni per gli oggetti con ambito di spazio dei nomi in un repository non strutturato o in un repository gerarchico per limitare gli spazi dei nomi che possono ereditare la configurazione. NamespaceSelectors sono simili, ma non identici, a ClusterSelectors. Un NamespaceSelector restringe il pool di spazi dei nomi a cui si applica una configurazione.
Per dichiarare un selettore di spazi dei nomi, aggiungi l'annotazione metadata.namespace
o NamespaceSelector
. La dichiarazione di entrambe le annotazioni non è valida. Se le risorse con ambito nello spazio dei nomi non dichiarano metadata.namespace
o l'annotazione NamespaceSelector
, Config Sync utilizza lo spazio dei nomi "predefinito" del cluster.
NamespaceSelectors nei repository non strutturati
Un repository non strutturato non deve dichiarare tutti gli spazi dei nomi per gli oggetti a livello di spazio dei nomi nel repository. Un oggetto può
definire un metadata.namespace
senza avere un oggetto dello spazio dei nomi corrispondente in un
repository non strutturato. Se lo spazio dei nomi esiste già nel cluster,
Config Sync crea l'oggetto all'interno di questo spazio dei nomi. Se lo spazio dei nomi non esiste ancora nel cluster, Config Sync lo crea implicitamente.
Prima di creare un repository non strutturato con oggetti
che sono stati utilizzati in precedenza in un repository gerarchico, verifica che i tuoi
NamespaceSelectors
non si applichino a risorse aggiuntive.
Quando rimuovi oggetti con ambito di spazio dei nomi da un repository non strutturato, Config Sync li elimina, ma non rimuove gli spazi dei nomi che potrebbero essere stati creati implicitamente per questi oggetti. Questo comportamento avviene perché Config Sync non è in grado di dedurre quando è sicuro eliminare un ambito creato implicitamente, pertanto viene sempre lasciato nel cluster.
Modalità NamespaceSelector
In un repository non strutturato, gli oggetti che dichiarano l'annotazione NamespaceSelector
vengono applicati a tutti gli spazi dei nomi che soddisfano le condizioni di un
NamespaceSelector
. Gli spazi dei nomi possono essere dichiarati in modo statico nella fonte della verità o essere dinamici. Per attivare la selezione dinamica, imposta spec.mode
su
dynamic
. In modalità dinamica, la selezione si estende sia agli spazi dei nomi dichiarati in modo statico sia a quelli presenti dinamicamente nel cluster. Gli spazi dei nomi scelti dinamicamente esistono già nel cluster e pertanto non sono gestiti da Config Sync. La modalità predefinita è static
.
NamespaceSelectors nei repository gerarchici
In un repository gerarchico, gli oggetti che dichiarano l'annotazione NamespaceSelector
vengono applicati agli spazi dei nomi che ereditano una determinata configurazione da uno spazio dei nomi astratto, indipendentemente dalla struttura della directory della directory namespaces/
. Un ClusterSelector restringe il pool di cluster a cui si applica una configurazione,
indipendentemente dal fatto che la configurazione abbia come target un oggetto con ambito cluster o spazio dei nomi.
Posizione di NamespaceSelector
In un repository non strutturato, puoi inserire gli elementi NamespaceSelector in qualsiasi directory o sottodirectory.
In un repository gerarchico, puoi inserire gli elementi NamespaceSelector in qualsiasi directory di spazio dei nomi astratto, ma non in una directory di spazio dei nomi.
L'esempio seguente di architettura del repository mostra le posizioni valide e non valide per NamespaceSelectors se utilizzi un repository gerarchico:
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
Poiché le directory namespaces
, eng
e rnd
rappresentano spazi dei nomi astratti, puoi inserire un selettore. Tuttavia, poiché le directory gamestore
e
incubator-1
rappresentano spazi dei nomi effettivi, non puoi inserire un
NamespaceSelector al loro interno.
Esempi di NamespaceSelector
Puoi utilizzare un NamespaceSelector
con i selettori di etichette per includere o escludere i nomi di spazio dei giri. Kubernetes supporta
selettori basati sull'uguaglianza e sugli insiemi.
Puoi combinare entrambi i tipi di selettori per perfezionare ulteriormente i namespace selezionati.
Selettore di etichette basato sull'uguaglianza
La seguente configurazione crea un NamespaceSelector denominato gamestore-selector
. Se un'altra configurazione fa riferimento a questo NamespaceSelector, può essere applicata solo agli oggetti negli spazi dei nomi con l'etichetta app: gamestore
.
kind: NamespaceSelector
apiVersion: configmanagement.gke.io/v1
metadata:
name: gamestore-selector
spec:
selector:
matchLabels:
app: gamestore
Per fare riferimento a un NamespaceSelector in una configurazione, imposta l'annotazione configmanagement.gke.io/namespace-selector
sul nome del NamespaceSelector.
Un selettore di spazi dei nomi non ha alcun effetto finché non fai riferimento ad esso in un'altra configurazione.
Se gamestore-selector
NamespaceSelector si trova nella stessa gerarchia del seguente ResourceQuota, quota
, ResourceQuota viene creato solo negli spazi dei nomi con l'etichetta app: gamestore
:
kind: ResourceQuota
apiVersion: v1
metadata:
name: quota
annotations:
configmanagement.gke.io/namespace-selector: gamestore-selector
spec:
hard:
pods: "1"
cpu: "200m"
memory: "200Mi"
In sintesi, l'utilizzo di un selettore di spazi dei nomi è una procedura in tre passaggi:
- Aggiungi etichette agli spazi dei nomi.
- Crea una configurazione NamespaceSelector.
- Fai riferimento all'oggetto NamespaceSelector in un'altra configurazione.
Selettore di etichette basato su set
Puoi utilizzare i selettori di spazi dei nomi per esentare determinati spazi dei nomi dall'ereditare una risorsa nella struttura utilizzando i selettori di etichette basati su set.
In questo esempio, quando ResourceQuota
viene annotato con NamespaceSelector
impostando l'annotazione configmanagement.gke.io/namespace-selector: excludes-exempt-namespaces
, ResourceQuota
viene creato in ogni spazio dei nomi tranne in quelli etichettati come quota-exempt: exempt
:
kind: NamespaceSelector
apiVersion: configmanagement.gke.io/v1
metadata:
name: excludes-exempt-namespaces
spec:
selector:
matchExpressions:
- key: quota-exempt
operator: NotIn
values:
- exempt
Integrazione con gli ambiti dei team e gli spazi dei nomi del parco risorse
I namespace di parchi creati in Google Cloud hanno automaticamente l'etichettafleet.gke.io/fleet-scope: your-scope
. Tutti gli spazi dei nomi hanno anche l'etichetta Kuberneteskubernetes.io/metadata.name: your-namespace
. Puoi utilizzare queste etichette predefinite per configurare NamespaceSelector
per la selezione degli spazi dei nomi del parco risorse.
Disattivare l'ereditarietà per un tipo di oggetto
Gli oggetti Kubernetes HierarchyConfig non sono supportati nei repository non strutturati. Il seguente esempio si applica solo ai repository gerarchici.
Puoi disattivare in modo selettivo l'eredità per qualsiasi configurazione impostando il campo hierarchyMode
su none
. I file HierarchyConfigs vengono archiviati nella directory system/
del repository. Questo esempio disattiva l'eredità per i RoleBinding.
# 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
Passaggi successivi
- Scopri di più sulla configurazione di cluster e oggetti con ambito cluster