Configura spazi dei nomi e oggetti con ambito a livello di spazio dei nomi
Questa pagina illustra come utilizzare Config Sync per gestire gli spazi dei nomi e gli oggetti con ambito a livello 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 a livello di spazio dei nomi possono trovarsi ovunque nella directory o nelle sottodirectory del repository.
Completa i seguenti passaggi per configurare uno spazio dei nomi chiamato 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
ed esegui il push del 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 tuo repository remoto.BRANCH_NAME
: il ramo che vuoi impegnare.
Questo esempio aggiunge il file alla directory principale, ma puoi spostarlo in qualsiasi sottodirectory del repository.
Repository gerarchico
Tutte le configurazioni per gli spazi dei nomi e gli oggetti con ambito a livello di spazio dei nomi si trovano all'interno della directory namespaces/
del repository gerarchico e delle relative directory discendenti.
Segui questi passaggi per configurare uno spazio dei nomi chiamato gamestore
in ogni cluster registrato:
Nel clone locale del tuo 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 è denominata
namespaces/gamestore
:mkdir namespaces/gamestore
Nella directory dello spazio dei nomi, crea un file
gamestore.yaml
con il seguente contenuto: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 tuo repository remoto.BRANCH_NAME
: il ramo che vuoi impegnare.
Dopo qualche istante, lo spazio dei nomi gamestore
viene creato in ciascun 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 rimuova il file ed eseguine il push nel repository remoto. Non rimuovere la configurazione se vuoi configurare uno spazio dei nomi astratto per un repository gerarchico.
Configura un oggetto con ambito a livello di spazio dei nomi
Nei repository non strutturati, puoi archiviare oggetti con ambito dello spazio dei nomi in qualsiasi directory o sottodirectory senza richiedere una configurazione dello spazio dei nomi. Se una configurazione dello spazio dei nomi non è presente, Config Sync crea automaticamente un oggetto spazio dei nomi implicito e applica tutte le configurazioni a quello 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. Anche tutte le altre configurazioni con ambito a livello di spazio dei nomi devono essere archiviate nella stessa sottodirectory. Se una configurazione dello spazio dei nomi non è presente, Config Sync restituisce un errore KNV1044 che indica una configurazione mancante.
Configurare uno spazio dei nomi astratto
Questa sezione si applica solo ai repository gerarchici. Gli spazi dei nomi astratti non sono supportati nei repository non strutturati. Se utilizzi un repository non strutturato e vuoi funzionalità simili, usa gli spazi dei nomi gerarchici.
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 astratto denominata
eng
:mkdir namespaces/eng
A differenza di una directory dello spazio dei nomi discendente, la directory di uno spazio dei nomi astratta non contiene una configurazione.
Nella directory dello spazio dei nomi astratto di
eng
, crea una configurazione per un ruolo denominatoeng-viewer
, che concedaget
elist
a tutte le risorse in ogni spazio dei nomi che alla fine erediterà 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 chiamato
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
danamespaces/
alla directorynamespaces/eng/
:mv namespaces/gamestore /namespaces/eng/
Esegui il commit di tutte le modifiche e inviale al telecomando per il repository.
Config Sync nota la modifica e applica il nuovo Role e RoleBinding allo spazio dei nomi gamestore
in tutti i cluster registrati.
Per rimuovere le configurazioni ed eliminare lo spazio dei nomi gamestore
dai cluster registrati, puoi creare un nuovo commit che rimuova l'intero spazio dei nomi astratto di eng
ed eseguirne il push nel repository remoto.
Limita 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, quindi applica tutte le configurazioni ereditate a tale spazio dei nomi. Per limitare i cluster interessati da una determinata configurazione in base alle etichette di ogni cluster, utilizza un ClusterSelector. Per scoprire di più, consulta Utilizzare i ClusterSelector.
Limitare gli spazi dei nomi interessati da una configurazione
Per limitare gli spazi dei nomi interessati da una configurazione, utilizza uno spazio dei nomi. NamespaceSelector è un tipo speciale di configurazione che utilizza labelSelectors di Kubernetes. Puoi dichiarare gli spazi dei nomi in combinazione con le configurazioni degli oggetti con ambito a livello 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. NamespaceSelector: è simile, ma non identico a ClusterSelector. NamespaceSelector restringe il pool di spazi dei nomi a cui si applica una configurazione.
Per dichiarare un NamespaceSelector, aggiungi l'annotazione metadata.namespace
o NamespaceSelector
. La dichiarazione di entrambe le annotazioni non è valida. Se le risorse con ambito a livello di spazio non dichiarano metadata.namespace
o l'annotazione NamespaceSelector
, Config Sync utilizza lo spazio dei nomi "default" del cluster.
NamespaceSelector in repository non strutturati
Un repository non strutturato non deve dichiarare tutti gli spazi dei nomi per gli oggetti con ambito a livello di spazio dei 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 quello spazio. Se lo spazio dei nomi non esiste ancora nel cluster, Config Sync crea lo spazio dei nomi in modo implicito.
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
. Prima di creare un repository non strutturato con oggetti utilizzati in precedenza in un repository gerarchico, verifica che NamespaceSelectors
non si applichi a risorse aggiuntive.
Se rimuovi oggetti con ambito di spazio dei nomi da un repository non strutturato, Config Sync elimina quegli oggetti, ma non rimuove gli spazi dei nomi che potrebbero essere stati creati implicitamente per quegli oggetti. Questo comportamento si verifica perché Config Sync non può dedurre quando è sicuro eliminare uno spazio dei nomi creato in modo implicito, quindi viene sempre lasciato nel cluster.
NamespaceSelector in 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 a livello di cluster o di spazio dei nomi.
Località selettore nome spazio dei nomi
In un repository non strutturato, puoi posizionare gli spazi dei nomi in qualsiasi directory o sottodirectory.
In un repository gerarchico, puoi inserire NamespaceSelector in qualsiasi directory dello spazio dei nomi astratto, ma non in una directory namespace.
La seguente architettura di repository di esempio mostra le località valide e non valide per NamespaceSelector 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 al loro interno. Tuttavia, poiché le directory gamestore
e incubator-1
rappresentano gli spazi dei nomi effettivi, non puoi inserirli in uno spazio dei nomi.
Esempio di NamespaceSelector
La configurazione seguente crea uno spazio dei nomi denominato gamestore-selector
. Se un'altra configurazione fa riferimento a questo NamespaceSelector, la configurazione 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 uno spazio dei nomi Selector in una configurazione, imposta l'annotazione configmanagement.gke.io/namespace-selector
sul nome dello spazio dei nomi.
Un NamespaceSelector non ha effetto finché non vi fai riferimento in un'altra configurazione.
Se gamestore-selector
NamespaceSelector si trova nella stessa gerarchia della
ResourceQuota seguente, quota
, la risorsa ResourceQuota viene creata 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"
Per riassumere, l'utilizzo di uno spazio dei nomi è un processo in tre fasi:
- Aggiungi etichette agli spazi dei nomi.
- Creare una configurazione NamespaceSelector.
- Fare riferimento all'oggetto NamespaceSelector in un'altra configurazione.
Disabilita l'ereditarietà per un tipo di oggetto
Gli oggetti Kubernetes GereryConfig non sono supportati nei repository non strutturati. L'esempio seguente si applica solo ai repository gerarchici.
Puoi disattivare selettivamente l'ereditarietà per qualsiasi configurazione impostando il campo hierarchyMode
su none
. HierarchyConfigs è archiviato nella directory system/
del repository. Questo esempio disattiva l'ereditarietà per RoleBindings.
# 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