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.

  1. 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
    
  2. Define el IP address del balanceador de carga externo.

    export EXTERNAL_LB_IP_ADDRESS=EXTERNAL_LB_IP_ADDRESS
    
  3. [\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.

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.

  1. 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}
    
  1. Habilita el espacio de nombres para la inyección. Los pasos dependen de la implementación del plano de control.

    Gestionado (TD)

    1. 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:

    1. 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.

    2. 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:

    1. 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"}'
      
    2. Aplica la etiqueta de revisión al espacio de nombres. En el siguiente comando, REVISION_LABEL es el valor de la etiqueta de revisión istiod que has anotado en el paso anterior.

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      
  2. 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
    
  3. 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)"
    
  4. [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

  1. 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}')
    
  2. 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.

  1. 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.

  2. Configura grupos de nodos en el balanceador de carga para enrutar el tráfico de HTTP y HTTPS. Usa la siguiente configuración de IP: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