IBM Cloud Docs
Despliegue de pasarelas de Istio personalizadas

Despliegue de pasarelas de Istio personalizadas

Cree un recurso personalizado IstioOperator (IOP) que defina sus propias pasarelas de entrada y salida para el tráfico de apps gestionado por Istio.

De forma predeterminada, se crea un despliegue de istio-ingressgateway en el espacio de nombres istio-system del clúster. Este despliegue se expone como un servicio de equilibrador de carga público con una dirección IP accesible externamente. Luego puede definir puertos para las apps gestionadas por Istio en un recurso de pasarela (Gateway), que configura el equilibrador de carga istio-ingressgateway de modo que escuche el tráfico HTTP/TCP de entrada en dichos puertos. Además, se crea de forma predeterminada una istio-egressgateway y se expone como un servicio de equilibrador de carga para gestionar el tráfico de salida de las apps gestionadas por Istio.

Sin embargo, es posible que desee crear despliegues de pasarela de entrada y salida adicionales además de estas pasarelas predeterminadas. Por ejemplo, puede crear pasarelas adicionales para que se ejecuten junto a las pasarelas predeterminadas o para que se ejecuten en lugar de las pasarelas predeterminadas por los siguientes motivos:

  • Separar los flujos de tráfico entre determinadas cargas de trabajo o espacios de nombres
  • Crear una pasarela de entrada para el tráfico de red privada
  • Modificar una pasarela con personalizaciones, como afinidad de nodos de pod de pasarela, réplicas mínimas y equilibradores de carga específicos de la zona
  • Controlar las actualizaciones de las versiones de pasarela independientemente de las actualizaciones automáticas de versiones que se han desplegado para todos los componentes del complemento Istio gestionado

Consideraciones

Antes de empezar, revise las siguientes consideraciones sobre el uso de pasarelas personalizadas.

  • El complemento Istio gestionado no gestiona ni concilia las pasarelas personalizadas que cree. Usted es el responsable de crear, gestionar y mantener estos recursos.
  • Después de desplegar la pasarela personalizada, compruebe los registros del pod del operador de Istio para ver si hay errores de sintaxis ejecutando kubectl logs -n ibm-operators -l name=addon-istio-operator. El operador de Istio valida y concilia cualquier cambio que usted haga en el IOP ( IstioOperator, protocolo de interfaz de operador). Si observa un bucle de reconciliación, indicado por el info installer Reconciling IstioOperator que se repite en los registros, siga los pasos para encontrar la línea en la configuración que está causando el error de bucle.
  • Además, asegúrese de que la opción istio-global-proxy-accessLogFile del mapa de configuración managed-istio-custom esté establecida en "/dev/stdout". Los proxies de Envoy imprimen información de acceso en su salida estándar, que puede ver ejecutando mandatos kubectl logs para los contenedores de Envoy.

Creación de una pasarela de entrada personalizada para el tráfico público

Utilice un IstioOperator (IOP) para crear un despliegue de pasarela de entrada personalizado y un servicio de equilibrador de carga público en un espacio de nombres custom-gateways.

  1. Instale el complemento Istio.

  2. Cree un espacio de nombres para la pasarela de entrada personalizada.

    kubectl create namespace custom-gateways
    
  3. Cree un archivo YAML llamado custom-ingress-iop.yaml para un recurso IstioOperator (IOP). Para forzar los pods de pasarela personalizados a que ejecuten una versión específica de Istio gestionado, especifique la versión en el campo tag. Para obtener más información, consulte Control de actualizaciones y versiones de pasarela personalizadas.

    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    metadata:
      namespace: ibm-operators
      name: custom-ingressgateway-iop
    spec:
      profile: empty
      hub: icr.io/ext/istio
      # tag: 1.23.5
      components:
        ingressGateways:
          - name: custom-ingressgateway
            label:
              istio: custom-ingressgateway
            namespace: custom-gateways
            enabled: true
            k8s:
              serviceAnnotations:
                service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public
    
  4. Cree el recurso IstioOperator (IOP) en el clúster. El operador de Istio gestionado del espacio de nombres ibm-operators utiliza el recurso de IOP para desplegar y exponer la pasarela de entrada en el espacio de nombres custom-gateways con un servicio de equilibrador de carga público.

    kubectl apply -f ./custom-ingress-iop.yaml
    
  5. Verifique que el despliegue y el servicio de pasarela de entrada se han creado en el espacio de nombres custom-gateways.

    kubectl get deploy,svc -n custom-gateways
    

    Salida de ejemplo

    NAME                                    READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/custom-ingressgateway   1/1     1            1           4m53s
    
    NAME                            TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                                                                                                                                      AGE
    service/custom-ingressgateway   LoadBalancer   172.21.98.120   52.117.68.222   15020:32656/TCP,80:30576/TCP,443:32689/TCP,15029:31885/TCP,15030:30198/TCP,15031:32637/TCP,15032:30869/TCP,31400:30310/TCP,15443:31698/TCP   4m53s
    
  6. En la salida del equilibrador de carga service/custom-ingressgateway, anote la dirección IP (clústeres clásicos) o el nombre de host (clústeres de VPC) de la columna EXTERNAL-IP.

Ahora puede especificar el nombre de este equilibrador de carga de pasarela de entrada, custom-ingressgateway, en un recurso Gateway que define el puerto para su app gestionada por Istio. A continuación, puede especificar el nombre de la pasarela (Gateway) en un recurso VirtualService que defina las vías de acceso para los microservicios de la red de servicios. Para ver un ejemplo de utilización de Gateway y VirtualService con el equilibrador de carga de pasarela personalizado, pruebe la app de ejemplo BookInfo.

Configuración del ejemplo BookInfo

Implemente la aplicación de muestra de Istio(BookInfo) para probar el acceso a su balanceador de carga de puerta de enlace de entrada personalizado.

  1. Cree un espacio de nombres bookinfo y etiquételo para la inyección automática de sidecar.
    kubectl create namespace bookinfo
    kubectl label namespace bookinfo istio-injection=enabled
    
  2. Despliegue la app de ejemplo BookInfo. Sustituya <version> por la versión major.minor que ejecuta el complemento gestionado de Istio, que puede encontrar ejecutando ibmcloud ks cluster addon ls -c <cluster_name_or_ID>.
    kubectl apply -n bookinfo -f https://raw.githubusercontent.com/istio/istio/release-<version>/samples/bookinfo/platform/kube/bookinfo.yaml
    
  3. Asegúrese de que los microservicios de BookInfo y sus pods correspondientes están desplegados.
    kubectl get svc -n bookinfo
    
    NAME                      TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)          AGE
    details                   ClusterIP      172.21.19.104    <none>         9080/TCP         2m
    kubernetes                ClusterIP      172.21.0.1       <none>         443/TCP          1d
    productpage               ClusterIP      172.21.168.196   <none>         9080/TCP         2m
    ratings                   ClusterIP      172.21.11.131    <none>         9080/TCP         2m
    reviews                   ClusterIP      172.21.117.164   <none>         9080/TCP         2m
    
    kubectl get pods -n bookinfo
    
    NAME                                     READY     STATUS      RESTARTS   AGE
    details-v1-6865b9b99d-7v9h8              2/2       Running     0          2m
    productpage-v1-f8c8fb8-tbsz9             2/2       Running     0          2m
    ratings-v1-77f657f55d-png6j              2/2       Running     0          2m
    reviews-v1-6b7f6db5c5-fdmbq              2/2       Running     0          2m
    reviews-v2-7ff5966b99-zflkv              2/2       Running     0          2m
    reviews-v3-5df889bcff-nlmjp              2/2       Running     0          2m
    
  4. Cree un archivo YAML llamado bookinfo-custom-gateway.yaml para definir los recursos de Gateway y VirtualService. Observe que el recurso Gateway especifica custom-ingressgateway para el nombre del equilibrador de carga de entrada personalizado que ha creado anteriormente y el recurso VirtualService especifica bookinfo-gateway para el nombre del recurso Gateway.
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: bookinfo-gateway
    spec:
      selector:
        istio: custom-ingressgateway
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "*"
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: bookinfo
    spec:
      hosts:
      - "*"
      gateways:
      - bookinfo-gateway
      http:
      - match:
        - uri:
            exact: /productpage
        - uri:
            prefix: /static
        - uri:
            exact: /login
        - uri:
            exact: /logout
        - uri:
            prefix: /api/v1/products
        route:
        - destination:
            host: productpage
            port:
              number: 9080
    
  5. Cree los recursos Gateway y VirtualService en el clúster.
    kubectl apply -f bookinfo-custom-gateway.yaml -n bookinfo
    
  6. Utilizando la dirección IP (clásica) o el nombre de host (VPC) que ha encontrado para el equilibrador de carga service/custom-ingressgateway en la sección anterior, abra la página del producto para la app BookInfo en un navegador.
    http://<IP_OR_HOSTNAME>/productpage
    

Ahora el equilibrador de carga de pasarela de entrada personalizado utiliza el puerto del recurso Gateway y las vías de acceso de microservicio del recurso VirtualService para direccionar el tráfico a la app BookInfo. A continuación, puede crear un registro DNS para el equilibrador de carga de pasarela personalizado.

Exposición de BookInfo utilizando un subdominio proporcionado por IBM con TLS

Cree un subdominio proporcionado por IBM para registrar la dirección IP (clásica) o el nombre de host (VPC) del equilibrador de carga de pasarela personalizado con un registro DNS. El certificado TLS que se genera para el subdominio habilita las conexiones HTTPS con la app BookInfo.

  1. Registre la dirección IP o el nombre de host del equilibrador de carga de pasarela personalizado mediante la creación de un subdominio DNS. Especifique el espacio de nombres custom-gateway para los secretos TLS.

    • Clústeres clásicos
      ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> --secret-namespace custom-gateways
      
    • Clústeres de VPC
      ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname> --secret-namespace custom-gateways
      
  2. Verifique que se ha creado el subdominio.

    ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
    

    Ejemplo de salida para clústeres clásicos

    Hostname                                                                                IP(s)              Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["168.1.1.1"]      None             created                   <certificate>
    

    Ejemplo de salida para clústeres de VPC

    Subdomain                                                                               Load Balancer Hostname                        Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["1234abcd-us-south.lb.appdomain.cloud"]      None             created                   <certificate>
    
  3. Obtenga el nombre del secreto para su subdominio.

    kubectl get secret -n custom-gateways
    

    Salida de ejemplo

    mycluster-af23f234rwr3asdfasdf-002   kubernetes.io/tls                     2      15m
    
  4. En el archivo bookinfo-custom-gateway.yaml que ha creado en la sección anterior, modifique el recurso bookinfo-gateway Gateway añadiendo un puerto HTTPS 443 y una sección TLS que especifique el secreto de su subdominio.

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: bookinfo-gateway
    spec:
      selector:
        istio: custom-ingressgateway
      servers:
      - port:
          number: 443
          name: https
          protocol: HTTPS
        tls:
          mode: SIMPLE
          credentialName: mycluster-af23f234rwr3asdfasdf-002 # secret name
        hosts:
        - "*"
    ---
    ...
    
  5. Cree el recurso Gateway modificado en el clúster.

    kubectl apply -f bookinfo-custom-gateway.yaml -n bookinfo
    
  6. En un navegador web, abra la página de productos de BookInfo. Asegúrese de que utiliza HTTPS para el subdominio que ha encontrado en el paso 2.

    https://<subdomain>/productpage
    

Creación de una pasarela de entrada personalizada para el tráfico de red

Para crear un despliegue de pasarela de entrada personalizado y exponerlo con un servicio de equilibrador de carga privado, siga los pasos del apartado Creación de una pasarela de entrada personalizada para el tráfico público. Cuando cree el IOP en el paso 3, especifique la anotación service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: private en lugar de public.

Tenga en cuenta las consideraciones siguientes:

  • Si el clúster clásico solo está conectado a VLAN privadas, o si el clúster de VPC solo tiene habilitado el punto final de servicio de nube privada, se crea un equilibrador de carga privado de forma predeterminada cuando se aplica el IOP.
  • Solo en el caso de clústeres clásicos, no se puede utilizar ibmcloud ks nlb-dns create classic para crear un registro DNS y un subdominio proporcionado por IBM para la dirección IP del equilibrador de carga de pasarela personalizada.

Control de actualizaciones y versiones de pasarela personalizadas

Actualice y controle manualmente la versión de Istio gestionada de las pasarelas de entrada personalizadas.

IBM Cloud mantiene actualizados todos los componentes de Istio mediante la actualización automática de parches a la versión más reciente de Istio a la que da soporte IBM Cloud Kubernetes Service. Por ejemplo, cuando se publica la versión de parche 1.23.5, todos los pods de la puerta de enlace de entrada se actualizan automáticamente a esta última versión de parche. Las versiones de parche se completan utilizando la estrategia de actualización continua para evitar el tiempo de inactividad de las apps. Sin embargo, es posible que desee impedir las actualizaciones automáticas de los pods de pasarela personalizados, por ejemplo si desea probar las posibles regresiones con la última versión de parche.

Para gestionar las actualizaciones de las pasarelas de entrada personalizadas, puede utilizar la siguiente estrategia de despliegue:

  1. Cree IOPs de pasarela de entrada personalizada. En el campo tag, especifique una versión de parche que sea igual o anterior a la versión del plano de control. Encontrará la versión del plano de control con el mandato istioctl version.
  2. Cuando se publique una versión de parche nueva para el complemento Istio gestionado, edite el archivo YAML de IOP para que una pasarela personalizada utilice la versión más reciente del parche y vuelva a aplicar el IOP en el clúster.
  3. Después de actualizar los pods de la pasarela personalizada al parche más reciente, pruebe los cambios en la pasarela personalizada.
  4. Cuando esté satisfecho con los cambios, modifique las configuraciones para el resto de las pasarelas personalizadas para actualizarlas al parche más reciente.

No establezca la etiqueta en una versión posterior a la versión del plano de control del complemento Istio.

Actualice los pods de la pasarela personalizada tan pronto como sea posible después de que se publique una versión. Las pasarelas personalizadas que ejecutan versiones anteriores pueden quedar expuestas a vulnerabilidades de seguridad.

Personalizaciones de pasarela adicionales

Las pasarelas de entrada personalizadas se pueden configurar con personalizaciones adicionales, que incluyen el despliegue del equilibrador de carga de pasarela en una zona específica, la especificación del número mínimo de réplicas de pod de pasarela, la planificación de pods de pasarela personalizados en nodos de extremo, la adición de enganches de ciclo de vida de preStop para cierres ordenados y la especificación de antiafinidad y de afinidad de nodo trabajador.

Revise los ejemplos de estas personalizaciones adicionales en el siguiente archivo YAML de IOP.

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: ibm-operators
  name: custom-ingressgateway-iop
spec:
  profile: empty
  hub: icr.io/ext/istio
  # tag: 1.23.5 # Force the gateway to a specific managed Istio version
  components:
    ingressGateways:
      - name: custom-ingressgateway
        label:
          istio: custom-ingressgateway
        namespace: custom-gateways
        enabled: true
        k8s:
          serviceAnnotations:
            service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public
            service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "dal12" # Deploy the load balancer to a specific zone in your cluster
          hpaSpec: # Specify the minimum number of pod replicas
            minReplicas: 2
          tolerations: # Schedule the custom gateway pods onto edge nodes
          - key: dedicated
            value: edge
          env:
          - name: TERMINATION_DRAIN_DURATION
            value: 30s
          affinity:
            podAntiAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
              - podAffinityTerm:
                  labelSelector:
                    matchExpressions:
                    - key: app
                      operator: In
                      values:
                      - istio-ingressgateway
                  topologyKey: kubernetes.io/hostname
                weight: 100
            nodeAffinity: # Example node affinities to control the zone or the edge
              preferredDuringSchedulingIgnoredDuringExecution: # Could be requiredDuringSchedulingIgnoredDuringExecution instead
                nodeSelectorTerms:
                - matchExpressions:
                  - key: ibm-cloud.kubernetes.io/zone
                    operator: In
                    values:
                    - "dal12" # Deploy the load balancer to a specific zone in your cluster
              preferredDuringSchedulingIgnoredDuringExecution:
              - preference:
                  matchExpressions:
                  - key: dedicated
                    operator: In
                    values:
                    - edge
                weight: 100

Creación de una pasarela de salida personalizada

En la versión 1.8 y posteriores del complemento Istio gestionado, puede crear pasarelas de salida personalizadas. Las pasarelas de salida sirven como punto de salida para todo el tráfico de salida de las apps de la red de servicios a destinos externos.

Por ejemplo, para crear una pasarela de salida personalizada, puede aplicar el siguiente archivo YAML para un IOP en el clúster.

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: ibm-operators
  name: custom-egressgateway-iop
spec:
  profile: empty
  hub: icr.io/ext/istio
  # tag: 1.23.5 # Force the Gateway to a specific version
  components:
    egressGateways:
      - name: custom-egressgateway
        label:
          istio: custom-egressgateway
        namespace: custom-gateways
        enabled: true

Para obtener más información sobre la configuración y el uso de puertas de enlace de salida personalizadas, consulte la documentación de código abierto de Istio.

Inhabilitación de las pasarelas predeterminadas

Si no necesita los despliegues predeterminados de istio-ingressgateway o istio-egressgateway después de crear pasarelas personalizadas, los puede inhabilitar.

Si desea que los clientes puedan acceder a sus apps, asegúrese de que haya al menos un equilibrador de carga de pasarela habilitado y configurado para dirigir el tráfico a sus apps. Si inhabilita los equilibradores de carga de pasarela predeterminados en todas las zonas, su aplicación ya no está expuesta y no se puede acceder a ella externamente.

  1. Edite el recurso de mapa de configuración managed-istio-custom.

    kubectl edit cm managed-istio-custom -n ibm-operators
    
  2. Inhabilite las pasarelas de entrada predeterminadas estableciendo los campos istio-ingressgateway-public-1|2|3-enabled en "false".

    istio-ingressgateway-public-1-enabled: "false"
    istio-ingressgateway-public-2-enabled: "false"
    istio-ingressgateway-public-3-enabled: "false"
    
  3. Para inhabilitar la pasarela de salida predeterminada, añada el campo istio-egressgateway-public-1-enabled: "false".

    istio-egressgateway-public-1-enabled: "false"
    
  4. Guarde y cierre el archivo de configuración.

  5. Verifique que los servicios de pasarela predeterminados se han eliminado.

    kubectl get svc -n istio-system