Configurar 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 en 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 vinculados, incluidos clústeres de Amazon EKS y Microsoft AKS
En esta guía se muestra cómo configurar dos clústeres, pero puedes ampliar este proceso para incorporar cualquier número de clústeres a tu malla.
Antes de empezar
En esta guía se presupone que has instalado Cloud Service Mesh con 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 configurarlo, sigue los pasos que se indican en Instalar herramientas dependientes y validar el clúster para hacer lo siguiente:
- Instalar las herramientas necesarias
- Descargar asmcli
- Conceder permisos de administrador de clústeres
- Validar el proyecto y el clúster
Necesitas acceso a los archivos kubeconfig de todos los clústeres que vayas a configurar en la malla.
Configurar variables de entorno y marcadores de posición
Necesitas las siguientes variables de entorno para instalar la pasarela este-oeste.
- Crea una variable de entorno para el número de proyecto. En el siguiente comando, sustituye FLEET_PROJECT_ID por el ID del proyecto host de la flota. - export PROJECT_NUMBER=$(gcloud projects describe FLEET_PROJECT_ID \ --format="value(projectNumber)")
- Crea una variable de entorno para el identificador de la malla. - export MESH_ID="proj-${PROJECT_NUMBER}"
- Crea variables de entorno para los nombres de los clústeres con 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"
- Para obtener el nombre de contexto de los clústeres, usa los valores de la columna - NAMEdel resultado de este comando:- kubectl config get-contexts 
- Asigna a las variables de entorno los nombres de contexto del clúster, que se usan en muchos pasos de esta guía: - export CTX_1=CLUSTER1_CONTEXT_NAME export CTX_2=CLUSTER2_CONTEXT_NAME 
Instalar la pasarela este-oeste
En los siguientes comandos:
- Sustituye - CLUSTER_NAME_1y- CLUSTER_NAME_2por los nombres de tus clústeres.
- Sustituye - PATH_TO_KUBECONFIG_1y- PATH_TO_KUBECONFIG_2por los archivos kubeconfig de tus clústeres.
Clústeres de Anthos
Mesh CA o Servicio de Autoridades de Certificación
- Instala una pasarela en el clúster 1 que esté dedicada al tráfico este-oeste de - $CLUSTER_2. De forma predeterminada, esta pasarela será pública en Internet. Los sistemas de producción pueden requerir restricciones de acceso adicionales, como reglas de cortafuegos, para evitar ataques externos.- asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1236-11 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
- Instala una pasarela en - $CLUSTER_2que esté dedicada al tráfico este-oeste de- $CLUSTER_1.- asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1236-11 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
CA de Istio
- Instala una pasarela en el clúster 1 que esté dedicada al tráfico este-oeste de - $CLUSTER_2. De forma predeterminada, esta pasarela será pública en Internet. Los sistemas de producción pueden requerir restricciones de acceso adicionales, como reglas de cortafuegos, para evitar ataques externos.- asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1236-11 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
- Instala una pasarela en - $CLUSTER_2que esté dedicada al tráfico este-oeste de- $CLUSTER_1.- asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1236-11 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Azure, AWS y Attached
Mesh CA
- Instala una pasarela en el clúster 1 que esté dedicada al tráfico este-oeste de - $CLUSTER_2. De forma predeterminada, esta pasarela será pública en Internet. Los sistemas de producción pueden requerir restricciones de acceso adicionales, como reglas de cortafuegos, para evitar ataques externos.- asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1236-11 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
- Instala una pasarela en - $CLUSTER_2que esté dedicada al tráfico este-oeste de- $CLUSTER_1.- asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1236-11 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
CA de Istio
- Instala una pasarela en el clúster 1 que esté dedicada al tráfico este-oeste de - $CLUSTER_2. De forma predeterminada, esta pasarela será pública en Internet. Los sistemas de producción pueden requerir restricciones de acceso adicionales, como reglas de cortafuegos, para evitar ataques externos.- asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1236-11 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
- Instala una pasarela en - $CLUSTER_2que esté dedicada al tráfico este-oeste de- $CLUSTER_1.- asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1236-11 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Servicios de exposición
Como los clústeres están en redes independientes, debe exponer todos los servicios (*.local) en la puerta de enlace este-oeste de ambos clústeres. Aunque esta pasarela es pública en Internet, solo pueden acceder a los servicios que hay detrás los servicios que tengan un certificado mTLS y un ID de carga de trabajo de confianza, como si estuvieran en la misma red.
- Expone servicios a través de la pasarela este-oeste para - CLUSTER_NAME_1.- kubectl --kubeconfig=PATH_TO_KUBECONFIG_1 apply -n istio-system -f \ asm/istio/expansion/expose-services.yaml
- Expone servicios a través de la pasarela este-oeste para - CLUSTER_NAME_2.- kubectl --kubeconfig=PATH_TO_KUBECONFIG_2 apply -n istio-system -f \ asm/istio/expansion/expose-services.yaml
Habilitar el descubrimiento de endpoints
Ejecuta el comando asmcli create-mesh para habilitar el descubrimiento de endpoints. En este ejemplo solo se muestran dos clústeres, pero puedes ejecutar el comando para habilitar el descubrimiento de endpoints en otros clústeres, sujeto al límite de servicio de GKE Hub.
  ./asmcli create-mesh \
      FLEET_PROJECT_ID \
      PATH_TO_KUBECONFIG_1 \
      PATH_TO_KUBECONFIG_2
Verificar la conectividad entre clústeres
En esta sección se explica cómo desplegar los servicios de ejemplo HelloWorld y Sleep en tu entorno multiclúster para verificar que el balanceo de carga entre clústeres funciona.
Habilitar la inyección de sidecar
- Crea el espacio de nombres de ejemplo en cada clúster. - for CTX in ${CTX_1} ${CTX_2} do kubectl create --context=${CTX} namespace sample done
- Habilita la inserción de sidecars en los espacios de nombres creados. - Recomendación: Ejecuta el siguiente comando para aplicar la etiqueta de inyecció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 inyección predeterminada, pero también se admite la inyección basada en revisiones: Sigue estas instrucciones: - Usa el siguiente comando para localizar 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"}'
- Aplica la etiqueta de revisión al espacio de nombres. En el siguiente comando, - REVISION_LABELes el valor de la etiqueta de revisión- istiodque has anotado 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
 
Instalar 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
Desplegar HelloWorld v1 y v2 en cada clúster
- Implementa - HelloWorld v1en- CLUSTER_1y- v2en- CLUSTER_2, lo que te ayudará más adelante a verificar el balanceo de carga 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
- Confirma que - HelloWorld v1y- v2se están ejecutando con los siguientes comandos. Comprueba que el resultado sea similar al que se muestra:- 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 
Desplegar el servicio de sueño
- Despliega el servicio - Sleepen ambos clústeres. Este pod 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
- Espera a que se inicie el servicio - Sleepen cada clúster. Comprueba que el resultado sea similar al que se muestra:- 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 
Verificar el balanceo de carga entre clústeres
Llama al servicio HelloWorld varias veces y comprueba el resultado para verificar
respuestas alternas de las versiones 1 y 2:
- Llama al servicio de - 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'- La salida es similar a la que se muestra a continuación: - Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8 Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv ... 
- 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'- La salida es similar a la que se muestra a continuación: - Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8 Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv ... 
Enhorabuena, has verificado tu malla de servicios de Cloud con balanceo de carga y varios clústeres.
Limpieza
Cuando termines de verificar el balanceo de carga, elimina el servicio HelloWorld y Sleep
de tu clúster.
kubectl delete ns sample --context ${CTX_1}
kubectl delete ns sample --context ${CTX_2}