Sincronizzare gli oggetti con più spazi dei nomi

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:

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:

  1. Aggiungi o scegli un'etichetta esistente per gli spazi dei nomi in cui vuoi eseguire il deployment.
  2. Definisci un oggetto risorsa NamespaceSelector nella tua fonte attendibile. Config Sync non sincronizza gli oggetti NamespaceSelector con il cluster.
  3. 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'annotazione configmanagement.gke.io/namespace-selector con un valore corrispondente al metadata.name del tuo NamespaceSelector.

Gli esempi nella sezione successiva forniscono ulteriori dettagli su come definire gli oggetti NamespaceSelector e annotare altri oggetti per utilizzare NamespaceSelector.

Prima di iniziare

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:

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

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

  3. 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:

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

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

  3. 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, dove NAMESPACE 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:

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

  2. Nella directory dello spazio dei nomi astratto che hai creato, crea una configurazione per un ruolo che concede le autorizzazioni get e list 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.

  3. 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.

  4. 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