Instala y actualiza puertas de enlace

Cloud Service Mesh te da la opción de implementar y administrar puertas de enlace como parte del tu malla de servicios. Una puerta de enlace describe un balanceador de cargas que opera en el perímetro de la malla que recibe conexiones HTTP/TCP entrantes o salientes. Las puertas de enlace son proxies de Envoy que te brindan un control detallado sobre el tráfico que entra y sale de la malla. Las puertas de enlace se usan principalmente para administrar el tráfico de entrada, pero también puedes configurar puertas de enlace que administren otros tipos de tráfico. Por ejemplo:

  • Puertas de enlace de salida: una puerta de enlace de salida te permite configurar un nodo de salida dedicado para el tráfico que sale de la malla, lo que te permite limitar qué servicios pueden o deben acceder a las redes externas o habilitar el control seguro del tráfico de salida para agregar seguridad a tu malla, por ejemplo.

  • Puertas de enlace este-oeste: un proxy para el tráfico este-oeste a fin de permitir que las cargas de trabajo del servicio se comuniquen a través de los límites del clúster en una malla multiprincipal en redes diferentes. De forma predeterminada, esta puerta de enlace será pública en Internet.

En esta página, se describen las prácticas recomendadas para implementar y actualizar los proxies de puerta de enlace, así como los ejemplos de configuración de tus propios proxies de puerta de enlace istio-ingressgateway y istio-egressgateway. La división del tráfico, los redireccionamientos y la lógica de reintento son posibles aplicar un Puerta de enlace con los proxies de puerta de enlace. Luego, en lugar de agregar capas de aplicación de enrutamiento de tráfico (L7) al mismo recurso de API, vinculas un Servicio virtual a la puerta de enlace. Esto te permite administrar el tráfico de puerta de enlace como cualquier otro tráfico del plano de datos en la malla de servicios.

Puedes implementar puertas de enlace de diferentes maneras y puedes usar más de una topología dentro del mismo clúster. Consulta Topologías de implementación de puertas de enlace en la documentación de Istio para obtener más información sobre estas topologías.

Prácticas recomendadas para implementar puertas de enlace

Las prácticas recomendadas para implementar puertas de enlace dependen de si usas el plano de datos administrado o el plano de datos no administrado.

Prácticas recomendadas para el plano de datos administrado

  1. Habilita el plano de datos administrado.
  2. Agrega una etiqueta de revisión administrada a un espacio de nombres.
  3. Implementa y administra el plano de control y las puertas de enlace por separado.
  4. Como práctica recomendada de seguridad, te recomendamos que implementes puertas de enlace en un espacio de nombres diferente del plano de control.
  5. Usa la inserción automática del sidecar (inserción automática) para incorporar la configuración del proxy en las puertas de enlace de manera similar a como insertarías los proxies de sidecar para tus servicios.

Estas prácticas recomendadas son las siguientes:

  • Asegúrate de que las puertas de enlace administradas se mantengan actualizadas de forma automática con las mejoras y las actualizaciones de seguridad más recientes.
  • Transfiere la administración y el mantenimiento de las instancias de puerta de enlace a Cloud Service Mesh en el plano de datos administrado.

Prácticas recomendadas para el plano de datos no administrado

  1. Implementa y administra el plano de control y las puertas de enlace por separado.
  2. Como práctica recomendada de seguridad, te recomendamos que implementes puertas de enlace en un espacio de nombres diferente del plano de control.
  3. Usa la inserción automática del sidecar (inserción automática) para incorporar la configuración del proxy en las puertas de enlace de manera similar a como insertarías los proxies de sidecar para tus servicios.

Estas prácticas recomendadas son las siguientes:

  • Permite que los administradores de espacios de nombres administren las puertas de enlace sin necesidad de privilegios elevados para todo el clúster.
  • Permite que los administradores usen las mismas herramientas o los mismos mecanismos de implementación que usan para administrar las aplicaciones de Kubernetes a fin de implementar y administrar puertas de enlace.
  • Brinda a los administradores control total sobre la implementación de la puerta de enlace y también simplifica las operaciones. Cuando una actualización nueva está disponible o se modifica una configuración, los administradores actualizan los Pods de la puerta de enlace mediante su reinicio. Esto hace que la experiencia de operar un Deployment de la puerta de enlace sea la misma que operar los proxies de sidecar operativos de tus servicios.

Implementa puertas de enlace

Para brindar asistencia a los usuarios con las herramientas de implementación existentes, Cloud Service Mesh admite de las mismas maneras de implementar una puerta de enlace, Istio: IstioOperator, Helm y YAML de Kubernetes. Cada método produce el mismo resultado. Aunque puedes elegir el método con el que más estés familiarizado, te recomendamos que uses el método YAML de Kubernetes porque es más fácil de modificar y puedes almacenar manifiestos hidratados en el control de origen.

  1. Crea un espacio de nombres para la puerta de enlace si aún no tienes uno. Reemplaza GATEWAY_NAMESPACE por el nombre de tu espacio de nombres.

    kubectl create namespace GATEWAY_NAMESPACE
    
  2. Para habilitar la inserción automática, etiqueta tus espacios de nombres con las etiquetas de inyección predeterminadas si la etiqueta predeterminada está configurada o con la etiqueta de revisión en tu espacio de nombres. La etiqueta que agregas también depende de si implementaste Malla de servicios de Cloud administrados o haber instalado el plano de control en el clúster. El archivo adicional usa la etiqueta. webhook de inyector para asociar los sidecars insertados a un control particular revisión del plano de control.

    A continuación, selecciona la pestaña según tu tipo de instalación (ya sea administrada o en el clúster).

    Administrado

    Usa el siguiente comando para ubicar los canales de versiones disponibles:

    kubectl -n istio-system get controlplanerevision
    

    El resultado es similar a este:

    NAME                AGE
    asm-managed         6d7h
    asm-managed-rapid   6d7h
    

    En el resultado, el valor debajo de la columna NAME es la etiqueta de revisión. que corresponden canal de versiones para la versión de Cloud Service Mesh.

    En el clúster

    Para los planos de control en el clúster, el Service de istiod y la Deployment, por lo general, tendrás una etiqueta de revisión similar a istio.io/rev=asm-1233-2, en la que asm-1233-2 identifica la versión de Cloud Service Mesh. La revisión pasa a formar parte del nombre del servicio istiod, por ejemplo: istiod-asm-1233-2.istio-system.

    Usa el siguiente comando a fin de encontrar la etiqueta de revisión en istiod para el plano de control en el clúster:

    kubectl get deploy -n istio-system -l app=istiod \
      -o=jsonpath='{.items[*].metadata.labels.istio\.io\/rev}''{"\n"}'
    
  3. Habilita el espacio de nombres para la inserción. Reemplaza REVISION por el valor de la etiqueta de revisión.

    kubectl label namespace GATEWAY_NAMESPACE istio-injection- istio.io/rev=REVISION --overwrite
    
  4. Si instalaste Cloud Service Mesh con asmcli, cambia al directorio que que especificaste en --output_dir y, luego, cd al directorio samples.

    Si no lo instalaste mediante asmcli, copia los archivos de configuración de las puertas de enlace del repositorio anthos-service-mesh.

  5. Puedes implementar la configuración de la puerta de enlace de ejemplo ubicada en el directorio samples/gateways/ tal como está o modificarla según sea necesario.

    Ingress

    kubectl apply -n GATEWAY_NAMESPACE -f gateways/istio-ingressgateway
    

    Salida

    kubectl apply -n GATEWAY_NAMESPACE -f gateways/istio-egressgateway
    
  6. Después de crear la implementación, verifica que los servicios nuevos funcionen de forma correcta:

    kubectl get pod,service -n GATEWAY_NAMESPACE
    

    El resultado es similar a este:

    NAME                                      READY   STATUS    RESTARTS   AGE
    pod/istio-ingressgateway-856b7c77-bdb77   1/1     Running   0          3s
    
    NAME                           TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)        AGE
    service/istio-ingressgateway   LoadBalancer   10.24.5.129    34.82.157.6      80:31904/TCP   3s

Selectores de puertas de enlace

Aplicas un Puerta de enlace configuración de los proxies istio-ingressgateway y istio-egressgateway para administrar el tráfico de entrada y salida de tu malla, lo que te permite especificar el tráfico al que quieres ingresar o salir de la malla. Los recursos de configuración de puerta de enlace usan las etiquetas en los Pods de la implementación de una puerta de enlace, por lo que es importante que tu selector de puerta de enlace coincida con estas etiquetas.

Por ejemplo, en las implementaciones anteriores, la etiqueta istio=ingressgateway se configura en los Pods de la puerta de enlace. Para aplicar una configuración de puerta de enlace a estas implementaciones, debes seleccionar la misma etiqueta:

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: gateway
spec:
  selector:
    istio: ingressgateway
...

En este ejemplo de configuración de puerta de enlace y servicio virtual, consulta frontend.yaml. en la aplicación de muestra Online Boutique.

Actualiza puertas de enlace

Actualizaciones in situ

Para la mayoría de los casos de uso, debes actualizar las puertas de enlace según el patrón de actualización in situ. Debido a que las puertas de enlace usan la inserción de Pods, los Pods nuevos de puerta de enlace que se crean se inyectarán de forma automática con la última configuración, que incluye la versión.

Si quieres cambiar la revisión del plano de control que usa la puerta de enlace, puedes establecer la etiqueta istio.io/rev en el objeto Deployment de la puerta de enlace, que también pueden activar un reinicio progresivo.

Plano de control administrado

Dado que Google administra las actualizaciones del plano de control administrado, puedes reiniciar el objeto Deployment de la puerta de enlace, y los nuevos Pods insertar automáticamente la configuración y la versión más recientes.

kubectl rollout restart deployment istio-ingressgateway \
  -n GATEWAY_NAMESPACE

Plano de control en el clúster

Para aplicar el mismo patrón a las puertas de enlace cuando tienes el control en el clúster deberá cambiar la revisión del plano de control que usa la puerta de enlace. Establece la etiqueta istio.io/rev en el Deployment de la puerta de enlace que activará una un reinicio progresivo. Los pasos necesarios dependen de si necesitas actualizar el etiqueta de revisión en el espacio de nombres o en el Pod de la puerta de enlace.

  • Si etiquetaste el espacio de nombres para la inyección, configura la etiqueta istio.io/rev en el espacio de nombres al nuevo valor de revisión:

      kubectl label namespace GATEWAY_NAMESPACE \
        istio-injection- istio.io/rev=REVISION \
        --overwrite
    
  • Si habilitaste la inyección solo para el pod de puerta de enlace, configura istio.io/rev etiqueta del objeto Deployment al valor de revisión nuevo, como se muestra a continuación Archivo YAML de Kubernetes:

    cat <<EOF > gateway-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: istio-ingressgateway
      namespace: GATEWAY_NAMESPACE
    spec:
      selector:
        matchLabels:
          istio: ingressgateway
      template:
        metadata:
          annotations:
            # This is required to tell Anthos Service Mesh to inject the gateway with the
            # required configuration.
            inject.istio.io/templates: gateway
          labels:
            istio: ingressgateway
            istio.io/rev: REVISION
        spec:
          containers:
          - name: istio-proxy
            image: auto # The image will automatically update each time the pod starts.
    EOF
    
    kubectl apply -f gateway-deployment.yaml
    

Actualizaciones de versiones canary (avanzadas)

Si usas el plano de control en el clúster y deseas controlar con mayor lentitud el lanzamiento de una revisión nueva del plano de control, puedes seguir el patrón de actualización canary. Puedes ejecutar varias versiones de un Deployment de la puerta de enlace y asegurarte de que todo funcione como se espera con un subconjunto de tu tráfico. Por ejemplo, si deseas lanzar una revisión nueva, realiza una actualización canary, crea una copia del Deployment de la puerta de enlace con la etiqueta istio.io/rev=REVISION configurada en la revisión nueva y un nombre nuevo, por ejemplo, istio-ingressgateway-canary:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: istio-ingressgateway-canary
  namespace: GATEWAY_NAMESPACE
spec:
  selector:
    matchLabels:
      istio: ingressgateway
  template:
    metadata:
      annotations:
        inject.istio.io/templates: gateway
      labels:
        istio: ingressgateway
        istio.io/rev: REVISION # Set to the control plane revision you want to deploy
    spec:
      containers:
      - name: istio-proxy
        image: auto

Cuando se cree este objeto Deployment, tendrás dos versiones de la puerta de enlace, ambas seleccionadas por el mismo servicio:

kubectl get endpoints \
-o "custom-columns=NAME:.metadata.name,PODS:.subsets[*].addresses[*].targetRef.name" \
-n GATEWAY_NAMESPACE

El resultado es similar a este:

NAME                   PODS
istio-ingressgateway   istio-ingressgateway-788854c955-8gv96,istio-ingressgateway-canary-b78944cbd-mq2qf

Si estás seguro de que tus aplicaciones funcionan como esperabas, ejecuta este comando para realizar la transición a la nueva versión mediante la eliminación del Deployment con el conjunto de etiquetas istio.io/rev anterior:

kubectl delete deploy/istio-ingressgateway -n GATEWAY_NAMESPACE

Si encontraste un problema cuando probaste tu aplicación con la versión nueva de la puerta de enlace, ejecuta este comando para volver a la versión anterior; para ello, borra el Deployment con el nuevo conjunto de etiquetas istio.io/rev:

kubectl delete deploy/istio-ingressgateway-canary -n GATEWAY_NAMESPACE

Configuración avanzada

Configurar la versión mínima de TLS de la puerta de enlace

Para la versión 1.14 y posteriores de Cloud Service Mesh, la versión de TLS mínima predeterminada para servidores de puerta de enlace es 1.2. Puedes configurar la versión mínima de TLS con el minProtocolVersion. Para obtener más información, consulta ServerTLSSettings.

Soluciona problemas de las puertas de enlace

No se pudo actualizar la imagen de la puerta de enlace desde auto

Cuando implementas o actualizas una puerta de enlace, Cloud Service Mesh inserta auto como un en el campo image. Después de la llamada al webhook de mutación, Cloud Service Mesh reemplaza automáticamente este marcador de posición con el Imagen del proxy de Cloud Service Mesh. Si la llamada al webhook de mutación falla, el auto el marcador de posición permanece y no se encontrará el contenedor. Normalmente, esto es causado por una etiqueta de espacio de nombres incorrecta. Asegúrate de haber configurado y, luego, implementa o actualiza la puerta de enlace nuevamente.