Configura spazi dei nomi e oggetti con ambito dello spazio dei nomi

Questa pagina illustra come utilizzare Config Sync per gestire gli spazi dei nomi e gli oggetti con ambito dello spazio dei nomi.

Configura uno spazio dei nomi

Lo spazio dei nomi deve essere configurato in modo diverso per i repository non strutturati e gerarchici. I seguenti esempi evidenziano le differenze.

Repository non strutturato

Le configurazioni degli spazi dei nomi e degli oggetti con ambito dello spazio dei nomi possono essere posizionate ovunque nella directory o nelle sottodirectory del repository.

Completa i seguenti passaggi per configurare uno spazio dei nomi denominato gamestore in ogni cluster registrato:

  1. Crea un file namespace-gamestore.yaml con i seguenti contenuti:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: gamestore
    

    Devi solo creare un file YAML che contiene la configurazione dello spazio dei nomi.

  2. Crea un commit che includa la configurazione di 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 di cui vuoi eseguire il commit.

    In questo esempio il file viene aggiunto alla directory radice, ma puoi spostarlo in una qualsiasi delle sottodirectory del repository.

Repository gerarchico

Tutte le configurazioni per gli spazi dei nomi e gli oggetti con ambito dello spazio dei nomi si trovano nella directory namespaces/ del repository gerarchico e delle directory discendenti.

Segui questi passaggi per configurare uno spazio dei nomi denominato gamestore in ogni cluster registrato:

  1. 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
    
  2. 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.

  3. Crea un commit che includa la configurazione di 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 di cui vuoi eseguire il commit.

Dopo qualche istante, in ogni cluster registrato viene creato lo spazio dei nomi gamestore. 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 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 dello spazio dei nomi

Nei repository non strutturati, puoi archiviare oggetti con ambito 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 spazio dei nomi implicito e applica tutte le configurazioni a quello spazio dei nomi.

Questo comportamento può essere modificato utilizzando il campo namespaceStrategy. Se namespaceStrategy è impostato su explicit, Config Sync non creerà automaticamente un oggetto spazio dei nomi implicito. Per saperne di più, consulta la pagina relativa alla 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. Anche tutte le altre configurazioni con ambito dello spazio dei nomi devono essere archiviate 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.

  1. Nel clone locale del repository, crea una directory dello spazio dei nomi astratta denominata eng:

    mkdir namespaces/eng
    

    Una directory dello spazio dei nomi astratta non contiene una configurazione per uno spazio dei nomi, a differenza delle directory dello spazio dei nomi discendenti.

  2. Nella directory dello spazio dei nomi astratto eng, crea una configurazione per un ruolo denominato eng-viewer, che concede get e list su tutte le risorse in qualsiasi spazio dei nomi che 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"]
    
  3. Crea una configurazione per una risorsa RoleBinding denominata eng-admin che associa il ruolo eng-viewer al gruppo eng@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
    
  4. Sposta la directory dello spazio dei nomi gamestore da namespaces/ alla directory namespaces/eng/:

    mv namespaces/gamestore /namespaces/eng/
    
  5. Esegui il commit di tutte le modifiche ed eseguine il push sul remoto per accedere al repository.

Config Sync rileva la modifica e applica i nuovi Role e RoleBinding 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 astratto eng ed eseguirne il push nel repository remoto.

Limita i cluster interessati da una configurazione

Normalmente, Config Sync applica una configurazione a ogni cluster registrato. Tuttavia, se la configurazione si trova all'interno della 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 quello 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.

Limita gli spazi dei nomi interessati da una configurazione

Per limitare gli spazi dei nomi interessati da una configurazione, utilizza un selettore di spazio dei nomi. Un NamespaceSelector è un tipo speciale di configurazione che utilizza labelSelectors di Kubernetes. Puoi dichiarare i selettori dello spazio dei nomi in combinazione con le configurazioni degli oggetti con ambito dello spazio dei nomi in un repository non strutturato o in un repository gerarchico per limitare gli spazi dei nomi che possono ereditare quella configurazione. I NamespaceSelector 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 spazio dei nomi, aggiungi l'annotazione metadata.namespace o NamespaceSelector. La dichiarazione di entrambe le annotazioni non è valida. Se le risorse con ambito dello spazio dei nomi non dichiarano metadata.namespace o l'annotazione NamespaceSelector, Config Sync utilizza lo spazio dei nomi "predefinito" del cluster.

Selettori dello spazio dei nomi nei repository non strutturati

Un repository non strutturato non deve dichiarare tutti gli spazi dei nomi per gli oggetti con ambito. 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 lo crea in modo implicito.

Prima di creare un repository non strutturato con oggetti utilizzati in precedenza in un repository gerarchico, verifica che NamespaceSelectors non si applichino a risorse aggiuntive.

Quando rimuovi gli oggetti con ambito dello spazio dei nomi da un repository non strutturato, Config Sync elimina questi oggetti, ma non rimuove gli spazi dei nomi che potrebbero essere stati creati implicitamente per questi oggetti. Questo comportamento si verifica perché Config Sync non può dedurre quando è sicuro eliminare uno spazio dei nomi creato in modo implicito, pertanto viene sempre lasciato sul cluster.

Modalità di selezione dello spazio dei nomi

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 elemento NamespaceSelector. Nelle versioni di Config Sync precedenti alla 1.17.0, l'annotazione NamespaceSelector si applica solo agli spazi dei nomi corrispondenti che vengono dichiarati in modo statico nella fonte di riferimento. Nella versione 1.17.0 e successive, l'oggetto NamespaceSelector supporta la modalità dinamica impostando spec.mode su dynamic. In modalità dinamica, la selezione si estende agli spazi dei nomi dichiarati in modo statico e a quelli presenti dinamicamente nel cluster. Gli spazi dei nomi scelti in modo dinamico esistono già nel cluster e, di conseguenza, non sono gestiti da Config Sync. La modalità predefinita è static.

Selettori dello spazio dei nomi 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, a prescindere 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 uno spazio dei nomi.

Posizione del selettore dello spazio dei nomi

In un repository non strutturato, puoi inserire NamespaceSelector in qualsiasi directory o sottodirectory.

In un repository gerarchico, puoi inserire i selettori dello spazio dei nomi in qualsiasi directory spazio dei nomi astratto, ma non in una directory spazio dei nomi.

La seguente architettura di repository di esempio mostra 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 al loro interno. Tuttavia, poiché le directory gamestore e incubator-1 rappresentano degli spazi dei nomi reali, non puoi inserirvi un selettore di spazio dei nomi.

Esempi di selezione dello spazio dei nomi

Puoi utilizzare un elemento NamespaceSelector con selettori di etichette per includere o escludere gli spazi dei nomi. Kubernetes supporta selettori basati su uguaglianza e set. Puoi combinare entrambi i tipi di selettori per perfezionare ulteriormente gli spazi dei nomi selezionati.

Selettore di etichette basato sull'uguaglianza

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 un NamespaceSelector in una configurazione, imposta l'annotazione configmanagement.gke.io/namespace-selector sul nome di NamespaceSelector.

Un NamespaceSelector non ha effetto finché non lo fai riferimento in un'altra configurazione. Se gamestore-selector NamespaceSelector si trova nella stessa gerarchia di ResourceQuota, 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 riepilogare, l'uso di un NamespaceSelector è un processo in tre passaggi:

  1. Aggiungere etichette agli spazi dei nomi.
  2. Creare una configurazione di NamespaceSelector.
  3. Fai riferimento all'oggetto NamespaceSelector in un'altra configurazione.

Selettore di etichette basate su set

Puoi utilizzare i selettori di spazio dei nomi per escludere determinati spazi dei nomi dall'ereditarietà di 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 quelli con etichetta 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

Gli spazi dei nomi del parco risorse creati in Google Cloud hanno automaticamente l'etichetta fleet.gke.io/fleet-scope: your-scope. Tutti gli spazi dei nomi hanno anche l'etichetta Kubernetes kubernetes.io/metadata.name: your-namespace. Puoi utilizzare queste etichette predefinite per configurare NamespaceSelector e selezionare gli spazi dei nomi del parco risorse.

Disabilita l'ereditarietà per un tipo di oggetto

Gli oggetti Kubernetes HierarchyConfig 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. I file HierarchyConfig sono archiviati nella directory system/ del repository. Questo esempio disabilita 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