Versión 1.0. Esta versión ya no se admite como se describe en la política de asistencia de la versión de Anthos. Actualiza a una versión compatible para obtener los parches y las actualizaciones más recientes sobre vulnerabilidades de seguridad, exposiciones y problemas que afectan a los clústeres de Anthos en VMware (GKE On-Prem). Puedes encontrar la versión más reciente aquí.

Instala Istio

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

Descripción general

Istio es un framework de código abierto para conectar, supervisar y proteger microservicios, incluidos los servicios que se ejecutan en GKE On-Prem. 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 on GKE On-Prem y cómo 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 la instalación de Istio, te recomendamos usar Helm con uno de los perfiles configurables de Istio.

Si aún no instalaste Helm, sigue las instrucciones que están en el archivo README de Helm para instalar el objeto binario de helm en la máquina en la que se encuentran las credenciales de tu 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)"
    

    Si bien 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 a otras funciones de Istio.

Descarga Istio

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

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 de Istio v1.7 a tu directorio actual con el siguiente comando:

    curl -L https://github.com/istio/istio/releases/download/1.1.7/istio-1.1.7-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 de cliente en el directorio bin/. istioctl se usa cuando se incorpora 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 el directorio raíz de la instalación y agrega istioctl en la PATH:

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

Configura el espacio de nombres y el certificado

En la máquina del 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. En los clústeres de GKE On-Prem, esto es necesario:

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

Instala Istio

Ahora está todo listo para instalar Istio. Istio se instala 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. Si bien puedes elegir otro perfil, recomendamos usar 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 una dirección IP externa para los servicios del LoadBalancer de forma automática. Esto no es así con los clústeres de GKE On-Prem. Debido a esto, debes asignar una dirección IP de forma manual para el servicio de puerta de enlace de entrada de Istio. Para asignar una dirección IP externa estática, ejecuta el comando siguiente:

kubectl edit svc -n istio-system istio-ingressgateway

Agrega la línea:

loadBalancerIP: <your static external IP address>

a la sección spec:, como en el siguiente ejemplo:

spec:
  loadBalancerIP: 1.2.3.4

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. Se trata de una aplicación sencilla que simula ser una librería, formada por cuatro servicios que proporcionan una página web de productos, detalles de reservas, reseñas (con varias versiones del servicio de reseñas) y clasificaciones, todo esto administrado 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 y 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á implementada, veamos la aplicación Bookinfo en acción. Ya conoces la dirección IP externa de la puerta de enlace de entrada debido a que la configuraste antes. Por lo tanto, si usaste 1.2.3.4 para la IP externa, por ejemplo, el resultado será el siguiente:

export GATEWAY_URL=1.2.3.4

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
    

Próximos pasos

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