Se la tua organizzazione utilizza Policy Controller per gestire i criteri nei cluster Google Kubernetes Engine (GKE) Enterprise Edition, puoi convalidare la configurazione di deployment di un'app nella relativa 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 un ingegnere di piattaforma che crea un modello di pipeline CI per più team di app.
Questa pagina è rivolta ad amministratori e operatori IT che vogliono assicurarsi che tutte le risorse in esecuzione all'interno della piattaforma cloud soddisfino i requisiti di conformità dell'organizzazione fornendo e mantenendo l'automazione per eseguire controlli o applicare le norme e che gestiscono il ciclo di vita dell'infrastruttura tecnologica sottostante. Per approfondire i ruoli comuni e le attività di esempio a cui facciamo riferimento nei contenuti di Google Cloud, consulta Ruoli e attività comuni degli utenti di GKE Enterprise.
Le norme sono una parte importante della sicurezza e della conformità di un'organizzazione. Policy Controller consente alla tua organizzazione di gestire questi criteri in modo descrittivo e centralizzato per tutti i cluster. In qualità di sviluppatore, puoi sfruttare la natura dichiarativa e centralizzata di queste norme. Puoi utilizzare queste caratteristiche per verificare la tua app in base a questi criteri il prima possibile nel flusso di lavoro di sviluppo. Scoprire le violazioni delle norme nella pipeline di CI invece che durante il deployment presenta due vantaggi principali: consente di eseguire lo spostamento a sinistra per la sicurezza e rafforza il loop di feedback, riducendo il tempo e i costi necessari per correggere le violazioni.
Questo tutorial utilizza Cloud Build come strumento di CI e un repository GitHub di esempio contenente criteri per le dimostrazioni.
Risorse
Questo tutorial utilizza diversi strumenti Kubernetes. Questa sezione spiega che cosa sono questi strumenti, come 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 i criteri relativi agli oggetti creati in un cluster Kubernetes (ad esempio, impedisce l'utilizzo di un'opzione specifica o impone l'utilizzo di un'etichetta specifica). Questi criteri sono chiamati limitazioni. I vincoli sono definiti come risorse personalizzate Kubernetes. Policy Controller è disponibile nell'edizione Enterprise di Google Kubernetes Engine (GKE), ma puoi utilizzare Open Policy Agent - Gatekeeper anziché Policy Controller per l'implementazione.
GitHub: in questo tutorial utilizziamo GitHub per ospitare i repository Git: uno per un'app di esempio e uno contenente le limitazioni per Policy Controller. Per semplicità, i due repository sono due diverse cartelle in un unico repository Git. In realtà, si tratta di diversi repository. Puoi utilizzare qualsiasi soluzione Git.
Cloud Build: Cloud Build è la soluzione CI di Google Cloud. In questo tutorial lo utilizziamo per eseguire i test di convalida. Sebbene i dettagli dell'implementazione possano variare da un sistema CI all'altro, i concetti descritti in questo tutorial possono essere utilizzati con qualsiasi sistema CI basato su contenitori.
Kustomize: Kustomize è uno strumento di personalizzazione per le configurazioni Kubernetes. Funziona prendendo le configurazioni "di base" e applicandovi le personalizzazioni. Ti consente di avere un approccio DRY (Don't Repeat Yourself) alle configurazioni di Kubernetes. Con Kustomize, mantieni gli elementi comuni a tutti gli ambienti nelle configurazioni di base e crei personalizzazioni per ambiente. In questo tutorial, manteniamo le configurazioni di Kustomize nel repository dell'app e "costruiamo" (ad esempio, applichiamo le personalizzazioni) le configurazioni nella pipeline CI. Puoi utilizzare i concetti delineati in questo tutorial con qualsiasi strumento che produca 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 Kubernetes. Kpt ti consente di recuperare, visualizzare, personalizzare, aggiornare, convalidare e applicare le configurazioni Kubernetes. Poiché funziona con i 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 di 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 dell'app di esempio. La pipeline inizia generando le configurazioni Kubernetes finali con Kustomize. Successivamente, recupera i vincoli rispetto ai quali vogliamo eseguire la convalida dal repository anthos-config-management-samples utilizzando kpt. Infine, utilizza kpt per convalidare le configurazioni Kubernetes in base a questi vincoli. Per completare questo ultimo passaggio,
utilizziamo una specifica
funzione di configurazione chiamata
gatekeeper
che esegue questa convalida. In questo tutorial attivi la pipeline CI manualmente, ma in realtà la configureresti in modo che venga eseguita dopo un git push
nel tuo repository Git.
Obiettivi
- Esegui una pipeline CI per un'app di esempio con Cloud Build.
- Nota che la pipeline non va a buon fine a causa di una violazione delle norme.
- Modifica il repository dell'app di esempio in modo che sia conforme alle norme.
- Esegui di nuovo la pipeline CI.
Costi
Questo tutorial utilizza i seguenti componenti fatturabili di Google Cloud:
- Cloud Build
- Versione Enterprise di Google Kubernetes Engine (GKE)
Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi.
Al termine di questo tutorial, puoi evitare la fatturazione continua 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 per utilizzare il 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 dell'app di esempio
In questa sezione esegui una pipeline CI con Cloud Build per un repository di app di esempio fornito da noi. Questa pipeline convalida la configurazione 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
Esegui 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 seguente file.
In Policy Controller, i vincoli sono istanze di modelli di vincoli. I modelli di vincoli contengono il codice Rego effettivo utilizzato per implementare il vincolo. Per funzionare, la funzione
gcr.io/kpt-fn/gatekeeper
ha bisogno sia del modello di vincolo sia delle definizioni di vincolo. Il repository dei criteri di esempio contiene entrambi, ma in realtà possono essere memorizzati in luoghi diversi. Utilizza il comandokpt pkg get
in base alle esigenze per scaricare sia i modelli di vincolo sia i vincoli.Questo tutorial utilizza
gcr.io/kpt-fn/gatekeeper
con Cloud Build per verificare 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 non va a buon fine con 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 violato dalla configurazione è definito nel seguente file. Si tratta di una risorsa personalizzata Kubernetes chiamata
K8sRequiredLabels
.Per il modello di vincolo corrispondente a questo vincolo, consulta
requiredlabels.yaml
su GitHub.Crea la configurazione completa di Kubernetes e osserva che l'etichetta
owner
è effettivamente mancante. Per compilare la configurazione:kubectl kustomize config/prod
Correggi l'app per renderla conforme ai criteri 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 completa di Kubernetes e verifica che l'etichetta
owner
sia ora presente: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
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Passaggi successivi
- Per altre architetture di riferimento, diagrammi e best practice, visita il Cloud Architecture Center.