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
NAME
del 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_1
yCLUSTER_NAME_2
por los nombres de tus clústeres.Sustituye
PATH_TO_KUBECONFIG_1
yPATH_TO_KUBECONFIG_2
por 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-1264-1 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
Instala una pasarela en
$CLUSTER_2
que 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-1264-1 | \ ./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-1264-1 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Instala una pasarela en
$CLUSTER_2
que 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-1264-1 | \ ./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-1264-1 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Instala una pasarela en
$CLUSTER_2
que 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-1264-1 | \ ./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-1264-1 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Instala una pasarela en
$CLUSTER_2
que 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-1264-1 | \ ./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
Busca el valor de la etiqueta de revisión, que usarás en pasos posteriores.
Usa el siguiente comando para localizar la etiqueta de revisión, que usarás en pasos posteriores.
kubectl -n istio-system get pods -l app=istiod --show-labels
El resultado es similar al siguiente:
NAME READY STATUS RESTARTS AGE LABELS istiod-asm-173-3-5788d57586-bljj4 1/1 Running 0 23h app=istiod,istio.io/rev=asm-173-3,istio=istiod,pod-template-hash=5788d57586 istiod-asm-173-3-5788d57586-vsklm 1/1 Running 1 23h app=istiod,istio.io/rev=asm-173-3,istio=istiod,pod-template-hash=5788d57586
En el resultado, en la columna LABELS
, anote el valor de la etiqueta de revisión istiod
que sigue al prefijo istio.io/rev=
. En este ejemplo, el valor es asm-173-3
. Usa el valor de revisión en los pasos de la siguiente sección.
Instalar el servicio HelloWorld
Crea el espacio de nombres de ejemplo y la definición de servicio en cada clúster. En el siguiente comando, sustituye REVISION por la
istiod
etiqueta de revisión que has anotado en el paso anterior.for CTX in ${CTX_1} ${CTX_2} do kubectl create --context=${CTX} namespace sample kubectl label --context=${CTX} namespace sample \ istio-injection- istio.io/rev=REVISION --overwrite done
donde REVISION es la etiqueta de revisión
istiod
que has indicado anteriormente.El resultado es el siguiente:
label "istio-injection" not found. namespace/sample labeled
Puedes ignorar
label "istio-injection" not found.
sin problemaCrea 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 v1
enCLUSTER_1
yv2
enCLUSTER_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 v1
yv2
se 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
Sleep
en 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
Sleep
en 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}