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 adjuntos, incluidos los 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 cantidad de clústeres a tu malla.
Antes de comenzar
En esta guía, se supone que instalaste 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 realizar la configuración, sigue los pasos que se indican en Instala herramientas dependientes y valida el clúster para hacer lo siguiente:
- Instala las herramientas requeridas
- Descarga
asmcli
- Otorga permisos de administrador del clúster
- Valida tu proyecto y clúster
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.
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)")
Crea una variable de entorno para el identificador de malla.
export MESH_ID="proj-${PROJECT_NUMBER}"
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"
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
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
yCLUSTER_NAME_2
por los nombres de tus clústeres.Reemplaza
PATH_TO_KUBECONFIG_1
yPATH_TO_KUBECONFIG_2
por los archivos kubeconfig de los clústeres.
Clústeres de Anthos
Servicio de CA o CA de Mesh
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-1215-12 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
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-1215-12 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
CA de Istio
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-1215-12 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
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-1215-12 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Azure, AWS y adjuntos
CA de Mesh
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-1215-12 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
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-1215-12 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
CA de Istio
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-1215-12 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
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-1215-12 | \ ./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.
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
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
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
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:
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"}'
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ónistiod
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
Implementa
HelloWorld v1
enCLUSTER_1
yv2
enCLUSTER_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
Ejecuta los siguientes comandos para verificar que
HelloWorld v1
yv2
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
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
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:
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 ...
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}