Instalar Istio on GKE

En esta guía, se muestra cómo comenzar a usar el complemento Istio on GKE, incluidas las opciones de instalación de clústeres nuevos y existentes. Puedes instalar el complemento con la CLI de gcloud o Google Cloud Console.

Puede obtener más información sobre el complemento Istio on GKE y si es adecuado para usted en la Descripción general.

Antes de comenzar

Siga los pasos que se indican a continuación para habilitar la API de Google Kubernetes Engine:

  1. Visita la página de Kubernetes Engine en Google Cloud Console.
  2. Crea o selecciona un proyecto.
  3. Espera a que la API y los servicios relacionados se habiliten. Esto puede tomar varios minutos.
  4. Comprueba que la facturación esté habilitada en tu proyecto.

    Descubre cómo puedes habilitar la facturación

Asegúrate de tener instaladas las siguientes herramientas de línea de comandos:

  • La CLI de gcloud se usa para crear y borrar clústeres de Kubernetes Engine, incluso crear y actualizar clústeres con el complemento de Istio on GKE. La CLI de gcloud se incluye en la CLI de Google Cloud: sigue las instrucciones para instalar y, luego, inicializar la CLI de gcloud a fin de trabajar con tus proyectos de GCP. Si tienes una instalación existente de la CLI de Google Cloud, verifica que tenga al menos la versión 208.0.0:
    gcloud version
    Ten en cuenta que no debes instalar gcloud para crear un clúster nuevo habilitado para Istio, ya que puedes usar Google Cloud Console, pero es útil para administrar clústeres existentes y para instalar otras herramientas como kubectl.
  • kubectl se usa para administrar Kubernetes, el sistema de organización de clúster que usa GKE. Puedes instalar kubectl mediante gcloud:
    gcloud components install kubectl

Establece valores predeterminados para la herramienta de línea de comandos de gcloud

Para ahorrar tiempo cuando escribes las opciones del ID del proyecto y la zona de Compute Engine en la herramienta de línea de comandos de gcloud, puedes establecer los valores predeterminados:
gcloud config set project project-id
gcloud config set compute/zone compute-zone

Elige una opción de seguridad.

Existen dos opciones predeterminadas de seguridad para toda la malla que se pueden elegir cuando se crea o actualiza un clúster con Istio on GKE. La elección de uno depende de las necesidades iniciales de la aplicación.

  • mTLS estricto: En este modo de seguridad, Istio aplica la encriptación mutua de TLS (mTLS) entre todos los servicios y los componentes del plano de control de la malla de forma predeterminada, a menos que la anules con reglas específicas de destino. Todas las llamadas dentro de la malla están encriptadas y los servicios no aceptarán tráfico no encriptado.
  • mTLS permisivo: De forma predeterminada, Istio permite que los servicios de la malla aceptan tráfico encriptado y sin encriptar, y todos los servicios envían llamadas no encriptadas de forma predeterminada. Al igual que con la mTLS estricta, puedes anular esto para servicios específicos. Usa esta opción si tienes servicios que aún necesitan aceptar tráfico no encriptado, por ejemplo, si no migraste por completo tus servicios a Istio y tienes tráfico que proviene de clientes heredados fuera de la malla. Istio on GKE proporciona este modo en lugar de simplemente instalar Istio sin seguridad habilitada, ya que facilita la migración a la mTLS estricta para aumentar la seguridad.

Si quieres aprender a actualizar tus valores predeterminados de seguridad y a configurar mejor la seguridad de Istio, consulta la sección Actualiza los valores predeterminados de seguridad a continuación.

Instalar Istio on GKE

Puede instalar Istio on GKE en un clúster nuevo o en uno existente. En ambos casos, esto instala el plano de control de Istio. Para aprovechar al máximo las funciones de Istio, debes insertar proxies de sidecar de Envoy en los Pods de la malla de servicios.

Cree un clúster con Istio on GKE

Te sugerimos que crees al menos un clúster de 4 nodos con el tipo de máquina de 2 CPU virtuales cuando uses este complemento. Puedes implementar Istio con la configuración predeterminada del nuevo clúster de GKE, pero es posible que no proporcione recursos suficientes para explorar aplicaciones de muestra.

Siga estos pasos para crear un clúster con Istio on GKE:

Console

  1. Vaya a la página de Kubernetes en Console y seleccione Crear clúster.
  2. Use el diálogo predeterminado Clúster estándar para elegir la cantidad preferida de nodos y máquinas. Tenga en cuenta el tamaño mínimo de clúster recomendado para Istio.
  3. En el menú desplegable Versión principal, selecciona un clúster de Istio on GKE.
  4. Seleccione Disponibilidad, Herramientas de redes, seguridad y características adicionales para mostrar opciones de configuración adicionales, incluido Istio on GKE.
  5. Seleccione Habilitar Istio (Beta).
  6. En el menú desplegable, seleccione el modo de seguridad mTLS que desea usar para su clúster.
  7. Haga clic en Crear para crear su clúster.

Línea de comandos

Para crear un clúster de GKE con Istio habilitado y con TLS mutua aplicada de forma predeterminada, ejecuta este comando y reemplaza CLUSTER_NAME por el nombre de clúster que elegiste y CLUSTER_VERSION por una versión de clúster compatible:

gcloud beta container clusters create CLUSTER_NAME \
    --addons=Istio --istio-config=auth=MTLS_STRICT \
    --cluster-version=CLUSTER_VERSION \
    --machine-type=n1-standard-2 \
    --num-nodes=4

Para crear un clúster de GKE con Istio habilitado y con mTLS en modo permisivo, haga lo siguiente:

gcloud beta container clusters create CLUSTER_NAME \
    --addons=Istio --istio-config=auth=MTLS_PERMISSIVE \
    --cluster-version=CLUSTER_VERSION \
    --machine-type=n1-standard-2 \
    --num-nodes=4

Agrega Istio on GKE a un clúster existente

Si desea actualizar un clúster con el complemento, es posible que primero deba cambiar el tamaño del clúster a fin de asegurarse de que tiene recursos suficientes para Istio. Al crear un clúster nuevo, te sugerimos al menos un clúster de 4 nodos con el tipo de máquina con 2 CPU virtuales.

Para actualizar un clúster existente con el complemento Istio on GKE, haga lo siguiente:

Console

  1. Ve a la página de clústeres de Kubernetes en Console y selecciona el que quieras actualizar.
  2. Selecciona Editar.
  3. En Istio (beta), seleccione Enabled para mostrar Istio mTLS (beta).
  4. En el menú desplegable, seleccione el modo de seguridad mTLS que desea usar para su clúster.
  5. Haz clic en Guardar para actualizar tu clúster.

Línea de comandos

Para agregar Istio con TLS mutua aplicada de forma predeterminada a un clúster existente, ejecuta este comando y reemplaza CLUSTER_NAME por el nombre del clúster:

gcloud beta container clusters update CLUSTER_NAME \
    --update-addons=Istio=ENABLED --istio-config=auth=MTLS_STRICT

O bien, para agregar Istio con mTLS en modo permisivo a un clúster existente, siga estos pasos:

gcloud beta container clusters update CLUSTER_NAME \
    --update-addons=Istio=ENABLED --istio-config=auth=MTLS_PERMISSIVE

Ten en cuenta que el comando clusters update puede requerir otros parámetros, según la configuración real de tu clúster.

Si ya tiene una aplicación en el clúster, puede encontrar cómo migrarla para que Istio la administre en la documentación de Istio.

Verifica la instalación

Siga estos pasos para verificar que la instalación de Istio on GKE se haya realizado correctamente:

  1. Si acabas de crear un clúster en lugar de actualizarlo, verifica que esté en ejecución con una versión de GKE de 1.10.6 o superior:
    gcloud container clusters list
    
    El resultado es similar a este:
    NAME        LOCATION       MASTER_VERSION  MASTER_IP      MACHINE_TYPE   NODE_VERSION   NUM_NODES  STATUS
    istio-demo  us-central1-b  1.11.2-gke.15   35.239.252.38  n1-standard-2  1.11.2-gke.15  4          RUNNING
    
  2. Obtén las credenciales para tu clúster nuevo a fin de interactuar con él mediante kubectl.
    gcloud container clusters get-credentials CLUSTER_NAME
    
  3. Asegúrate de que los siguientes servicios de Kubernetes estén implementados: istio-citadel, istio-egressgateway, istio-pilot, istio-ingressgateway, istio-policy, istio-sidecar-injector y istio-telemetry (también verás los otros servicios implementados):
    kubectl get service -n istio-system
    
    NAME                       TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                                                                                   AGE
    istio-citadel              ClusterIP      10.47.245.92    <none>        8060/TCP,9093/TCP                                                                                                         12s
    istio-egressgateway        ClusterIP      10.47.248.129   <none>        80/TCP,443/TCP                                                                                                            12s
    istio-galley               ClusterIP      10.47.248.109   <none>        443/TCP,9093/TCP                                                                                                          12s
    istio-ingressgateway       LoadBalancer   10.47.248.117   <pending>     80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:30221/TCP,8060:32445/TCP,853:30663/TCP,15030:32010/TCP,15031:32633/TCP   12s
    istio-pilot                ClusterIP      10.47.251.133   <none>        15010/TCP,15011/TCP,8080/TCP,9093/TCP                                                                                     12s
    istio-policy               ClusterIP      10.47.255.244   <none>        9091/TCP,15004/TCP,9093/TCP                                                                                               12s
    istio-sidecar-injector     ClusterIP      10.47.240.36    <none>        443/TCP                                                                                                                   12s
    istio-statsd-prom-bridge   ClusterIP      10.47.247.135   <none>        9102/TCP,9125/UDP                                                                                                         12s
    istio-telemetry            ClusterIP      10.47.242.73    <none>        9091/TCP,15004/TCP,9093/TCP,42422/TCP                                                                                     12s
    promsd                     ClusterIP      10.47.241.188   <none>        9090/TCP                                                                                                                  12s
    
  4. 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-egressgateway-*, istio-ingressgateway-*, istio-sidecar-injector-* y istio-citadel-*.

    kubectl get pods -n istio-system
    
    NAME                                        READY   STATUS      RESTARTS   AGE
    istio-citadel-555d845b65-xfdmj              1/1     Running     0          2d
    istio-cleanup-secrets-8x2pl                 0/1     Completed   0          2d
    istio-egressgateway-667d854c49-9q5dl        1/1     Running     0          2d
    istio-galley-6c9cd5b8bb-4j4jk               1/1     Running     0          2d
    istio-ingressgateway-6c796c5594-f972p       1/1     Running     0          2d
    istio-pilot-77f74fc6f-rpbfj                 2/2     Running     0          2d
    istio-policy-655b87fff-4wbwq                2/2     Running     0          2d
    istio-security-post-install-tm2rm           0/1     Completed   1          2d
    istio-sidecar-injector-668c9fb4db-p6lwt     1/1     Running     0          2d
    istio-statsd-prom-bridge-5b645f6f4d-6pbgf   1/1     Running     0          2d
    istio-telemetry-d9848f498-wf6kh             2/2     Running     0          2d
    promsd-6b989699d8-l7jxt                 1/1     Running     0          2d
    

Habilita la inserción de sidecar

Para aprovechar al máximo las funciones de Istio, cada servicio de tu aplicación debe tener un proxy de sidecar de Envoy en ejecución en su Pod. El proxy Envoy intercepta todo el tráfico de entrada y de salida del servicio y se comunica con el plano de control de Istio. Puedes insertar un proxy de Envoy de forma manual si actualizas tu configuración de Kubernetes o puedes usar la inyección automática de sidecar basada en webhooks de Istio.

De forma predeterminada, la inserción automática de sidecar está inhabilitada para todos los espacios de nombres. A fin de habilitar la inserción automática, reemplaza NAMESPACE en el siguiente comando por el nombre del espacio de nombres para los servicios de tu aplicación o por default:

kubectl label namespace NAMESPACE istio-injection=enabled

Los Pods en ejecución deben reiniciarse para que se aplique el cambio, ya que el sidecar se agrega en el momento de la creación del Pod. Si quieres inhabilitar la inserción automática en el espacio de nombres, quita la etiqueta y reinicia los Pods para quitar los sidecars.

Para insertar los sidecars de forma manual, consulta Instala el sidecar.

Configurar el plano de control

Aunque Istio en GKE administra la mayor parte de la configuración del plano de control, para el uso de producción, te recomendamos que elijas y especifiques los valores adecuados a tu caso práctico en los siguientes parámetros de configuración. Puedes cambiarlas con kubectl o las herramientas de Kubernetes que prefieras. Estos parámetros de configuración no se cambian cuando el complemento actualiza tu instalación.

Escalamiento horizontal:

Configura una de las siguientes opciones a fin de asegurarte de que tienes suficientes réplicas de los componentes del plano de control de Istio para manejar el tráfico de la malla. Para el uso en producción, recomendamos un mínimo de dos réplicas para istio-policy, istio-telemetry, istio-pilot y istio-sidecar-injector.

  • El ajuste de escala automático horizontal de Pods ajusta de forma automática la cantidad de réplicas en función del uso observado de CPU. Proporcionamos valores máximos y mínimos predeterminados para los componentes del plano de control del ajuste de escala automático, pero puedes editarlos según tus necesidades. Por ejemplo, así se especifica con kubectl edit que quieres editar la configuración del escalador automático para Istio-Telemetry:

    kubectl edit -n istio-system HorizontalPodAutoscalers/istio-telemetry
    
  • Si no usas el ajuste de escala automático, puedes establecer la cantidad de réplicas para cada elemento del plano de control (a excepción de Citadel, que siempre es un singleton) para el escalamiento manual manual. Por ejemplo, a continuación, te mostramos cómo especificar con kubectl que quieres dos instancias de Pilot:

    kubectl scale -n istio-system --replicas=2 deployment/istio-pilot
    

Solicitudes de recursos

De forma predeterminada, las solicitudes de recursos no están configuradas; sin embargo, para su uso en producción, recomendamos configurarlas en valores apropiados a fin de garantizar que los nodos tengan recursos suficientes a fin de admitir los pods. Debe configurar solicitudes de recursos para cada contenedor del Pod. De lo contrario, la CPU en los HPA mostrará unknown, y el ajuste de escala automático no funcionará.

Puede encontrar puntos de partida recomendados para la configuración de los recursos de cada componente en la guía de opciones de instalación de Istio. Por ejemplo, las solicitudes de recursos y los límites de Mixer se encuentran en opciones mixer.

kubectl edit -n istio-system Deployments/istio-telemetry

Presupuesto de interrupción del Pod

PodDisruptionBudgets te permite especificar la cantidad mínima de réplicas disponibles de una implementación determinada que una aplicación puede tolerar y seguir funcionando.

Debe configurar PodDisruptionBudgets para todas las implementaciones que deben permanecer disponibles durante las actualizaciones de Istio on GKE. Como mínimo, recomendamos hacer esto para la puerta de enlace de entrada de Istio (istio-ingressgateway) proporcionada por el complemento, si no implementaste y configuraste tu propia puerta de enlace de entrada, ya que, de lo contrario, es posible que el tráfico externo no pueda acceder a la aplicación durante la actualización.

La configuración del presupuesto de interrupción del Pod debe establecerse junto con la configuración de escalamiento horizontal, como se describió anteriormente. La cantidad de réplicas o réplicas mínimas del escalador automático debe ser mayor que el mínimo del presupuesto de interrupción del Pod, ya que el proceso de actualización de Istio on GKE hace que las réplicas individuales no estén disponibles mientras se actualizan. De esta manera, se garantiza que la configuración minAvailable en PodDisruptionBudget no se incumpla durante las actualizaciones y que la actualización funcione según lo previsto.

Personaliza la instalación

Si bien Istio en GKE proporciona un comportamiento predeterminado razonable para muchos casos de uso, puedes personalizar la instalación de varias maneras, como configurar herramientas de telemetría y agregar puertas de enlace. En esta sección, se describe cómo realizar personalizaciones admitidas.

Actualiza los valores predeterminados de seguridad

Si cambias el modo de seguridad de Istio Default de Istio en un clúster en ejecución de estricto a permisivo, o viceversa, usa el mismo comando que se usa Istio para agregar al clúster:

Console

  1. Ve a la página de clústeres de Kubernetes en Console y selecciona el que quieras actualizar.
  2. Selecciona Editar.
  3. En Istio (beta), seleccione Enabled para mostrar Istio mTLS (beta).
  4. En el menú desplegable, seleccione el modo de seguridad mTLS que desea usar para su clúster.
  5. Haz clic en Guardar para actualizar tu clúster.

Línea de comandos

Si quieres cambiar el clúster para usar Istio con TLS mutua de forma predeterminada, ejecuta este comando y reemplaza CLUSTER_NAME por el nombre del clúster:

$ gcloud beta container clusters update CLUSTER_NAME \
    --update-addons=Istio=ENABLED --istio-config=auth=MTLS_STRICT

O bien, para cambiar tu clúster a mTLS en modo permisivo, haz lo siguiente:

$ gcloud beta container clusters update CLUSTER_NAME \
    --update-addons=Istio=ENABLED --istio-config=auth=MTLS_PERMISSIVE

Ten en cuenta que si habilitas mTLS estricto mientras aún tienes servicios que necesitan enviar o recibir tráfico sin encriptar, tu aplicación puede fallar. Puedes obtener más información sobre cómo migrar a mTLS estricto en Migración de TLS mutua. También puedes especificar políticas de autenticación más específicas y específicas de un destino. Las políticas de autenticación específicas del destino siempre anularán cualquier configuración mTLS global predeterminada, incluso si cambias del modo Estricto a Permisivo, o viceversa.

Puede obtener más información sobre cómo configurar y trabajar con la seguridad de Istio, incluida la configuración de la autorización basada en funciones, en el sitio de Istio.

Supervisar y registrar

De forma predeterminada, una malla instalada con Istio on GKE puede enviar datos de registros y métricas a Cloud Logging y Cloud Monitoring, siempre y cuando hayas habilitado las funciones relevantes para el proyecto y el clúster. Las versiones de Istio on GKE anteriores a 1.1.7 también envían datos de seguimiento de forma predeterminada. Puedes obtener más información al respecto en Asistencia de Google Cloud's operations suite.

Tanto el seguimiento como el registro pueden generar costos adicionales de uso, en especial, con un gran volumen de datos provenientes de tu malla. Si quieres inhabilitar esta función sin inhabilitar las API de Google Cloud's operations suite por completo para tu proyecto, actualiza la configuración de Istio on GKE de la siguiente manera.

Inhabilita Cloud Logging para Istio on GKE

  1. Abre la regla stackdriver-log para editarla:

    kubectl edit -n istio-system rule stackdriver-log
    
  2. Reemplaza la condición match (context.protocol == "http" || context.protocol == "grpc") && (context.reporter.kind | "inbound" == "inbound") por "false".

  3. Guarde y cierre la regla.

  4. Abre la regla stackdriver-log-tcp.

    kubectl edit -n istio-system rule stackdriver-log-tcp
    
  5. Reemplaza la condición match (context.protocol == "tcp") && (context.reporter.kind | "inbound" == "inbound") por "false".

  6. Guarde y cierre la regla.

Inhabilitar el seguimiento de Google Cloud's operations suite para Istio on GKE

Si tienes Istio on GKE versión 1.1.3-gke.0 o anterior, o si habilitaste de forma manual el seguimiento de Google Cloud Operations Suite, puedes inhabilitarlo de la siguiente manera:

  1. Abre la regla stackdriver-tracing-rule para editarla:

    kubectl edit -n istio-system rule stackdriver-tracing-rule
    
  2. Reemplaza la condición match context.protocol == "http" || context.protocol == "grpc" por "false".

  3. Guarde y cierre la regla.

Habilitar el seguimiento de Google Cloud's operations suite para Istio on GKE

Si usas la versión 1.1.7 o posterior, y deseas habilitar el seguimiento de Google Cloud's operations suite, haz lo siguiente:

  1. Asegúrate de que la API de Cloud Trace esté habilitada en tu proyecto de Google Cloud.

  2. Abre la regla stackdriver-tracing-rule para editarla:

    kubectl edit -n istio-system rule stackdriver-tracing-rule
    
  3. Reemplaza la condición match "false" por context.protocol == "http" || context.protocol == "grpc".

  4. Guarde y cierre la regla.

Agregar puertas de enlace

Se proporciona una puerta de enlace de entrada de Istio como parte de la instalación de Istio on GKE. La puerta de enlace de entrada predeterminada es adecuada para implementaciones en las que los recursos instalados (RBAC, Service, Deployment) no necesitan mucha personalización. Puedes agregar campos a la configuración de la puerta de enlace de Istio y modificar la siguiente configuración del plano de control:

  • Escalamiento horizontal:
  • Solicitudes de recursos
  • Presupuestos de interrupción del Pod

Cuando actualiza GKE, el complemento Istio on GKE y todos los recursos que instaló el complemento, incluida la puerta de enlace de entrada predeterminada, se actualizan de forma automática. No cambies ningún otro valor en la configuración de la puerta de enlace de entrada predeterminada porque los cambios se revertirán a los valores predeterminados durante la actualización automática.

Para situaciones más complejas en las que se requiere la personalización, debes crear una puerta de enlace de entrada nueva. Si agregas una puerta de enlace de entrada o salida, están bajo tu control y no se modifican durante la actualización automática.

Ten en cuenta que una puerta de enlace de salida de Istio no está instalada de forma predeterminada en la versión 1.1 y posteriores. Para agregar una puerta de enlace de entrada o salida, haz lo siguiente:

  1. Otorga permisos de administrador de clúster al usuario actual.

    1. Establece tu cuenta de usuario como el usuario actual.

      gcloud auth login
    2. Otorga permisos de administrador de clúster al usuario actual.

      kubectl create clusterrolebinding cluster-admin-binding \
      --clusterrole=cluster-admin \
      --user="$(gcloud config get-value core/account)"
      
  2. Sigue los pasos que se indican en Agrega puertas de enlace para agregar la puerta de enlace.

Accede a servicios externos

Todo el tráfico saliente de un Pod habilitado para Istio se redirecciona a su proxy de sidecar. De forma predeterminada, Istio configura el proxy de sidecar para pasar solicitudes de servicios desconocidos, pero puedes configurar un control más estricto. Aunque puedes crear ServiceEntries para permitir solicitudes salientes a destinos permitidos, por razones de seguridad, te recomendamos agregar una puerta de enlace de salida, como se describe en la entrada de blog Protección del control del tráfico de salida en Istio.

Próximos pasos

  • Intenta instalar y explorar el ejemplo de Bookinfo para ver lo que puede hacer Istio. A fin de obtener la app de muestra y la herramienta de istioctl, ve a la página de lanzamiento de Istio para descargar el archivo de instalación correspondiente al SO en el que ejecutas los comandos. Luego, sigue las instrucciones para implementar y probar la aplicación (no necesitas implementar Istio en sí) en el instructivo de instalación de Istio de GKE.
  • Obtenga más información sobre Istio en la documentación de código abierto.
  • Si necesita quitar el complemento de Istio de un clúster, consulte Desinstala Istio en GKE.