Configurare spazi dei nomi e oggetti con ambito 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 di spazio dei nomi possono trovarsi ovunque nella directory del repository o nelle sottodirectory.

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

  1. Crea un file namespace-gamestore.yaml con il seguente contenuto:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: gamestore
    

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

  2. 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 a cui vuoi impegnarti.

    Questo esempio aggiunge il file alla directory radice, ma puoi spostarlo in qualsiasi sottodirectory del repository.

Repository gerarchico

Tutte le configurazioni degli spazi dei nomi e gli oggetti con ambito 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:

  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 gamestore.yaml ed esegui il push del commit al 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 a cui vuoi impegnarti.

Dopo qualche istante, 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 rimuova il file ed esegui il push al repository remoto. Non rimuovere la configurazione se vuoi configurare uno spazio dei nomi astratto per un repository gerarchico.

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, utilizza gli spazi dei nomi gerarchici.

L'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 ulteriori configurazioni ereditate dallo spazio dei nomi gamestore.

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

    mkdir namespaces/eng
    

    Una directory dello spazio dei nomi astratta non contiene una configurazione per uno spazio dei nomi, al contrario 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 un RoleBinding chiamato eng-admin che vincola 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 dalla directory namespaces/ alla directory namespaces/eng/:

    mv namespaces/gamestore/namespaces/eng/
    
  5. Esegui il commit di tutte le modifiche e inviale al telecomando per il repository.

L'operatore Config Management rileva la modifica e applica il nuovo 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 rimuova l'intero spazio dei nomi astratto eng ed eseguirne il push al 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, prima Config Sync crea 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 ciascun cluster, utilizza un ClusterSelector. Per scoprire di più, consulta la sezione Configurare un sottoinsieme di cluster.

Limita 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 labelSelector di Kubernetes. Puoi dichiarare spazi dei nomi in combinazione con configurazioni per oggetti con ambito a livello di spazio in un repository non strutturato o in un repository gerarchico per limitare gli spazi dei nomi che possono ereditare tale configurazione. NamespaceSelector: sono simili, ma non identici, a ClusterSelector. Un NamespaceSelector limita 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 nello spazio dei nomi nel repository. Un oggetto può definire un metadata.namespace senza avere un oggetto 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 dei nomi. Se lo spazio dei nomi non esiste ancora nel cluster, Config Sync crea lo spazio dei nomi implicitamente.

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. Prima di creare un repository non strutturato con oggetti utilizzati in precedenza in un repository gerarchico, verifica che il dominio NamespaceSelectors non si applichi a risorse aggiuntive.

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

NamespaceSelector 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 limita 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 di spazio dei nomi.

Posizione dello spazio dei nomi Selector

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

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

La seguente architettura di repository di esempio mostra posizioni 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 spazi dei nomi effettivi, non puoi inserire uno NamespaceSelector al loro interno.

Esempio di spazio dei nomi Selector

La seguente configurazione 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 in una configurazione, imposta l'annotazione configmanagement.gke.io/namespace-selector sul nome di uno spazio dei nomi.

Un NamespaceSelector non ha effetto finché non vi fai riferimento in un'altra configurazione. Se NamespaceSelector di gamestore-selector si trova nella stessa gerarchia della risorsa ResourceQuota seguente, quota, la risorsa QuotaQuota 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 Selector è un processo in tre fasi:

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

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. Le gerarchie sono archiviate 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