Gestión y exposición de apps en la red de servicios

Después de instalar el complemento de Istio en el clúster, puede desplegar las apps en la red de servicios de Istio configurando la inyección del componente proxy de Envoy y exponiendo las apps con un subdominio.

Descripción de la aplicación de ejemplo BookInfo

La aplicación de ejemplo BookInfo para Istio incluye la configuración básica de la demostración y las reglas de destino predeterminadas, para que puedas probar de inmediato las capacidades de Istio.

En Istio versión 1.4 y posteriores, BookInfo no se ofrece como complemento gestionado y se debe instalar por separado. Para instalar BookInfo, consulte Configuración de la app de ejemplo de BookInfo.

Los cuatro microservicios de BookInfo incluyen:

  • productpage llama a los microservicios details y reviews para llenar la página.
  • details contiene información sobre libros.
  • ratings contiene información sobre clasificación de libros que acompaña a una revisión de un libro.
  • reviews contiene reseñas de libros y llamadas al microservicio ratings. El microservicio reviews tiene varias versiones:
    • v1 no llama al microservicio ratings.
    • v2 llama al microservicio ratings y muestra clasificaciones como estrellas negras, de 1 a 5.
    • v3 llama al microservicio ratings y muestra clasificaciones como estrellas rojas, de 1 a 5.

Los archivos YAML de despliegue para cada uno de estos microservicios se modifican para que los proxies de complemento de Envoy se inyectan previamente como contenedores en los pods de los microservicios antes de que se desplieguen. Para obtener más información sobre la inyección manual de sidecar, consulta la documentación de Istio. La app BookInfo ya está también expuesta en una dirección IP pública mediante una pasarela de Istio. Aunque la app BookInfo puede ayudarle a ponerse en marcha, no está pensada para su uso en producción.

Configuración de la app de ejemplo de BookInfo

  1. Instale BookInfo en el clúster. Descargue el paquete de Istio más reciente para su sistema operativo, que incluye los archivos de configuración para la app de BookInfo.
    curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.29.5 sh -
    
  2. Vaya al directorio del paquete de Istio.
    cd istio-1.29.5
    
  3. Etiquete el espacio de nombres default para la inyección de complementos.
    kubectl label namespace default istio-injection=enabled
    
  4. Despliegue la aplicación de BookInfo, la pasarela y las reglas de destino.
    kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
    kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
    kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
    
  5. Asegúrese de que los microservicios de BookInfo y sus pods correspondientes están desplegados.
    kubectl get svc
    kubectl get pods
    
    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
    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
    

Acceso público a BookInfo

Obtenga la dirección pública del equilibrador de carga istio-ingressgateway que expone BookInfo.

Creación de un URL de pasarela en clústeres clásicos

  1. Establezca el host de entrada de Istio.
    export INGRESS_IP=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    
  2. Establezca el puerto de entrada de Istio.
    export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
    
  3. Cree una variable de entorno GATEWAY_URL que utilice el host y el puerto de entrada de Ingress.
    export GATEWAY_URL=$INGRESS_IP:$INGRESS_PORT
    
  4. Ejecute curl sobre la variable GATEWAY_URL para comprobar que la app BookInfo se está ejecutando. Una respuesta 200 significa que la app BookInfo se está ejecutando correctamente con Istio.
    curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
    
  5. Intente renovar la página varias veces. Las diferentes versiones de la sección de revisiones se muestran con estrellas rojas, estrellas negras y sin estrellas.

Creación de un URL de pasarela en clústeres de VPC

  1. Cree una variable de entorno GATEWAY_URL que utilice el nombre de host de Ingress de Istio.
    export GATEWAY_URL=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
    
  2. Ejecute curl sobre la variable GATEWAY_URL para comprobar que la app BookInfo se está ejecutando. Una respuesta 200 significa que la app BookInfo se está ejecutando correctamente con Istio.
    curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
    

Visualización de la página web de BookInfo en un navegador

Ejecute el mandato correspondiente a su sistema operativo para ver la aplicación BookInfo en el navegador.

Mac OS o Linux

open http://$GATEWAY_URL/productpage

Windows

start http://$GATEWAY_URL/productpage

Intente renovar la página varias veces. Las diferentes versiones de la sección de revisiones se muestran con estrellas rojas, estrellas negras y sin estrellas.

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

Cuando se habilita el complemento BookInfo en el clúster, se crea la pasarela de Istio bookinfo-gateway. La pasarela utiliza reglas de servicio virtual de Istio y de destino para configurar un equilibrador de carga, istio-ingressgateway, que expone públicamente la app BookInfo. En los pasos siguientes, creará un subdominio para la dirección IP del equilibrador de carga istio-ingressgateway en clústeres clásicos a través del cual podrá acceder públicamente a BookInfo.

  1. Registre la dirección IP en clústeres clásicos o el nombre de host en clústeres VPC para el equilibrador de carga istio-ingressgateway creando un subdominio de DNS.
    • Clásico:
        ibmcloud ks nlb-dns create classic --ip $INGRESS_IP --cluster <cluster_name_or_id>
        ```
    * VPC:
    ```sh {: pre}
        ibmcloud ks nlb-dns create vpc-gen2 --lb-host $GATEWAY_URL --cluster <cluster_name_or_id>
        ```
    
  2. Verifique que se ha creado el subdominio y copie 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>

En un navegador web, abra la página de productos de BookInfo. Puesto que no hay ningún TLS configurado, asegúrese de que utiliza HTTP.

http://<subdomain>/productpage

Intente renovar la página varias veces. Las solicitudes a http://<subdomain>/productpage las recibe el equilibrador de carga de pasarela de Istio. Las distintas versiones del microservicio reviews se siguen devolviendo aleatoriamente porque la pasarela de Istio gestiona las reglas de direccionamiento de destino y servicio virtual para los microservicios.

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

Cuando se habilita el complemento BookInfo en el clúster, se crea la pasarela de Istio bookinfo-gateway. La pasarela utiliza reglas de servicio virtual de Istio y de destino para configurar un equilibrador de carga, istio-ingressgateway, que expone públicamente la app BookInfo. En los pasos siguientes, creará un subdominio para la dirección IP del equilibrador de carga istio-ingressgateway en clústeres clásicos a través del cual podrá acceder públicamente a BookInfo. También puede utilizar el certificado SSL para habilitar las conexiones HTTPS con la app BookInfo.

  1. Registre la dirección IP en clústeres clásicos o el nombre de host en clústeres VPC para el equilibrador de carga istio-ingressgateway creando un subdominio de DNS.

    • Clásico:
        ibmcloud ks nlb-dns create classic --ip $INGRESS_IP --secret-namespace istio-system --cluster <cluster_name_or_id>
        ```
    * VPC:
    ```sh {: pre}
        ibmcloud ks nlb-dns create vpc-gen2 --lb-host $GATEWAY_URL --secret-namespace istio-system --cluster <cluster_name_or_id>
        ```
    
  2. Verifique que se ha creado el subdominio y anote el nombre del secreto de SSL del campo SSL Cert Secret Name.

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

    Salida de ejemplo 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>
    

Configuración de bookinfo-gateway para que utilice la terminación TLS

Siga estos pasos para configurar la terminación TLS para bookinfo-gateway.

  1. Suprima el bookinfo-gateway existente, que no está configurado para manejar conexiones TLS.
    kubectl delete gateway bookinfo-gateway
    
  2. Cree un nuevo archivo de configuración bookinfo-gateway que utilice la terminación TLS. Guarde el siguiente archivo YAML como bookinfo-gateway.yaml. Sustituya <secret_name> por el nombre del secreto SSL que ha encontrado anteriormente.
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: bookinfo-gateway
    spec:
      selector:
        istio: ingressgateway
      servers:
      - port:
          number: 443
          name: https
          protocol: HTTPS
        tls:
          mode: SIMPLE
          credentialName: <secret_name>
        hosts:
        - "*"
    
  3. Cree el nuevo bookinfo-gateway en el clúster.
    kubectl apply -f bookinfo-gateway.yaml
    
  4. 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
    
  5. Intente renovar la página varias veces. Las solicitudes a https://<subdomain>/productpage las recibe el equilibrador de carga de pasarela de Istio. Las distintas versiones del microservicio reviews se siguen devolviendo aleatoriamente porque la pasarela de Istio gestiona las reglas de direccionamiento de destino y servicio virtual para los microservicios.

Visión general de lo que ha sucedido

El ejemplo BookInfo muestra cómo tres componentes de gestión del tráfico de Istio funcionan en combinación para direccionar el tráfico de entrada a la app.

Gateway
Gatewaybookinfo-gateway describe un equilibrador de carga, el servicio istio-ingressgateway del espacio de nombres istio-system que actúa como punto de entrada para el tráfico entrante de HTTP / TCP destinado a BookInfo. Istio configura el equilibrador de carga para que escuche las solicitudes entrantes a las apps gestionadas por Istio en los puertos definidos en el archivo de configuración de pasarela. Para ver el archivo de configuración de la pasarela de BookInfo, ejecute el mandato siguiente.
kubectl get gateway bookinfo-gateway -o yaml
VirtualService
El documento VirtualServicebookinfo define las reglas que controlan cómo se enrutan las solicitudes dentro de la malla de servicios, definiendo los microservicios como destinations. En el servicio virtual bookinfo, el URI /productpage de una solicitud se direcciona al host productpage en el puerto 9080. De este modo, todas las solicitudes a la app BookInfo se direccionan primero al microservicio productpage, que a continuación llama a los otros microservicios de BookInfo. Para ver la regla de servicio virtual, ejecute el mandato siguiente.
kubectl get virtualservice bookinfo -o yaml
DestinationRule
Una vez que la puerta de enlace ha enrutado la solicitud según la regla del servicio virtual, las políticas details, productpage, ratings, y DestinationRulesreviews definen las políticas que se aplican a la solicitud cuando esta llega a un microservicio. Por ejemplo, si renueva la página de productos de BookInfo, los cambios que verá son el resultado de que el microservicio productpage llame aleatoriamente a distintas versiones, v1, v2 y v3, del microservicio reviews. Las versiones se seleccionan aleatoriamente porque la regla de destino reviews otorga el mismo peso a los subsets, o versiones con nombre, del microservicio. Las reglas del servicio virtual utilizan estos subconjuntos cuando se direcciona el tráfico a versiones específicas del servicio. Para ver las reglas de destino que se aplican a BookInfo, ejecute el mandato siguiente.
kubectl describe destinationrules

Inclusión de apps en la red de servicios de Istio mediante la configuración la inyección de complementos

¿Está listo para gestionar sus propias apps mediante Istio? Antes de desplegar la app, debe decidir cómo desea inyectar los complementos de proxy de Envoy en los pods de la app.

Cada pod de aplicación debe ejecutar un sidecar de proxy de Envoy para que los microservicios estén en la malla de servicios. Puede asegurarse de que los complementos se inyectan en cada pod de la app de forma automática o manual. Para obtener más información sobre la inyección de sidecar, consulta la documentación de Istio.

Habilitación de la inyección automática de complementos

Cuando la inyección automática de complementos está habilitada, un espacio de nombres escucha cualquier nuevo despliegue y modifica automáticamente la especificación de la plantilla de pod de forma que los pods de app se creen con contenedores de complementos de proxy de Envoy. Habilite la inyección automática de complementos para un espacio de nombres cuando vaya a desplegar varias apps que desee integrar con Istio en ese espacio de nombres. La inyección automática de complementos no está habilitada de forma predeterminada para ninguno de los espacios de nombres en el complemento gestionado de Istio.

No habilite la inyección de complementos para los espacios de nombres kube-system, ibm-system, ni ibm-operators.

Para habilitar la inyección automática de complementos para un espacio de nombres:

  1. Obtenga el nombre del espacio de nombres en el que desea desplegar las apps gestionadas por Istio.

    kubectl get namespaces
    
  2. Etiquete el espacio de nombres como istio-injection=enabled.

    kubectl label namespace <namespace> istio-injection=enabled
    
  3. Despliegue las apps en el espacio de nombres etiquetado o vuelva a desplegar las apps que ya están en el espacio de nombres.

    kubectl apply <myapp>.yaml --namespace <namespace>
    
  4. Opcional Para volver a desplegar una aplicación en el espacio de nombres, suprima el pod de la aplicación, a fin de que se vuelva a desplegar con el sidecar inyectado.

    kubectl delete pod -l app=<myapp>
    
  5. Si no ha creado un servicio para exponer la aplicación, cree un servicio de Kubernetes. El servicio de Kubernetes debe exponer la app para incluirla como microservicio en la red de servicios de Istio. Asegúrese de cumplir los requisitos de Istio para los pods y los servicios.

  6. Defina un servicio para la app.

    apiVersion: v1
    kind: Service
    metadata:
      name: myappservice
    spec:
      selector:
        <selector_key>: <selector_value> # Enter the label key `selector_key` and value `selector_value` pair that you want to use to target the pods where your app runs.
      ports:
      - protocol: TCP
        port: 8080 # The port that the service listens on
    
  7. Cree el servicio en el clúster. Asegúrese de que el servicio se despliega en el mismo espacio de nombres que la app.

    kubectl apply -f myappservice.yaml -n <namespace>
    

Los pods de la app están ahora integrados en la red de servicios de Istio porque tienen el contenedor de complementos de Istio que se ejecutan junto con el contenedor de la app.

Inyección manual de complementos

Si no quiere habilitar la inyección automática de sidecar para un espacio de nombres, puede inyectar manualmente el sidecar en un archivo YAML de despliegue. Inyecte sidecars manualmente cuando las aplicaciones se ejecuten en espacios de nombres junto con otros despliegues en los que no desea que se inyecten automáticamente los sidecars.

No habilite la inyección de complementos para los espacios de nombres kube-system, ibm-system, ni ibm-operators.

  1. Descargue el cliente istioctl.
    curl -L https://istio.io/downloadIstio | sh -
    
  2. Vaya al directorio del paquete de Istio.
    cd istio-1.29.5
    

Para inyectar manualmente complementos en un despliegue:

  1. Inyecte el complemento Envoy en el archivo YAML de despliegue de la app.

    istioctl kube-inject -f <myapp>.yaml | kubectl apply -f -
    
  2. Desplegar la app.

    kubectl apply <myapp>.yaml
    
  3. Si no ha creado un servicio para exponer la aplicación, cree un servicio de Kubernetes. El servicio de Kubernetes debe exponer la app para incluirla como microservicio en la red de servicios de Istio. Asegúrese de cumplir los requisitos de Istio para los pods y los servicios.

  4. Defina un servicio para la app.

    apiVersion: v1
    kind: Service
    metadata:
      name: myappservice
    spec:
      selector:
        <selector_key>: <selector_value> # Enter the label key `selector_key` and value `selector_value` pair that you want to use to target the pods where your app runs.
      ports:
      - protocol: TCP
        port: 8080 # The port that the service listens on.
    
  5. Cree el servicio en el clúster. Asegúrese de que el servicio se despliega en el mismo espacio de nombres que la app.

    kubectl apply -f myappservice.yaml -n <namespace>
    

Los pods de la app están ahora integrados en la red de servicios de Istio porque tienen el contenedor de complementos de Istio que se ejecutan junto con el contenedor de la app.

Activación o desactivación de los equilibradores de carga públicos Istio en addon-istio 1.23

De forma predeterminada, un equilibrador de carga de Istio público, istio-ingressgateway, está habilitado en el clúster para equilibrar la carga de las solicitudes de entrada procedentes de internet destinadas a las apps gestionadas por Istio. Puede obtener una mayor disponibilidad si habilita un equilibrador de carga de Istio en cada zona del clúster.

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

    kubectl edit cm managed-istio-custom -n ibm-operators
    
  2. Verifique que todas las zonas de clúster estén en los campos istio-ingressgateway-zone.

    Ejemplo para un clúster clásico multizona en Dallas:

    istio-ingressgateway-zone-1: "dal10"
    istio-ingressgateway-zone-2: "dal12"
    istio-ingressgateway-zone-3: "dal13"
    
  3. Habilite o inhabilite un equilibrador de carga de Istio en cada zona estableciendo los campos istio-ingressgateway-public-1|2|3-enabled en "true" o "false".

    Si desea que las apps sean accesibles para los clientes, asegúrese de que al menos un equilibrador de carga esté habilitado o cree equilibradores de carga de pasarela personalizados. Si inhabilita todos los equilibradores de carga en todas las zonas, su aplicación ya no está expuesta y no se puede acceder a ella externamente.

    Ejemplo para habilitar una pasarela pública en cada zona:

    istio-ingressgateway-public-1-enabled: "true"
    istio-ingressgateway-public-2-enabled: "true"
    istio-ingressgateway-public-3-enabled: "true"
    
  4. Guarde y cierre el archivo de configuración.

  5. Verifique que se han creado los nuevos servicios del equilibrador de carga istio-ingressgateway.

    kubectl get svc -n istio-system
    

Para exponer las apps gestionadas por Istio mediante los servicios del equilibrador de carga istio-ingressgateway, especifique el selector istio: ingressgateway en el recurso Gateway. Para obtener más información, consulte Exposición de apps gestionadas por Istio.

Exposición de la pasarela ingress de Istio con DNS

Exponga públicamente sus apps gestionadas por Istio creando una entrada de DNS para el equilibrador de carga istio-ingressgateway y configurando el equilibrador de carga para reenviar el tráfico a la app.

En los pasos siguientes, debe configurar un nombre de subdominio mediante el cual los usuarios pueden acceder a la app creando los recursos siguientes:

  • Una pasarela denominada my-gateway. Esta pasarela actúa como el punto de entrada público en sus apps y utiliza el servicio de equilibrador de carga istio-ingressgateway existente para exponer la app. La pasarela se puede configurar opcionalmente para la terminación de TLS.
  • Un servicio virtual denominado my-virtual-service. my-gateway utiliza las reglas que define en my-virtual-service para direccionar el tráfico a la aplicación.
  • Un subdominio para el equilibrador de carga istio-ingressgateway. Todas las solicitudes de usuario para el subdominio se reenvían a la app de acuerdo con las reglas de direccionamiento de my-virtual-service.

Exposición de la pasarela ingress de Istio con DNS sin terminación TLS

  1. Instale el complemento gestionado istio en un clúster.
  2. Instale la CLI de istioctl.
  3. Configure la inyección de sidecar para los microservicios de aplicaciones, despliegue los microservicios de aplicaciones en un espacio de nombres y cree servicios de Kubernetes para que los microservicios de aplicaciones estén en la malla de servicios de Istio.

Para exponer apps públicamente:

  1. Cree una pasarela que utilice el servicio de equilibrador de carga istio-ingressgateway público para exponer el puerto 80 para HTTP. Sustituya <namespace> por el espacio de nombres en el que se despliegan los microservicios gestionados por Istio. Para obtener más información sobre los componentes YAML de la pasarela, consulta la documentación de referencia de Istio.

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: my-gateway
    spec:
      selector:
        app: ingressgateway
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "*"
    
  2. Aplique la pasarela en el espacio de nombres en el que se han desplegado los microservicios gestionados por Istio.

    kubectl apply -f my-gateway.yaml -n <namespace>
    
  3. Cree un servicio virtual que utilice la pasarela my-gateway y defina las reglas de direccionamiento para los microservicios de la app. Si los microservicios escuchan en un puerto distinto al 80, añada dicho puerto. Para obtener más información sobre los componentes YAML de los servicios virtuales, consulta la documentación de referencia de Istio.

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: my-virtual-service
      namespace: <namespace> # The namespace where your Istio-managed microservices are deployed.
    spec:
      gateways:
      - my-gateway # `my-gateway` is specified so that the gateway can apply these virtual service routing rules to the `istio-ingressgateway` load balancer.
      hosts:
      - '*'
      http:
      - match:
        - uri:
            exact: /<service_path> # Replace `service_path` with the path that your entrypoint microservice listens on. For example, in the BookInfo app, the path is defined as `/productpage`.
        route:
        - destination:
            host: <service_name> # Replace `service_name` with the name of your entrypoint microservice. For example, in the BookInfo app, `productpage` served as the entrypoint microservice that called the other app microservices.
            port:
              number: 80 # If your microservice listens on a different port, replace `80` with the port.
    
  4. Aplique las reglas de servicio virtual en el espacio de nombres en el que se ha desplegado el microservicio gestionado por Istio.

    kubectl apply -f my-virtual-service.yaml -n <namespace>
    
  5. Obtenga la dirección EXTERNAL-IP (clústeres clásicos) o el nombre de host (clústeres de VPC) para el equilibrador de carga público istio-ingressgateway. Si ha habilitado un equilibrador de carga de Istio en cada zona del clúster, obtenga la dirección IP o el nombre de host del servicio de equilibrador de carga en cada zona.

    kubectl get svc -n istio-system
    
    # Example output for classic clusters
    istio-ingressgateway     LoadBalancer   172.21.XXX.XXX   169.1.1.1       80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP  22m
    
    # Example output for VPC clusters:
    istio-ingressgateway     LoadBalancer   172.21.XXX.XXX   1234abcd-us-south.lb.appdomain.cloud       80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP  22m
    
  6. Registre la dirección IP o el nombre de host del equilibrador de carga creando un subdominio de DNS. Para obtener más información sobre el registro de subdominios DNS en IBM Cloud Kubernetes Service, consulte Clásico: Registro de un subdominio NLB o información sobre el registro de un nombre de host de equilibrador de carga VPC con un subdominio DNS para un VPC ALB o VPC NLB.

    ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> [--ip <LB_zone2_IP> ...]
    

    Ejemplo comando para clústeres de VPC.

    ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname>
    
  7. Verifique que se ha creado el subdominio. En la salida, copie el nombre del secreto de SSL del campo SSL Cert Secret Name.

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

    Salida de ejemplo 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 resultado para clústeres 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>
    
  8. Compruebe que el tráfico se está direccionando a los microservicios gestionados por Istio especificando el URL del microservicio de la app.

    http://<host_name>/<service_path>
    

¿Busca un control aún más detallado sobre el direccionamiento? Para crear reglas que se apliquen después de que el equilibrador de carga dirija el tráfico a cada microservicio, como reglas para enviar el tráfico a diferentes versiones de un mismo microservicio, puede crear y aplicar DestinationRules.

¿Necesita depurar las configuraciones de entrada o de salida? 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. Si observa que el pod ibm-cloud-provider-ip para una pasarela está atascado en pending, consulte este tema de resolución de problemas.

Exposición de la pasarela ingress de Istio con DNS con terminación TLS

  1. Instale el complemento gestionado istio en un clúster.
  2. Instale la CLI de istioctl.
  3. Configure la inyección de sidecar para los microservicios de aplicaciones, despliegue los microservicios de aplicaciones en un espacio de nombres y cree servicios de Kubernetes para que los microservicios de aplicaciones estén en la malla de servicios de Istio.

Para exponer apps públicamente:

  1. Registre la dirección IP o el nombre de host del equilibrador de carga creando un subdominio de DNS. Para obtener más información sobre cómo registrar subdominios de DNS en IBM Cloud Kubernetes Service, consulte Clásico: Registro de un subdominio de NLB o Registro de un nombre de host de equilibrador de carga de VPC con un subdominio de DNS.

    • Clústeres clásicos:
        ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> [--ip <LB_zone2_IP> ...]
        ```
    * Clústeres VPC:
    ```sh {: pre}
        ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname>
        ```
    
  2. Verifique que se ha creado el subdominio. En la salida, copie el nombre del secreto de SSL del campo SSL Cert Secret Name.

    ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
    
    # Example output for classic clusters:
    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>
    
    # Example output for VPC clusters:
    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. Cree una pasarela que utilice el servicio de equilibrador de carga istio-ingressgateway público para exponer el puerto 80 para HTTP. Sustituya <namespace> por el espacio de nombres en el que se despliegan los microservicios gestionados por Istio. Para obtener más información sobre los componentes YAML de la pasarela, consulta la documentación de referencia de Istio.

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: my-gateway
      namespace: <namespace>
    spec:
      selector:
        istio: ingressgateway
      servers:
        - port:
            name: https
            protocol: HTTPS
            number: 443
        tls:
          mode: SIMPLE
          serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
          privateKey: /etc/istio/ingressgateway-certs/tls.key
        hosts:
        - "*"
    
  4. Aplique la pasarela en el espacio de nombres en el que se han desplegado los microservicios gestionados por Istio.

    kubectl apply -f my-gateway.yaml -n <namespace>
    
  5. Cree un servicio virtual que utilice la pasarela my-gateway y defina las reglas de direccionamiento para los microservicios de la app. Para obtener más información sobre los componentes YAML de los servicios virtuales, consulta la documentación de referencia de Istio.

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: my-virtual-service
      namespace: <namespace> # The namespace where your Istio-managed microservices are deployed.
    spec:
      gateways:
      - my-gateway # `my-gateway` is specified so that the gateway can apply these virtual service routing rules to the `istio-ingressgateway` load balancer.
      hosts:
      - '*'
      http:
      - match:
        - uri:
            exact: /<service_path> # Replace `service_path` with the path that your entrypoint microservice listens on. For example, in the BookInfo app, the path is defined as `/productpage`.
        route:
        - destination:
            host: <service_name> # The name of your entrypoint microservice. For example, in the BookInfo app, `productpage` served as the entrypoint microservice that called the other app microservices.
            port:
              number: 443 # If your microservice listens on a different port, replace 443 with the port.
    
  6. Aplique las reglas de servicio virtual en el espacio de nombres en el que se ha desplegado el microservicio gestionado por Istio.

    kubectl apply -f my-virtual-service.yaml -n <namespace>
    
  7. Obtenga la dirección EXTERNAL-IP (clústeres clásicos) o el nombre de host (clústeres de VPC) para el equilibrador de carga público istio-ingressgateway. Si ha habilitado un equilibrador de carga de Istio en cada zona del clúster, obtenga la dirección IP o el nombre de host del servicio de equilibrador de carga en cada zona.

    kubectl get svc -n istio-system
    
    # Example output for classic clusters:
    istio-ingressgateway     LoadBalancer   172.21.XXX.XXX   169.1.1.1       80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP  22m
    
    # Example output for VPC clusters:
    istio-ingressgateway     LoadBalancer   172.21.XXX.XXX   1234abcd-us-south.lb.appdomain.cloud       80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP  22m
    
  8. Compruebe que el tráfico se está direccionando a los microservicios gestionados por Istio especificando el URL del microservicio de la app.

    https://<host_name>/<service_path>
    

Los certificados para el secreto de host de DNS de NLB caducan cada 90 días. IBM Cloud Kubernetes Service renueva automáticamente el secreto del espacio de nombres predeterminado 37 días antes de que caduque, pero debe copiar manualmente el secreto en el espacio de nombres istio-system cada vez que se renueve el secreto. Utilice scripts para automatizar este proceso.

¿Busca un control aún más detallado sobre el direccionamiento? Para crear reglas que se apliquen después de que el equilibrador de carga dirija el tráfico a cada microservicio, como reglas para enviar el tráfico a diferentes versiones de un mismo microservicio, puede crear y aplicar DestinationRules.

¿Necesita depurar las configuraciones de entrada o de salida? 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. Si observa que el pod ibm-cloud-provider-ip para una pasarela está atascado en pending, consulte este tema de resolución de problemas.

Protección del tráfico interno del clúster mediante la habilitación de mTLS

Habilite el cifrado para las cargas de trabajo en un espacio de nombres para conseguir el TLS mutuo (mTLS) dentro del clúster. El tráfico que direcciona Envoy entre los pods del clúster se cifra con TLS. Istio se encarga de la gestión de certificados para mTLS. Para más información, consulte la documentación de Istio mutual TLS.

  1. Cree un archivo de política de autenticación que se denomina default.yaml. Esta política está limitada al espacio de nombres y configura cargas de trabajo en la red de servicios de modo que solo acepten las solicitudes cifradas con TLS. Observe que no se incluyen especificaciones de destino (targets) porque la política se aplica a todos los servicios de la red en este espacio de nombres.
    apiVersion: "security.istio.io/v1beta1"
    kind: "PeerAuthentication"
    metadata:
      name: "default"
    spec:
      mtls:
        mode: STRICT
    
  2. Aplique la política de autenticación a un espacio de nombres.
    kubectl apply -f default.yaml -n NAMESPACE
    
  3. Cree un archivo de reglas de destino llamado destination-mtls.yaml. Esta política configura las cargas de trabajo de la red de servicios en un espacio de nombres de modo que envíen el tráfico mediante TLS. Observe que el carácter comodín host: *.local aplica esta regla de destino a todos los servicios de la red.
    apiVersion: "networking.istio.io/v1beta1"
    kind: "DestinationRule"
    metadata:
      name: "destination-mtls"
    spec:
      host: "*.local"
      trafficPolicy:
        tls:
          mode: ISTIO_MUTUAL
    
  4. Aplique la regla de destino.
    kubectl apply -f destination-mtls.yaml -n NAMESPACE
    
  5. Si desea aplicar mTLS a las cargas de trabajo de malla de servicios en otros espacios de nombres, repita estos pasos en cada espacio de nombres.

Las reglas de destino también se utilizan por motivos no relacionados con la autenticación, como por ejemplo para direccionar el tráfico a diferentes versiones de un servicio. Cualquier regla de destino que cree para un servicio también debe contener el mismo bloque TLS que está establecido en mode: ISTIO_MUTUAL. Este bloque impide que la regla altere modifique los valores de mTSL de la red que ha configurado en esta sección.