Rafforza la sicurezza della tua app con Anthos Service Mesh e Config Management


Questo tutorial mostra come migliorare la strategia di sicurezza del cluster e dell'app. Immagina di essere un amministratore di piattaforma la cui organizzazione gestisce le app per il proprio negozio online con Anthos Service Mesh, una suite di strumenti che consente di monitorare e gestire un mesh di servizi affidabile. È tua responsabilità garantire che il tuo mesh e le tue app siano sicuri.

Puoi prevenire gli errori di configurazione e convalidare automaticamente i criteri di Anthos 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 Anthos 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 di Policy Controller e Config Sync insieme consente di applicare continuamente vincoli alle configurazioni dei criteri di Anthos Service Mesh.

Il seguente diagramma mostra una panoramica dell'interazione tra Anthos Service Mesh, Policy Controller e Config Sync in questo tutorial per gestire e proteggere un gateway in entrata e le app di esempio Online Boutique che utilizzi in questo tutorial:

Diagramma che mostra l'architettura creata per questo tutorial

Obiettivi

  • Crea un cluster Google Kubernetes Engine (GKE) e registralo in un parco risorse.
  • Installa Policy Controller, Config Sync e Anthos Service Mesh su un cluster.
  • Configura Config Sync per sincronizzare più repository
  • Applica le best practice per il deployment di configurazioni, app e risorse Istio con Config Sync.
  • Esegui il deployment delle configurazioni dei cluster, delle app di esempio di Online Boutique e di un gateway in entrata con Config Sync.
  • Utilizza il pacchetto di criteri Anthos Service Mesh di Policy Controller per applicare le seguenti best practice per la sicurezza:
    • Assicurati che tutti i carichi di lavoro nel mesh prevedano l'inserimento automatico di file collaterali.
    • Criptare tutto il traffico nel mesh.
    • Garantire che tutti i carichi di lavoro nel mesh abbiano un controllo granulare degli accessi.

Costi

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

  • GKE.
  • GKE Enterprise. La fatturazione per GKE Enterprise include la fatturazione per Anthos Service Mesh, Config Sync e Policy Controller.

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud possono essere idonei a una prova senza costi aggiuntivi.

Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.

Prima di iniziare

  1. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  2. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

prepara l'ambiente

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

  1. Nella console Google Cloud, attiva Cloud Shell.

    Attiva Cloud Shell

  2. Esegui l'upgrade alla versione più recente di Google Cloud CLI:

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

    mkdir ~/asm-acm-tutorial-dir
    
  4. Per semplificare la parte restante 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 chiesto 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 le 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 migliore per il 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
    

    Questa operazione può richiedere più di un minuto.

configura un cluster GKE

In questa sezione creerai un cluster GKE e quindi lo registri in un parco risorse. I parchi risorse sono un concetto di Google Cloud per l'organizzazione logica dei cluster e di altre risorse, consentendoti 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 installerai Anthos Service Mesh, Policy Controller e Config Sync. È anche il cluster in cui esegui il deployment delle app di esempio di Boutique Online.

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

    Questa operazione può richiedere più di cinque minuti.

  2. Per garantire la creazione riuscita del cluster GKE, descrivine lo 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 corretta registrazione del cluster GKE, descrivine lo 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 sull'installazione applicherai 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, usa i comandi sed per aggiornare acm-config.yaml. Con il file acm-config.yaml, Config Sync esegue il deployment dei manifest richiesti per ogni passaggio di questo tutorial. L'aggiornamento di un singolo file consente di concentrarsi sui concetti e sul flusso di protezione dei cluster, del mesh e delle applicazioni senza dover manipolare ripetutamente i file ed eseguire ripetutamente i comandi git.

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

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

Installa Policy Controller, Config Sync e Anthos Service Mesh gestito

Ora che hai creato e registrato il cluster, puoi installare Config Sync, Policy Controller e Anthos Service Mesh sul tuo cluster e configurarlo per la sincronizzazione dalle configurazioni dell'impostazione predefinita RootSync:

  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. Abilita Anthos 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. Abilita la gestione automatica di Anthos Service Mesh per consentire a Google di applicare la configurazione consigliata di Anthos 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 saperne di più sui campi di configurazione di Google Cloud CLI, consulta gcloud apply spec campi.

    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 tuo cluster. Poi, Config Sync inizia a sincronizzare tutte le configurazioni dell'elemento RootSync predefinito con il tuo cluster. Queste configurazioni installano e configurano i seguenti componenti chiave:

    • Gli oggetti RepoSync che configurano le app Online Boutique e il gateway in entrata sono sincronizzati:

      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 hanno bisogno di autorizzazioni aggiuntive per creare risorse Istio, un oggetto ClusterRole e due oggetti RoleBinding per concedere queste autorizzazioni vengono applicati anche al tuo cluster:

      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 assicurarti che l'installazione di Policy Controller e Config Sync sia riuscita, 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
    Hierarchy_Controller: PENDING
    

    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 la corretta installazione di Anthos Service Mesh, descrivine lo 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 proseguire con il tutorial, assicurati 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, eseguirai il deployment dell'applicazione di esempio Online Boutique e di un gateway in entrata per gestire il traffico in entrata.

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

    Il comando seguente utilizza sed per aggiornare il manifest acm-config.yaml in modo che Config Sync esegua il deployment delle risorse necessarie per 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 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 a questo:

    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 ulteriori informazioni, consulta Visualizzare lo stato di Config Sync in più cluster.

  3. Attendi che venga eseguito 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. Recupera 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 il deployment dell'app Online Boutique sia stato eseguito correttamente:

    echo http://${EXTERNAL_IP}
    

Applica i criteri per proteggere la rete mesh

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

Applica l'inserimento di proxy sidecar

In questa sezione applicherai i criteri per garantire che in tutti i carichi di lavoro nel mesh sia abilitata l'inserimento automatica dei sidecar.

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

    Il comando seguente utilizza sed per aggiornare il manifest acm-config.yaml e fare 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 valore K8sRequiredLabels Constraint che richiede che qualsiasi Namespace nel mesh contenga la specifica etichetta di iniezione proxy sidecar di Anthos Service Mesh:

      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 file collaterale proxy 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 a questo:

    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 i Constraints siano stati creati:

    kubectl get constraints
    

    Policy Controller può richiedere 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 a questo:

    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, ci sono 0 TOTAL-VIOLATIONS per questi Constraints.

  4. Per vedere questi Constraints in funzione, prova a creare un Namespace nel tuo cluster senza un label né un annotation:

    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"}
    

Forza l'applicazione della crittografia del traffico

In questa sezione applicherai i criteri per garantire che tutto il traffico nel mesh sia criptato.

  1. Per forzare l'applicazione della crittografia del traffico, applica i vincoli.

    Il comando seguente utilizza sed per aggiornare il manifest acm-config.yaml e fare 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 elemento AsmPeerAuthnMeshStrictMtls Constraint che applica in modo forzato mTLS a livello di mesh PeerAuthentication 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 di riferimento consente all'elemento 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 vieta 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 a tutti i PeerAuthentications di non 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 a questo:

    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 PeerAuthentication:

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

    L'output è simile a questo:

    [
      {
        "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 eseguendo il deployment di un PeerAuthentication in istio-system. Per impedire a tutti i servizi nel mesh di accettare traffico di testo non crittografato, imposta un criterio PeerAuthentication a livello di mesh con la modalità mTLS impostata su STRICT. Quando esegui il deployment del criterio, il piano di controllo esegue automaticamente il provisioning dei certificati TLS in modo che i carichi di lavoro possano autenticarsi l'uno con l'altro.

    Il comando seguente utilizza sed per aggiornare il manifest acm-config.yaml e fare 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. Questa azione applica mTLS STRICT all'intero 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 a questo:

    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 i Constraints siano stati creati:

    kubectl get constraints
    

    Tieni presente che questa operazione può richiedere alcuni minuti prima che Policy Controller valuti questi Constraints. Attendi ed esegui di nuovo questo comando kubectl get constraints fino a quando non ottieni valori nella colonna TOTAL-VIOLATIONS per ogni riga.

    L'output è simile a questo:

    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
    

Applicazione di un controllo granulare degli accessi

In questa sezione applicherai i criteri per garantire che tutti i carichi di lavoro nel mesh abbiano un controllo dell'accesso granulare.

  1. Per applicare un controllo granulare degli accessi, applica vincoli.

    Il comando seguente utilizza sed per aggiornare il manifest acm-config.yaml e fare 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 Constraint AsmAuthzPolicyDefaultDeny che applica l'impostazione predefinita di negazione AuthorizationPolicy a livello di mesh 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 Constraint AsmAuthzPolicyEnforceSourcePrincipals che impone che ogni AuthorizationPolicies definisce entità di origine granulari (diverse da "*"). Solo il gateway in entrata nello spazio dei nomi asm-ingress costituisce un'eccezione a questa regola per ricevere il traffico dagli utenti finali e reindirizzare il traffico 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 a questo:

    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 ulteriori informazioni sulla violazione associata:

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

    L'output è simile a questo:

    [
      {
        "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 comando seguente utilizza sed per aggiornare il manifest acm-config.yaml e fare 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 tipo di negazione AuthorizationPolicy 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 a questo:

    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 i Constraints siano stati creati:

    kubectl get constraints
    

    Tieni presente che questa operazione può richiedere alcuni minuti prima che Policy Controller valuti questi Constraints. Attendi ed esegui di nuovo questo comando kubectl get constraints fino a quando non ottieni valori nella colonna TOTAL-VIOLATIONS per ogni riga.

    L'output è simile a questo:

    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'intero mesh.

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

    Il comando seguente utilizza sed per aggiornare il manifest acm-config.yaml e fare 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 al fine di avere un'identità univoca per app valutata come principal in AuthorizationPolicies. Ecco un 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 a questo:

    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 vedere nel dettaglio le risorse gestite, puoi aggiungere il flag --managed-resources. Per ulteriori informazioni, consulta Visualizzare lo stato di Config Sync in più cluster.

  10. Visita nuovamente l'app Online Boutique dal browser:

    echo http://${EXTERNAL_IP}
    

    Se attendi qualche minuto, il sito web dovrebbe funzionare di nuovo come previsto.

Visualizza lo stato delle funzionalità di sicurezza di GKE Enterprise

Puoi visualizzare lo stato delle funzionalità di sicurezza di GKE Enterprise, inclusi i criteri di autenticazione e autorizzazione, nella console Google Cloud.

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

    Vai alla sicurezza di GKE Enterprise

    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 Controllo criteri per visualizzare gli stati dei criteri dei carichi di lavoro per il cluster e per entrambi gli spazi dei nomi (asm-ingress e onlineboutique).

    Le schede Controllo accesso ai servizi e Stato mTLS forniscono una panoramica generale.

    Panoramica generale del controllo dell'accesso ai servizi e dello stato di mTLS

    L'elenco Carichi di lavoro mostra lo stato controllo dell'accesso ai servizi e mTLS di ciascun carico di lavoro.

    Elenco dettagliato di ogni carico di lavoro e del relativo controllo dell'accesso ai servizi e stato di mTLS

Ora hai protetto il cluster e il 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

    Elimina un progetto Google Cloud:

    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 ti viene 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