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 Google Kubernetes Engine (GKE) Enterprise, 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 è destinata 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 il controllo o l'applicazione e che gestiscono il ciclo di vita dell'infrastruttura tecnologica sottostante. Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei contenuti diGoogle 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 centralizzato e dichiarativo per tutti i tuoi cluster. In qualità di sviluppatore, puoi sfruttare la natura centralizzata e dichiarativa di queste norme. Puoi utilizzare queste caratteristiche per convalidare la tua app in base a questi criteri il prima possibile nel tuo flusso di lavoro di sviluppo. L'apprendimento delle violazioni delle norme nella pipeline CI invece che durante il deployment presenta due vantaggi principali: ti consente di spostare la sicurezza a sinistra e di stringere il ciclo di feedback, riducendo il tempo e i costi necessari per correggere queste violazioni.

Questo tutorial utilizza Cloud Build come strumento CI e un repository GitHub di esempio contenente criteri per le dimostrazioni.

Risorse

Questo tutorial utilizza diversi strumenti Kubernetes. Questa sezione spiega cosa sono questi strumenti, come interagiscono tra loro e se puoi sostituirli con qualcos'altro.

Gli strumenti utilizzati in questo tutorial includono:

  • Policy Controller: si basa sul progetto open source Open Policy Agent - Gatekeeper. Policy Controller applica criteri relativi agli oggetti creati in un cluster Kubernetes (ad esempio, impedendo l'utilizzo di un'opzione specifica o imponendo l'utilizzo di un'etichetta specifica). Queste norme sono chiamate vincoli. I vincoli sono definiti come risorse personalizzate di Kubernetes. Policy Controller è disponibile nella versione GKE Enterprise di Google Kubernetes Engine (GKE), 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à, si tratterebbe di repository diversi. 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 container.

  • Kustomize: Kustomize è uno strumento di personalizzazione per le configurazioni Kubernetes. Funziona prendendo le configurazioni "di base" e applicando le personalizzazioni. Ti consente di adottare 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 "creiamo" (ad esempio, applichiamo le personalizzazioni) le configurazioni nella pipeline CI. Puoi utilizzare i concetti descritti 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 di 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 Kubernetes in base a questi vincoli.

Pipeline

La pipeline CI che utilizziamo in questo tutorial è mostrata nel seguente diagramma:

Pipeline CI per Policy Controller

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 da convalidare dal repository anthos-config-management-samples utilizzando kpt. Infine, utilizza kpt per convalidare le configurazioni Kubernetes in base a questi vincoli. Per eseguire questo ultimo passaggio, utilizziamo una funzione di configurazione specifica chiamata gatekeeper che esegue questa convalida. In questo tutorial, attivi la pipeline CI manualmente, ma in realtà la configurerai per l'esecuzione dopo un git push nel repository Git.

Obiettivi

  • Esegui una pipeline CI per un'app di esempio con Cloud Build.
  • Osserva che la pipeline non va a buon fine a causa di una violazione delle norme.
  • Modifica il repository dell'app di esempio per renderlo conforme alle norme.
  • Esegui di nuovo la pipeline CI.

Costi

Questo tutorial utilizza i seguenti componenti fatturabili di Google Cloud:

  • Cloud Build
  • 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 l'addebito di ulteriori costi eliminando le risorse create. Per maggiori dettagli, consulta la sezione Pulizia.

Prima di iniziare

  1. Seleziona o crea un Google Cloud progetto. Nella console Google Cloud , vai alla pagina Gestisci risorse:

    Vai a Gestisci risorse

  2. Abilita la fatturazione per il tuo progetto.

  3. Per eseguire i comandi elencati in questo tutorial, apri Cloud Shell:

    Vai a Cloud Shell

  4. 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.

  5. In Cloud Shell, abilita l'API Cloud Build richiesta:

    gcloud services enable cloudbuild.googleapis.com
    

Convalidare le configurazioni dell'app di esempio

In questa sezione, esegui una pipeline CI con Cloud Build per un repository di app di esempio che forniamo. Questa pipeline convalida la configurazione di Kubernetes disponibile nel repository dell'app di esempio rispetto ai vincoli disponibili in un repository anthos-config-management-samples.

Per convalidare le configurazioni dell'app:

  1. In Cloud Shell, clona il repository dell'app di esempio:

    git clone https://github.com/GoogleCloudPlatform/anthos-config-management-samples.git
    
  2. 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.

    steps:
    - id: 'Prepare config'
      # This step builds the final manifests for the app
      # using kustomize and the configuration files
      # available in the repository.
      name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
      entrypoint: '/bin/sh'
      args: ['-c', 'mkdir hydrated-manifests && kubectl kustomize config/prod > hydrated-manifests/prod.yaml']
    - id: 'Download policies'
      # This step fetches the policies from the Anthos Config Management repository
      # and consolidates every resource in a single file.
      name: 'gcr.io/kpt-dev/kpt'
      entrypoint: '/bin/sh'
      args: ['-c', 'kpt pkg get https://github.com/GoogleCloudPlatform/anthos-config-management-samples.git/ci-app/acm-repo/cluster@main constraints
                      && kpt fn source constraints/ hydrated-manifests/ > hydrated-manifests/kpt-manifests.yaml']
    - id: 'Validate against policies'
      # This step validates that all resources comply with all policies.
      name: 'gcr.io/kpt-fn/gatekeeper:v0.2'
      args: ['--input', 'hydrated-manifests/kpt-manifests.yaml']

    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 sia il modello di vincolo sia le definizioni di vincolo per funzionare. Il repository dei criteri di esempio contiene entrambi, ma in realtà possono essere memorizzati in posizioni diverse. Utilizza il comando kpt 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 convalidare le risorse, ma esistono altre due alternative che puoi utilizzare:

    kpt fn eval hydrated-manifests/kpt-manifests.yaml --image gcr.io/kpt-fn/gatekeeper:v0.2
    
    gator test -f hydrated-manifests/kpt-manifests.yaml
    
  3. Dopo qualche minuto, osserva che la pipeline non va a buon fine e viene visualizzato 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.

    apiVersion: constraints.gatekeeper.sh/v1beta1
    kind: K8sRequiredLabels
    metadata:
      name: deployment-must-have-owner
    spec:
      match:
        kinds:
          - apiGroups: ["apps"]
            kinds: ["Deployment"]
      parameters:
        labels:
          - key: "owner"
        message: "Deployment objects should have an 'owner' label indicating who created them."

    Per il modello di vincolo corrispondente a questo vincolo, consulta requiredlabels.yaml su GitHub.

  4. Crea autonomamente la configurazione completa di Kubernetes e osserva che l'etichetta owner è effettivamente mancante. Per creare la configurazione:

    kubectl kustomize config/prod
    

Correggere l'app per renderla conforme ai criteri aziendali

In questa sezione, correggi la violazione delle norme utilizzando Kustomize:

  1. In Cloud Shell, aggiungi una sezione commonLabels al file Kustomization di base:

    cat <<EOF >> config/base/kustomization.yaml
    commonLabels:
      owner: myself
    EOF
    
  2. Crea la configurazione completa di Kubernetes e osserva che l'etichetta owner è ora presente:

    kubectl kustomize config/prod
    
  3. Esegui di nuovo la pipeline CI con Cloud Build:

    gcloud builds submit .
    

    La pipeline viene ora eseguita correttamente 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

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Passaggi successivi