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 para clústeres nuevos y existentes. Puedes instalar el complemento mediante la herramienta de línea de comandos de gcloud o Google Cloud Console.

Puedes obtener más información sobre el complemento Istio on GKE y si es adecuado para ti en la descripción general.

Antes de comenzar

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

  1. Consulta 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:

  • gcloud se usa para crear y borrar clústeres de Kubernetes Engine, incluida la creación y actualización de clústeres con el complemento Istio on GKE. gcloud está incluido en el SDK de Google Cloud: sigue las instrucciones para instalarlo e inicializarlo a fin de que funcione con tus proyectos de GCP. Si tienes una instalación de gcloud existente, verifica que sea al menos la versión 208.0.0:
    gcloud version
    Ten en cuenta que no es necesario que instales gcloud para crear un nuevo clúster habilitado para Istio, ya que puedes usar Google Cloud Console, pero sigue siendo útil para administra clústeres existentes y también instala 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 valores predeterminados:
gcloud config set project project-id
gcloud config set compute/zone compute-zone

Elige una opción de seguridad.

Existen dos opciones de seguridad predeterminadas en toda la malla que puedes elegir cuando creas o actualizas un clúster con Istio en GKE. La elección que elijas dependerá de las necesidades de tu aplicación inicial.

  • 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 en la malla de forma predeterminada, a menos que lo anules con una etiqueta de destino específica. . Todas las llamadas dentro de la malla están encriptadas, y los servicios no aceptarán tráfico no encriptado.
  • mTLS permisivo: En este modo de seguridad, en la configuración predeterminada, Istio permite que los servicios en la malla acepten tráfico encriptado y no encriptado, y todos los servicios envían llamadas no encriptadas. de forma predeterminada. De la misma manera que con un mTLS estricto, 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 completamente tus servicios a Istio y si el tráfico proviene de clientes heredados sin soluciones. Istio en GKE proporciona este modo en lugar de instalar Istio sin seguridad habilitada, ya que facilita la migración a mTLS estricta más adelante para aumentar la seguridad.

Puedes obtener información sobre cómo actualizar los valores predeterminados de seguridad y configurar aún más la seguridad de Istio en la sección Actualiza los valores predeterminados de seguridad a continuación.

Versiones compatibles de clúster de GKE

La versión de Istio on GKE instalada cuando creas o actualizas un clúster con Istio en GKE depende de la versión del clúster. Te recomendamos usar una versión del clúster con la última versión de Istio (1.4.10-gke.5) Si usas una versión anterior, actualiza tu clúster en cuanto esté disponible esta versión de Istio on GKE.

Para obtener una lista de las versiones compatibles, consulta Versiones de Istio en GKE.

Instalar Istio on GKE

Puedes instalar Istio on GKE en un clúster nuevo o en un clúster existente. En ambos casos, se instala el plano de control de Istio. Para aprovechar al máximo las características de Istio, debes insertar proxies de sidecar de Envoy en los pods de tu malla de servicios.

Crea un clúster con Istio on GKE

Te recomendamos crear 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 de clúster nueva de GKE predeterminada, pero es posible que esto no proporcione suficientes recursos para explorar aplicaciones de muestra. Ten en cuenta que el complemento Istio on GKE no es compatible con Workload Identity.

Para crear un clúster con Istio on GKE, sigue estos pasos:

Console

  1. Ve a la página de Kubernetes en Cloud Console y selecciona Crear clúster.
  2. En el cuadro de diálogo predeterminado Clúster estándar, elige la cantidad de nodos y máquinas que prefieras, y ten en cuenta el tamaño de clúster mínimo recomendado para Istio.
  3. En el menú desplegable Versión principal, selecciona una versión de clúster recomendada de Istio en GKE (o una versión compatible si no puedes usar la versión recomendada).
  4. Selecciona Disponibilidad, herramientas de redes, seguridad y características adicionales para mostrar opciones de configuración adicionales, incluido Istio on GKE.
  5. Selecciona Habilitar Istio (Beta).
  6. Selecciona el modo de seguridad mTLS que deseas usar para tu clúster en el menú desplegable.
  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, reemplazando CLUSTER_NAME con el nombre de tu clúster elegido y CLUSTER_VERSION con 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

O bien, para crear un clúster de GKE con Istio habilitado y con mTLS en modo permisivo:

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 deseas actualizar un clúster con el complemento, es posible que primero debas cambiar el tamaño de tu clúster para asegurarte de tener suficientes recursos para Istio. Al crear un clúster nuevo, sugerimos al menos un clúster de 4 nodos con el tipo de máquina de 2 CPU virtuales.

Tu clúster también debe ejecutar una versión de instancia principal compatible con el clúster para usar el complemento. Ten en cuenta que el complemento Istio on GKE no es compatible con Workload Identity.

Para actualizar un clúster existente con el complemento Istio on GKE:

Console

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

Línea de comandos

Para agregar Istio con la TLS mutua aplicada de manera predeterminada en un clúster existente, ejecuta este comando, reemplazando 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 para agregar Istio con mTLS en modo permisivo a un clúster existente:

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 tienes una aplicación en el clúster, puedes averiguar cómo migrarla para que sea administrada por Istio en la documentación de Istio.

Verifica la instalación

Para verificar que la instalación de Istio on GKE tenga éxito, sigue estos pasos:

  1. Si acabas de crear en lugar de actualizar un clúster, verifica que esté en funcionamiento y que se ejecute con una versión de GKE de 1.10.6 o superior:
    gcloud container clusters list
    
    El resultado es similar al siguiente:
    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 de tu clúster nuevo para que puedas interactuar con 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 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 archivo adicional Envoy en ejecución en su pod. El proxy Envoy intercepta todo el tráfico entrante y saliente al servicio y se comunica con el plano de control de Istio. Puedes insertar un proxy de Envoy de forma manual si actualizas la configuración de Kubernetes de tus pods o puedes usar la inyección automática de archivo adicional basada en webhooks de Istio.

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

kubectl label namespace NAMESPACE istio-injection=enabled

Cualquier pod en ejecución se debe reiniciar para que el cambio se aplique, ya que el archivo adicional se agrega en el momento de la creación del pod. Para inhabilitar la inserción automática en el espacio de nombres, quita la etiqueta y reinicia los pods para quitar sus archivos adicionales.

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

Configura tu plano de control

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

Escalamiento horizontal:

Configura una de las siguientes opciones a fin de asegurarte de tener suficientes réplicas de tus componentes del plano de control de Istio para controlar 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 pod escala automáticamente la cantidad de réplicas según el uso de CPU observado. Proporcionamos valores máximos y mínimos predeterminados para los componentes del plano de control de ajuste de escala automático, pero puedes editarlos según tus necesidades. Por ejemplo, a continuación, se especifica cómo especificarías con kubectl edit que deseas 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 evento único) del ajuste de escala horizontal manual. Por ejemplo, a continuación, se especifica cómo especificarías con kubectl que deseas 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 el uso en producción, recomendamos configurarlas con los valores apropiados a fin de garantizar que los nodos tengan recursos suficientes para admitir los pods. Debes configurar las solicitudes de recursos para cada contenedor en el pod. De lo contrario, la CPU en los HPA mostrará unknown y el ajuste de escala automático no funcionará.

Puedes encontrar puntos de partida recomendados para la configuración de recursos en cada componente en la guía Opciones de instalación de Istio. Por ejemplo, las solicitudes y límites de recursos para Mixer se encuentran en Opciones de 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 continuar trabajando.

Debes configurar PodDisruptionBudgets para todas las implementaciones que deben seguir 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) que proporciona el complemento si no implementaste y configuraste tu propia puerta de enlace de entrada, como el tráfico externo. que no puedan acceder a tu aplicación durante la actualización.

La configuración del presupuesto de interrupción del pod se debe establecer junto con la configuración de escalamiento horizontal, como se describió antes. La cantidad de réplicas o réplicas mínimas de escalador automático debe ser superior al mínimo del presupuesto de interrupción del pod, ya que Istio on GKE hace que las réplicas individuales no estén disponibles mientras se actualizan. Esto garantiza que no se infrinja la configuración minAvailable en PodDisruptionBudget durante las actualizaciones y que la actualización funcione según lo previsto.

Personaliza tu instalación

Si bien Istio on GKE proporciona un comportamiento predeterminado razonable para muchos casos prácticos, puedes personalizar tu instalación de varias maneras, incluida la configuración de herramientas de telemetría y la adición de puertas de enlace. En esta sección, se describe cómo realizar personalizaciones admitidas.

Actualiza la configuración predeterminada de seguridad

El cambio del modo de seguridad mTLS predeterminado de Istio en un clúster en ejecución de Estricto a Permisivo, o viceversa, usa el mismo comando que se agrega a Istio en un clúster:

Console

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

Línea de comandos

Si deseas cambiar tu clúster para que use Istio con TLS mutua aplicada 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, cambia el clúster a mTLS en modo permisivo:

$ 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 no encriptado, tu aplicación puede fallar. Puede obtener más información sobre la migración a mTLS estricta en Migración de TLS mutua. También puedes especificar políticas de autenticación más específicas para el destino. Las políticas de autenticación específicas del destino siempre anularán cualquier configuración de mTLS predeterminada, incluso si cambias de Strict a Permisivo o viceversa.

Puedes obtener más información sobre la configuración y el trabajo con Istio, incluida la configuración de la autorización basada en funciones en el sitio de Istio.

Registro y registro

De forma predeterminada, una malla instalada con Istio on GKE puede enviar datos de registro y métricas a Cloud Logging y Cloud Monitoring, siempre que hayas habilitado las funciones relevantes para tu proyecto y clúster. Las versiones de Istio en GKE anteriores a 1.1.7 también envían datos de seguimiento de forma predeterminada. Puedes obtener más información sobre este tema en la Asistencia del paquete de operaciones de Google Cloud.

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

Para inhabilitar Cloud Logging para Istio en 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. Guarda y cierra 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. Guarda y cierra la regla.

A fin de inhabilitar el seguimiento del conjunto de operaciones de Google Cloud para Istio on GKE

Si tienes Istio on GKE 1.1.3-gke.0 o una anterior, o si habilitaste de forma manual el seguimiento del conjunto de operaciones de Google Cloud, 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. Guarda y cierra la regla.

Habilitar el seguimiento del conjunto de operaciones de Google Cloud 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:

  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. Guarda y cierra la regla.

Agrega puertas de enlace

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

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

Cuando actualizas 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 manera automática. No cambies ningún otro valor en la configuración predeterminada de la puerta de enlace de entrada, ya que 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 personalización, necesitas crear una nueva puerta de enlace de entrada. Si agregas una puerta de enlace de entrada o salida, estas 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 se instala 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. Configura tu cuenta de usuario como 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 en la documentación de Istio 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 archivo adicional. De forma predeterminada, Istio configura el proxy de archivo adicional para pasar solicitudes de servicios desconocidos, pero puedes configurar un control más estricto. Aunque puedesCrear ServiceEntries Para permitir solicitudes salientes a destinos permitidos, por razones de seguridad, puedes agregar una puerta de enlace de salida, como se describe en el blogpost Control seguro del tráfico de salida en Istio.

¿Qué sigue?

  • Intenta instalar y explorar el ejemplo de Bookinfo para ver lo que Istio puede hacer. Si deseas obtener la app de muestra y la herramienta istioctl, ve a la página de actualización de Istio para descargar el archivo de instalación que corresponde al sistema operativo con el que estás ejecutando los comandos. Luego, sigue las instrucciones para implementar y probar la aplicación (no es necesario que implementes Istio) en el instructivo de instalación de Istio de GKE.
  • Obtenga mucha más información sobre Istio en la documentación de código abierto.
  • Si necesitas quitar el complemento de Istio de un clúster, consulta Desinstala Istio on GKE.