Migliora la sicurezza della tua app con Cloud Service Mesh, Config Sync e Policy Controller


Questo tutorial mostra come migliorare la postura di sicurezza del cluster e dell'app. Immagina di essere un amministratore della piattaforma la cui organizzazione gestisce le app per il proprio negozio online con Cloud Service Mesh, una suite di strumenti che ti aiuta a monitorare e gestire un mesh di servizi affidabile. È tua responsabilità garantire la sicurezza della tua rete mesh e delle tue app.

Puoi evitare errori di configurazione e convalidare automaticamente i criteri di Cloud Service Mesh utilizzando Policy Controller e Config Sync. Policy Controller consente l'applicazione di criteri completamente programmabili per i cluster. Policy Controller include anche una libreria predefinita di modelli di vincolo che puoi utilizzare con il pacchetto di sicurezza Cloud Service Mesh per verificare la conformità delle vulnerabilità e delle best practice per la sicurezza del mesh. Config Sync riconcilia continuamente lo stato dei cluster con un set centrale di file di configurazione dichiarativi di Kubernetes. L'utilizzo combinato di Policy Controller e Config Sync ti consente di applicare continuamente i vincoli alle configurazioni dei criteri Cloud Service Mesh.

Il seguente diagramma mostra una panoramica di come Cloud Service Mesh, Policy Controller e Config Sync funzionano insieme in questo tutorial per gestire e proteggere un gateway in entrata e le app di esempio Online Boutique che utilizzi in questo tutorial:

Un diagramma che mostra l'architettura che crei per questo tutorial

Obiettivi

  • Crea un cluster Google Kubernetes Engine (GKE) e registralo in un parco risorse.
  • Installa Policy Controller, Config Sync e Cloud Service Mesh su un cluster.
  • Configura Config Sync per sincronizzare più repository
  • Applica le best practice per eseguire il deployment di configurazioni, app e risorse Istio con Config Sync.
  • Esegui il deployment delle configurazioni del cluster, delle app di esempio Online Boutique e di un gateway ingress con Config Sync.
  • Sfrutta il pacchetto di criteri Cloud Service Mesh di Policy Controller per applicare le seguenti best practice per la sicurezza:
    • Assicurati che tutti i workload nel mesh abbiano l'inserimento automatico di sidecar.
    • Cripta tutto il traffico nella mesh.
    • Garantire che tutti i carichi di lavoro nel mesh abbiano controllo dell'accesso granulare.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

  • GKE.
  • GKE Enterprise. The billing for GKE Enterprise includes billing for the Cloud Service Mesh, Config Sync, and Policy Controller.

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il calcolatore prezzi.

I nuovi utenti di Google Cloud potrebbero avere diritto a una prova senza costi.

Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per ulteriori informazioni, vedi Pulizia.

Prima di iniziare

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

prepara l'ambiente

In questa sezione, prepara l'ambiente in modo da poter installare Cloud Service Mesh, Policy Controller e Config Sync:

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

    Activate Cloud Shell

  2. Esegui l'upgrade all'ultima versione di Google Cloud CLI:

    gcloud components update
    
  3. Per archiviare i file che crei in questo tutorial, crea una directory:

    mkdir ~/asm-acm-tutorial-dir
    
  4. Per semplificare il resto del tutorial, crea le seguenti variabili di ambiente:

    PROJECT_ID=PROJECT_ID
    gcloud config set project $PROJECT_ID
    CLUSTER=asm-acm-tutorial
    CLUSTER_ZONE=us-east4-a
    MEMBERSHIP=asm-acm-tutorial
    PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format='get(projectNumber)')
    

    Sostituisci PROJECT_ID con l'ID progetto che vuoi utilizzare per questo tutorial.

    Se ti viene richiesto di autorizzare Cloud Shell, fai clic su Autorizza per completare l'operazione.

  5. Abilita le API necessarie per questo tutorial:

    gcloud

    gcloud services enable \
        mesh.googleapis.com \
        anthos.googleapis.com
    

    Config Connector

    Questo tutorial include risorse Config Connector. Puoi utilizzare queste risorse per completare le stesse attività che completi nella scheda gcloud. Per utilizzare queste risorse, installa Config Connector e applica le risorse nel modo più adatto al tuo ambiente.

    Utilizza il seguente manifest Services:

    apiVersion: serviceusage.cnrm.cloud.google.com/v1beta1
    kind: Service
    metadata:
      annotations:
        cnrm.cloud.google.com/deletion-policy: "abandon"
        cnrm.cloud.google.com/disable-dependent-services: "false"
      name: mesh.googleapis.com
    spec:
      resourceID: mesh.googleapis.com
      projectRef:
        external: PROJECT_ID
    ---
    apiVersion: serviceusage.cnrm.cloud.google.com/v1beta1
    kind: Service
    metadata:
      annotations:
        cnrm.cloud.google.com/deletion-policy: "abandon"
        cnrm.cloud.google.com/disable-dependent-services: "false"
      name: anthos.googleapis.com
    spec:
      resourceID: anthos.googleapis.com
      projectRef:
        external: PROJECT_ID
    

    Il completamento di questa operazione può richiedere più di un minuto.

  6. Configura un cluster GKE

    In questa sezione creerai un cluster GKE e lo registrerai in un parco risorse. I parchi risorse sono un concetto diGoogle Cloud per l'organizzazione logica dei cluster e di altre risorse; ti consentono di utilizzare e gestire le funzionalità multi-cluster e di applicare criteri coerenti in tutti i tuoi sistemi.

    Il cluster che crei in questa sezione è quello su cui installi Cloud Service Mesh, Policy Controller e Config Sync. È anche il cluster in cui esegui il deployment delle app di esempio Online Boutique.

    Per configurare il cluster, completa i seguenti passaggi:

    1. Crea un cluster GKE:

      gcloud

      gcloud container clusters create ${CLUSTER} \
          --zone ${CLUSTER_ZONE} \
          --machine-type=e2-standard-4 \
          --num-nodes 4 \
          --workload-pool ${PROJECT_ID}.svc.id.goog \
          --labels mesh_id=proj-${PROJECT_NUMBER}
      

      Config Connector

      Utilizza i seguenti manifest ContainerCluster e ContainerNodePool:

      apiVersion: container.cnrm.cloud.google.com/v1beta1
      kind: ContainerNodePool
      metadata:
        annotations:
          cnrm.cloud.google.com/project-id: PROJECT_ID
        name: asm-acm-tutorial
      spec:
        clusterRef:
          name: asm-acm-tutorial
        location: us-east4-a
        nodeConfig:
          machineType: e2-standard-4
        nodeCount: 4
      ---
      apiVersion: container.cnrm.cloud.google.com/v1beta1
      kind: ContainerCluster
      metadata:
        annotations:
          cnrm.cloud.google.com/project-id: PROJECT_ID
          cnrm.cloud.google.com/remove-default-node-pool: "true"
        labels:
          mesh_id: proj-PROJECT_NUMBER
        name: asm-acm-tutorial
      spec:
        location: us-east4-a
        initialNodeCount: 1
        workloadIdentityConfig:
          workloadPool: PROJECT_ID.svc.id.goog
      

      Sostituisci PROJECT_NUMBER con il valore della variabile di ambiente PROJECT_NUMBER recuperata in precedenza.

      Il completamento di questa operazione può richiedere più di cinque minuti.

    2. Per garantire la creazione corretta del cluster GKE, descrivi il suo stato:

      gcloud container clusters list \
          --zone ${CLUSTER_ZONE} \
          --project ${PROJECT_ID}
      

      L'output è simile al seguente:

      NAME                LOCATION      MASTER_VERSION   MASTER_IP      MACHINE_TYPE   NODE_VERSION     NUM_NODES  STATUS
      asm-acm-tutorial    us-east4-a    1.23.12-gke.100  35.186.179.30  e2-standard-4  1.23.12-gke.100  3          RUNNING
      
    3. Connettiti al cluster GKE:

      gcloud container clusters get-credentials ${CLUSTER} \
          --zone ${CLUSTER_ZONE} \
          --project ${PROJECT_ID}
      
    4. Registra il cluster in un parco risorse:

      gcloud

      gcloud container fleet memberships register ${MEMBERSHIP} \
          --project ${PROJECT_ID} \
          --gke-cluster ${CLUSTER_ZONE}/${CLUSTER} \
          --enable-workload-identity
      

      L'output è simile al seguente:

      kubeconfig entry generated for asm-acm-tutorial.
      Waiting for membership to be created...done.
      Created a new membership [projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial] for the cluster [asm-acm-tutorial]
      Generating the Connect Agent manifest...
      Deploying the Connect Agent on cluster [asm-acm-tutorial] in namespace [gke-connect]...
      Deployed the Connect Agent on cluster [asm-acm-tutorial] in namespace [gke-connect].
      Finished registering the cluster [asm-acm-tutorial] with the Fleet.
      

      Config Connector

      Utilizza il seguente manifest GKEHubMembership:

      apiVersion: gkehub.cnrm.cloud.google.com/v1beta1
      kind: GKEHubMembership
      metadata:
        annotations:
          cnrm.cloud.google.com/project-id: PROJECT_ID
        name: asm-acm-tutorial
      spec:
        location: global
        authority:
          issuer: https://container.googleapis.com/v1/projects/PROJECT_ID/locations/us-east4-a/clusters/asm-acm-tutorial
        endpoint:
          gkeCluster:
            resourceRef:
              name: asm-acm-tutorial
      
    5. Per garantire la registrazione corretta del cluster GKE, descrivi il suo stato:

      gcloud container fleet memberships list
      

      L'output è simile al seguente:

      NAME              EXTERNAL_ID                           LOCATION
      asm-acm-tutorial  0e12258c-8831-4d81-b5c0-5e7099a468cc  global
      

    Esplora i repository

    Nella seguente sezione di installazione, applichi un file manifest acm-config.yaml. Questo manifest configura il cluster per la sincronizzazione dalla cartella asm-acm-tutorial del repository di esempio. Questa cartella contiene tutti i file di configurazione necessari per completare il resto del tutorial.

    Per semplificare questo tutorial, utilizzi i comandi sed per aggiornare acm-config.yaml. Con il file acm-config.yaml, Config Sync esegue il deployment dei manifest necessari per ogni passaggio di questo tutorial. L'aggiornamento di un singolo file ti consente di concentrarti sui concetti e sul flusso di protezione dei cluster, della mesh e delle applicazioni senza manipolare ripetutamente i file ed eseguire ripetutamente i comandi git.

    Per utilizzare la funzionalità di Config Sync per sincronizzare più repository, utilizza le seguenti risorse:

    • root-sync, in quanto repository RootSync, contiene tutte le configurazioni del cluster, incluse RepoSyncs, Constraints, ClusterRole, RoleBindings e le risorse incluse in alcuni spazi dei nomi di sistema come istio-system.
    • ingress-gateway, come primo RepoSync, contiene tutte le risorse necessarie per il deployment di un gateway in entrata e per proteggerlo progressivamente durante questo tutorial.
    • online-boutique, come secondo RepoSync, contiene tutte le risorse necessarie per il deployment delle app Online Boutique e per proteggerle progressivamente durante questo tutorial.

    Installa Policy Controller, Config Sync e Cloud Service Mesh gestito

    Ora che hai creato e registrato il cluster, puoi installare Config Sync, Policy Controller e Cloud Service Mesh sul cluster e configurarlo in modo che si sincronizzi dalle configurazioni di RootSync predefinito:

    1. Abilita l'operatore ConfigManagement, che gestisce Config Sync e Policy Controller:

      gcloud

      gcloud beta container fleet config-management enable
      

      Config Connector

      Utilizza il seguente manifest GKEHubFeature:

      apiVersion: gkehub.cnrm.cloud.google.com/v1beta1
      kind: GKEHubFeature
      metadata:
        name: configmanagement
      spec:
        projectRef:
          external: PROJECT_ID
        location: global
        resourceID: configmanagement
      
    2. Abilitare Cloud Service Mesh nel tuo parco risorse.

      gcloud

      gcloud container fleet mesh enable
      

      Config Connector

      Utilizza il seguente manifest GKEHubFeature:

      apiVersion: gkehub.cnrm.cloud.google.com/v1beta1
      kind: GKEHubFeature
      metadata:
        name: servicemesh
      spec:
        projectRef:
          external: PROJECT_ID
        location: global
        resourceID: servicemesh
      
    3. Attiva la gestione automatica di Cloud Service Mesh per consentire a Google di applicare la configurazione consigliata di Cloud Service Mesh gestito:

      gcloud

      gcloud container fleet mesh update \
          --management automatic \
          --memberships ${MEMBERSHIP}
      

      Config Connector

      Utilizza il seguente manifest GKEHubFeatureMembership:

      apiVersion: gkehub.cnrm.cloud.google.com/v1beta1
      kind: GKEHubFeatureMembership
      metadata:
        name: servicemesh-membership
      spec:
        projectRef:
          external: PROJECT_ID
        location: global
        membershipRef:
          name: asm-acm-tutorial
        featureRef:
          name: servicemesh
        mesh:
          management: MANAGEMENT_AUTOMATIC
      
    4. Abilita Config Sync e Policy Controller:

      gcloud

      Salva il seguente manifest come acm-config.yaml nella directory ~/asm-acm-tutorial-dir:

      applySpecVersion: 1
      spec:
        configSync:
          enabled: true
          policyDir: asm-acm-tutorial/root-sync/init
          secretType: none
          sourceFormat: unstructured
          syncRepo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples
          syncBranch: main
        policyController:
          enabled: true
          referentialRulesEnabled: true
          templateLibraryInstalled: true
      

      Per scoprire di più sui campi di configurazione di Google Cloud CLI, consulta Campi per le specifiche dell'applicazione di gcloud.

      Applica il file:

      gcloud beta container fleet config-management apply \
          --membership ${MEMBERSHIP} \
          --config ~/asm-acm-tutorial-dir/acm-config.yaml
      

      Config Connector

      Utilizza il seguente manifest GKEHubFeatureMembership:

      apiVersion: gkehub.cnrm.cloud.google.com/v1beta1
      kind: GKEHubFeatureMembership
      metadata:
        name: configmanagement-membership
      spec:
        projectRef:
          external: PROJECT_ID
        location: global
        membershipRef:
          name: asm-acm-tutorial
        featureRef:
          name: configmanagement
        configmanagement:
          configSync:
            sourceFormat: unstructured
            git:
              policyDir: asm-acm-tutorial/root-sync/init
              secretType: none
              syncBranch: main
              syncRepo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples
          policyController:
            enabled: true
            referentialRulesEnabled: true
            templateLibraryInstalled: true
      

      Policy Controller e Config Sync sono installati sul cluster. Successivamente, Config Sync inizia a sincronizzare tutte le configurazioni di RootSync predefinito con il tuo cluster. Queste configurazioni installano e configurano i seguenti componenti chiave:

      • Vengono sincronizzati gli oggetti RepoSync che configurano le app Online Boutique e il gateway di ingresso:

        apiVersion: configsync.gke.io/v1beta1
        kind: RepoSync
        metadata:
          name: repo-sync
        spec:
          override:
            enableShellInRendering: true
          sourceFormat: unstructured
          git:
            repo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples
            revision: HEAD
            branch: main
            dir: asm-acm-tutorial/online-boutique/init
            auth: none
        apiVersion: configsync.gke.io/v1beta1
        kind: RepoSync
        metadata:
          name: repo-sync
        spec:
          override:
            enableShellInRendering: true
          sourceFormat: unstructured
          git:
            repo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples
            revision: HEAD
            branch: main
            dir: asm-acm-tutorial/ingress-gateway/init
            auth: none
      • Poiché i RepoSync riconciliatori richiedono autorizzazioni aggiuntive per creare risorse Istio, al cluster vengono applicati anche un ClusterRole e due oggetti RoleBinding per concedere queste autorizzazioni:

        apiVersion: rbac.authorization.k8s.io/v1
        kind: ClusterRole
        metadata:
          labels:
            rbac.authorization.k8s.io/aggregate-to-edit: "true"
          name: custom:aggregate-to-edit:istio
        rules:
        - apiGroups:
          - "networking.istio.io"
          - "security.istio.io"
          resources:
          - "virtualservices"
          - "authorizationpolicies"
          - "gateways"
          verbs:
          - "*"
        apiVersion: rbac.authorization.k8s.io/v1
        kind: RoleBinding
        metadata:
          name: repo-sync
        subjects:
        - kind: ServiceAccount
          name: ns-reconciler-onlineboutique
          namespace: config-management-system
        roleRef:
          kind: ClusterRole
          name: edit
          apiGroup: rbac.authorization.k8s.io
        apiVersion: rbac.authorization.k8s.io/v1
        kind: RoleBinding
        metadata:
          name: repo-sync
        subjects:
        - kind: ServiceAccount
          name: ns-reconciler-asm-ingress
          namespace: config-management-system
        roleRef:
          kind: ClusterRole
          name: edit
          apiGroup: rbac.authorization.k8s.io
    5. Per garantire l'installazione corretta di Policy Controller e Config Sync, controlla lo stato:

      gcloud beta container fleet config-management status
      

      L'output è simile al seguente:

      Name: asm-acm-tutorial
      Status: SYNCED
      Last_Synced_Token: 4b3384d
      Sync_Branch: main
      Last_Synced_Time: 2022-05-04T21:32:58Z
      Policy_Controller: INSTALLED
      

      Se vedi PENDING o NOT_INSTALLED nelle righe Status o Policy_Controller, attendi qualche minuto ed esegui di nuovo gcloud beta container fleet config-management status.

    6. Per garantire l'installazione corretta di Cloud Service Mesh, descrivi il suo stato:

      gcloud container fleet mesh describe
      

      L'output è simile al seguente:

      createTime: '2022-09-13T23:12:56.477042921Z'
      membershipSpecs:
        projects/PROJECT_NUMBER/locations/global/memberships/asm-acm-tutorial:
          mesh:
            management: MANAGEMENT_AUTOMATIC
      membershipStates:
        projects/PROJECT_NUMBER/locations/global/memberships/asm-acm-tutorial:
          servicemesh:
            controlPlaneManagement:
              details:
              - code: REVISION_READY
                details: 'Ready: asm-managed'
              state: ACTIVE
            dataPlaneManagement:
              details:
              - code: OK
                details: Service is running.
              state: ACTIVE
          state:
            code: OK
            description: |-
              Revision(s) ready for use: asm-managed.
              All Canonical Services have been reconciled successfully.
            updateTime: '2022-09-14T00:19:10.571552206Z'
      name: projects/PROJECT_ID/locations/global/features/servicemesh
      resourceState:
        state: ACTIVE
      spec: {}
      state:
        state: {}
      updateTime: '2022-09-14T00:19:14.135113118Z'
      

      Se vedi state.code: ERROR anziché state.code: OK, attendi qualche minuto ed esegui di nuovo gcloud container fleet mesh describe. Prima di procedere con il tutorial, devi assicurarti che il campo servicemesh.controlPlaneManagement.details.code abbia il valore REVISION_READY.

    Esegui il deployment di un gateway in entrata e di un'applicazione di esempio

    In questa sezione, esegui il deployment dell'applicazione di esempio Online Boutique e di un gateway di ingresso per gestire il traffico in entrata.

    1. Esegui il deployment dell'applicazione di esempio Online Boutique e del gateway in entrata.

      Il seguente comando utilizza sed per aggiornare il manifest acm-config.yaml in modo che Config Sync esegua il deployment delle risorse necessarie per eseguire il deployment del gateway in entrata e dell'app di esempio.

      sed -i "s,root-sync/init,root-sync/deployments,g" ~/asm-acm-tutorial-dir/acm-config.yaml
      gcloud beta container fleet config-management apply \
          --membership ${MEMBERSHIP} \
          --config ~/asm-acm-tutorial-dir/acm-config.yaml
      

      Tieni presente che il completamento di questo passaggio può richiedere alcuni minuti.

    2. Visualizza lo stato di Config Sync per RootSync e i due RepoSyncs:

      gcloud alpha anthos config sync repo describe
      

      L'output è simile al seguente:

      getting 3 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial
      [
        {
          "clusters": [
            "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial"
          ],
          "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03",
          "errors": [],
          "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/deployments@main",
          "status": "SYNCED"
        },
        {
          "clusters": [
            "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial"
          ],
          "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03",
          "errors": [],
          "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/ingress-gateway/deployments@main",
          "status": "SYNCED"
        },
        {
          "clusters": [
            "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial"
          ],
          "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03",
          "errors": [],
          "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/online-boutique/deployments@main",
          "status": "SYNCED"
        }
      ]
      

      Se vedi status: RECONCILING anziché status: SYNCED, attendi qualche minuto ed esegui di nuovo gcloud alpha anthos config sync repo describe.

      Per visualizzare solo le informazioni di un repository, puoi utilizzare i flag --sync-name e --sync-namespace. Per visualizzare in dettaglio le risorse gestite, aggiungi il flag --managed-resources. Per saperne di più, vedi Visualizzare lo stato di Config Sync in più cluster.

    3. Attendi il provisioning dell'indirizzo IP pubblico del gateway in entrata:

      until kubectl -n asm-ingress get svc asm-ingressgateway -o jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; done
      
    4. Ottieni l'indirizzo IP pubblico del gateway in entrata:

      EXTERNAL_IP=$(kubectl get svc asm-ingressgateway -n asm-ingress -o jsonpath="{.status.loadBalancer.ingress[*].ip}")
      
    5. Visita l'indirizzo IP dal browser per verificare che l'app Online Boutique sia stata implementata correttamente:

      echo http://${EXTERNAL_IP}
      

    Applica criteri per proteggere il mesh

    Nelle sezioni seguenti utilizzerai Policy Controller per applicare i criteri del pacchetto di criteri Cloud Service Mesh creando vincoli.

    Forza l'inserimento di proxy sidecar

    In questa sezione applichi i criteri per assicurarti che tutti i carichi di lavoro nel mesh abbiano l'inserimento automatico di sidecar attivato.

    1. Per forzare l'inserimento dei proxy sidecar, applica i vincoli.

      Il seguente comando utilizza sed per aggiornare il manifest acm-config.yaml in modo che Config Sync esegua il deployment delle risorse associate.

      sed -i "s,root-sync/deployments,root-sync/enforce-sidecar-injection,g" ~/asm-acm-tutorial-dir/acm-config.yaml
      gcloud beta container fleet config-management apply \
          --membership ${MEMBERSHIP} \
          --config ~/asm-acm-tutorial-dir/acm-config.yaml
      

      Il comando precedente esegue il deployment delle seguenti risorse:

      • Un K8sRequiredLabels Constraint che richiede che qualsiasi Namespace nel mesh contenga l'etichetta di inserimento del proxy sidecar Cloud Service Mesh specifica:

        apiVersion: constraints.gatekeeper.sh/v1beta1
        kind: K8sRequiredLabels
        metadata:
          name: namespace-sidecar-injection-label
        spec:
          enforcementAction: deny
          match:
            kinds:
            - apiGroups:
              - ""
              kinds:
              - Namespace
            excludedNamespaces:
            - config-management-monitoring
            - config-management-system
            - default
            - gatekeeper-system
            - gke-connect
            - istio-system
            - kube-node-lease
            - kube-public
            - kube-system
            - resource-group-system
          parameters:
            labels:
            - allowedRegex: enabled
              key: istio-injection
      • Un AsmSidecarInjection Constraint che impedisce a qualsiasi Pod nel mesh di bypassare l'inserimento del proxy sidecar Istio:

        apiVersion: constraints.gatekeeper.sh/v1beta1
        kind: AsmSidecarInjection
        metadata:
          name: pod-sidecar-injection-annotation
        spec:
          enforcementAction: deny
          match:
            kinds:
            - apiGroups:
              - ""
              kinds:
              - Pod
            excludedNamespaces:
            - kube-system
          parameters:
            strictnessLevel: High
    2. Visualizza lo stato di Config Sync per RootSync:

      gcloud alpha anthos config sync repo describe \
          --sync-name root-sync \
          --sync-namespace config-management-system
      

      L'output è simile al seguente:

      getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial
      [
        {
          "clusters": [
            "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial"
          ],
          "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
          "errors": [],
          "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-sidecar-injection@main",
          "status": "SYNCED"
        }
      ]
      

      Se vedi status: RECONCILING anziché status: SYNCED, attendi qualche minuto ed esegui di nuovo gcloud alpha anthos config sync repo describe.

    3. Verifica che siano stati creati i Constraints:

      kubectl get constraints
      

      Policy Controller potrebbe impiegare alcuni minuti per valutare questi vincoli. Se non vedi valori nella colonna TOTAL-VIOLATIONS, attendi ed esegui di nuovo kubectl get constraints.

      L'output è simile al seguente:

      NAME                                                                                       ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      podsidecarinjectionannotation.constraints.gatekeeper.sh/pod-sidecar-injection-annotation   deny                 0
      
      NAME                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      k8srequiredlabels.constraints.gatekeeper.sh/namespace-sidecar-injection-label   deny                 0
      

      Poiché abbiamo configurato correttamente Namespaces e Pods, sono disponibili 0 TOTAL-VIOLATIONS per questi Constraints.

    4. Per vedere questi Constraints all'opera, prova a creare un Namespace nel tuo cluster senza labelannotation:

      kubectl create namespace test
      

      L'output è simile al seguente errore:

      Error from server (Forbidden): admission webhook "validation.gatekeeper.sh" denied the request: [namespace-sidecar-injection-label] you must provide labels: {"istio-injection"}
      

    Applica la crittografia del traffico

    In questa sezione applichi le norme per garantire che tutto il traffico nel mesh sia criptato.

    1. Per applicare la crittografia del traffico, applica i vincoli.

      Il seguente comando utilizza sed per aggiornare il manifest acm-config.yaml in modo che Config Sync esegua il deployment delle risorse associate.

      sed -i "s,root-sync/enforce-sidecar-injection,root-sync/enforce-strict-mtls,g" ~/asm-acm-tutorial-dir/acm-config.yaml
      gcloud beta container fleet config-management apply \
          --membership ${MEMBERSHIP} \
          --config ~/asm-acm-tutorial-dir/acm-config.yaml
      

      Il comando precedente esegue il deployment delle seguenti risorse:

      • Un AsmPeerAuthnMeshStrictMtls Constraint che applica mTLS PeerAuthentication a livello di mesh nello spazio dei nomi istio-system:

        apiVersion: constraints.gatekeeper.sh/v1beta1
        kind: AsmPeerAuthnMeshStrictMtls
        metadata:
          name: mesh-level-strict-mtls
        spec:
          enforcementAction: deny
          parameters:
            rootNamespace: istio-system
            strictnessLevel: High
      • Un vincolo referenziale Config nello spazio dei nomi gatekeeper-system. Questo vincolo referenziale consente a AsmPeerAuthnMeshStrictMtls Constraint di fare riferimento a un altro oggetto nella sua definizione (ad esempio, la ricerca di qualsiasi PeerAuthentication in istio-system Namespace):

        apiVersion: config.gatekeeper.sh/v1alpha1
        kind: Config
        metadata:
          name: config
        spec:
          sync:
            syncOnly:
              - group: ""
                version: "v1"
                kind: "Namespace"
              - group: "security.istio.io"
                version: "v1beta1"
                kind: "PeerAuthentication"
              - group: "security.istio.io"
                version: "v1beta1"
                kind: "AuthorizationPolicy"
      • Un DestinationRuleTLSEnabled Constraint che impedisce la disattivazione di TLS per tutti gli host e i sottoinsiemi di host in Istio DestinationRules:

        apiVersion: constraints.gatekeeper.sh/v1beta1
        kind: DestinationRuleTLSEnabled
        metadata:
          name: destination-rule-tls-enabled
        spec:
          enforcementAction: deny
          match:
            kinds:
            - apiGroups:
              - networking.istio.io
              kinds:
              - DestinationRule
      • Un AsmPeerAuthnStrictMtls Constraint che impone che tutti i PeerAuthentications non possano sovrascrivere STRICT mTLS:

        apiVersion: constraints.gatekeeper.sh/v1beta1
        kind: AsmPeerAuthnStrictMtls
        metadata:
          name: peerauthentication-strict-mtls
        spec:
          enforcementAction: deny
          match:
            kinds:
            - apiGroups:
              - security.istio.io
              kinds:
              - PeerAuthentication
          parameters:
            strictnessLevel: High
    2. Visualizza lo stato di Config Sync per RootSync:

      gcloud alpha anthos config sync repo describe \
          --sync-name root-sync \
          --sync-namespace config-management-system
      

      L'output è simile al seguente:

      getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial
      [
        {
          "clusters": [
            "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial"
          ],
          "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
          "errors": [],
          "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-strict-mtls@main",
          "status": "SYNCED"
        }
      ]
      

      Se vedi status: RECONCILING anziché status: SYNCED, attendi qualche minuto ed esegui di nuovo gcloud alpha anthos config sync repo describe.

    3. Esegui questo comando per ottenere ulteriori informazioni sulla violazione di PeerAuthentication:

      kubectl get asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls -ojsonpath='{.status.violations}'  | jq
      

      L'output è simile al seguente:

      [
        {
          "enforcementAction": "deny",
          "group": "constraints.gatekeeper.sh",
          "kind": "AsmPeerAuthnMeshStrictMtls",
          "message": "Root namespace <istio-system> does not have a strict mTLS PeerAuthentication",
          "name": "mesh-level-strict-mtls",
          "version": "v1beta1"
        }
      ]
      
    4. Risolvi il problema implementando un PeerAuthentication in istio-system. Per impedire a tutti i servizi nel mesh di accettare il traffico in testo non crittografato, imposta una policy PeerAuthentication a livello di mesh con la modalità mTLS impostata su STRICT. Quando esegui il deployment della policy, il control plane esegue automaticamente il provisioning dei certificati TLS in modo che i workload possano autenticarsi a vicenda.

      Il seguente comando utilizza sed per aggiornare il manifest acm-config.yaml in modo che Config Sync esegua il deployment delle risorse associate.

      sed -i "s,root-sync/enforce-strict-mtls,root-sync/fix-strict-mtls,g" ~/asm-acm-tutorial-dir/acm-config.yaml
      gcloud beta container fleet config-management apply \
          --membership ${MEMBERSHIP} \
          --config ~/asm-acm-tutorial-dir/acm-config.yaml
      

      Il comando precedente esegue il deployment del seguente STRICT mTLS PeerAuthentication nello spazio dei nomi istio-system. In questo modo, mTLS STRICT viene applicato all'intera mesh:

      apiVersion: security.istio.io/v1beta1
      kind: PeerAuthentication
      metadata:
        name: default
      spec:
        mtls:
          mode: STRICT
    5. Visualizza lo stato di Config Sync per RootSync:

      gcloud alpha anthos config sync repo describe \
          --sync-name root-sync \
          --sync-namespace config-management-system
      

      L'output è simile al seguente:

      getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial
      [
        {
          "clusters": [
            "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial"
          ],
          "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
          "errors": [],
          "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/fix-strict-mtls@main",
          "status": "SYNCED"
        }
      ]
      

      Se vedi status: RECONCILING anziché status: SYNCED, attendi qualche minuto ed esegui di nuovo gcloud alpha anthos config sync repo describe.

    6. Verifica che siano stati creati i Constraints:

      kubectl get constraints
      

      Tieni presente che potrebbero essere necessari alcuni minuti prima che Policy Controller inizi a valutare questi Constraints. Attendi ed esegui di nuovo questo comando kubectl get constraints finché non ottieni valori nella colonna TOTAL-VIOLATIONS per ogni riga.

      L'output è simile al seguente:

      NAME                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      k8srequiredlabels.constraints.gatekeeper.sh/namespace-sidecar-injection-label   deny                 0
      NAME                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls   deny                 0
      NAME                                                                               ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      destinationruletlsenabled.constraints.gatekeeper.sh/destination-rule-tls-enabled   deny                 0
      NAME                                                                              ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      asmpeerauthnstrictmtls.constraints.gatekeeper.sh/peerauthentication-strict-mtls   deny                 0
      NAME                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      asmsidecarinjection.constraints.gatekeeper.sh/pod-sidecar-injection-annotation   deny                 0
      

    Applica controllo dell'accesso granulare

    In questa sezione applichi i criteri per garantire che tutti i workload nel mesh abbiano un controllo dell'accesso granulare.

    1. Per applicare controllo dell'accesso granulare, applica i vincoli.

      Il seguente comando utilizza sed per aggiornare il manifest acm-config.yaml in modo che Config Sync esegua il deployment delle risorse associate.

      sed -i "s,root-sync/fix-strict-mtls,root-sync/enforce-authorization-policies,g" ~/asm-acm-tutorial-dir/acm-config.yaml
      gcloud beta container fleet config-management apply \
          --membership ${MEMBERSHIP} \
          --config ~/asm-acm-tutorial-dir/acm-config.yaml
      

      Il comando precedente esegue il deployment delle seguenti risorse:

      • Un AsmAuthzPolicyDefaultDeny Constraint che applica il valore predefinito di negazione a livello di mesh AuthorizationPolicy nello spazio dei nomi istio-system:

        apiVersion: constraints.gatekeeper.sh/v1beta1
        kind: AsmAuthzPolicyDefaultDeny
        metadata:
          name: default-deny-authorization-policies
        spec:
          enforcementAction: deny
          parameters:
            rootNamespace: istio-system
            strictnessLevel: High
      • Un AsmAuthzPolicyEnforceSourcePrincipals Constraint che impone che qualsiasi AuthorizationPolicies definisca principal di origine granulari (diversi da "*"). Solo l'ingress gateway nello spazio dei nomi asm-ingress è un'eccezione a questa regola per ricevere il traffico dagli utenti finali e reindirizzarlo all'app frontend di Online Boutique.

        apiVersion: constraints.gatekeeper.sh/v1beta1
        kind: AsmAuthzPolicyEnforceSourcePrincipals
        metadata:
          name: authz-source-principals-not-all
        spec:
          enforcementAction: deny
          match:
            kinds:
            - apiGroups:
              - security.istio.io
              kinds:
              - AuthorizationPolicy
            excludedNamespaces:
              - asm-ingress
    2. Visualizza lo stato di Config Sync per RootSync:

      gcloud alpha anthos config sync repo describe \
          --sync-name root-sync \
          --sync-namespace config-management-system
      

      L'output è simile al seguente:

      getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial
      [
        {
          "clusters": [
            "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial"
          ],
          "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
          "errors": [],
          "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-authorization-policies@main",
          "status": "SYNCED"
        }
      ]
      

      Se vedi status: RECONCILING anziché status: SYNCED, attendi qualche minuto ed esegui di nuovo gcloud alpha anthos config sync repo describe.

    3. Esegui questo comando per ottenere maggiori informazioni sulla violazione associata:

      kubectl get asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/default-deny-authorization-policies -ojsonpath='{.status.violations}'  | jq
      

      L'output è simile al seguente:

      [
        {
          "enforcementAction": "deny",
          "group": "constraints.gatekeeper.sh",
          "kind": "AsmAuthzPolicyDefaultDeny",
          "message": "Root namespace <istio-system> does not have a default deny AuthorizationPolicy",
          "name": "default-deny-authorization-policies",
          "version": "v1beta1"
        }
      ]
      
    4. Risolvi il problema eseguendo il deployment di AuthorizationPolicy nello spazio dei nomi istio-system.

      Il seguente comando utilizza sed per aggiornare il manifest acm-config.yaml in modo che Config Sync esegua il deployment delle risorse associate.

      sed -i "s,root-sync/enforce-authorization-policies,root-sync/fix-default-deny-authorization-policy,g" ~/asm-acm-tutorial-dir/acm-config.yaml
      gcloud beta container fleet config-management apply \
          --membership ${MEMBERSHIP} \
          --config ~/asm-acm-tutorial-dir/acm-config.yaml
      

      Il comando precedente esegue il deployment del seguente AuthorizationPolicy deny-all nello spazio dei nomi istio-system:

      apiVersion: security.istio.io/v1beta1
      kind: AuthorizationPolicy
      metadata:
        name: deny-all
      spec:
        {}
    5. Visualizza lo stato di Config Sync per RootSync:

      gcloud alpha anthos config sync repo describe \
          --sync-name root-sync \
          --sync-namespace config-management-system
      

      L'output è simile al seguente:

      getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial
      [
        {
          "clusters": [
            "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial"
          ],
          "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
          "errors": [],
          "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/fix-default-deny-authorization-policy@main",
          "status": "SYNCED"
        }
      ]
      

      Se vedi status: RECONCILING anziché status: SYNCED, attendi qualche minuto ed esegui di nuovo gcloud alpha anthos config sync repo describe.

    6. Verifica che siano stati creati i Constraints:

      kubectl get constraints
      

      Tieni presente che potrebbero essere necessari alcuni minuti prima che Policy Controller inizi a valutare questi Constraints. Attendi ed esegui di nuovo questo comando kubectl get constraints finché non ottieni valori nella colonna TOTAL-VIOLATIONS per ogni riga.

      L'output è simile al seguente:

      NAME                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      asmsidecarinjection.constraints.gatekeeper.sh/pod-sidecar-injection-annotation   deny                 0
      NAME                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      k8srequiredlabels.constraints.gatekeeper.sh/namespace-sidecar-injection-label   deny                 0
      NAME                                                                                      ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/default-deny-authorization-policies   deny                 0
      NAME                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls   deny                 0
      NAME                                                                               ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      destinationruletlsenabled.constraints.gatekeeper.sh/destination-rule-tls-enabled   deny                 0
      NAME                                                                              ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      asmpeerauthnstrictmtls.constraints.gatekeeper.sh/peerauthentication-strict-mtls   deny                 0
      NAME                                                                                              ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      asmauthzpolicyenforcesourceprincipals.constraints.gatekeeper.sh/authz-source-principals-not-all   deny                 0
      
    7. Visita l'app Online Boutique dal browser:

      echo http://${EXTERNAL_IP}
      

      Dovresti ricevere l'errore: RBAC: access denied che conferma che il rifiuto predefinito AuthorizationPolicy viene applicato all'intera mesh.

    8. Risolvi questo problema eseguendo il deployment di AuthorizationPolicies più granulari negli spazi dei nomi asm-ingress e onlineboutique.

      Il seguente comando utilizza sed per aggiornare il manifest acm-config.yaml in modo che Config Sync esegua il deployment delle risorse associate.

      sed -i "s,root-sync/fix-default-deny-authorization-policy,root-sync/deploy-authorization-policies,g" ~/asm-acm-tutorial-dir/acm-config.yaml
      gcloud beta container fleet config-management apply \
          --membership ${MEMBERSHIP} \
          --config ~/asm-acm-tutorial-dir/acm-config.yaml
      

      Il comando precedente esegue il deployment delle seguenti risorse:

      • Un AuthorizationPolicy nello spazio dei nomi asm-ingress:

        apiVersion: security.istio.io/v1beta1
        kind: AuthorizationPolicy
        metadata:
          name: asm-ingressgateway
        spec:
          selector:
            matchLabels:
              asm: ingressgateway
          rules:
          - to:
            - operation:
                ports:
                - "8080"
      • Un AuthorizationPolicy per app nello spazio dei nomi onlineboutique, ecco l'esempio per l'app cartservice:

        apiVersion: security.istio.io/v1beta1
        kind: AuthorizationPolicy
        metadata:
          name: cartservice
        spec:
          selector:
            matchLabels:
              app: cartservice
          rules:
          - from:
            - source:
                principals:
                - cluster.local/ns/onlineboutique/sa/frontend
                - cluster.local/ns/onlineboutique/sa/checkoutservice
            to:
            - operation:
                paths:
                - /hipstershop.CartService/AddItem
                - /hipstershop.CartService/GetCart
                - /hipstershop.CartService/EmptyCart
                methods:
                - POST
                ports:
                - "7070"
      • Un ServiceAccount per app negli spazi dei nomi asm-ingress e onlineboutique per avere un'identità univoca per app valutata come principal in AuthorizationPolicies. Ecco l'esempio per l'app cartservice:

        apiVersion: v1
        kind: ServiceAccount
        metadata:
          name: cartservice
    9. Visualizza lo stato di Config Sync per RootSync e i due RepoSyncs:

      gcloud alpha anthos config sync repo describe
      

      L'output è simile al seguente:

      getting 3 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial
      [
        {
          "clusters": [
            "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial"
          ],
          "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
          "errors": [],
          "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/deploy-authorization-policies@main",
          "status": "SYNCED"
        },
        {
          "clusters": [
            "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial"
          ],
          "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
          "errors": [],
          "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/ingress-gateway/authorization-policies@main",
          "status": "SYNCED"
        },
        {
          "clusters": [
            "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial"
          ],
          "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
          "errors": [],
          "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/online-boutique/authorization-policies@main",
          "status": "SYNCED"
        }
      ]
      

      Se vedi status: RECONCILING anziché status: SYNCED, attendi qualche minuto ed esegui di nuovo gcloud alpha anthos config sync repo describe.

      Per visualizzare solo le informazioni di un repository, puoi utilizzare i flag --sync-name e --sync-namespace. Per visualizzare in dettaglio le risorse gestite, puoi aggiungere il flag --managed-resources. Per saperne di più, vedi Visualizzare lo stato di Config Sync in più cluster.

    10. Visita di nuovo l'app Online Boutique dal browser:

      echo http://${EXTERNAL_IP}
      

      Se attendi qualche minuto, dovresti vedere di nuovo il sito web funzionare correttamente come previsto.

    Visualizzare lo stato delle funzionalità di sicurezza di GKE Enterprise

    Puoi visualizzare lo stato delle funzionalità di sicurezza di GKE Enterprise, incluse le policy di autenticazione e autorizzazione, nella console Google Cloud .

    1. Nella console Google Cloud , vai alla pagina GKE Enterprise Security.

      Vai a GKE Enterprise Security

      Il Riepilogo dei criteri mostra lo stato della sicurezza delle applicazioni, inclusi il controllo dell'accesso ai servizi (AuthorizationPolicies) e mTLS.

    2. Fai clic su Audit policy per visualizzare gli stati dei criteri del workload per il cluster e per entrambi gli spazi dei nomi (asm-ingress e onlineboutique).

      Le schede Controllo dell'accesso ai servizi e Stato mTLS forniscono una panoramica di alto livello.

      Panoramica generale del controllo dell&#39;accesso al servizio e dello stato di mTLS

      L'elenco Workloads mostra lo stato del controllo dell'accesso al servizio e di mTLS di ogni workload.

      Elenco dettagliato di ogni workload e del relativo controllo dell&#39;accesso al servizio e stato mTLS

    Ora hai protetto il tuo cluster e la tua mesh con Policy Controller e Config Sync.

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

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

Elimina singole risorse

Per eliminare le singole risorse:

  1. Annulla la registrazione del cluster dal parco risorse:

    gcloud

    gcloud container fleet memberships unregister ${CLUSTER} \
        --project=${PROJECT_ID} \
        --gke-cluster=${CLUSTER_ZONE}/${CLUSTER}
    

    L'output è simile al seguente:

    kubeconfig entry generated for asm-acm-tutorial.
    Waiting for membership to be deleted...done.
    Deleting membership CR in the cluster...done.
    Deleting namespace [gke-connect] in the cluster...done.
    

    Config Connector

    kubectl delete -f ~/asm-acm-tutorial-dir/fleet-membership.yaml
    
  2. Elimina il cluster:

    gcloud

    gcloud container clusters delete ${CLUSTER} \
        --zone ${CLUSTER_ZONE}
    

    Premi y quando richiesto. Il completamento di questo comando può richiedere più di cinque minuti.

    L'output è simile al seguente:

    Deleting cluster asm-acm-tutorial...done.
    Deleted [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/us-east4-a/clusters/asm-acm-tutorial].
    

    Config Connector

    kubectl delete -f ~/asm-acm-tutorial-dir/container-cluster.yaml
    
  3. Elimina i file che hai creato:

    rm -r ~/asm-acm-tutorial-dir
    

Passaggi successivi