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 aver installato un vincolo, le richieste al server API vengono verificate in base al vincolo e vengono rifiutate se non sono conformi. Le risorse preesistenti non conformi vengono segnalate al momento del controllo.
Ogni vincolo è supportato da un modello che definisce lo schema e la logica del vincolo. I modelli di vincolo possono essere acquisiti da Google e terze parti oppure puoi scriverne uno personalizzato. 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, devi specificare il modello di vincolo che estende. Per impostazione predefinita è installata una libreria di modelli di vincoli comuni sviluppati da Google 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 comando seguente:
kubectl get constrainttemplates \ -l="configmanagement.gke.io/configmanagement=config-management"
Per descrivere un modello di vincolo e verificare 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
Definisci un vincolo utilizzando YAML e non hai bisogno di comprendere o scrivere Rego. Un vincolo richiama invece 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 includono i seguenti campi:
- Il
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 essere soddisfatte prima che un oggetto rientri nell'ambito di un vincolo. Le condizionimatch
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 corrispondenti ekinds
è un elenco di tipi corrispondenti. "*" corrisponde a tutto. Se almeno una voceapiGroup
e una vocekind
corrispondono, la condizionekinds
è soddisfatta.scope
accetta *, Cluster o con pacing dei nomi, che determina se sono selezionate risorse con ambito cluster o con spazio dei nomi (il valore predefinito è *).namespaces
è un elenco di nomi di spazi dei nomi a cui l'oggetto può appartenere. 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 di vincolo.
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 utilizzati dal modello di vincolo per valutare se gli spazi dei nomi hanno l'etichetta geo
impostata su un certo 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 campo status.byPod[].enforced
è impostato su true
, a seconda che il vincolo sia configurato per l'applicazione forzata o solo per testare il vincolo.
I vincoli vengono applicati per impostazione predefinita e la violazione di un vincolo impedisce una determinata operazione del cluster. Puoi impostare spec.enforcementAction
su dryrun
di un vincolo per segnalare violazioni nel campo status.violations
senza
impedire l'operazione.
Per scoprire di più sul controllo, consulta Controllo con vincoli.
Avvertenze per la sincronizzazione dei vincoli
Se sincronizzi i vincoli con un'origine centralizzata, ad esempio un repository Git, con Config Sync o con un altro strumento in stile GitOps, tieni presenti le seguenti avvertenze durante la sincronizzazione dei vincoli.
Coerenza finale
Puoi eseguire il commit dei vincoli su una fonte 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 su un cluster attiva un vincolo il cui NamespaceSelector si riferisce a uno spazio dei nomi che non è stato sincronizzato, il vincolo viene applicato in modo forzato e l'operazione viene impedita. In altre parole, uno spazio dei nomi mancante "non è riuscito".
- 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 modificarne le etichette. Inoltre, verifica i vincoli che influiscono su uno spazio dei nomi rinominato o rietichettato per assicurarti che funzionino come previsto.
Configura Policy Controller per i vincoli di riferimento
Prima di poter abilitare 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 il controllo degli spazi dei nomi e delle risorse Ingress.
Crea una voce con group
, version
e kind
in spec.sync.syncOnly
,
con i valori per ogni tipo di oggetto che vuoi controllare.
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 i 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 è referenziale se il relativo modello contiene la stringa data.inventory
nel relativo Rego.
I vincoli referenziali sono abilitati per impostazione predefinita se installi Policy Controller mediante la console Google Cloud. Se installi Policy Controller utilizzando Google Cloud CLI, puoi scegliere se abilitare i vincoli referenziali durante l'installazione di Policy Controller. La coerenza dei vincoli referenziali è garantita solo alla fine e questo crea rischi:
Su un server API sovraccarico, i contenuti della cache di Policy Controller potrebbero diventare obsoleti, causando il "fail open" di un vincolo referenziale, il che significa che l'azione di applicazione sembra funzionare quando non funziona. Ad esempio, puoi creare risorse Ingress con nomi host duplicati troppo rapidamente per consentire al controller di ammissione di rilevare i duplicati.
L'ordine di installazione dei vincoli e l'ordine di aggiornamento della cache sono entrambi casuali.
Puoi aggiornare un cluster esistente per consentire i vincoli referenziali.
Console
Per disabilitare i vincoli referenziali, completa questi passaggi:
- Nella console Google Cloud, vai alla pagina Criteri di GKE Enterprise nella sezione Gestione della postura.
- Nella tabella dei cluster della scheda Impostazioni, seleziona Modifica edit nella colonna Modifica configurazione.
- Espandi il menu Modifica 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 Policy Controller
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 per attivare le regole di riferimento. Puoi specificare più abbonamenti separati da una virgola.
gcloud ConfigManagement
Per attivare il supporto dei vincoli referenziali, imposta policyController.referentialRulesEnabled
su true
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: true
Disabilita i vincoli referenziali
Quando disabiliti i vincoli referenziali, dal cluster vengono rimossi anche tutti i modelli che li utilizzano, 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 referenziali, completa questi passaggi:
- Nella console Google Cloud, vai alla pagina Criteri di GKE Enterprise nella sezione Gestione della postura.
- Nella tabella dei cluster della scheda Impostazioni, seleziona Modifica edit nella colonna Modifica configurazione.
- Espandi il menu Modifica 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 Policy Controller
Per disabilitare 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 per attivare le regole di riferimento. Puoi specificare più abbonamenti separati da una virgola.
gcloud ConfigManagement
Per disabilitare i vincoli referenziali 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 maggiori informazioni, consulta le metriche di Policy Controller.
Rimuovi un vincolo
Per trovare tutti i vincoli che utilizzano un modello di vincolo, usa il comando seguente per elencare tutti gli oggetti con lo stesso kind
dell'elemento metadata.name
del modello di vincolo:
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 cessa di essere applicato non appena il server API lo contrassegna come eliminato.
Rimuovi tutti i modelli di vincolo
Console
Per disabilitare la libreria dei modelli di vincolo, completa i seguenti passaggi:
- Nella console Google Cloud, vai alla pagina Criteri di GKE Enterprise nella sezione Gestione della postura.
- Nella tabella dei cluster della scheda Impostazioni, seleziona Modifica edit nella colonna Modifica configurazione.
- Nel menu Aggiungi/Modifica pacchetti di criteri, disattiva do_not_disturb_on la libreria dei modelli e tutti i pacchetti di criteri.
- Seleziona Salva modifiche.
gcloud Policy Controller
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ù abbonamenti separati da una virgola.
gcloud ConfigManagement
Imposta spec.policyController.templateLibraryInstalled
su false
. In questo modo, Policy Controller non reinstalla automaticamente la libreria.
Per rimuovere tutti i modelli di vincoli e tutti 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:
- Nella console Google Cloud, vai alla pagina Criteri di GKE Enterprise nella sezione Gestione della postura.
- Nella tabella dei cluster della scheda Impostazioni, seleziona Modifica edit nella colonna Modifica configurazione.
- Nel menu Aggiungi/Modifica pacchetti di criteri, attiva la libreria dei modelli check_circle. Puoi anche abilitare uno o tutti i pacchetti di criteri.
- Seleziona Salva modifiche.
gcloud Policy Controller
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ù abbonamenti separati da una virgola.
gcloud ConfigManagement
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.
Per riavviare l'Operator Pod, utilizza il comando seguente:
kubectl delete pod -n config-management-system -l k8s-app=config-management-operator
Passaggi successivi
- Scopri di più sui pacchetti 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.