Instala Istio

En esta página, se explica cómo instalar Istio en tu clúster de GKE on-prem.

Resumen

Istio es un framework de código abierto para conectar, supervisar y proteger microservicios, incluidos los servicios que se ejecutan en GKE de forma local. Te permite crear una red de servicios implementados con balanceo de cargas, autenticación de servicio a servicio, supervisión y más, sin requerir ningún cambio en el código de servicio. Debes agregar la asistencia de Istio a los servicios mediante la implementación de un proxy especial de archivo adicional Envoy en cada uno de los pods de tu aplicación. El proxy Envoy intercepta toda la comunicación de red entre microservicios y se configura y administra mediante la funcionalidad del plano de control de Istio.

En esta guía, se muestra cómo instalar y configurar Istio en GKE on-prem e implementar una aplicación de varios servicios habilitada para Istio.

Antes de comenzar

Asegúrate de haber instalado el SDK de Cloud.

Instale Helm

Para instalar Istio, recomendamos usar Helm con uno de los perfiles configurables de Istio.

Si aún no instalaste Helm, sigue las instrucciones del archivo README de Helm para instalar el objeto binario helm en la máquina en la que tienes las credenciales del clúster.

Permisos y credenciales

  1. Asegúrate de tener credenciales kubectl para el clúster de usuarios de GKE on-prem en el que desees instalar Istio. Ten en cuenta que Istio solo se puede instalar en un clúster de usuario de GKE on-prem, no en un clúster de administrador.

  2. Otorga permisos de administrador de clúster al usuario actual. Necesitas estos permisos para crear las reglas de control de acceso basado en funciones (RBAC) necesarias de Istio:

    kubectl create clusterrolebinding cluster-admin-binding \
      --clusterrole=cluster-admin \
      --user="$(gcloud config get-value core/account)"
    

    Aunque puedes ejecutar la app de demostración sin otorgar permisos de administrador de clúster, los permisos son necesarios si deseas acceder a los datos de telemetría y otras funciones de Istio.

Descargar Istio

Para GKE On-Prem, recomendamos usar la versión de Istio 1.1.13.

Sigue estos pasos en la misma máquina donde tienes tus credenciales de clúster: esta es tu máquina de administración de clúster.

  1. Descarga y expande el paquete 1.1.13 de Istio a tu directorio actual con el siguiente comando:

    curl -L https://github.com/istio/istio/releases/download/1.1.13/istio-1.1.13-linux.tar.gz | tar xz
    

    El directorio de instalación contiene lo siguiente:

    • Archivos .yaml de instalación para Kubernetes en install/
    • Aplicaciones de muestra en samples/
    • El objeto binario istioctl en el directorio bin/ istioctl se usa cuando se inserta Envoy de forma manual como un proxy de sidecar y para crear reglas y políticas de enrutamiento.
    • El archivo de configuración istio.VERSION
  2. Cambia al directorio raíz de instalación y agrega istioctl a tu PATH:

    cd  istio-1.1.13
    export PATH=$PATH:${PWD}/bin
    

Configurar el espacio de nombres y el certificado

En tu máquina de administrador de clústeres, haz lo siguiente para configurar el espacio de nombres istio-system en los componentes del plano de control:

kubectl create namespace istio-system

Luego, copia el certificado raíz requerido en istio-system para Citadel. Esto es necesario para los clústeres de GKE on-prem:

kubectl get secret istio-ca-secret --namespace=kube-system --export -o yaml | kubectl apply --validate=false --namespace=istio-system -f -

Instala Istio

Ya está listo para instalar Istio. Istio está instalado en el espacio de nombres istio-system que acabas de crear y puede administrar microservicios desde todos los demás espacios de nombres. La instalación incluye componentes, herramientas y ejemplos de Istio Core.

  1. Asegúrate de que estás en el directorio raíz de la instalación de Istio.

  2. Instala las definiciones de recursos personalizadas (CRD) de Istio:

    helm template install/kubernetes/helm/istio-init \
      --name istio-init --namespace istio-system | kubectl apply -f -
    
  3. Espera unos segundos para que todas las CRD se confirmen en el servidor de la API de Kubernetes.

  4. Instala Istio con el perfil predeterminado. Aunque puedes elegir otro perfil, recomendamos el perfil predeterminado para las implementaciones de producción.

    helm template install/kubernetes/helm/istio \
      --name istio --namespace istio-system | kubectl apply -f -
    

    Esta acción implementará los componentes principales de Istio:

    • Istio-Pilot, que es responsable de la detección del servicio y de la configuración de los proxies de archivos adicionales Envoy en una malla de servicio de Istio.
    • Los componentes Mixer de Istio-Policy y de Istio-Telemetry que aplican políticas de uso y recopilan datos de telemetría a través de la malla de servicios
    • Istio-Ingressgateway, que proporciona un punto de ingreso para el tráfico desde fuera del clúster
    • Istio-Citadel, que automatiza la administración de claves y certificados para Istio.

Verifica la instalación de Istio

  1. Asegúrate de que los siguientes servicios de Kubernetes estén implementados: istio-citadel, istio-pilot, istio-ingressgateway, istio-policy e istio-telemetry (también verás otros servicios implementados). :

    kubectl get service -n istio-system
    
    Salida:
    NAME                       TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                               AGE
    ...
    istio-citadel              ClusterIP      10.19.253.95            8060/TCP,9093/TCP                                                     37s
    istio-galley               ClusterIP      10.19.245.2             443/TCP,15014/TCP,9901/TCP                                            37s
    istio-ingressgateway       LoadBalancer   10.19.247.233        80:31380/TCP,443:31390/TCP,31400:31400/TCP                            40s
    istio-pilot                ClusterIP      10.19.243.14            15003/TCP,15005/TCP,15007/TCP,15010/TCP,15011/TCP,8080/TCP,9093/TCP   38s
    istio-policy               ClusterIP      10.19.254.117           9091/TCP,15004/TCP,9093/TCP                                           39s
    istio-sidecar-injector     ClusterIP      10.19.248.228           443/TCP                                                               37s
    istio-statsd-prom-bridge   ClusterIP      10.19.252.35            9102/TCP,9125/UDP                                                     39s
    istio-telemetry            ClusterIP      10.19.250.11            9091/TCP,15004/TCP,9093/TCP,42422/TCP                                 39s
    ...
  2. Asegúrate de que los pods de Kubernetes correspondientes estén implementados y que todos los contenedores estén en funcionamiento: istio-pilot-*, istio-policy-*, istio-telemetry-*, istio-ingressgateway-* e istio-citadel-*.

    kubectl get pods -n istio-system
    
    Salida:
    NAME                                        READY     STATUS      RESTARTS   AGE
    istio-citadel-54f4678f86-4549b              1/1       Running     0          12m
    istio-cleanup-secrets-5pl77                 0/1       Completed   0          12m
    istio-galley-7bd8b5f88f-nhwlc               1/1       Running     0          12m
    istio-ingressgateway-665699c874-l62rg       1/1       Running     0          12m
    istio-pilot-68cbbcd65d-l5298                2/2       Running     0          12m
    istio-policy-7c5b5bb744-k6vm9               2/2       Running     0          12m
    istio-security-post-install-g9l9p           0/1       Completed   3          12m
    istio-sidecar-injector-85ccf84984-2hpfm     1/1       Running     0          12m
    istio-telemetry-5b6c57fffc-9j4dc            2/2       Running     0          12m
    istio-tracing-77f9f94b98-jv8vh              1/1       Running     0          12m
    prometheus-7456f56c96-7hrk5                 1/1       Running     0          12m
    ...

Configura una dirección IP externa

La instalación predeterminada de Istio supone que se asigna automáticamente una dirección IP externa para los servicios de LoadBalancer. Esto no es cierto en los clústeres de GKE on-prem. Debido a esto, debes asignar de forma manual una dirección IP para el recurso de puerta de enlace de entrada de Istio.

Para configurar una dirección IP externa, sigue una de las secciones que se encuentran a continuación, según el modo de balanceo de cargas de tu clúster:

Modo de balanceo de cargas integrado

  1. Abre la configuración del servicio istio-ingressgateway:

    kubectl edit svc -n istio-system istio-ingressgateway
    

    La configuración para el servicio istio-ingressgateway se abre en el editor de texto predeterminado de tu shell.

  2. En el archivo, agrega la siguiente línea debajo del bloque de especificación (spec):

    loadBalancerIP: <your static external IP address>
    

    Por ejemplo:

    spec:
     loadBalancerIP: 203.0.113.1
    
  3. Guarde el archivo.

Modo de balanceo de cargas manual

Para exponer un servicio de tipo NodePort con una VIP en el balanceador de cargas seleccionado, primero debes averiguar los valores nodePort:

  1. Visualiza la configuración del servicio istio-ingressgateway en tu shell:

    kubectl get svc -n istio-system istio-ingressgateway -o yaml
    

    Se muestran cada uno de los puertos para las puertas de enlace de istio. El resultado del comando podría verse así:

     ...
     ports:

    • name: status-port nodePort: 30391 port: 15020 protocol: TCP targetPort: 15020
    • name: http2 nodePort: 31380 port: 80 protocol: TCP targetPort: 80
    • name: https nodePort: 31390 port: 443 protocol: TCP targetPort: 443
    • name: tcp nodePort: 31400 port: 31400 protocol: TCP targetPort: 31400
    • name: https-kiali nodePort: 31073 port: 15029 protocol: TCP targetPort: 15029
    • name: https-prometheus nodePort: 30253 port: 15030 protocol: TCP targetPort: 15030
    • name: https-grafana nodePort: 30050 port: 15031 protocol: TCP targetPort: 15031
    • name: https-tracing nodePort: 31204 port: 15032 protocol: TCP targetPort: 15032
    • name: tls nodePort: 30158 port: 15443 protocol: TCP targetPort: 15443 ...
  2. Expón estos puertos a través de tu balanceador de cargas.

    Por ejemplo, el puerto de servicio llamado http2 tiene port 80 y nodePort 31380. Supongamos que las direcciones de nodo para tu clúster de usuario son 192.168.0.10, 192.168.0.11 y 192.168.0.12, y la VIP de tu balanceador de cargas es 203.0.113.1.

    Configura tu balanceador de cargas para que el tráfico enviado a 203.0.113.1:80 se reenvíe a 192.168.0.10:31380, 192.168.0.11:31380 o 192.168.0.12:31380. Puedes seleccionar los puertos de servicio que deseas exponer en esta VIP determinada.

Implementa la aplicación de muestra

Una vez que Istio esté instalado y todos sus componentes se ejecuten, puedes intentar implementar una de las aplicaciones de muestra provistas con la instalación. En este instructivo, instalaremos BookInfo. Esta es una aplicación simple de librería, que consta de cuatro servicios que proporcionan una página de producto web, detalles de libros, reseñas (con varias versiones del servicio de reseñas) y calificaciones. Todas se administran mediante Istio. Puedes encontrar el código fuente y todos los demás archivos usados en este ejemplo en el directorio muestras/bookinfo de tu instalación de Istio.

Cuando sigues estos pasos, los servicios de la aplicación BookInfo se implementan en un entorno habilitado para Istio con proxies de archivos adicionales Envoy inyectados junto con cada servicio a fin de proporcionar la funcionalidad de Istio.

  1. Asegúrate de que aún te encuentras en el directorio raíz de instalación de Istio en tu máquina de administración de clústeres.

  2. Implementa la aplicación con kubectl apply e istioctl kube-inject. El comando kube-inject actualiza la implementación de BookInfo para que se implemente un archivo adicional en cada pod de aplicación junto con el servicio.

    kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
    
  3. Confirma que la aplicación se implementó correctamente ejecutando los siguientes comandos:

    kubectl get services
    Salida:
    NAME                       CLUSTER-IP   EXTERNAL-IP   PORT(S)              AGE
    details                    10.0.0.31    <none>        9080/TCP             6m
    kubernetes                 10.0.0.1     <none>        443/TCP              7d
    productpage                10.0.0.120   <none>        9080/TCP             6m
    ratings                    10.0.0.15    <none>        9080/TCP             6m
    reviews                    10.0.0.170   <none>        9080/TCP             6m

    y

    kubectl get pods
    Salida:
    NAME                                        READY     STATUS    RESTARTS   AGE
    details-v1-1520924117-48z17                 2/2       Running   0          6m
    productpage-v1-560495357-jk1lz              2/2       Running   0          6m
    ratings-v1-734492171-rnr5l                  2/2       Running   0          6m
    reviews-v1-874083890-f0qf0                  2/2       Running   0          6m
    reviews-v2-1343845940-b34q5                 2/2       Running   0          6m
    reviews-v3-1813607990-8ch52                 2/2       Running   0          6m
  4. Finalmente, define el enrutamiento de la puerta de enlace para la aplicación:

    kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
    

Valida la implementación de la aplicación

Ahora que está implementado, veamos la aplicación BookInfo en acción. Ya conoces la dirección IP externa para la puerta de enlace de entrada como la configuraste anteriormente. Entonces, por ejemplo, si usaste 203.0.113.1 para tu IP externa:

export GATEWAY_URL=203.0.113.1

Prueba la aplicación

  1. Verifica que la app BookInfo se ejecute con curl:

    curl -I http://${GATEWAY_URL}/productpage
    

    Si la respuesta muestra 200, significa que la aplicación funciona correctamente con Istio.

  2. Ahora, dirige tu navegador a http://$GATEWAY_URL/productpage para ver la página web de BookInfo. Si actualizas la página varias veces, podrás ver diferentes versiones de reseñas que se muestran en la página del producto presentadas en un estilo de round robin (estrellas rojas, estrellas negras, sin estrellas), ya que aún no hemos usado Istio para controlar la versión de enrutamiento.

Implementa tu propia aplicación

Si deseas intentar implementar una de tus propias aplicaciones, simplemente sigue el mismo procedimiento con tu propia implementación de YAML: Istio no requiere cambios en la aplicación en sí. Ten en cuenta que la aplicación debe usar el protocolo HTTP/1.1 o HTTP/2.0 para todo su tráfico HTTP porque el proxy Envoy no admite HTTP/1.0: Se basa en encabezados que no están presentes en HTTP/1.0 para el enrutamiento.

Puedes usar kube-inject para agregar los archivos adicionales cuando implementas la aplicación, como en nuestro ejemplo, o puedes habilitar la inyección automática del archivo adicional de Istio para el espacio de nombres en el que se ejecuta tu aplicación.

Desinstala

  1. Usa el siguiente comando para desinstalar los componentes de Istio:

    helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl delete -f -
    
  2. Luego, borra el espacio de nombres istio-system:

    kubectl delete namespace istio-system
    

¿Qué sigue?

Obtén más información sobre Istio en el sitio de Istio y en la documentación de Istio de Google Cloud Platform.