Convalida le app in base ai criteri aziendali in una pipeline CI
Se la tua organizzazione utilizza Policy Controller per gestire i criteri nei cluster della versione Google Kubernetes Engine (GKE) Enterprise, puoi convalidare la configurazione del deployment di un'app nella sua pipeline di integrazione continua (CI). Questo tutorial mostra come ottenere questo risultato. La convalida dell'app è utile se sei uno sviluppatore che crea una pipeline CI per un'app o se sei un platform engineer che crea un modello di pipeline CI per più team di app.
I criteri sono una parte importante della sicurezza e della conformità di un'organizzazione. Policy Controller consente alla tua organizzazione di gestire questi criteri a livello centrale e dichiarativo per tutti i cluster. In qualità di sviluppatore, puoi sfruttare la natura centralizzata e dichiarativa di questi criteri. Puoi utilizzare queste caratteristiche per convalidare la tua app in base a questi criteri il prima possibile nel flusso di lavoro di sviluppo. Conoscere le violazioni dei criteri nella pipeline CI anziché durante il deployment presenta due vantaggi principali: consente di abbandonare la sicurezza e di stringere il ciclo di feedback, riducendo il tempo e i costi necessari per risolvere queste violazioni.
Questo tutorial utilizza Cloud Build come strumento CI e un repository GitHub di esempio contenente i criteri per le dimostrazioni.
Risorse
Questo tutorial utilizza diversi strumenti Kubernetes. Questa sezione spiega quali sono questi strumenti, in che modo interagiscono tra loro e se puoi sostituirli con qualcos'altro.
Gli strumenti che utilizzerai in questo tutorial includono:
Policy Controller: si basa sul progetto open source Open Policy Agent - Gatekeeper. Policy Controller applica criteri sugli oggetti creati in un cluster Kubernetes (ad esempio impedire l'utilizzo di un'opzione specifica o imporre l'utilizzo di un'etichetta specifica). Questi criteri sono chiamati vincoli. I vincoli sono definiti come risorse personalizzate di Kubernetes. Policy Controller è disponibile come parte della versione Google Kubernetes Engine (GKE) Enterprise, ma puoi utilizzare Open Policy Agent - Gatekeeper anziché Policy Controller per la tua implementazione.
GitHub: in questo tutorial utilizziamo GitHub per ospitare i repository Git: uno per un'app di esempio e uno che contiene i vincoli per Policy Controller. Per semplicità, i due repository sono due cartelle diverse in un unico repository Git. In realtà, sarebbero repository diversi. Puoi utilizzare qualsiasi soluzione Git.
Cloud Build: Cloud Build è la soluzione CI di Google Cloud. In questo tutorial, la useremo per eseguire i test di convalida. Sebbene i dettagli dell'implementazione possano variare da un sistema CI a un altro, i concetti descritti in questo tutorial possono essere utilizzati con qualsiasi sistema CI basato su container.
Kustomize: Kustomize è uno strumento di personalizzazione per le configurazioni di Kubernetes. Funziona prendendo le configurazioni "di base" e applicandovi le personalizzazioni. Ti consente di adottare un approccio DRY (Don't Ripeti Yourself) alle configurazioni di Kubernetes. Con Kustomize, puoi mantenere gli elementi comuni a tutti i tuoi ambienti nelle configurazioni di base e creare personalizzazioni per ciascun ambiente. In questo tutorial manteniamo le configurazioni Kustomize nel repository dell'app e le "creiamo" (ad esempio applichiamo le personalizzazioni) delle configurazioni nella pipeline CI. Puoi utilizzare i concetti descritti in questo tutorial con qualsiasi strumento che produce configurazioni Kubernetes pronte per essere applicate a un cluster (ad esempio il comando helm template).
Kpt: Kpt è uno strumento per creare flussi di lavoro per le configurazioni di Kubernetes. Kpt consente di recuperare, visualizzare, personalizzare, aggiornare, convalidare e applicare configurazioni Kubernetes. Poiché funziona con file Git e YAML, è compatibile con la maggior parte degli strumenti esistenti dell'ecosistema Kubernetes. In questo tutorial utilizziamo kpt nella pipeline CI per recuperare i vincoli dal repository anthos-config-management-samples e per convalidare le configurazioni Kubernetes in base a questi vincoli.
Pipeline
La pipeline CI utilizzata in questo tutorial è mostrata nel seguente diagramma:
La pipeline viene eseguita in Cloud Build e i comandi vengono eseguiti in una directory contenente una copia del repository di app di esempio. La pipeline inizia generando
le configurazioni Kubernetes finali con Kustomize. Quindi, recupera i vincoli in base a cui eseguire la convalida dal repository anthos-config-management-samples utilizzando kpt. Infine, usa kpt per convalidare le
configurazioni Kubernetes rispetto a questi vincoli. Per completare questo ultimo passaggio,
utilizziamo una
funzione di configurazione specifica chiamata
gatekeeper
che esegue questa convalida. In questo tutorial, attiverai la pipeline CI manualmente, ma in realtà la configurerai in modo che venga eseguita dopo un comando git push
nel repository Git.
Obiettivi
- Eseguire una pipeline CI per un'app di esempio con Cloud Build.
- Osserva che la pipeline non funziona a causa di una violazione delle norme.
- Modifica il repository dell'app di esempio in modo che sia conforme ai criteri.
- Eseguire di nuovo la pipeline CI.
Costi
Questo tutorial utilizza i seguenti componenti fatturabili di Google Cloud:
- Cloud Build
- Versione Google Kubernetes Engine (GKE) Enterprise
Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi.
Al termine di questo tutorial, puoi evitare di continuare la fatturazione eliminando le risorse che hai creato. Per ulteriori dettagli, consulta la sezione Pulizia.
Prima di iniziare
Seleziona o crea un progetto Google Cloud. Nella console Google Cloud, vai alla pagina Gestisci risorse:
Per eseguire i comandi elencati in questo tutorial, apri Cloud Shell:
In Cloud Shell, esegui
gcloud config get-value project
.Se il comando non restituisce l'ID del progetto appena selezionato, configura Cloud Shell in modo che utilizzi il tuo progetto:
gcloud config set project PROJECT_ID
Sostituisci
PROJECT_ID
con l'ID progetto.In Cloud Shell, abilita l'API Cloud Build richiesta:
gcloud services enable cloudbuild.googleapis.com
Convalida le configurazioni di app di esempio
In questa sezione eseguirai una pipeline CI con Cloud Build per un repository di app di esempio fornito da noi. Questa pipeline convalida la configurazione di Kubernetes disponibile nel repository di app di esempio in base ai vincoli disponibili in un repository anthos-config-management-samples.
Per convalidare le configurazioni dell'app:
In Cloud Shell, clona il repository dell'app di esempio:
git clone https://github.com/GoogleCloudPlatform/anthos-config-management-samples.git
Eseguire la pipeline CI con Cloud Build. I log della build vengono visualizzati direttamente in Cloud Shell.
cd anthos-config-management-samples/ci-app/app-repo gcloud builds submit .
La pipeline che esegui è definita nel file seguente.
In Policy Controller, i vincoli sono istanze di modelli di vincoli. I modelli di vincolo contengono il codice Rego effettivo utilizzato per implementare il vincolo. La funzione
gcr.io/kpt-fn/gatekeeper
richiede che le definizioni del modello di vincolo e del vincolo funzionino. Il repository dei criteri di esempio contiene entrambi, ma in realtà possono essere archiviati in luoghi diversi. Utilizza il comandokpt pkg get
in base alle esigenze per scaricare sia i modelli di vincolo che i vincoli.Questo tutorial utilizza
gcr.io/kpt-fn/gatekeeper
con Cloud Build per convalidare le risorse, ma puoi utilizzare altre due alternative:- Utilizza la funzione
gcr.io/kpt-fn/gatekeeper
conkpt
:
kpt fn eval hydrated-manifests/kpt-manifests.yaml --image gcr.io/kpt-fn/gatekeeper:v0.2
- Utilizza lo strumento a riga di comando
gator
:
gator test -f hydrated-manifests/kpt-manifests.yaml
- Utilizza la funzione
Dopo alcuni minuti, osserva che la pipeline presenta il seguente errore:
[...] Step #2 - "Validate against policies": [error] apps/v1/Deployment/nginx-deployment : Deployment objects should have an 'owner' label indicating who created them. Step #2 - "Validate against policies": violatedConstraint: deployment-must-have-owner Finished Step #2 - "Validate against policies" 2022/05/11 18:55:18 Step Step #2 - "Validate against policies" finished 2022/05/11 18:55:19 status changed to "ERROR" ERROR ERROR: build step 2 "gcr.io/kpt-fn/gatekeeper:v0.2" failed: exit status 1 2022/05/11 18:55:20 Build finished with ERROR status
Il vincolo che viene violato dalla configurazione è definito nel file seguente. È una risorsa Kubernetes personalizzata denominata
K8sRequiredLabels
.Per il modello di vincolo corrispondente a questo vincolo, vedi
requiredlabels.yaml
su GitHub.Crea autonomamente la configurazione Kubernetes completa e osserva che manca l'etichetta
owner
. Per creare la configurazione:kubectl kustomize config/prod
Correggi l'app in modo che rispetti le norme aziendali
In questa sezione correggi la violazione delle norme utilizzando Kustomize:
In Cloud Shell, aggiungi una sezione
commonLabels
al file di Kustomization di base:cat <<EOF >> config/base/kustomization.yaml commonLabels: owner: myself EOF
Crea la configurazione Kubernetes completa e osserva che ora è presente l'etichetta
owner
:kubectl kustomize config/prod
Esegui di nuovo la pipeline CI con Cloud Build:
gcloud builds submit .
La pipeline ora riesce con il seguente output:
[...] Step #2 - "Validate against policies": [RUNNING] "gcr.io/kpt-fn/gatekeeper:v0" Step #2 - "Validate against policies": [PASS] "gcr.io/kpt-fn/gatekeeper:v0" [...]
Esegui la pulizia
- Nella console Google Cloud, vai alla pagina Gestisci risorse.
- Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
- Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.
Passaggi successivi
- Per altre architetture di riferimento, diagrammi e best practice, esplora il Cloud Architecture Center.