Questa pagina spiega come utilizzare Config Sync per gestire gli spazi dei nomi e scegliere quali oggetti sincronizzare con gli spazi dei nomi.
Gli oggetti delle risorse Kubernetes possono avere ambito a livello di cluster o di spazio dei nomi,
a seconda del tipo di risorsa. Seleziona il cluster configurando il client per comunicare con un cluster specifico. Seleziona lo spazio dei nomi configurando il campo metadata.namespace
nel manifest dell'oggetto. Config Sync aggiunge funzionalità aggiuntive: selettori di cluster e selettori di spazi dei nomi, che ti consentono di perfezionare ulteriormente gli oggetti da sincronizzare.
Prima di leggere questa pagina, dovresti già conoscere i seguenti concetti di Kubernetes:
Informazioni sull'ambito degli oggetti con Config Sync
Per impostazione predefinita, quando installi Config Sync su un cluster o come impostazione predefinita per un parco, Config Sync sincronizza tutti gli oggetti Kubernetes nella tua fonte attendibile con i cluster su cui è installato Config Sync o con tutti i cluster di un parco. Tuttavia, definiendo l'ambito degli oggetti in un cluster o spazio dei nomi, puoi controllare quali oggetti vengono sincronizzati con un cluster o uno spazio dei nomi.
Config Sync offre i seguenti metodi per definire l'ambito degli oggetti:
- Configurare oggetti con ambito cluster con un selettore di cluster
- Configurare oggetti con ambito cluster con le etichette dei pacchetti del parco risorse (anteprima)
- Configurare oggetti con ambito di spazio dei nomi con un selettore di spazi dei nomi (questa pagina)
Utilizza spazi dei nomi espliciti
Ti consigliamo di utilizzare una dichiarazione esplicita dello spazio dei nomi durante la configurazione di Config Sync perché ti consente di gestire i metadati dello spazio dei nomi ed eliminare gli spazi dei nomi in un secondo momento, se necessario.
L'impostazione predefinita è implicit
, ma puoi modificare la strategia dello spazio dei nomi nell'oggetto RootSync
o RepoSync
impostando il campo namespaceStrategy
su explicit
. Per ulteriori informazioni, consulta la strategia dello spazio dei nomi.
Informazioni sui selettori di spazi dei nomi
I selettori di spazi dei nomi sono una funzionalità di Config Sync che ti consente di eseguire il deployment di oggetti della risorsa altrimenti identici in più spazi dei nomi.
L'utilizzo dei selettori di spazi dei nomi è simile all'utilizzo
dei selettori di etichette Kubernetes
per mappare un servizio a un insieme di pod, ma con un livello aggiuntivo di indirizzamento indiretto.
Poiché non puoi aggiungere campi personalizzati ai tipi di risorse esistenti, definisci il selettore in un oggetto NamespaceSelector
. Poi fai riferimento a questo selettore
per nome in un'annotazione sugli oggetti in cui vuoi utilizzarlo.
Per utilizzare i selettori di spazi dei nomi:
- Aggiungi o scegli un'etichetta esistente per gli spazi dei nomi in cui vuoi eseguire il deployment.
- Definisci un oggetto risorsa
NamespaceSelector
nella tua fonte attendibile. Config Sync non sincronizza gli oggettiNamespaceSelector
con il cluster. - Per ogni oggetto che vuoi sincronizzare con uno o più spazi dei nomi, modifica la configurazione dell'oggetto per rimuovere il campo
metadata.namespace
e aggiungere l'annotazioneconfigmanagement.gke.io/namespace-selector
con un valore corrispondente almetadata.name
del tuoNamespaceSelector
.
Gli esempi nella sezione successiva forniscono ulteriori dettagli su come definire gli oggetti NamespaceSelector
e annotare altri oggetti per utilizzare NamespaceSelector
.
Prima di iniziare
- Installa Config Sync.
- Crea o accedi a una fonte attendibile in cui archiviare i file di configurazione.
- Se non hai ancora uno o più spazi dei nomi, crea gli spazi dei nomi a cui vuoi applicare l'ambito delle risorse. Puoi creare lo spazio dei nomi direttamente nel cluster o nella fonte attendibile.
Utilizzare i selettori di spazi dei nomi
I selettori di spazi dei nomi vengono definiti con requisiti basati sull'uguaglianza o con requisiti basati su insiemi. Puoi combinare più requisiti.
Esempio di selettore di etichette basato sull'uguaglianza
L'esempio seguente mostra come utilizzare i selettori basati sull'uguaglianza per selezionare i namespace a cui si applica una configurazione:
Aggiungi un'etichetta a uno o più spazi dei nomi:
kubectl label namespace NAMESPACE app=gamestore
Sostituisci
NAMESPACE
con il nome dello spazio dei nomi.Esegui questo comando per ogni spazio dei nomi a cui vuoi aggiungere un'etichetta.
Crea un selettore dello spazio dei nomi denominato
gamestore-selector
.kind: NamespaceSelector apiVersion: configmanagement.gke.io/v1 metadata: name: gamestore-selector spec: selector: matchLabels: app: gamestore
Se la configurazione di un altro oggetto fa riferimento a questo selettore di spazi dei nomi, la configurazione può essere applicata solo agli oggetti negli spazi dei nomi che hanno l'etichetta
app: gamestore
.Un selettore dello spazio dei nomi non ha alcun effetto finché non fai riferimento ad esso in un'altra configurazione. Crea una quota di oggetti di esempio che fa riferimento al selettore dello spazio dei nomi:
kind: ResourceQuota apiVersion: v1 metadata: name: quota annotations: configmanagement.gke.io/namespace-selector: gamestore-selector spec: hard: pods: "1" cpu: "200m" memory: "200Mi"
La quota della risorsa viene creata solo negli spazi dei nomi con l'etichetta
app: gamestore
.
Esempio di selettore di etichette basato su set
L'esempio seguente mostra come utilizzare i selettori basati su set per esentare i namespace dall'ereditarietà degli oggetti:
Aggiungi un'etichetta a uno o più spazi dei nomi:
kubectl label namespace NAMESPACE quota-exempt=exempt
Sostituisci
NAMESPACE
con il nome dello spazio dei nomi.Esegui questo comando per ogni spazio dei nomi a cui vuoi aggiungere un'etichetta.
Crea un selettore dello spazio dei nomi denominato
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 la configurazione di un altro oggetto fa riferimento a questo selettore dello spazio dei nomi, la configurazione viene applicata a tutti gli spazi dei nomi tranne quelli con la coppia chiave-valore
quota-exempt: exempt
.Un selettore dello spazio dei nomi non ha alcun effetto finché non fai riferimento ad esso in un'altra configurazione. Crea una quota di oggetti di esempio che fa riferimento al selettore dello spazio dei nomi:
kind: ResourceQuota apiVersion: v1 metadata: name: quota annotations: configmanagement.gke.io/namespace-selector: exclude-exempt-namespaces spec: hard: pods: "1" cpu: "200m" memory: "200Mi"
La quota della risorsa viene creata in tutti gli spazi dei nomi, ad eccezione di quelli che contengono la coppia chiave-valore
quota-exempt: exempt
.
Integrazione con gli ambiti dei team e gli spazi dei nomi del parco risorse
Gli spazi dei nomi del parco risorse 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 un selettore di spazi dei nomi per la selezione degli spazi dei nomi del parco risorse.
Il tutorial sulla proprietà del parco risorse spiega in modo più dettagliato come utilizzare i selettori di spazi dei nomi con i parchi risorse e gli ambiti dei team per gestire in modo selettivo gli oggetti per team diversi.
Oggetti con ambito di spazio dei nomi con modalità gerarchica
Sebbene i repository non strutturati siano consigliati per la maggior parte dei casi d'uso, puoi utilizzare i selettori di spazi dei nomi per definire l'ambito dei tuoi oggetti con un repository gerarchico. L'utilizzo dei selettori dello spazio dei nomi è lo stesso, ma esistono limitazioni e requisiti aggiuntivi per la modalità di organizzazione della configurazione dello spazio dei nomi nella tua origine attendibile.
Limitazioni
Quando utilizzi una configurazione del selettore dello spazio dei nomi con un repository gerarchico, tieni presente le seguenti limitazioni e requisiti:
- Devi archiviare tutti i file di configurazione per gli spazi dei nomi e gli oggetti a livello di spazio dei nomi all'interno della directory
namespaces/
del repository gerarchico e delle relative directory discendenti. - Devi specificare esplicitamente una configurazione dello spazio dei nomi nella sottodirectory
namespaces/NAMESPACE
, doveNAMESPACE
corrisponde al nome dello spazio dei nomi. Tutti gli altri oggetti con ambito nello spazio dei nomi devono essere archiviati nella stessa sottodirectory. Se manca una configurazione dello spazio dei nomi, Config Sync restituisce un errore KNV1044. - Le risorse che fanno riferimento a un selettore di spazi dei nomi vengono applicate agli spazi dei nomi che ereditano una determinata configurazione da uno spazio dei nomi astratto, indipendentemente dalla struttura della directory
namespaces/
.
Posizione del selettore dello spazio dei nomi
In un repository gerarchico, puoi inserire una configurazione del selettore dello spazio dei nomi in qualsiasi directory dello spazio dei nomi astratto, ma non in una directory dello spazio dei nomi.
L'esempio seguente di architettura del repository mostra le posizioni valide e non valide per i selettori di spazi dei nomi:
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
selettore dello spazio dei nomi al loro interno.
Configura uno spazio dei nomi astratto
Con un repository gerarchico, puoi facoltativamente utilizzare spazi dei nomi astratti.
L'esempio seguente mostra come spostare la directory dello spazio dei nomi in uno spazio dei nomi astratto che contiene configurazioni aggiuntive ereditate dallo spazio dei nomi:
Nel tuo repository, crea una directory dello spazio dei nomi astratto. La directory dello spazio dei nomi astratto non contiene configurazioni per gli spazi dei nomi, ma le directory degli spazi dei nomi discendenti contengono configurazioni.
Nella directory dello spazio dei nomi astratto che hai creato, crea una configurazione per un ruolo che concede le autorizzazioni
get
elist
a tutti gli oggetti di qualsiasi spazio dei nomi che alla fine eredita il ruolo:apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: ROLE_NAME rules: - apiGroups: [""] resources: ["*"] verbs: ["get", "list"]
Sostituisci
ROLE_NAME
con il nome del ruolo.Crea una configurazione per un'associazione di ruoli che associ il ruolo a un gruppo 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
Sostituisci
ROLEBINDING_NAME
con il nome del ruolo.Sposta la configurazione dello spazio dei nomi che hai creato nella sezione precedente dalla directory
namespaces/
alla directory dello spazio dei nomi astratto che hai creato in questa sezione.
Disattivare l'ereditarietà per gli oggetti
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 le associazioni di ruoli:
# 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