Iniciación a Istio

Iniciación al complemento de Istio gestionado en IBM Cloud® Kubernetes Service. En este conjunto de pasos desplegará la app de ejemplo BookInfo para practicar el uso de diversas funciones de la red de servicios de Istio.

Antes de empezar, consulta el registro de cambios del complemento Istio para obtener información sobre la versión.

Paso 1: Habilitar el complemento de Istio

Configure el complemento de Istio gestionado en el clúster.

Inicie una sesión en la cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster.

  1. Habilite el complemento istio.

    ibmcloud ks cluster addon enable istio --cluster CLUSTER_NAME_OR_ID
    
  2. Verifique que el complemento de Istio gestionado tenga el estado Addon Ready. Tenga en cuenta que el complemento puede tardar unos minutos en estar listo.

    ibmcloud ks cluster addon ls --cluster CLUSTER_NAME_OR_ID
    

    Salida de ejemplo

    Name            Version     Health State   Health Status
    istio           1.29       normal         Addon Ready
    
  3. También puede consultar los componentes individuales del complemento para asegurarse de que los pods de Istio se han desplegado.

    kubectl get pods -n istio-system
    
    kubectl get svc -n istio-system
    

Para obtener más información sobre Istio en IBM Cloud Kubernetes Service, consulte Acerca del complemento de Istio gestionado.

Paso 2: Configurar de la app de ejemplo BookInfo

La aplicación de ejemplo BookInfo incluye una configuración básica de Istio para que pueda probar de inmediato las prestaciones de Istio.

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.

La app BookInfo ya está también expuesta en una dirección IP pública mediante una pasarela de Istio. Para ver la arquitectura de BookInfo, consulta la documentación de Istio.

  1. Instale BookInfo en el clúster.

    1. Descargue el paquete de Istio más reciente, 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.
    ```sh {: pre}
        cd istio-1.29.5
        ```
    3. Usuarios de Linux y macOS: añada el cliente `istioctl` a la variable del sistema `PATH`.
    ```sh {: pre}
        export PATH=$PWD/bin:$PATH
        ```
    4. Etiquete el espacio de nombres `default` para la inyección de complementos. Los pods nuevos que se despliegan en `default` se crean ahora automáticamente con los contenedores del complemento proxy de Envoy.
    ```sh {: pre}
        kubectl label namespace default istio-injection=enabled
        ```
    5. Despliegue la aplicación de BookInfo, la pasarela y las reglas de destino.
    ```sh {: pre}
        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
        ```
    6. Asegúrese de que los pods de microservicios de BookInfo tengan el estado `Running`.
    ```sh {: pre}
        kubectl get pods
        ```
        ```sh {: screen}
        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
        ```
    
  2. Obtenga la dirección pública del equilibrador de carga istio-ingressgateway que expone BookInfo.

    • Clústeres clásicos
      1. Establezca la dirección IP de entrada de Istio como una variable de entorno.
        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 como una variable de entorno.
        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
        
    • Clústeres de VPC: cree una variable de entorno GATEWAY_URL que utilice el nombre de host de entrada de Ingress.
        export GATEWAY_URL=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
        ```
    
  3. 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
    
  4. Consulte la página web de BookInfo en un navegador.

    Mac OS o Linux

    open http://$GATEWAY_URL/productpage
    

    Windows

    start http://$GATEWAY_URL/productpage
    
  5. Intente renovar la página varias veces. Las distintas versiones de la sección reviews se indican con cero estrellas (v1 de reviews), estrellas negras (v2) y estrellas rojas (v3).

Para obtener más información sobre cómo direccionar trabajos en Istio, consulte el apartado Visión general de lo que ha sucedido.

Paso 3: Simular un despliegue por fases de BookInfo

Para simular el lanzamiento de una app, puede realizar un despliegue por fases v3 del microservicio reviews de BookInfo.

Cuando termine de probar la app y esté listo para empezar a dirigir tráfico a la misma, puede realizar despliegues graduales a través de Istio. Por ejemplo, puede publicar v3 al 10 % de los usuarios, luego al 20 % de los usuarios, y así sucesivamente.

  1. Configure un servicio virtual para distribuir el 0 % del tráfico a v1, el 90 % del tráfico a v2 y el 10 % del tráfico a v3 de reviews.

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: reviews
    spec:
      hosts:
      - reviews
      http:
      - route:
        - destination:
            host: reviews
            subset: v1
          weight: 0
        - destination:
            host: reviews
            subset: v2
          weight: 90
        - destination:
            host: reviews
            subset: v3
          weight: 10
    
    kubectl apply -f <filename>.yaml
    
  2. Para ver la página web de BookInfo en un navegador, ejecute open http://$GATEWAY_URL/productpage en Mac OS o Linux, o bien ejecute start http://$GATEWAY_URL/productpage en Windows.

  3. Intente renovar la página varias veces. Observe que la página sin estrellas (v1) ya no se muestra y que la mayoría de las renovaciones de páginas muestran estrellas negras (v2). Solo rara vez se muestra la página con estrellas rojas (v3).

  4. Cambie la distribución del tráfico de modo que todo el tráfico se envíe solo a v3. Observe que, en un escenario real, puede desplegar lentamente los cambios de versión modificando la distribución del tráfico primero a 80:20, luego a 70:30, y así sucesivamente hasta que todo el tráfico se dirija solo a la versión más reciente.

    1. Edite el archivo de configuración para el servicio virtual reviews.
        kubectl edit VirtualService reviews
        ```
    2. Cambie el valor de `weight` de `v2` por `0` y el valor de `weight` de `v3` por `100`.
    3. Guarde y cierre el archivo.
    
    
  5. Intente renovar la página de BookInfo varias veces. Observe que la página con estrellas negras (v2) ya no se muestra y que solo aparece la página con estrellas rojas (v3).

  6. Si tiene habilitados los registros de acceso de envoy: verifique que no existen registros de solicitudes a v2 desde que ha cambiado el archivo YAML para las revisiones VirtualService.

    kubectl logs -l app=reviews,version=v2 -c istio-proxy
    

Paso 4: Supervisar BookInfo con IBM Cloud Monitoring

Utiliza uno de los paneles predefinidos de Istio de Monitoring para supervisar tus microservicios de BookInfo.

Para desplegar agentes de supervisión en el clúster, realice los pasos siguientes.

  1. Suministre una instancia de IBM Cloud Monitoring.

  2. Configure un agente de supervisión en el clúster.

  3. En la consola de supervisión, haz clic en Abrir panel de control para la instancia que has aprovisionado.

  4. En la interfaz de usuario de Monitoring, pulse Añadir nuevo panel de control.

  5. Busca Istio y selecciona uno de los paneles predefinidos de Istio de Monitoring.

Para obtener más información sobre cómo consultar métricas y paneles de control, supervisar los componentes internos de Istio y supervisar las implementaciones A/B y las implementaciones canary de Istio, consulta la entrada del blog Cómo supervisar Istio, de la malla de servicios Kubernetes.

Paso 5: Proteger el 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.