Configura una malla de varios clústeres fuera de Google Cloud

En esta guía, se explica cómo configurar una malla de varios clústeres para las siguientes plataformas:

  • Google Distributed Cloud (solo software) para VMware
  • Google Distributed Cloud (solo software) para Bare Metal
  • GKE en Azure
  • GKE en AWS
  • Clústeres conectados, incluidos los clústeres de Amazon EKS y los clústeres de Microsoft AKS

En esta guía, se muestra cómo configurar dos clústeres, pero puedes ampliar este proceso para incorporar cualquier cantidad de clústeres a tu malla.

Antes de comenzar

En esta guía, se da por sentado que instalaste Cloud Service Mesh asmcli install Necesitas asmcli y el paquete de configuración que asmcli descarga en el directorio que especificaste en --output_dir cuando ejecutaste asmcli install. Si necesitas realizar la configuración, sigue los pasos que se indican en Instala herramientas dependientes y valida el clúster para hacer lo siguiente:

Necesitas acceso a los archivos kubeconfig para todos los clústeres que configuras en la malla.

Configura variables de entorno y marcadores de posición

Necesitas las siguientes variables de entorno para instalar la puerta de enlace este-oeste.

  1. Crea una variable de entorno para el número de proyecto. En el comando siguiente, reemplaza FLEET_PROJECT_ID por el ID del proyecto host de la flota.

    export PROJECT_NUMBER=$(gcloud projects describe FLEET_PROJECT_ID \
    --format="value(projectNumber)")
    
  2. Crea una variable de entorno para el identificador de malla.

    export MESH_ID="proj-${PROJECT_NUMBER}"
    
  3. Crea variables de entorno para los nombres de los clústeres en el formato que requiere asmcli.

    export CLUSTER_1="cn-FLEET_PROJECT_ID-global-CLUSTER_NAME_1"
    export CLUSTER_2="cn-FLEET_PROJECT_ID-global-CLUSTER_NAME_2"
    
  4. Obtén el nombre de contexto de los clústeres con los valores de la columna NAME en el resultado de este comando:

    kubectl config get-contexts
  5. Configura las variables de entorno en los nombres del contexto del clúster, que esta guía usará en muchos pasos más adelante:

    export CTX_1=CLUSTER1_CONTEXT_NAME
    export CTX_2=CLUSTER2_CONTEXT_NAME
    

Instala la puerta de enlace este-oeste

En los siguientes comandos:

  • Reemplaza CLUSTER_NAME_1 y CLUSTER_NAME_2 por los nombres de tus clústeres.

  • Reemplaza PATH_TO_KUBECONFIG_1 y PATH_TO_KUBECONFIG_2 por los archivos kubeconfig de los clústeres.

Clústeres de Anthos

Servicio de CA o CA de Mesh

  1. Instala una puerta de enlace en el clúster1 que esté dedicada a tráfico de este a oeste a $CLUSTER_2. De forma predeterminada, esta puerta de enlace será pública en Internet. Los sistemas de producción pueden requerir restricciones de acceso adicionales, por ejemplo, reglas de firewall, para evitar ataques externos.

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID}  \
        --cluster ${CLUSTER_1}  \
        --network default \
        --revision asm-1225-1 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \
        install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
    
  2. Instala una puerta de enlace en $CLUSTER_2 que esté dedicada al tráfico de este a oeste para $CLUSTER_1.

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID}  \
        --cluster ${CLUSTER_2}  \
        --network default \
        --revision asm-1225-1 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \
        install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
    

CA de Istio

  1. Instala una puerta de enlace en cluster1 que esté dedicada al tráfico este-oeste $CLUSTER_2. De forma predeterminada, esta puerta de enlace será pública en Internet. Los sistemas de producción pueden requerir restricciones de acceso adicionales, por ejemplo, reglas de firewall, para evitar ataques externos.

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID}  \
        --cluster ${CLUSTER_1}  \
        --network default \
        --revision asm-1225-1 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    
  2. Instala una puerta de enlace en $CLUSTER_2 que esté dedicada al tráfico de este a oeste para $CLUSTER_1.

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID}  \
        --cluster ${CLUSTER_2}  \
        --network default \
        --revision asm-1225-1 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    

Azure, AWS y adjuntos

CA de Mesh

  1. Instala una puerta de enlace en el clúster1 que esté dedicada a tráfico de este a oeste a $CLUSTER_2. De forma predeterminada, esta puerta de enlace será pública en Internet. Los sistemas de producción pueden requerir restricciones de acceso adicionales, por ejemplo, reglas de firewall, para evitar ataques externos.

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID}  \
        --cluster ${CLUSTER_1}  \
        --network default \
        --revision asm-1225-1 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    
  2. Instala una puerta de enlace en $CLUSTER_2 que esté dedicada al tráfico de este a oeste para $CLUSTER_1.

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID}  \
        --cluster ${CLUSTER_2}  \
        --network default \
        --revision asm-1225-1 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    

CA de Istio

  1. Instala una puerta de enlace en cluster1 que esté dedicada al tráfico este-oeste $CLUSTER_2. De forma predeterminada, esta puerta de enlace será pública en Internet. Los sistemas de producción pueden requerir restricciones de acceso adicionales, por ejemplo, reglas de firewall, para evitar ataques externos.

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID}  \
        --cluster ${CLUSTER_1}  \
        --network default \
        --revision asm-1225-1 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    
  2. Instala una puerta de enlace en $CLUSTER_2 que esté dedicada al tráfico de este a oeste para $CLUSTER_1.

    asm/istio/expansion/gen-eastwest-gateway.sh \
        --mesh ${MESH_ID}  \
        --cluster ${CLUSTER_2}  \
        --network default \
        --revision asm-1225-1 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    

Servicios expuestos

Como los clústeres se encuentran en redes separadas, deberás exponer todos los servicios (*.local) en la puerta de enlace este-oeste en ambos clústeres. Aunque esta puerta de enlace es pública en Internet, solo los servicios que tengan un certificado mTLS y un ID de carga de trabajo de confianza podrán acceder a los servicios subyacentes, como si estuvieran en la misma red.

  1. Expón servicios a través de la puerta de enlace este-oeste para CLUSTER_NAME_1.

    kubectl --kubeconfig=PATH_TO_KUBECONFIG_1 apply -n istio-system -f \
        asm/istio/expansion/expose-services.yaml
    
  2. Expón servicios a través de la puerta de enlace este-oeste para el CLUSTER_NAME_2.

    kubectl --kubeconfig=PATH_TO_KUBECONFIG_2 apply -n istio-system -f \
        asm/istio/expansion/expose-services.yaml
    

Habilita la detección de extremos

Ejecuta el comando asmcli create-mesh para habilitar la detección de extremos. En este ejemplo, solo se muestran dos clústeres, pero puedes ejecutar el comando para habilitar el descubrimiento de extremos en clústeres adicionales, sujeto al límite de servicio de GKE Hub.

  ./asmcli create-mesh \
      FLEET_PROJECT_ID \
      PATH_TO_KUBECONFIG_1 \
      PATH_TO_KUBECONFIG_2

Verifica la conectividad de varios clústeres

En esta sección, se explica cómo implementar los servicios HelloWorld y Sleep de muestra en el entorno de varios clústeres para verificar que el balanceo de cargas entre clústeres funcione.

Habilita la inyección de sidecar

  1. Crea el espacio de nombres de muestra en cada clúster.

    for CTX in ${CTX_1} ${CTX_2}
    do
        kubectl create --context=${CTX} namespace sample
    done
    
  2. Habilita la inserción de sidecar en los espacios de nombres creados.

    Recomendado: Ejecuta el siguiente comando para aplicar la etiqueta de inserción predeterminada al espacio de nombres:

    for CTX in ${CTX_1} ${CTX_2}
    do
        kubectl label --context=${CTX} namespace sample \
            istio.io/rev- istio-injection=enabled --overwrite
    done
    

    Te recomendamos que uses la inserción predeterminada, pero también se admite la inserción basada en revisiones: Usa las siguientes instrucciones:

    1. Usa el siguiente comando para encontrar la etiqueta de revisión en istiod:

      kubectl get deploy -n istio-system -l app=istiod -o \
          jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
      
    2. Aplica la etiqueta de revisión a los espacios de nombres. En el siguiente comando, REVISION_LABEL es el valor de la etiqueta de revisión istiod que anotaste en el paso anterior.

      for CTX in ${CTX_1} ${CTX_2}
      do
          kubectl label --context=${CTX} namespace sample \
              istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      done
      

Instala el servicio HelloWorld

  • Crea el servicio HelloWorld en ambos clústeres:

    kubectl create --context=${CTX_1} \
        -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \
        -l service=helloworld -n sample
    
    kubectl create --context=${CTX_2} \
        -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \
        -l service=helloworld -n sample
    

Implementa HelloWorld v1 y v2 en cada clúster

  1. Implementa HelloWorld v1 en CLUSTER_1 y v2 en CLUSTER_2, lo que más adelante ayudará a verificar el balanceo de cargas entre clústeres:

    kubectl create --context=${CTX_1} \
      -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \
      -l version=v1 -n sample
    kubectl create --context=${CTX_2} \
      -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \
      -l version=v2 -n sample
  2. Ejecuta los siguientes comandos para verificar que HelloWorld v1 y v2 se estén ejecutando. Verifica que el resultado sea similar al siguiente:

    kubectl get pod --context=${CTX_1} -n sample
    NAME                            READY     STATUS    RESTARTS   AGE
    helloworld-v1-86f77cd7bd-cpxhv  2/2       Running   0          40s
    kubectl get pod --context=${CTX_2} -n sample
    NAME                            READY     STATUS    RESTARTS   AGE
    helloworld-v2-758dd55874-6x4t8  2/2       Running   0          40s

Implementa el servicio de suspensión

  1. Implementa el servicio Sleep en ambos clústeres. En este Pod, se genera tráfico de red artificial con fines de demostración:

    for CTX in ${CTX_1} ${CTX_2}
    do
        kubectl apply --context=${CTX} \
            -f ${SAMPLES_DIR}/samples/sleep/sleep.yaml -n sample
    done
    
  2. Espera a que se inicie el servicio Sleep en cada clúster. Verifica que el resultado sea similar al siguiente:

    kubectl get pod --context=${CTX_1} -n sample -l app=sleep
    NAME                             READY   STATUS    RESTARTS   AGE
    sleep-754684654f-n6bzf           2/2     Running   0          5s
    kubectl get pod --context=${CTX_2} -n sample -l app=sleep
    NAME                             READY   STATUS    RESTARTS   AGE
    sleep-754684654f-dzl9j           2/2     Running   0          5s

Verifica el balanceo de cargas entre clústeres

Llama al servicio HelloWorld varias veces y observa el resultado para verificar respuestas alternativas de v1 y v2:

  1. Llama al servicio HelloWorld:

    kubectl exec --context="${CTX_1}" -n sample -c sleep \
        "$(kubectl get pod --context="${CTX_1}" -n sample -l \
        app=sleep -o jsonpath='{.items[0].metadata.name}')" \
        -- /bin/sh -c 'for i in $(seq 1 20); do curl -sS helloworld.sample:5000/hello; done'
    

    El resultado es similar al que se muestra:

    Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8
    Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv
    ...
  2. Vuelve a llamar al servicio HelloWorld:

    kubectl exec --context="${CTX_2}" -n sample -c sleep \
        "$(kubectl get pod --context="${CTX_2}" -n sample -l \
        app=sleep -o jsonpath='{.items[0].metadata.name}')" \
        -- /bin/sh -c 'for i in $(seq 1 20); do curl -sS helloworld.sample:5000/hello; done'
    

    El resultado es similar al que se muestra:

    Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8
    Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv
    ...

Felicitaciones, ya verificaste el funcionamiento de Cloud Service Mesh de varios clústeres con balanceo de cargas.

Limpia

Cuando termines de verificar el balanceo de cargas, quita los servicios HelloWorld y Sleep del clúster.

kubectl delete ns sample --context ${CTX_1}
kubectl delete ns sample --context ${CTX_2}