Exponer una pasarela de entrada mediante un balanceador de carga externo
Información general
Con Cloud Service Mesh, puedes desplegar y gestionar gateways de entrada como parte de tu malla de servicios. Puedes configurar el balanceo de carga de tu clúster con Cloud Service Mesh mediante balanceadores de carga externos (balanceadores de carga físicos o de software fuera del clúster) para enviar tráfico a la puerta de enlace de entrada.
En esta página se explica cómo configurar un balanceador de carga externo con Cloud Service Mesh. También puedes configurar el acceso con varias configuraciones de backend.
Antes de empezar
Para completar los pasos de este documento, necesitas los siguientes recursos:
Un clúster de Kubernetes con Cloud Service Mesh instalado.
Un balanceador de carga externo que pueda acceder a los nodos en los que se ejecuta el clúster. Configura este balanceador de carga externo para que esté delante de la pasarela de entrada de tu clúster mediante la dirección IP externa del balanceador de carga.
Configurar un entorno
Ejecuta los siguientes comandos desde una estación de trabajo que pueda acceder al clúster que quieras usar. Asegúrate de que la herramienta kubectl
esté configurada para usar el contexto de clúster específico de tu clúster.
Define las variables de entorno.
export ASM_INGRESSGATEWAY_NAMESPACE=asm-ingressgateway export ASM_INGRESSGATEWAY_DEPLOYMENT_NAME=asm-ingressgateway export ASM_INGRESSGATEWAY_SERVICE_NAME=asm-ingressgateway export ASM_INGRESSGATEWAY_NODE_LABEL=asm-ingressgateway
Define el
IP address
del balanceador de carga externo.export EXTERNAL_LB_IP_ADDRESS=EXTERNAL_LB_IP_ADDRESS
[\Optional/] Etiqueta los nodos de la pasarela de entrada. De esta forma, la pasarela se desplegará en nodos específicos del clúster.
kubectl label nodes INGRESSGATEWAY_NODE_IP ${ASM_INGRESSGATEWAY_NODE_LABEL}=
- INGRESSGATEWAY_NODE_IP: son los nodos de tu clúster de Kubernetes que alojan la pasarela de entrada. Ejecuta este comando
kubectl
para cada nodo de entrada que tengas.
- INGRESSGATEWAY_NODE_IP: son los nodos de tu clúster de Kubernetes que alojan la pasarela de entrada. Ejecuta este comando
Crear la pasarela de entrada
Antes de completar las instrucciones de esta sección, debes determinar la implementación de tu plano de control. Para hacerlo, sigue las instrucciones que se indican en Identificar la implementación del plano de control.
Crea el espacio de nombres. Este espacio de nombres se usa para desplegar la puerta de enlace de entrada.
kubectl create namespace ${ASM_INGRESSGATEWAY_NAMESPACE}
Habilita el espacio de nombres para la inyección. Los pasos dependen de la implementación del plano de control.
Gestionado (TD)
- Aplica la etiqueta de inyección predeterminada al espacio de nombres:
kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio.io/rev- istio-injection=enabled --overwrite
Gestionado (Istiod)
Recomendación: Ejecuta el siguiente comando para aplicar la etiqueta de inyección predeterminada al espacio de nombres:
kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio.io/rev- istio-injection=enabled --overwrite
Si ya eres usuario del plano de control de Istiod gestionado: Te recomendamos que utilices la inyección predeterminada, pero también se admite la inyección basada en revisiones. Sigue estas instrucciones:
Ejecuta el siguiente comando para localizar los canales de lanzamiento disponibles:
kubectl -n istio-system get controlplanerevision
El resultado debería ser similar al siguiente:
NAME AGE asm-managed-rapid 6d7h
NOTA: Si aparecen dos revisiones del plano de control en la lista anterior, elimina una. No se admite tener varios canales del plano de control en el clúster.
En el resultado, el valor de la columna
NAME
es la etiqueta de revisión que corresponde al canal de lanzamiento disponible para la versión de Cloud Service Mesh.Aplica la etiqueta de revisión al espacio de nombres:
kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
En el clúster
Recomendación: Ejecuta el siguiente comando para aplicar la etiqueta de inyección predeterminada al espacio de nombres:
kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio.io/rev- istio-injection=enabled --overwrite
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_LABEL
es el valor de la etiqueta de revisiónistiod
que has anotado en el paso anterior.kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
Aplica el archivo de manifiesto de la pasarela de entrada.
kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} apply --filename https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-service-mesh-samples/main/docs/ingress-gateway-external-lb/ingress-gateway.yaml
Resultado esperado:
serviceaccount/asm-ingressgateway created role.rbac.authorization.k8s.io/asm-ingressgateway created rolebinding.rbac.authorization.k8s.io/asm-ingressgateway created deployment.apps/asm-ingressgateway created service/asm-ingressgateway created poddisruptionbudget.policy/asm-ingressgateway created horizontalpodautoscaler.autoscaling/asm-ingressgateway created
Aplica un parche al servicio
ingressgateway
con la dirección IP del balanceador de carga externo.cat <<EOF > asm-external-ip-patch.yaml spec: externalIPs: - ${EXTERNAL_LB_IP_ADDRESS} loadBalancerIP: ${EXTERNAL_LB_IP_ADDRESS} EOF kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} patch service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --patch "$(cat asm-external-ip-patch.yaml)"
[Opcional] Aplica un parche al
ingressgateway
de la implementación para la afinidad de etiquetas de los nodos de la pasarela de entrada.cat <<EOF > asm-ingress-node-label-patch.yaml spec: template: spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: ${ASM_INGRESSGATEWAY_NODE_LABEL} operator: Exists EOF kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} patch deployment/${ASM_INGRESSGATEWAY_DEPLOYMENT_NAME} --patch "$(cat asm-ingress-node-label-patch.yaml)"
Configurar el balanceador de carga externo
En esta sección, configurará el balanceador de carga externo para que se conecte con la pasarela de entrada del clúster.
Obtener información del puerto de la pasarela de entrada Service
Coge la
NodePorts
.export HTTP_INGRESS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}') export HTTPS_INGRESS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="https")].nodePort}') export STATUS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="status-port")].nodePort}')
Muestra el
NodePorts
.echo HTTP_INGRESS_PORT=${HTTP_INGRESS_PORT} echo HTTPS_INGRESS_PORT=${HTTPS_INGRESS_PORT} echo STATUS_PORT=${STATUS_PORT}
Configurar el balanceador de carga externo
Usa el NodePorts
que se muestra en el paso anterior para configurar la conectividad entre el balanceador de carga externo y la pasarela de entrada.
Configura la comprobación del estado en la configuración del balanceador de carga.
hosts: CLUSTER_NODE_IP Protocol: HTTP Port: STATUS_PORT Path: /healthz/ready
CLUSTER_NODE_IP: es la dirección IP de los nodos de tu clúster de Kubernetes que aloja la pasarela de entrada. Se debe poder acceder a esta dirección IP desde tu balanceador de carga externo. Es posible que tengas que configurar esto varias veces, una por cada nodo del clúster.
STATUS_PORT: es el
NodePort
a través del cual se expone la API de estado de salud de la puerta de enlace de entrada. Puedes copiar esta información del paso anterior. El valor es el mismo para todos los nodos del clúster.
Configura grupos de nodos en el balanceador de carga para enrutar el tráfico de
HTTP
yHTTPS
. Usa la siguiente configuración deIP:PORT
para el tráfico en el puerto 80 (HTTP
) y el puerto 443 (HTTPS
).80 -> CLUSTER_NODE_IP:HTTP_INGRESS_PORT 443 -> CLUSTER_NODE_IP:HTTPS_INGRESS_PORT
CLUSTER_NODE_IP: es la dirección IP de los nodos de tu clúster de Kubernetes que aloja la pasarela de entrada. Se debe poder acceder a esta dirección IP desde tu balanceador de carga externo. Es posible que tengas que configurar esto varias veces, una por cada nodo del clúster.
HTTP_INGRESS_PORT: es el
NodePort
a través del cual se expone el tráfico HTTP de la puerta de enlace de entrada. Puedes copiar esta información del paso anterior. El valor es el mismo para todos los nodos del clúster.HTTPS_INGRESS_PORT: es el
NodePort
a través del cual se expone el tráfico HTTPS de la puerta de enlace de entrada. Puedes copiar esta información del paso anterior. El valor es el mismo para todos los nodos del clúster.
Para verificar la configuración, comprueba que las comprobaciones del estado del balanceador de carga se completan correctamente.
Siguientes pasos
- Consulta más información sobre cómo instalar y actualizar pasarelas.