Sincronizzare gli oggetti con più spazi dei nomi

Questa pagina spiega come utilizzare Config Sync per gestire gli spazi dei nomi e scegliere gli oggetti che Config Sync sincronizza con gli spazi dei nomi.

Gli oggetti risorsa Kubernetes possono avere ambito cluster o spazio dei nomi, a seconda del tipo di risorsa. Selezioni il cluster configurando il client in modo che comunichi 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 consentono di perfezionare ulteriormente gli oggetti sincronizzati.

Prima di leggere questa pagina, dovresti già avere familiarità con 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 del parco progetti, Config Sync sincronizza tutti gli oggetti Kubernetes nella tua fonte attendibile con i cluster in cui è installato Config Sync o con tutti i cluster di un parco progetti. Tuttavia, limitando l'ambito degli oggetti a un cluster o a uno 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 la dichiarazione esplicita dello spazio dei nomi quando configuri 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 saperne di più, consulta la strategia per gli spazi dei nomi.

Informazioni sui selettori dello spazio dei nomi

I selettori di spazi dei nomi sono una funzionalità di Config Sync che consente di eseguire il deployment di oggetti 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 di indirezione aggiuntivo. Poiché non puoi aggiungere campi personalizzati ai tipi di risorse esistenti, devi definire il selettore in un oggetto NamespaceSelector. Poi, fai riferimento al selettore per nome in un'annotazione sugli oggetti che vuoi utilizzare.

Per utilizzare i selettori di spazi dei nomi:

  1. Aggiungi o scegli un'etichetta esistente negli 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 tuo 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 che corrisponda a metadata.name di NamespaceSelector.

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

Prima di iniziare

Utilizza i selettori di spazi dei nomi

I selettori dello spazio dei nomi sono definiti con requisiti basati sull'uguaglianza o requisiti basati sull'insieme. 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 gli spazi dei nomi 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 del tuo spazio dei nomi.

    Esegui questo comando per ogni spazio dei nomi a cui vuoi aggiungere un'etichetta.

  2. Crea un selettore di spazi 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, 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 effetto finché non viene fatto riferimento a un'altra configurazione. Crea una quota di oggetti di esempio che faccia 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 di risorse 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 gli spazi dei nomi 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 del tuo spazio dei nomi.

    Esegui questo comando per ogni spazio dei nomi a cui vuoi aggiungere un'etichetta.

  2. Crea un selettore di spazi 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, questa 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 effetto finché non viene fatto riferimento a un'altra configurazione. Crea una quota di oggetti di esempio che faccia 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 di risorse viene creata in tutti gli spazi dei nomi, ad eccezione di quelli che hanno la coppia chiave-valore quota-exempt: exempt.

Integrazione con gli ambiti del 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 un selettore dello spazio dei nomi per selezionare gli spazi dei nomi del parco risorse.

Il tutorial sul tenancy 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 degli oggetti con un repository gerarchico. L'utilizzo dei selettori dello spazio dei nomi è lo stesso, ma esistono limitazioni e requisiti aggiuntivi per l'organizzazione della configurazione dello spazio dei nomi nella fonte 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 con ambito 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 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 di directory 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 spazio dei nomi astratto, ma non in una directory spazio dei nomi.

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

Configura uno spazio dei nomi astratto

Con un repository gerarchico, puoi utilizzare facoltativamente 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 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 dello spazio 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 su tutti gli oggetti in 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 associa 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 selettivamente l'eredità per qualsiasi configurazione impostando il campo hierarchyMode su none. HierarchyConfigs vengono archiviati nella directory system/ del repository. Questo esempio disattiva l'ereditarietà 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