Creazione di risorse Google Cloud conformi ai criteri


Questo tutorial mostra come gli amministratori di piattaforma possono utilizzare Policy Controller criteri per la creazione di risorse Google Cloud mediante Config Connector.

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 istruzioni in questo tutorial presuppongono che tu abbia una conoscenza di base di Kubernetes o Google Kubernetes Engine (GKE). Nel tutorial definisci un criterio che limita le posizioni consentite per i bucket Cloud Storage.

Policy Controller controlla, verifica e applica la conformità delle risorse del cluster Kubernetes ai criteri relativi a sicurezza, normative o regole aziendali. Policy Controller è creato dal progetto open source OPA Gatekeeper.

Config Connector crea e gestisce il ciclo di vita delle risorse Google Cloud, descrivendone come risorse personalizzate Kubernetes. Per creare una risorsa Google Cloud, devi creare una risorsa Kubernetes in un gestito da Config Connector. Il seguente esempio mostra come descrivere un bucket Cloud Storage utilizzando Config Connector:

apiVersion: storage.cnrm.cloud.google.com/v1beta1
kind: StorageBucket
metadata:
  name: my-bucket
spec:
  location: us-east1

Gestendo le tue risorse Google Cloud con Config Connector, puoi e applicare i criteri di Policy Controller a queste risorse quando crei nel cluster della versione Google Kubernetes Engine (GKE) Enterprise. Questi criteri ti consentono di impedire o segnalare azioni che creano o modificano le risorse in modi che violano le tue criteri. Ad esempio, puoi applicare in modo forzato un criterio che limita le località di di archiviazione dei bucket Cloud Storage.

Questo approccio, basato Modello di risorse di Kubernetes (KRM), consente di utilizzare un set coerente di strumenti e flussi di lavoro per gestire di Kubernetes e Google Cloud. Questo tutorial mostra come puoi completare le seguenti attività:

  • Definisci i criteri che regolano le tue risorse Google Cloud.
  • Implementa controlli che impediscano a sviluppatori e amministratori di creare risorse Google Cloud che violano i tuoi criteri.
  • Implementa controlli che sottopongono a revisione le risorse Google Cloud esistenti rispetto ai tuoi criteri, anche se le hai create al di fuori di Config Connector.
  • Fornisci un feedback rapido a sviluppatori e amministratori durante la creazione e l'aggiornamento delle definizioni delle risorse.
  • Convalida le definizioni delle risorse Google Cloud in base ai tuoi criteri prima di tentare di applicare le definizioni a un cluster Kubernetes.

Obiettivi

  • Crea un cluster della versione Google Kubernetes Engine (GKE) Enterprise che includa Config Connector come componente aggiuntivo.
  • Installa Policy Controller.
  • Crea un criterio per limitare le località dei bucket Cloud Storage consentite.
  • Verifica che il criterio impedisca la creazione di bucket Cloud Storage in posizioni non consentite.
  • Valutare la conformità ai criteri della definizione del bucket Cloud Storage durante lo sviluppo.
  • Controlla i bucket Cloud Storage esistenti per verificare la conformità ai criteri.

Costi

In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi basata sull'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero essere idonei per una prova gratuita.

Prima di iniziare

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

  4. In Cloud Shell, imposta il progetto Google Cloud che vuoi utilizzare per questo tutorial:

    gcloud config set project PROJECT_ID
    

    Sostituisci PROJECT_ID con l'ID progetto Google Cloud del tuo progetto. Quando esegui questo comando, Cloud Shell crea una variabile di ambiente esportata denominata GOOGLE_CLOUD_PROJECT che contiene il tuo ID progetto. Se non utilizzi Cloud Shell, puoi creare di variabile di ambiente con questo comando:

    export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value core/project)
    
  5. Abilita l'API GKE:

    gcloud services enable container.googleapis.com
    
  6. Abilita l'API Policy Controller:

    gcloud services enable anthospolicycontroller.googleapis.com
    
  7. Crea una directory per archiviare i file creati per questo tutorial:

    mkdir -p ~/cnrm-gatekeeper-tutorial
    
  8. Vai alla directory che hai creato:

    cd ~/cnrm-gatekeeper-tutorial
    

Crea un cluster GKE

  1. In Cloud Shell, crea un cluster GKE il componente aggiuntivo Config Connector e Federazione delle identità dei carichi di lavoro per GKE:

    gcloud container clusters create CLUSTER_NAME \
      --addons ConfigConnector \
      --enable-ip-alias \
      --num-nodes 4 \
      --release-channel regular \
      --scopes cloud-platform \
      --workload-pool $GOOGLE_CLOUD_PROJECT.svc.id.goog \
      --zone ZONE
    

    Sostituisci quanto segue:

    • CLUSTER_NAME: il nome del cluster che vuoi per questo progetto, ad esempio cnrm-gatekeeper-tutorial.
    • ZONE: una zona Compute Engine vicina alla tua posizione, ad esempio asia-southeast1-b.

    Il componente aggiuntivo Config Connector installa definizioni di risorse personalizzate (CRD) per risorse Google Cloud nel tuo cluster GKE.

  2. (Facoltativo) Se utilizzi una cluster privato nel tuo ambiente, aggiungi una regola firewall che consenta al cluster GKE dal piano di controllo per la connessione al webhook di Policy Controller:

    gcloud compute firewall-rules create allow-cluster-control-plane-tcp-8443 \
      --allow tcp:8443 \
      --network default \
      --source-ranges CONTROL_PLANE_CIDR \
      --target-tags NODE_TAG
    

    Sostituisci quanto segue:

    • CONTROL_PLANE_CIDR: l'intervallo IP per il tuo Piano di controllo del cluster GKE, ad esempio 172.16.0.16/28.
    • NODE_TAG: un tag applicato a tutti i nodi del cluster GKE.

    Questa regola firewall facoltativa è obbligatoria per consentire al webhook di Policy Controller funzionano quando il cluster usa nodi privati.

Configura Config Connector

Il progetto Google Cloud in cui installi Config Connector è noto come progetto host. I progetti in cui è noto che usa Config Connector per gestire le risorse come progetti gestiti. In questo tutorial utilizzi Config Connector per creare risorse Google Cloud nello stesso progetto del tuo cluster GKE, in modo che il progetto host e il progetto gestito siano lo stesso progetto.

  1. In Cloud Shell, crea un account di servizio Google per Config Connector:

    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
      --display-name "Config Connector Gatekeeper tutorial"
    

    Sostituisci SERVICE_ACCOUNT_NAME con il nome che vuoi utilizzare per questo account di servizio, ad esempio cnrm-gatekeeper-tutorial. Config Connector utilizza questo account di servizio Google per creare risorse in progetto gestito.

  2. Concedi il ruolo Amministratore archiviazione all'account di servizio Google:

    gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
      --member "serviceAccount:SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com" \
      --role roles/storage.admin
    

    In questo tutorial, utilizzerai il ruolo Amministratore Storage perché utilizzi Config Connector per creare bucket Cloud Storage. Nel tuo ambiente, concedi i ruoli necessari per gestire le risorse Google Cloud che vuoi creare per Config Connector. Per ulteriori informazioni sui ruoli predefiniti, consulta la sezione Informazioni sui ruoli nella documentazione di IAM.

  3. Crea uno spazio dei nomi Kubernetes per le risorse Config Connector che crea in questo tutorial:

    kubectl create namespace NAMESPACE
    

    Sostituisci NAMESPACE con lo spazio dei nomi Kubernetes vuoi usare nel tutorial, ad esempio tutorial.

  4. Aggiungi un'annotazione al nome dell'ambito per specificare il progetto che Config Connector deve utilizzare per creare le risorse Google Cloud (il progetto gestito):

    kubectl annotate namespace NAMESPACE \
        cnrm.cloud.google.com/project-id=$GOOGLE_CLOUD_PROJECT
    
  5. Crea una risorsa ConfigConnectorContext che attivi Config Connector per lo spazio dei nomi Kubernetes e associala all'account di servizio Google che hai creato:

    cat << EOF | kubectl apply -f -
    apiVersion: core.cnrm.cloud.google.com/v1beta1
    kind: ConfigConnectorContext
    metadata:
      name: configconnectorcontext.core.cnrm.cloud.google.com
      namespace: NAMESPACE
    spec:
      googleServiceAccount: SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
    EOF
    

    Quando crei la risorsa ConfigConnectorContext, Config Connector crea un account di servizio Kubernetes e un StatefulSet nello spazio dei nomi cnrm-system per gestire le risorse Config Connector nel tuo spazio dei nomi.

  6. Attendi che il pod del controller di Config Connector per il tuo spazio dei nomi:

    kubectl wait --namespace cnrm-system --for=condition=Ready pod \
      -l cnrm.cloud.google.com/component=cnrm-controller-manager,cnrm.cloud.google.com/scoped-namespace=NAMESPACE
    

    Quando il pod è pronto, viene visualizzato il prompt di Cloud Shell. Se ricevi il messaggio error: no matching resources found, attendi un minuto e riprova.

  7. Associa l'account di servizio Kubernetes di Config Connector al tuo account di servizio Google creando un'associazione dei criteri IAM:

    gcloud iam service-accounts add-iam-policy-binding \
      SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
      --member "serviceAccount:$GOOGLE_CLOUD_PROJECT.svc.id.goog[cnrm-system/cnrm-controller-manager-NAMESPACE]" \
      --role roles/iam.workloadIdentityUser
    

    Questa associazione consente a Kubernetes cnrm-controller-manager-NAMESPACE l'account di servizio nello spazio dei nomi cnrm-system affinché agisca come servizio Google che hai creato.

Installa Policy Controller

Installa Policy Controller seguendo le istruzioni istruzioni di installazione.

Utilizza un intervallo di controllo di 60 secondi.

Creare una risorsa Google Cloud utilizzando Config Connector

  1. In Cloud Shell, crea un manifest di Config Connector che rappresenti un Bucket Cloud Storage nella regione us-central1:

    cat << EOF > tutorial-storagebucket-us-central1.yaml
    apiVersion: storage.cnrm.cloud.google.com/v1beta1
    kind: StorageBucket
    metadata:
      name: tutorial-us-central1-$GOOGLE_CLOUD_PROJECT
      namespace: NAMESPACE
    spec:
      location: us-central1
      uniformBucketLevelAccess: true
    EOF
    
  2. Per creare il bucket Cloud Storage, applica il manifest:

    kubectl apply -f tutorial-storagebucket-us-central1.yaml
    
  3. Verifica che Config Connector abbia creato il bucket Cloud Storage:

    gcloud storage ls | grep tutorial
    

    L'output è simile al seguente:

    gs://tutorial-us-central1-PROJECT_ID/
    

    Questo output include PROJECT_ID, che è il tuo ID progetto Google Cloud.

    Se non vedi questo output, attendi un minuto ed esegui di nuovo il passaggio.

Crea un criterio

Un criterio in Policy Controller è costituito da un modello di vincolo e da un vincolo. Il modello di vincolo contiene la logica dei criteri. Il vincolo specifica dove si applica il criterio e i parametri di input alla logica del criterio.

  1. In Cloud Shell, crea un modello di vincolo che limiti le località dei bucket Cloud Storage:

    cat << EOF > tutorial-storagebucket-location-template.yaml
    apiVersion: templates.gatekeeper.sh/v1beta1
    kind: ConstraintTemplate
    metadata:
      name: gcpstoragelocationconstraintv1
    spec:
      crd:
        spec:
          names:
            kind: GCPStorageLocationConstraintV1
          validation:
            openAPIV3Schema:
              properties:
                locations:
                  type: array
                  items:
                    type: string
                exemptions:
                  type: array
                  items:
                    type: string
      targets:
      - target: admission.k8s.gatekeeper.sh
        rego: |
          package gcpstoragelocationconstraintv1
    
          allowedLocation(reviewLocation) {
              locations := input.parameters.locations
              satisfied := [ good | location = locations[_]
                                    good = lower(location) == lower(reviewLocation)]
              any(satisfied)
          }
    
          exempt(reviewName) {
              input.parameters.exemptions[_] == reviewName
          }
    
          violation[{"msg": msg}] {
              bucketName := input.review.object.metadata.name
              bucketLocation := input.review.object.spec.location
              not allowedLocation(bucketLocation)
              not exempt(bucketName)
              msg := sprintf("Cloud Storage bucket <%v> uses a disallowed location <%v>, allowed locations are %v", [bucketName, bucketLocation, input.parameters.locations])
          }
    
          violation[{"msg": msg}] {
              not input.parameters.locations
              bucketName := input.review.object.metadata.name
              msg := sprintf("No permitted locations provided in constraint for Cloud Storage bucket <%v>", [bucketName])
          }
    EOF
    
  2. Applica il modello per creare il bucket Cloud Storage:

    kubectl apply -f tutorial-storagebucket-location-template.yaml
    
  3. Crea un vincolo che consenta i bucket solo a Singapore e Regioni di Giacarta (asia-southeast1 e asia-southeast2). Il vincolo si applica allo spazio dei nomi creato in precedenza. Esenta il bucket Cloud Storage predefinito per Cloud Build.

    cat << EOF > tutorial-storagebucket-location-constraint.yaml
    apiVersion: constraints.gatekeeper.sh/v1beta1
    kind: GCPStorageLocationConstraintV1
    metadata:
      name: singapore-and-jakarta-only
    spec:
      enforcementAction: deny
      match:
        kinds:
        - apiGroups:
          - storage.cnrm.cloud.google.com
          kinds:
          - StorageBucket
        namespaces:
        - NAMESPACE
      parameters:
        locations:
        - asia-southeast1
        - asia-southeast2
        exemptions:
        - ${GOOGLE_CLOUD_PROJECT}_cloudbuild
    EOF
    
  4. Per limitare le zone in cui possono esistere i bucket, applica la seguente limitazione:

    kubectl apply -f tutorial-storagebucket-location-constraint.yaml
    

Verifica il criterio

  1. Crea un manifest che rappresenti un bucket Cloud Storage in una posizione non consentita (us-west1):

    cat << EOF > tutorial-storagebucket-us-west1.yaml
    apiVersion: storage.cnrm.cloud.google.com/v1beta1
    kind: StorageBucket
    metadata:
      name: tutorial-us-west1-$GOOGLE_CLOUD_PROJECT
      namespace: NAMESPACE
    spec:
      location: us-west1
      uniformBucketLevelAccess: true
    EOF
    
  2. Per creare il bucket Cloud Storage, applica il manifest:

    kubectl apply -f tutorial-storagebucket-us-west1.yaml
    

    L'output è simile al seguente:

    Error from server ([singapore-and-jakarta-only] Cloud Storage bucket
    <tutorial-us-west1-PROJECT_ID> uses a disallowed location
    <us-west1>, allowed locations are ["asia-southeast1",
    "asia-southeast2"]): error when creating
    "tutorial-storagebucket-us-west1.yaml": admission webhook
    "validation.gatekeeper.sh" denied the request: [singapore-and-jakarta-only]
    Cloud Storage bucket <tutorial-us-west1-PROJECT_ID> uses a
    disallowed location <us-west1>, allowed locations are
    ["asia-southeast1", "asia-southeast2"]
    
  3. (Facoltativo) Puoi visualizzare un record della decisione di rifiutare la richiesta in Cloud Audit Logs. Esegui una query sui log delle attività di amministrazione per il tuo progetto:

    gcloud logging read --limit=1 \
        "logName=\"projects/$GOOGLE_CLOUD_PROJECT/logs/cloudaudit.googleapis.com%2Factivity\""'
        resource.type="k8s_cluster"
        resource.labels.cluster_name="CLUSTER_NAME"
        resource.labels.location="ZONE"
        protoPayload.authenticationInfo.principalEmail!~"system:serviceaccount:cnrm-system:.*"
        protoPayload.methodName:"com.google.cloud.cnrm."
        protoPayload.status.code=7'
    

    L'output è simile al seguente:

    insertId: 3c6940bb-de14-4d18-ac4d-9a6becc70828
    labels:
      authorization.k8s.io/decision: allow
      authorization.k8s.io/reason: ''
      mutation.webhook.admission.k8s.io/round_0_index_0: '{"configuration":"mutating-webhook.cnrm.cloud.google.com","webhook":"container-annotation-handler.cnrm.cloud.google.com","mutated":true}'
      mutation.webhook.admission.k8s.io/round_0_index_1: '{"configuration":"mutating-webhook.cnrm.cloud.google.com","webhook":"management-conflict-annotation-defaulter.cnrm.cloud.google.com","mutated":true}'
    logName: projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Factivity
    operation:
      first: true
      id: 3c6940bb-de14-4d18-ac4d-9a6becc70828
      last: true
      producer: k8s.io
    protoPayload:
      '@type': type.googleapis.com/google.cloud.audit.AuditLog
      authenticationInfo:
        principalEmail: user@example.com
      authorizationInfo:
      - permission: com.google.cloud.cnrm.storage.v1beta1.storagebuckets.create
        resource: storage.cnrm.cloud.google.com/v1beta1/namespaces/NAMESPACE/storagebuckets/tutorial-us-west1-PROJECT_ID
      methodName: com.google.cloud.cnrm.storage.v1beta1.storagebuckets.create
      requestMetadata:
        callerIp: 203.0.113.1
        callerSuppliedUserAgent: kubectl/v1.21.1 (linux/amd64) kubernetes/5e58841
      resourceName: storage.cnrm.cloud.google.com/v1beta1/namespaces/NAMESPACE/storagebuckets/tutorial-us-west1-PROJECT_ID
      serviceName: k8s.io
      status:
        code: 7
        message: Forbidden
    receiveTimestamp: '2021-05-21T06:56:24.940264678Z'
    resource:
      labels:
        cluster_name: CLUSTER_NAME
        location: CLUSTER_ZONE
        project_id: PROJECT_ID
      type: k8s_cluster
    timestamp: '2021-05-21T06:56:09.060635Z'

    Il campo methodName mostra l'operazione che hai tentato di eseguire, ovvero resourceName mostra il nome completo della risorsa Config Connector e status mostra che la richiesta non è andata a buon fine, con codice di errore 7 e messaggio a Forbidden.

  4. crea un manifest che rappresenti un bucket Cloud Storage in un località consentita (asia-southeast1):

    cat << EOF > tutorial-storagebucket-asia-southeast1.yaml
    apiVersion: storage.cnrm.cloud.google.com/v1beta1
    kind: StorageBucket
    metadata:
      name: tutorial-asia-southeast1-$GOOGLE_CLOUD_PROJECT
      namespace: NAMESPACE
    spec:
      location: asia-southeast1
      uniformBucketLevelAccess: true
    EOF
    
  5. Per creare il bucket Cloud Storage, applica il manifest:

    kubectl apply -f tutorial-storagebucket-asia-southeast1.yaml
    

    L'output è simile al seguente:

    storagebucket.storage.cnrm.cloud.google.com/tutorial-asia-southeast1-PROJECT_ID created
    

    Questo output include PROJECT_ID, che è l'ID progetto Google Cloud.

  6. Verifica che Config Connector abbia creato il bucket Cloud Storage:

    gcloud storage ls | grep tutorial
    

    L'output è simile al seguente:

    gs://tutorial-asia-southeast1-PROJECT_ID/
    gs://tutorial-us-central1-PROJECT_ID/
    

    Se non vedi questo output, attendi un minuto ed esegui di nuovo questo passaggio.

Vincoli di controllo

Il controller di controllo in Policy Controller valuta periodicamente le risorse in base ai relativi vincoli. Il controller rileva le violazioni dei criteri per le risorse create prima della limitazione e per le risorse create al di fuori di Config Connector.

  1. In Cloud Shell, visualizza le violazioni per tutti i vincoli che utilizzano il modello di vincolo GCPStorageLocationConstraintV1:

    kubectl get gcpstoragelocationconstraintv1 -o json \
      | jq '.items[].status.violations'
    

    L'output è simile al seguente:

    [
      {
        "enforcementAction": "deny",
        "kind": "StorageBucket",
        "message": "Cloud Storage bucket <tutorial-us-central1-PROJECT_ID>
        uses a disallowed location <us-central1>, allowed locations are
        \"asia-southeast1\", \"asia-southeast2\"",
        "name": "tutorial-us-central1-PROJECT_ID",
        "namespace": "NAMESPACE"
      }
    ]
    

    Vedrai il bucket Cloud Storage che hai creato in us-central1 prima di creare la limitazione.

Convalida le risorse durante lo sviluppo

Durante le build di sviluppo e di integrazione continua, è utile convalidare le risorse in base ai vincoli prima di applicarle al cluster GKE. La convalida fornisce un feedback rapido e ti consente di scoprire tempestivamente i problemi relativi a risorse e vincoli. Questi passaggi mostrano come verificare le risorse con kpt. Lo strumento a riga di comando kpt consente di gestire e applicare le risorse Kubernetes e i file manifest.

  1. In Cloud Shell, esegui gatekeeper Funzione KRM utilizzando kpt:

    kpt fn eval . --image=gcr.io/kpt-fn/gatekeeper:v0.2 --truncate-output=false
    

    Una funzione KRM è un programma in grado di modificare o convalidare Kubernetes archiviate nel file system locale come file YAML. La funzione KRM gatekeeper convalida le risorse del bucket Cloud Storage di Config Connector in base al criterio Gatekeeper. La funzione KRM gatekeeper è pacchettizzati come un'immagine container disponibile in Artifact Registry.

    La funzione segnala che i file manifest per i bucket Cloud Storage nelle regioni us-central1 e us-west1 violano il vincolo.

    L'output è simile al seguente:

    [RUNNING] "gcr.io/kpt-fn/gatekeeper:v0.2"
    [FAIL] "gcr.io/kpt-fn/gatekeeper:v0.2"
      Results:
        [ERROR] Cloud Storage bucket <tutorial-us-central1-PROJECT_ID> uses a disallowed location <us-central1>, allowed locations are ["asia-southeast1", "asia-southeast2"] violatedConstraint: singapore-and-jakarta-only in object "storage.cnrm.cloud.google.com/v1beta1/StorageBucket/tutorial/tutorial-us-central1-GOOGLE_CLOUD_PROJECT" in file "tutorial-storagebucket-us-central1.yaml"
        [ERROR] Cloud Storage bucket <tutorial-us-west1-PROJECT_ID> uses a disallowed location <us-west1>, allowed locations are ["asia-southeast1", "asia-southeast2"] violatedConstraint: singapore-and-jakarta-only in object "storage.cnrm.cloud.google.com/v1beta1/StorageBucket/tutorial/tutorial-us-west1-GOOGLE_CLOUD_PROJECT" in file "tutorial-storagebucket-us-west1.yaml"
      Stderr:
        "[error] storage.cnrm.cloud.google.com/v1beta1/StorageBucket/test/tutorial-us-central1-PROJECT_ID : Cloud Storage bucket <tutorial-us-central1-PROJECT_ID> uses a disallowed location <us-central1>, allowed locations are [\"asia-southeast1\", \"asia-southeast2\"]"
        "violatedConstraint: singapore-and-jakarta-only"
        ""
        "[error] storage.cnrm.cloud.google.com/v1beta1/StorageBucket/test/tutorial-us-west1-PROJECT_IDT : Cloud Storage bucket <tutorial-us-west1-PROJECT_IDgt; uses a disallowed location <us-west1>, allowed locations are [\"asia-southeast1\", \"asia-southeast2\"]"
        "violatedConstraint: singapore-and-jakarta-only"
        ""
      Exit code: 1
    

Convalida le risorse create al di fuori di Config Connector

Puoi convalidare le risorse Google Cloud create all'esterno Config Connector esportando le risorse. Dopo aver esportato le risorse, utilizza una delle seguenti opzioni per valutare i criteri di Policy Controller rispetto alle risorse esportate:

  • Convalida le risorse utilizzando la funzione KRM gatekeeper.

  • Importa le risorse in Config Connector.

Per esportare le risorse, usa Cloud Asset Inventory.

  1. In Cloud Shell, abilita l'API Cloud Asset:

    gcloud services enable cloudasset.googleapis.com
    
  2. Elimina i file manifest delle risorse Kubernetes per i bucket Cloud Storage in us-central1 e us-west1:

    rm tutorial-storagebucket-us-*.yaml
    
  3. Esporta tutte le risorse Cloud Storage nel progetto attuale, e archivierai l'output in un file denominato export.yaml:

    gcloud beta resource-config bulk-export \
      --project $GOOGLE_CLOUD_PROJECT \
      --resource-format krm \
      --resource-types StorageBucket > export.yaml
    

    L'output è simile al seguente:

    Exporting resource configurations to stdout...
    
    Export complete.
    
  4. Crea una pipeline kpt concatenando le funzioni KRM. Questa pipeline convalida le risorse nella directory corrente in base al criterio di posizione del bucket Cloud Storage:

    kpt fn source . \
      | kpt fn eval - --image=gcr.io/kpt-fn/set-namespace:v0.1 -- namespace=NAMESPACE \
      | kpt fn eval - --image=gcr.io/kpt-fn/gatekeeper:v0.2 --truncate-output=false
    

    Le risorse esportate non hanno un valore per i metadati namespace . Questa pipeline utilizza una funzione KRM chiamata set-namespace per impostare il valore namespace di tutte le risorse.

    L'output è simile al seguente e mostra violazioni per che hai esportato:

    [RUNNING] "gcr.io/kpt-fn/set-namespace:v0.1"
    [PASS] "gcr.io/kpt-fn/set-namespace:v0.1"
    [RUNNING] "gcr.io/kpt-fn/gatekeeper:v0.2"
    [FAIL] "gcr.io/kpt-fn/gatekeeper:v0.2"
      Results:
        [ERROR] Cloud Storage bucket <tutorial-us-central1-PROJECT_ID> uses a disallowed location <us-central1>, allowed locations are ["asia-southeast1", "asia-southeast2"] violatedConstraint: singapore-and-jakarta-only in object "storage.cnrm.cloud.google.com/v1beta1/StorageBucket/tutorial/tutorial-us-central1-GOOGLE_CLOUD_PROJECT" in file "export.yaml"
      Stderr:
        "[error] storage.cnrm.cloud.google.com/v1beta1/StorageBucket/test/tutorial-us-central1-PROJECT_ID : Cloud Storage bucket <tutorial-us-central1-PROJECT_ID> uses a disallowed location <us-central1>, allowed locations are [\"asia-southeast1\", \"asia-southeast2\"]"
        "violatedConstraint: singapore-and-jakarta-only"
        ""
      Exit code: 1
    

    Se il tuo progetto Google Cloud contiene bucket Cloud Storage che che hai creato prima di lavorare a questo tutorial e la sua posizione viola le , i bucket creati in precedenza vengono visualizzati nell'output.

Congratulazioni. Hai configurato correttamente una norma che regola il località consentita dei bucket Cloud Storage. Il tutorial è completo. Ora puoi continuare ad aggiungere i tuoi criteri per altri servizi Google Cloud Google Cloud.

Risoluzione dei problemi

Se Config Connector non crea le risorse Google Cloud previste, utilizza il seguente comando in Cloud Shell per visualizzare i log del gestore del controller Config Connector:

kubectl logs --namespace cnrm-system --container manager \
  --selector cnrm.cloud.google.com/component=cnrm-controller-manager,cnrm.cloud.google.com/scoped-namespace=NAMESPACE

Se Policy Controller non applica i criteri correttamente, utilizza seguente comando per visualizzare i log del gestore controller:

kubectl logs deployment/gatekeeper-controller-manager \
  --namespace gatekeeper-system

Se Policy Controller non segnala violazioni nel campo status degli oggetti di vincolo, visualizza i log del controller di controllo utilizzando questo comando:

kubectl logs deployment/gatekeeper-audit --namespace gatekeeper-system

Se riscontri altri problemi con questo tutorial, ti consigliamo di consultare questi documenti:

Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

Elimina il progetto

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

    Go to Manage resources

  2. If the project that you plan to delete is attached to an organization, expand the Organization list in the Name column.
  3. In the project list, select the project that you want to delete, and then click Delete.
  4. In the dialog, type the project ID, and then click Shut down to delete the project.

Elimina le risorse

Se vuoi mantenere il progetto Google Cloud utilizzato in questo tutorial, elimina le singole risorse.

  1. In Cloud Shell, elimina la località del bucket Cloud Storage vincolo:

    kubectl delete -f tutorial-storagebucket-location-constraint.yaml
    
  2. Aggiungi il parametro Annotazione cnrm.cloud.google.com/force-destroy con un valore stringa di true per tutte le storagebucket risorse nello spazio dei nomi gestito da Config Connector:

    kubectl annotate storagebucket --all --namespace NAMESPACE \
      cnrm.cloud.google.com/force-destroy=true
    

    Questa annotazione è una direttiva che consente a Config Connector di eliminare un bucket Cloud Storage quando elimini la risorsa storagebucket corrispondente nel cluster GKE, anche se il bucket contiene oggetti.

  3. Elimina le risorse Config Connector che rappresentano Cloud Storage bucket:

    kubectl delete --namespace NAMESPACE storagebucket --all
    
  4. Elimina il cluster GKE:

    gcloud container clusters delete CLUSTER_NAME \
      --zone ZONE --async --quiet
    
  5. Elimina l'associazione dei criteri di Workload Identity in IAM:

    gcloud iam service-accounts remove-iam-policy-binding \
      SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
      --member "serviceAccount:$GOOGLE_CLOUD_PROJECT.svc.id.goog[cnrm-system/cnrm-controller-manager-NAMESPACE]" \
      --role roles/iam.workloadIdentityUser
    
  6. Elimina l'associazione del ruolo Amministratore Cloud Storage per l'account di servizio Google:

    gcloud projects remove-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
      --member "serviceAccount:SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com" \
      --role roles/storage.admin
    
  7. Elimina l'account di servizio Google che hai creato per Config Connector:

    gcloud iam service-accounts delete --quiet \
      SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
    

Passaggi successivi