Utilizzo della libreria dei modelli di vincolo

Questa pagina mostra come definire i vincoli di Policy Controller utilizzando i modelli di vincoli preesistenti forniti da Google.

Policy Controller consente di applicare i criteri per un cluster Kubernetes definendo uno o più oggetti vincolo. Dopo l'installazione di un vincolo, le richieste al server API vengono verificate in base al vincolo e vengono rifiutate se non conformi. Le risorse non conformi preesistenti vengono segnalate al momento di controllo.

Ogni vincolo è supportato da un modello che ne definisce lo schema e la logica. I modelli di vincolo possono essere acquisiti da Google e da terze parti oppure puoi scriverne di personalizzati. Per ulteriori informazioni sulla creazione di nuovi modelli, consulta Scrivere un modello di vincolo.

Prima di iniziare

Esamina la libreria dei modelli di vincolo

Quando definisci un vincolo, specifichi il modello di vincolo che estende. Per impostazione predefinita viene installata una libreria di modelli di vincolo comuni sviluppati da Google e molte organizzazioni non hanno bisogno di creare modelli di vincolo personalizzati direttamente in Rego. I modelli di vincolo forniti da Google hanno l'etichetta configmanagement.gke.io/configmanagement.

Per elencare i vincoli, utilizza il comando seguente:

kubectl get constrainttemplates \
    -l="configmanagement.gke.io/configmanagement=config-management"

Per descrivere un modello di vincolo e verificarne i parametri richiesti, utilizza il seguente comando:

kubectl describe constrainttemplate CONSTRAINT_TEMPLATE_NAME

Puoi anche visualizzare tutti i modelli di vincolo nella libreria.

Definisci un vincolo

Puoi definire un vincolo utilizzando YAML e non hai bisogno di comprendere o scrivere Rego. Invece, un vincolo richiama un modello di vincolo e gli fornisce i parametri specifici per il vincolo.

Se utilizzi un repository strutturato, ti consigliamo di creare i vincoli nella directory cluster/.

I vincoli hanno i seguenti campi:

  • kind in minuscolo corrisponde al nome di un modello di vincolo.
  • metadata.name è il nome del vincolo.
  • Il campo match definisce gli oggetti a cui si applica il vincolo. Tutte le condizioni specificate devono essere soddisfatte prima che un oggetto rientri nell'ambito di un vincolo. Le condizioni match sono definite dai seguenti campi secondari:
    • kinds sono i tipi di risorse a cui si applica il vincolo, determinati da due campi: apiGroups è un elenco di gruppi di API Kubernetes che corrispondono e kinds è un elenco dei tipi che corrispondono. "*" corrisponde a tutto. Se almeno una voce apiGroup e una voce kind corrispondono, la condizione kinds viene soddisfatta.
    • scope accetta *, Cluster o CNAME, che determina se sono selezionate risorse con ambito cluster o con spazio dei nomi (il valore predefinito è *).
    • namespaces è un elenco di nomi degli spazi dei nomi a cui può appartenere l'oggetto. L'oggetto deve appartenere ad almeno uno di questi spazi dei nomi. Le risorse dello spazio dei nomi vengono trattate come se appartenessero a se stesse.
    • excludedNamespaces è un elenco di spazi dei nomi a cui l'oggetto non può appartenere.
    • labelSelector è un selettore di etichette Kubernetes che l'oggetto deve soddisfare.
    • namespaceSelector è un selettore di etichette nello spazio dei nomi a cui appartiene l'oggetto. Se lo spazio dei nomi non soddisfa l'oggetto, non corrisponderà. Le risorse dello spazio dei nomi vengono trattate come se appartenessero a se stesse.
  • Il campo parameters definisce gli argomenti del vincolo in base a ciò che prevede il modello.

Il seguente vincolo, denominato ns-must-have-geo, richiama un modello di vincolo denominato K8sRequiredLabels, incluso nella libreria dei modelli di vincolo fornita da Google. Il vincolo definisce i parametri che il modello di vincolo utilizza per valutare se gli spazi dei nomi hanno l'etichetta geo impostata su un valore.

# ns-must-have-geo.yaml

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
  name: ns-must-have-geo
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Namespace"]
  parameters:
    labels:
      - key: "geo"

Per creare il vincolo, utilizza kubectl apply -f:

kubectl apply -f ns-must-have-geo.yaml

Controlla un vincolo

Se il vincolo è configurato e installato correttamente, il relativo campo status.byPod[].enforced viene impostato su true, a prescindere dal fatto che il vincolo sia configurato per applicare o testare solo il vincolo.

I vincoli vengono applicati per impostazione predefinita e la violazione di un vincolo impedisce una determinata operazione del cluster. Puoi impostare il valore spec.enforcementAction di un vincolo su dryrun per segnalare le violazioni nel campo status.violations senza impedire l'operazione.

Per scoprire di più sul controllo, consulta Eseguire il controllo utilizzando i vincoli.

Avvertenze durante la sincronizzazione dei vincoli

Se sincronizzi i vincoli con una fonte attendibile con Config Sync o un altro strumento di tipo GitOps, tieni presente le seguenti avvertenze quando sincronizzi i vincoli.

Coerenza finale

Puoi eseguire il commit dei vincoli in un'origine attendibile come un repository Git e limitarne gli effetti utilizzando ClusterSelectors o NamespaceSelectors. Poiché la sincronizzazione è alla fine coerente, tieni presente quanto segue:

  • Se un'operazione del cluster attiva un vincolo il cui NamespaceSelector fa riferimento a uno spazio dei nomi non sincronizzato, il vincolo viene applicato in modo forzato e l'operazione viene impedita. In altre parole, uno spazio dei nomi mancante "non riesce a essere chiuso".
  • Se modifichi le etichette di uno spazio dei nomi, la cache potrebbe contenere dati obsoleti per un breve periodo di tempo.

Riduci al minimo la necessità di rinominare uno spazio dei nomi o di modificarne le etichette ed esegui dei test sui vincoli che interessano uno spazio dei nomi rinominato o rietichettato per garantire che funzioni come previsto.

Configura Policy Controller per i vincoli referenziali

Prima di poter abilitare i vincoli referenziali, devi creare una configurazione che indichi a Policy Controller i tipi di oggetti da monitorare, ad esempio gli spazi dei nomi.

Salva il manifest YAML seguente in un file e applicalo con kubectl. Il file manifest configura Policy Controller in modo da monitorare gli spazi dei nomi e le risorse Ingress. Crea una voce con group, version e kind in spec.sync.syncOnly, con i valori per ciascun tipo di oggetto che vuoi guardare.

apiVersion: config.gatekeeper.sh/v1alpha1
kind: Config
metadata:
  name: config
  namespace: "gatekeeper-system"
spec:
  sync:
    syncOnly:
      - group: ""
        version: "v1"
        kind: "Namespace"
      - group: "extensions"
        version: "v1beta1"
        kind: "Ingress"

Abilita vincoli referenziali

Un vincolo referenziale fa riferimento a un altro oggetto nella sua definizione. Ad esempio, puoi creare un vincolo che richiede che gli oggetti Ingress in un cluster abbiano nomi host univoci. Il vincolo è di riferimento se il relativo modello di vincolo contiene la stringa data.inventory nel relativo Rego.

I vincoli referenziali sono abilitati per impostazione predefinita se installi Policy Controller utilizzando la console Google Cloud. Se installi Policy Controller utilizzando Google Cloud CLI, puoi scegliere se abilitare i vincoli di riferimento quando installi Policy Controller. È garantito che i vincoli referenziali siano solo alla fine e questo crea rischi:

  • Su un server API sovraccarico, i contenuti della cache di Policy Controller potrebbero diventare inattivi, causando la "fail open" di un vincolo di riferimento, il che significa che l'azione di applicazione sembra funzionare anche in caso contrario. Ad esempio, puoi creare risorse Ingress con nomi host duplicati troppo rapidamente per consentire al controller di ammissione di rilevare i duplicati.

  • L'ordine in cui i vincoli vengono installati e in cui viene aggiornata la cache sono casuali.

Puoi aggiornare un cluster esistente per consentire vincoli di riferimento.

Console

Per disabilitare i vincoli di riferimento, segui questi passaggi:

  1. Nella console Google Cloud, vai alla pagina Criterio di GKE Enterprise nella sezione Gestione della postura.

    Vai alle norme

  2. Nella scheda Impostazioni, nella tabella del cluster, seleziona Modifica nella colonna Modifica configurazione.
  3. Espandi il menu Modifica configurazione di Policy Controller.
  4. Seleziona la casella di controllo Abilita modelli di vincolo che fanno riferimento a oggetti diversi dall'oggetto attualmente valutato.
  5. Seleziona Salva modifiche.

Policy Controller gcloud

Per abilitare il supporto per i vincoli di riferimento, esegui questo comando:

gcloud container fleet policycontroller update \
    --memberships=MEMBERSHIP_NAME \
    --referential-rules

Sostituisci MEMBERSHIP_NAME con il nome dell'appartenenza del cluster registrato su cui abilitare le regole di riferimento. Puoi specificare più abbonamenti separati da una virgola.

ConfigManagement gcloud

Per attivare il supporto per i vincoli di riferimento, imposta policyController.referentialRulesEnabled su true nel tuo file config-management.yaml:

apiVersion: configmanagement.gke.io/v1
kind: ConfigManagement
metadata:
  name: config-management
  namespace: config-management-system
spec:
  clusterName: my-cluster
  channel: dev
  policyController:
    enabled: true
    referentialRulesEnabled: true

Disabilita vincoli referenziali

Quando disabiliti i vincoli referenziali, tutti i modelli che utilizzano vincoli di riferimento vengono rimossi anche dal cluster, insieme a tutti i vincoli che li utilizzano.

Console

I vincoli referenziali sono abilitati per impostazione predefinita quando installi Policy Controller con la console Google Cloud. Per disabilitare i vincoli di riferimento, segui questi passaggi:

  1. Nella console Google Cloud, vai alla pagina Criterio di GKE Enterprise nella sezione Gestione della postura.

    Vai alle norme

  2. Nella scheda Impostazioni, nella tabella del cluster, seleziona Modifica nella colonna Modifica configurazione.
  3. Espandi il menu Modifica configurazione di Policy Controller.
  4. Deseleziona la casella di controllo Abilita modelli di vincolo che fanno riferimento a oggetti diversi dall'oggetto attualmente valutato.
  5. Seleziona Salva modifiche.

Policy Controller gcloud

Per disabilitare il supporto per i vincoli di riferimento, esegui questo comando:

gcloud container fleet policycontroller update \
    --memberships=MEMBERSHIP_NAME \
    --no-referential-rules

Sostituisci MEMBERSHIP_NAME con il nome dell'appartenenza del cluster registrato su cui abilitare le regole di riferimento. Puoi specificare più abbonamenti separati da una virgola.

ConfigManagement gcloud

Per disabilitare i vincoli di riferimento su un cluster, imposta policyController.referentialRulesEnabled su false nel file config-management.yaml:

apiVersion: configmanagement.gke.io/v1
kind: ConfigManagement
metadata:
  name: config-management
  namespace: config-management-system
spec:
  clusterName: my-cluster
  channel: dev
  policyController:
    enabled: true
    referentialRulesEnabled: false

Elenco di tutti i vincoli

Per elencare tutti i vincoli installati su un cluster, utilizza il comando seguente:

kubectl get constraint

Puoi anche visualizzare una panoramica dei vincoli applicati nella console Google Cloud. Per saperne di più, consulta le metriche di Policy Controller.

Rimuovi un vincolo

Per trovare tutti i vincoli che utilizzano un modello di vincolo, utilizza il comando seguente per elencare tutti gli oggetti con lo stesso kind del modello di vincolo metadata.name:

kubectl get CONSTRAINT_TEMPLATE_NAME

Per rimuovere un vincolo, specifica i relativi kind e name:

kubectl delete CONSTRAINT_TEMPLATE_NAME CONSTRAINT_NAME

Quando rimuovi un vincolo, questo smette di essere applicato non appena il server API lo contrassegna come eliminato.

Rimuovi tutti i modelli di vincolo

Console

Per disattivare la libreria dei modelli di vincolo, completa i seguenti passaggi:

  1. Nella console Google Cloud, vai alla pagina Criterio di GKE Enterprise nella sezione Gestione della postura.

    Vai alle norme

  2. Nella scheda Impostazioni, nella tabella del cluster, seleziona Modifica nella colonna Modifica configurazione.
  3. Nel menu Aggiungi/Modifica pacchetti di criteri, disattiva la libreria di modelli e tutti i pacchetti di criteri.
  4. Seleziona Salva modifiche.

Policy Controller gcloud

Per disabilitare la libreria dei modelli di vincolo, esegui questo comando:

gcloud container fleet policycontroller content templates disable \
    --memberships=MEMBERSHIP_NAME

Sostituisci MEMBERSHIP_NAME con il nome dell'appartenenza del cluster registrato per disabilitare la libreria dei modelli di vincolo. Puoi specificare più appartenenze separate da una virgola.

ConfigManagement gcloud

Imposta spec.policyController.templateLibraryInstalled su false. In questo modo, Policy Controller, Config Sync e Config Controller non reinstalleranno automaticamente la libreria.

Per rimuovere tutti i modelli e i vincoli, utilizza il seguente comando:

kubectl delete constrainttemplate --all

Ripristina la libreria dei modelli di vincolo

Console

Per abilitare la libreria dei modelli di vincolo, completa i seguenti passaggi:

  1. Nella console Google Cloud, vai alla pagina Criterio di GKE Enterprise nella sezione Gestione della postura.

    Vai alle norme

  2. Nella scheda Impostazioni, nella tabella del cluster, seleziona Modifica nella colonna Modifica configurazione.
  3. Nel menu Aggiungi/modifica pacchetti di criteri, attiva la libreria di modelli . Puoi anche attivare uno o tutti i pacchetti di criteri.
  4. Seleziona Salva modifiche.

Policy Controller gcloud

Per ripristinare la libreria dei modelli di vincolo, esegui questo comando:

gcloud container fleet policycontroller content templates enable \
    --memberships=MEMBERSHIP_NAME

Sostituisci MEMBERSHIP_NAME con il nome dell'appartenenza del cluster registrato per abilitare la libreria dei modelli di vincolo. Puoi specificare più appartenenze separate da una virgola.

ConfigManagement gcloud

Se hai disabilitato la libreria dei modelli di vincolo o hai disinstallato tutti i modelli di vincolo, puoi ripristinarla impostando spec.policyController.templateLibraryInstalled su true nella configurazione di Policy Controller, Config Sync e Config Controller.

Per riavviare il pod dell'operatore, utilizza il comando seguente:

kubectl delete pod -n config-management-system -l k8s-app=config-management-operator

Passaggi successivi