Questa pagina mostra come definire i vincoli di Policy Controller utilizzando i modelli di vincoli preesistenti forniti da Google.
Questa pagina è dedicata agli amministratori IT e agli operatori che vogliono assicurarsi che tutte le risorse in esecuzione all'interno della piattaforma cloud soddisfino i requisiti di conformità dell'organizzazione fornendo e gestendo l'automazione per controllare o applicare e utilizzare i modelli di configurazione dichiarativa. Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei contenuti, consulta Ruoli e attività comuni degli utenti GKE. Google Cloud
Policy Controller consente di applicare criteri per un cluster Kubernetes definendo uno o più oggetti vincolo. Dopo l'installazione di un vincolo, le richieste al server API vengono controllate in base al vincolo e vengono rifiutate se non sono conformi. Le risorse non conformi preesistenti vengono segnalate al momento del controllo.
Ogni vincolo è supportato da un modello di vincolo che definisce lo schema e la logica del vincolo. I modelli di vincolo possono provenire da Google e da terze parti oppure puoi scriverne di tuoi. Per saperne di più sulla creazione di nuovi modelli, vedi Scrivi un modello di vincolo.
Prima di iniziare
Esaminare la libreria dei modelli di vincolo
Quando definisci un vincolo, specifichi il modello di vincolo
che estende. Una libreria di modelli di vincoli comuni sviluppati da Google viene installata per impostazione predefinita e molte organizzazioni non hanno bisogno di creare modelli di vincoli personalizzati direttamente in Rego. I modelli di vincolo forniti da Google
hanno l'etichetta configmanagement.gke.io/configmanagement
.
Per elencare i vincoli, utilizza il seguente comando:
kubectl get constrainttemplates \ -l="configmanagement.gke.io/configmanagement=config-management"
Per descrivere un modello di vincolo e controllare i relativi parametri obbligatori, utilizza il seguente comando:
kubectl describe constrainttemplate CONSTRAINT_TEMPLATE_NAME
Puoi anche visualizzare tutti i modelli di vincolo nella libreria.
Definisci un vincolo
Definisci un vincolo utilizzando YAML e non devi comprendere o scrivere Rego. Un vincolo, invece, richiama un modello di vincolo e gli fornisce parametri specifici per il vincolo.
Se utilizzi Config Sync con un
repository gerarchico,
ti consigliamo di creare i vincoli nella directory cluster/
.
I vincoli hanno i seguenti campi:
- Il valore
kind
in minuscolo corrisponde al nome di un modello di vincolo. metadata.name
è il nome del vincolo.- Il campo
match
definisce a quali oggetti si applica il vincolo. Tutte le condizioni specificate devono corrispondere prima che un oggetto rientri nell'ambito di un vincolo.match
le condizioni 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 API Kubernetes che corrispondono ekinds
è un elenco di tipi che corrispondono. "*" corrisponde a tutto. Se almeno una voceapiGroup
e una vocekind
corrispondono, la condizionekinds
è soddisfatta.scope
accetta *, Cluster o Namespaced, che determina se vengono selezionate risorse con ambito cluster o con spazio dei nomi (il valore predefinito è *).namespaces
è un elenco di nomi di 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 per il vincolo, in base a ciò che si aspetta il modello di vincolo.
Il seguente vincolo, denominato ns-must-have-geo
, richiama un modello di vincolo
denominato K8sRequiredLabels
, incluso nella
libreria di modelli di vincolo
fornita da Google. Il vincolo definisce i parametri che il modello di vincolo utilizza per valutare se l'etichetta geo
è impostata su un determinato valore per gli spazi dei nomi.
# 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
Controllare un vincolo
Se il vincolo è configurato e installato correttamente, il relativo campo
status.byPod[].enforced
è impostato su true
, indipendentemente dal fatto che il vincolo sia
configurato per l'applicazione o solo per il test.
I vincoli vengono applicati per impostazione predefinita e una violazione di un vincolo impedisce
una determinata operazione del cluster. Puoi impostare spec.enforcementAction
di un vincolo
su dryrun
per segnalare le violazioni nel campo status.violations
senza
impedire l'operazione.
Per scoprire di più sull'audit, consulta Audit tramite vincoli.
Avvertenze durante la sincronizzazione dei vincoli
Se sincronizzi i vincoli con un'origine centralizzata, ad esempio un repository Git, con Config Sync o un altro strumento in stile GitOps, tieni presente i seguenti avvisi quando sincronizzi i vincoli.
Coerenza finale
Puoi eseguire il commit dei vincoli in una fonte attendibile come un repository Git e puoi limitarne gli effetti utilizzando ClusterSelectors o NamespaceSelectors. Poiché la sincronizzazione è coerente alla fine, tieni presente i seguenti avvisi:
- Se un'operazione del cluster attiva un vincolo il cui NamespaceSelector fa riferimento a uno spazio dei nomi che non è stato sincronizzato, il vincolo viene applicato e l'operazione viene impedita. In altre parole, uno spazio dei nomi mancante "non viene chiuso".
- Se modifichi le etichette di uno spazio dei nomi, la cache potrebbe contenere dati obsoleti per un breve periodo di tempo.
Ridurre al minimo la necessità di rinominare uno spazio dei nomi o modificarne le etichette e testare i vincoli che influiscono su uno spazio dei nomi rinominato o rietichettato per assicurarsi che funzionino come previsto.
Configura Policy Controller per i vincoli referenziali
Prima di poter attivare i vincoli referenziali, devi creare una configurazione che indichi a Policy Controller quali tipi di oggetti monitorare, ad esempio gli spazi dei nomi.
Salva il seguente manifest YAML in un file e applicalo con kubectl
. Il
manifest configura Policy Controller per monitorare gli spazi dei nomi e gli ingress.
Crea una voce con group
, version
e kind
in spec.sync.syncOnly
,
con i valori per ogni tipo di oggetto che vuoi monitorare.
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"
Abilitare i vincoli referenziali
Un vincolo referenziale fa riferimento a un altro oggetto nella sua definizione. Ad esempio, puoi creare un vincolo che richieda che gli oggetti Ingress in un cluster abbiano nomi host univoci. Il vincolo è referenziale se il relativo modello di vincolo contiene la stringa data.inventory
nel codice Rego.
I vincoli referenziali sono attivati per impostazione predefinita se installi Policy Controller utilizzando la console Google Cloud . Se installi Policy Controller utilizzando Google Cloud CLI, puoi scegliere se attivare i vincoli referenziali quando installi Policy Controller. È garantita solo la coerenza finale dei vincoli referenziali e ciò crea rischi:
Su un server API sovraccarico, i contenuti della cache di Policy Controller potrebbero diventare obsoleti, causando un "fail open" di un vincolo referenziale, il che significa che l'azione di applicazione sembra funzionare quando non lo fa. Ad esempio, puoi creare ingress con nomi host duplicati troppo rapidamente per consentire al controller di ammissione di rilevare i duplicati.
L'ordine in cui vengono installati i vincoli e l'ordine in cui viene aggiornata la cache sono entrambi casuali.
Puoi aggiornare un cluster esistente per consentire i vincoli referenziali.
Console
Per disattivare i vincoli referenziali, completa i seguenti passaggi:
- Nella console Google Cloud , vai alla pagina Policy di GKE Enterprise nella sezione Posture Management.
- Nella scheda Impostazioni, seleziona Modifica edit nella colonna Modifica configurazione della tabella del cluster.
- Espandi il menu Modifica la configurazione di Policy Controller.
- Seleziona la casella di controllo Abilita i modelli di vincolo che fanno riferimento a oggetti diversi dall'oggetto attualmente valutato.
- Seleziona Salva modifiche.
gcloud
Per abilitare il supporto dei vincoli referenziali, 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 attivare le regole referenziali. Puoi specificare più abbonamenti separati da una virgola.
Disattivare i vincoli referenziali
Quando disattivi i vincoli referenziali, vengono rimossi dal cluster anche tutti i modelli che li utilizzano, insieme a tutti i vincoli che utilizzano questi modelli.
Console
I vincoli referenziali sono attivati per impostazione predefinita quando installi Policy Controller con la console Google Cloud . Per disattivare i vincoli referenziali, completa i seguenti passaggi:
- Nella console Google Cloud , vai alla pagina Policy di GKE Enterprise nella sezione Posture Management.
- Nella scheda Impostazioni, seleziona Modifica edit nella colonna Modifica configurazione della tabella del cluster.
- Espandi il menu Modifica la configurazione di Policy Controller.
- Deseleziona la casella di controllo Abilita i modelli di vincolo che fanno riferimento a oggetti diversi dall'oggetto attualmente valutato.
- Seleziona Salva modifiche.
gcloud
Per disattivare il supporto dei vincoli referenziali, 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 attivare le regole referenziali. Puoi specificare più abbonamenti separati da una virgola.
Elenca tutti i vincoli
Per elencare tutti i vincoli installati su un cluster, utilizza il seguente comando:
kubectl get constraint
Puoi anche visualizzare una panoramica dei vincoli applicati nella Google Cloud console. Per ulteriori informazioni, consulta Metriche di Policy Controller.
Rimuovere un vincolo
Per trovare tutti i vincoli che utilizzano un modello di vincolo, utilizza il seguente comando per elencare tutti gli oggetti con lo stesso kind
del metadata.name
del modello di vincolo:
kubectl get CONSTRAINT_TEMPLATE_NAME
Per rimuovere un vincolo, specifica kind
e name
:
kubectl delete CONSTRAINT_TEMPLATE_NAME CONSTRAINT_NAME
Quando rimuovi un vincolo, la sua applicazione viene interrotta non appena il server API lo contrassegna come eliminato.
Rimuovi tutti i modelli di vincolo
Console
Per disattivare la libreria di modelli di vincoli:
- Nella console Google Cloud , vai alla pagina Policy di GKE Enterprise nella sezione Posture Management.
- Nella scheda Impostazioni, seleziona Modifica edit nella colonna Modifica configurazione della tabella del cluster.
- Nel menu Aggiungi/modifica pacchetti di policy, disattiva la raccolta di modelli e tutti i pacchetti di policy do_not_disturb_on.
- Seleziona Salva modifiche.
gcloud
Per disattivare la libreria di modelli di vincoli, esegui il seguente comando:
gcloud container fleet policycontroller content templates disable \
--memberships=MEMBERSHIP_NAME
Sostituisci MEMBERSHIP_NAME
con il nome dell'appartenenza del cluster registrato su cui disattivare la libreria dei modelli di vincolo. Puoi
specificare più abbonamenti separati da una virgola.
Ripristinare la libreria di modelli di vincolo
Console
Per attivare la libreria di modelli di vincoli:
- Nella console Google Cloud , vai alla pagina Policy di GKE Enterprise nella sezione Posture Management.
- Nella scheda Impostazioni, seleziona Modifica edit nella colonna Modifica configurazione della tabella del cluster.
- Nel menu Aggiungi/modifica pacchetti di policy, attiva la raccolta di modelli check_circle. Puoi anche attivare uno o tutti i pacchetti di policy.
- Seleziona Salva modifiche.
gcloud
Per ripristinare la libreria di modelli di vincoli, 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 attivare la libreria dei modelli di vincolo. Puoi
specificare più abbonamenti separati da una virgola.
Passaggi successivi
- Scopri di più sui bundle di Policy Controller.
- Visualizza la documentazione di riferimento della libreria di modelli di vincolo.
- Scopri come creare vincoli personalizzati.
- Risolvi i problemi di Policy Controller.