Fortalece la seguridad de tu app con Cloud Service Mesh, el Sincronizador de configuración y Policy Controller


En este instructivo, se muestra cómo mejorar la posición de seguridad de tu clúster y app. Imagina que eres un administrador de plataforma cuya organización administra las apps para la tienda en línea con Cloud Service Mesh, un conjunto de herramientas que te ayuda a supervisar y administrar una malla de servicios confiable. Eres responsable de garantizar que la malla y las apps sean seguras.

Puedes evitar una configuración incorrecta y validar de forma automática las políticas de Cloud Service Mesh mediante el Controlador de políticas y el Sincronizador de configuración. El controlador de políticas permite la aplicación de políticas completamente programables para tus clústeres. Policy Controller también incluye una biblioteca predeterminada plantillas de restricciones que puedes usar con el Paquete de seguridad de la malla de servicios de Cloud para auditar el cumplimiento de las vulnerabilidades y prácticas recomendadas de seguridad en malla. El Sincronizador de configuración concilia de forma continua el estado de los clústeres con un conjunto central de archivos de configuración declarativos de Kubernetes. Si usas el controlador de políticas y el Sincronizador de configuración juntos, puedes aplicar restricciones de forma continua en las opciones de configuración de la política de Cloud Service Mesh.

En el siguiente diagrama, se muestra una descripción general de cómo funcionan Cloud Service Mesh, el controlador de políticas y el Sincronizador de configuración en conjunto en este instructivo para administrar y proteger una puerta de enlace de entrada y las apps de ejemplo Online Boutique que utilizas en este instructivo:

Un diagrama que muestra la arquitectura que crearás para este instructivo

Objetivos

  • Crear un clúster de Google Kubernetes Engine (GKE) y registrarlo en una flota.
  • Instalar el controlador de políticas, el Sincronizador de configuración y Cloud Service Mesh en un clúster.
  • Configura el Sincronizador de configuración para sincronizar varios repositorios
  • Aplica las prácticas recomendadas para implementar archivos de configuración, apps y recursos de Istio con el Sincronizador de configuración.
  • Implementa archivos de configuración de clúster, las apps de muestra Online Boutique y una puerta de enlace de entrada con el Sincronizador de configuración.
  • Aprovecha el paquete de políticas de Cloud Service Mesh del controlador de políticas para aplicar las siguientes prácticas recomendadas de seguridad:
    • Garantizar que todas las cargas de trabajo en la malla tengan una inserción automática de archivo adicional.
    • Encripta todo el tráfico en la malla.
    • Garantiza que todas las cargas de trabajo en la malla tengan control de acceso detallado.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

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

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.

Antes de comenzar

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

    Go to project selector

  2. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

Prepare el entorno

En esta sección, prepararás tu entorno para poder instalar Malla de servicios de Cloud, Policy Controller y Sincronizador de configuración:

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

    Activate Cloud Shell

  2. Actualiza a la versión más reciente de Google Cloud CLI:

    gcloud components update
    
  3. Para almacenar los archivos creados en este instructivo, crea un directorio:

    mkdir ~/asm-acm-tutorial-dir
    
  4. Para simplificar el resto del instructivo, crea las siguientes variables de entorno:

    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)')
    

    Reemplaza PROJECT_ID por el ID del proyecto que deseas usar para este instructivo.

    Si se te solicita que autorices a Cloud Shell, haz clic en Autorizar para completar la operación.

  5. Habilita las API que necesitarás para este instructivo:

    gcloud

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

    Config Connector

    En este instructivo, se incluye Config Connector de Google Cloud. Puedes usar estos recursos para completar las mismas tareas que completas en la pestaña gcloud. Para utilizar estos recursos, instalar Config Connector y aplicar los recursos de la forma que mejor se adapte a tu entorno.

    Usa el siguiente manifiesto 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
    

    Esta operación puede tardar más de un minuto en completarse.

Configura un clúster de GKE

En esta sección, crearás un clúster de GKE y, luego, lo registrarás en una flota. Las flotas son un concepto de Google Cloud que organiza de manera lógica los clústeres y otros recursos, lo que te permite usar y administrar capacidades de varios clústeres y aplicar políticas coherentes en tus sistemas.

El clúster que crearás en esta sección es el que instalarás. Cloud Service Mesh, Policy Controller y Sincronizador de configuración están activados. También es el clúster en el que implementarás las apps de ejemplo Online Boutique.

Para configurar tu clúster, completa los siguientes pasos:

  1. Crea un clúster de 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

    Usa los siguientes manifiestos ContainerCluster y 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
    

    Reemplaza PROJECT_NUMBER por el valor de la variable de entorno PROJECT_NUMBER que se recuperó antes.

    Esta operación puede tardar más de cinco minutos en completarse.

  2. Para garantizar la creación correcta del clúster de GKE, describe su estado:

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

    El resultado es similar a este:

    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. Conéctate al clúster de GKE:

    gcloud container clusters get-credentials ${CLUSTER} \
        --zone ${CLUSTER_ZONE} \
        --project ${PROJECT_ID}
    
  4. Registra tu clúster en una flota:

    gcloud

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

    El resultado es similar a este:

    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

    Usa el siguiente manifiesto 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. Para garantizar el registro correcto del clúster de GKE, describe su estado:

    gcloud container fleet memberships list
    

    El resultado es similar a este:

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

Explora los repositorios

En la siguiente sección de instalación, aplicarás un el archivo de manifiesto acm-config.yaml. En este manifiesto, se configura el clúster para que se sincronice desde la carpeta asm-acm-tutorial del repositorio de muestra. Esta carpeta contiene todos los archivos de configuración que necesitas para completar el resto del instructivo.

Para simplificar este instructivo, usa los comandos de sed a fin de actualizar acm-config.yaml. Con el archivo acm-config.yaml, el Sincronizador de configuración implementa los manifiestos necesarios para cada paso de este instructivo. La actualización de un solo archivo te ayuda a enfocarte en los conceptos y el flujo de protección de los clústeres, la malla y las aplicaciones sin manipular los archivos ni ejecutar los comandos de git de manera repetida.

Para usar la capacidad del Sincronizador de configuración de sincronizar varios repositorios, usa los siguientes recursos:

  • root-sync, como repositorio de RootSync, contiene todos los archivos de configuración del clúster, incluidos RepoSyncs, Constraints. , ClusterRole, RoleBindings y los recursos incluidos en algunos espacios de nombres del sistema, como istio-system.
  • ingress-gateway, como primer RepoSync, contiene todos los recursos necesarios para implementar una puerta de enlace de entrada y protegerla de forma progresiva durante este instructivo.
  • online-boutique, como segundo RepoSync, contiene todos los recursos necesarios para implementar las apps de Online Boutique y protegerlas de forma progresiva durante este instructivo.

Instala el controlador de políticas, el Sincronizador de configuración y Cloud Service Mesh administrado

Ahora que creaste y registraste tu clúster, puedes instalar el Sincronizador de configuración, el controlador de políticas y Cloud Service Mesh en el clúster y configurarlo para que se sincronice con los archivos de configuración de RootSync predeterminados:

  1. Habilita el operador ConfigManagement, que administra el Sincronizador de configuración y Policy Controller:

    gcloud

    gcloud beta container fleet config-management enable
    

    Config Connector

    Usa el siguiente manifiesto GKEHubFeature:

    apiVersion: gkehub.cnrm.cloud.google.com/v1beta1
    kind: GKEHubFeature
    metadata:
      name: configmanagement
    spec:
      projectRef:
        external: PROJECT_ID
      location: global
      resourceID: configmanagement
    
  2. Habilita Cloud Service Mesh en tu flota.

    gcloud

    gcloud container fleet mesh enable
    

    Config Connector

    Usa el siguiente manifiesto GKEHubFeature:

    apiVersion: gkehub.cnrm.cloud.google.com/v1beta1
    kind: GKEHubFeature
    metadata:
      name: servicemesh
    spec:
      projectRef:
        external: PROJECT_ID
      location: global
      resourceID: servicemesh
    
  3. Habilita la administración automática de Cloud Service Mesh para permitir que Google aplique la configuración recomendada de Cloud Service Mesh administrado:

    gcloud

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

    Config Connector

    Usa el siguiente manifiesto 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. Habilita el Sincronizador de configuración y Policy Controller:

    gcloud

    Guarda el siguiente manifiesto como acm-config.yaml. En el directorio ~/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
    

    Para obtener más información sobre los campos de configuración de Google Cloud CLI, consulta gcloud apply spec fields.

    Aplica el siguiente archivo:

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

    Config Connector

    Usa el siguiente manifiesto 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
    

    El Controlador de políticas y el Sincronizador de configuración están instalados en tu clúster. Luego, El Sincronizador de configuración comienza a sincronizar todos los parámetros de configuración del RootSync predeterminado tu clúster. Estos parámetros de configuración instalan y configuran la siguiente clave componentes:

    • Los objetos RepoSync que configuran las apps Online Boutique y la puerta de enlace de entrada se sincronizan:

      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
    • Dado que los conciliadores RepoSync necesitan permisos adicionales para crear recursos de Istio, también se aplican un ClusterRole y dos objetos RoleBinding a fin de otorgar estos permisos al clúster:

      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. Para garantizar la instalación correcta de Policy Controller y El Sincronizador de configuración, verifica el estado:

    gcloud beta container fleet config-management status
    

    El resultado es similar a este:

    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
    

    Si ves PENDING o NOT_INSTALLED en las filas Status o Policy_Controller, espera unos minutos y vuelve a ejecutar gcloud beta container fleet config-management status.

  6. Para garantizar la instalación correcta de Cloud Service Mesh, describe su estado:

    gcloud container fleet mesh describe
    

    El resultado es similar a este:

    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'
    

    Si ves state.code: ERROR en lugar de state.code: OK, espera unos minutos y vuelve a ejecutar gcloud container fleet mesh describe. Antes de continuar con el instructivo, debes asegurarte de que el campo servicemesh.controlPlaneManagement.details.code tenga el valor REVISION_READY.

Implementa una puerta de enlace de entrada y una aplicación de muestra

En esta sección, implementarás el Aplicación de muestra Online Boutique y una puerta de enlace de entrada para administrar el tráfico de entrada.

  1. Implementa la aplicación de muestra Online Boutique y la puerta de enlace de entrada.

    En el siguiente comando, se usa sed a fin de actualizar el manifiesto acm-config.yaml para que el Sincronizador de configuración implemente los recursos que necesitas a fin de usar la puerta de enlace de entrada y la app de muestra.

    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
    

    Este paso puede tardar unos minutos en completarse.

  2. Consulta el estado del Sincronizador de configuración de RootSync y los dos RepoSyncs:

    gcloud alpha anthos config sync repo describe
    

    El resultado es similar al siguiente:

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

    Si ves status: RECONCILING en lugar de status: SYNCED, espera unos minutos y vuelve a ejecutar gcloud alpha anthos config sync repo describe.

    Para ver solo la información de un repositorio, puedes usar las marcas --sync-name y --sync-namespace. Para ver los recursos administrados en detalle, agrega la marca --managed-resources. Para obtener más información, consulta Visualiza el estado del Sincronizador de configuración en varios clústeres.

  3. Espera a que se aprovisione la dirección IP pública de la puerta de enlace de entrada:

    until kubectl -n asm-ingress get svc asm-ingressgateway -o jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; done
    
  4. Obtén la dirección IP pública de la puerta de enlace de entrada:

    EXTERNAL_IP=$(kubectl get svc asm-ingressgateway -n asm-ingress -o jsonpath="{.status.loadBalancer.ingress[*].ip}")
    
  5. Visita la dirección IP desde tu navegador para verificar que la aplicación Online Boutique se haya implementado correctamente:

    echo http://${EXTERNAL_IP}
    

Aplica políticas para proteger tu malla

En las siguientes secciones, aprovecharás Controlador de políticas para aplicar políticas desde la Paquete de políticas de la malla de servicios de Cloud creando restricciones.

Aplica la inyección de proxies de sidecar

En esta sección, aplicarás políticas para garantizar que todas las cargas de trabajo de la malla tengan habilitada la inyección automática de sidecar.

  1. Para aplicar la inserción de proxies de sidecar, aplica restricciones.

    En el siguiente comando, se usa sed para actualizar el manifiesto acm-config.yaml para que el Sincronizador de configuración implemente los recursos asociados.

    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
    

    El comando anterior implementa los siguientes recursos:

    • Un objeto Constraint K8sRequiredLabels que requiere Namespace en la malla para que contenga Etiqueta de inyección del proxy de sidecar de Cloud 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
    • Una Constraint AsmSidecarInjection que prohíbe que cualquier Pod de la malla omita la inserción de sidecar del proxy de 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. Consulta el estado del Sincronizador de configuración de RootSync:

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

    El resultado es similar al siguiente:

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

    Si ves status: RECONCILING en lugar de status: SYNCED, espera unos minutos y vuelve a ejecutar gcloud alpha anthos config sync repo describe.

  3. Verifica que se hayan creado Constraints:

    kubectl get constraints
    

    El controlador de políticas puede tardar unos minutos en evaluar estas restricciones. Si no ves valores en la columna TOTAL-VIOLATIONS, espera y vuelve a ejecutar kubectl get constraints.

    El resultado es similar al siguiente:

    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
    

    Debido a que configuraste correctamente Namespaces y Pods, hay 0 TOTAL-VIOLATIONS para estas Constraints.

  4. Para ver estos Constraints en funcionamiento, intenta crear un Namespace en tu clúster sin un label ni un annotation:

    kubectl create namespace test
    

    El resultado es similar al siguiente error:

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

Aplica la encriptación de tráfico

En esta sección, aplicarás políticas para garantizar que todo el tráfico de la malla esté encriptado.

  1. Para aplicar la encriptación de tráfico, aplica restricciones.

    En el siguiente comando, se usa sed para actualizar el manifiesto acm-config.yaml para que el Sincronizador de configuración implemente los recursos asociados.

    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
    

    El comando anterior implementa los siguientes recursos:

    • Un Constraint AsmPeerAuthnMeshStrictMtls que aplica el PeerAuthentication de mTLS a nivel de malla en el espacio de nombres istio-system:

      apiVersion: constraints.gatekeeper.sh/v1beta1
      kind: AsmPeerAuthnMeshStrictMtls
      metadata:
        name: mesh-level-strict-mtls
      spec:
        enforcementAction: deny
        parameters:
          rootNamespace: istio-system
          strictnessLevel: High
    • Una restricción referencial Config en el espacio de nombres gatekeeper-system Esta restricción referencial permite que AsmPeerAuthnMeshStrictMtls Constraint haga referencia a otro objeto en su definición (por ejemplo, si buscas cualquier PeerAuthentication en 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"
    • Una Constraint DestinationRuleTLSEnabled que prohíbe inhabilitar TLS para todos los hosts y subconjuntos de hosts en DestinationRules de Istio:

      apiVersion: constraints.gatekeeper.sh/v1beta1
      kind: DestinationRuleTLSEnabled
      metadata:
        name: destination-rule-tls-enabled
      spec:
        enforcementAction: deny
        match:
          kinds:
          - apiGroups:
            - networking.istio.io
            kinds:
            - DestinationRule
    • Una Constraint AsmPeerAuthnStrictMtls que exige que todas las PeerAuthentications no puedan reemplazar la mTLS STRICT:

      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. Consulta el estado del Sincronizador de configuración de RootSync:

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

    El resultado es similar al siguiente:

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

    Si ves status: RECONCILING en lugar de status: SYNCED, espera unos minutos y vuelve a ejecutar gcloud alpha anthos config sync repo describe.

  3. Ejecuta el siguiente comando para obtener más información sobre el incumplimiento PeerAuthentication:

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

    El resultado es similar al siguiente:

    [
      {
        "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. Para solucionar el problema, implementa un PeerAuthentication en el istio-system. Para evitar que todos tus servicios de la malla acepten tráfico de texto simple, establece una política PeerAuthentication en toda la malla con el modo mTLS establecido en STRICT. Cuando implementas la política, el plano de control aprovisiona automáticamente certificados TLS para que las cargas de trabajo se puedan autenticar entre sí.

    En el siguiente comando, se usa sed para actualizar el manifiesto acm-config.yaml para que el Sincronizador de configuración implemente los recursos asociados.

    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
    

    El comando anterior implementa el siguiente STRICT de PeerAuthentication de mTLS en el espacio de nombres istio-system. Esto aplica mTLS STRICT a toda la malla:

    apiVersion: security.istio.io/v1beta1
    kind: PeerAuthentication
    metadata:
      name: default
    spec:
      mtls:
        mode: STRICT
  5. Consulta el estado del Sincronizador de configuración de RootSync:

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

    El resultado es similar al siguiente:

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

    Si ves status: RECONCILING en lugar de status: SYNCED, espera unos minutos y vuelve a ejecutar gcloud alpha anthos config sync repo describe.

  6. Verifica que se hayan creado Constraints:

    kubectl get constraints
    

    Ten en cuenta que el controlador de políticas puede tardar unos minutos en evaluar estas Constraints. Espera y ejecuta de nuevo este comando kubectl get constraints hasta que obtengas los valores en la columna TOTAL-VIOLATIONS para cada línea.

    El resultado es similar al siguiente:

    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
    

Aplica control de acceso detallado

En esta sección, aplicarás políticas para garantizar que todas las cargas de trabajo de la malla tengan control de acceso detallado.

  1. Para aplicar un control de acceso detallado, aplica restricciones.

    En el siguiente comando, se usa sed para actualizar el manifiesto acm-config.yaml para que el Sincronizador de configuración implemente los recursos asociados.

    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
    

    El comando anterior implementa los siguientes recursos:

    • Un Constraint AsmAuthzPolicyDefaultDeny que aplica el AuthorizationPolicy predeterminado de denegación a nivel de malla en el espacio de nombres istio-system:

      apiVersion: constraints.gatekeeper.sh/v1beta1
      kind: AsmAuthzPolicyDefaultDeny
      metadata:
        name: default-deny-authorization-policies
      spec:
        enforcementAction: deny
        parameters:
          rootNamespace: istio-system
          strictnessLevel: High
    • Una Constraint AsmAuthzPolicyEnforceSourcePrincipals que exige que cualquier AuthorizationPolicies defina principales de origen detallados (además de “*”). Solo la puerta de enlace de entrada en el espacio de nombres asm-ingress es una excepción a esta regla para recibir el tráfico de los usuarios finales y redireccionar el tráfico a la aplicación frontend de 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. Consulta el estado del Sincronizador de configuración de RootSync:

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

    El resultado es similar al siguiente:

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

    Si ves status: RECONCILING en lugar de status: SYNCED, espera unos minutos y vuelve a ejecutar gcloud alpha anthos config sync repo describe.

  3. Ejecuta el siguiente comando para obtener más información sobre el incumplimiento asociado:

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

    El resultado es similar al siguiente:

    [
      {
        "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. Para solucionar el problema, implementa AuthorizationPolicy en el espacio de nombres istio-system.

    En el siguiente comando, se usa sed para actualizar el manifiesto acm-config.yaml para que el Sincronizador de configuración implemente los recursos asociados.

    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
    

    Con el comando anterior, se implementa el siguiente comando AuthorizationPolicy de denegación completo en el espacio de nombres istio-system:

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: deny-all
    spec:
      {}
  5. Consulta el estado del Sincronizador de configuración de RootSync:

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

    El resultado es similar al siguiente:

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

    Si ves status: RECONCILING en lugar de status: SYNCED, espera unos minutos y vuelve a ejecutar gcloud alpha anthos config sync repo describe.

  6. Verifica que se hayan creado Constraints:

    kubectl get constraints
    

    Ten en cuenta que el controlador de políticas puede tardar unos minutos en evaluar estas Constraints. Espera y ejecuta de nuevo este comando kubectl get constraints hasta que obtengas los valores en la columna TOTAL-VIOLATIONS para cada línea.

    El resultado es similar al siguiente:

    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 la aplicación Online Boutique desde tu navegador:

    echo http://${EXTERNAL_IP}
    

    Deberías recibir el siguiente error: RBAC: access denied que confirma que la denegación predeterminada AuthorizationPolicy se aplica a toda la malla.

  8. Para solucionar este problema, implementa AuthorizationPolicies más detallados en los espacios de nombres asm-ingress y onlineboutique.

    En el siguiente comando, se usa sed para actualizar el manifiesto acm-config.yaml para que el Sincronizador de configuración implemente los recursos asociados.

    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
    

    El comando anterior implementa los siguientes recursos:

    • Un AuthorizationPolicy en el espacio de nombres 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 por aplicación en el espacio de nombres onlineboutique. Este es el ejemplo de la app de 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 por app en los espacios de nombres asm-ingress y onlineboutique para tener una identidad única por app evaluada como principal en AuthorizationPolicies. Este es el ejemplo de la app de cartservice:

      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: cartservice
  9. Consulta el estado del Sincronizador de configuración de RootSync y los dos RepoSyncs:

    gcloud alpha anthos config sync repo describe
    

    El resultado es similar al siguiente:

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

    Si ves status: RECONCILING en lugar de status: SYNCED, espera unos minutos y vuelve a ejecutar gcloud alpha anthos config sync repo describe.

    Para ver solo la información de un repositorio, puedes usar las marcas --sync-name y --sync-namespace. Para ver en detalle los recursos administrados, puedes agregar la marca --managed-resources. Para obtener más información, consulta Visualiza el estado del Sincronizador de configuración en varios clústeres.

  10. Visita la aplicación Online Boutique de nuevo desde tu navegador:

    echo http://${EXTERNAL_IP}
    

    Si espera unos minutos, deberías ver que el sitio web funciona correctamente nuevamente.

Consulta el estado de las funciones de seguridad de GKE Enterprise

Puedes ver el estado de las funciones de seguridad de GKE Enterprise, incluidas las políticas de autenticación y autorización, en la consola de Google Cloud.

  1. En la consola de Google Cloud, ve a la página Seguridad de GKE Enterprise.

    Ir a Seguridad de GKE Enterprise

    En Resumen de la política, se muestra el estado de la seguridad de la aplicación, incluido el control de acceso de servicio (AuthorizationPolicies) y la mTLS.

  2. Haz clic en Auditoría de la política para ver los estados de las políticas de cargas de trabajo del clúster y de ambos espacios de nombres (asm-ingress y onlineboutique).

    Las tarjetas de Control de acceso de servicio y Estado de mTLS proporcionan una descripción general de alto nivel.

    Descripción general de alto nivel del control de acceso al servicio y el estado de mTLS

    En la lista Cargas de trabajo, se muestra el control de acceso del servicio y el estado de mTLS de cada carga de trabajo.

    Lista detallada de cada carga de trabajo y su control de acceso a servicios y estado de mTLS

Ya protegiste tu clúster y tu malla con el controlador de políticas y el Sincronizador de configuración.

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Borra el proyecto

    Borra un proyecto de Google Cloud:

    gcloud projects delete PROJECT_ID

Borra los recursos individuales

Para borrar los recursos individuales, haz lo siguiente:

  1. Cancela el registro de tu clúster de la flota:

    gcloud

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

    El resultado es similar a este:

    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. Borra el clúster

    gcloud

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

    Presiona y cuando se te solicite. Este comando puede demorar más de cinco minutos en completarse.

    El resultado es similar a este:

    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. Borra los archivos que creaste:

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

¿Qué sigue?