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 gcloud o Google Cloud Console.

Puedes obtener más información sobre el complemento de Istio on GKE y si es adecuado para ti 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. 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. Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud. Descubre cómo confirmar que tienes habilitada la facturación en un proyecto.

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

  • La herramienta gcloud se usa para crear y borrar clústeres de Kubernetes Engine, lo que incluye crear y actualizar clústeres con el complemento Istio on GKE. La herramienta de gcloud se incluye en el SDK de Cloud: sigue las instrucciones para instalar e inicializar la herramienta de gcloud a fin de que funcione con tus proyectos de GCP. Si tienes una instalación del SDK de Cloud existente, verifica que sea al menos la versión 208.0.0:
    gcloud version
    Ten en cuenta que no necesitas instalar gcloud a fin de crear un clúster nuevo habilitado para Istio, ya que puedes usar Google Cloud Console en su lugar, pero aún es útil para administrar clústeres existentes e 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 valores predeterminados:
gcloud config set project project-id
gcloud config set compute/zone compute-zone

Elige una opción de seguridad.

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

  • mTLS estricta: En este modo de seguridad, Istio aplica la encriptación TLS mutua (mTLS) entre todos los servicios y los componentes del plano de control en la malla de forma predeterminada, a menos que lo anules con un destino específico. reglas. 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, Istio permite de forma predeterminada que los servicios de la malla acepten tráfico encriptado y no encriptado, y todos los servicios envían llamadas no encriptadas. de forma predeterminada. Al igual que con la mTLS estricta, puedes anularla para servicios específicos. Usa esta opción si tienes servicios que aún necesitan aceptar tráfico sin encriptar, 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 solo instalar Istio sin seguridad habilitada, ya que facilita la migración a mTLS estricta en el futuro para aumentar la seguridad.

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

Instalar Istio on GKE

Puedes instalar Istio on GKE en un clúster nuevo o en un clúster 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 en la malla de servicios.

Crea un clúster con Istio en GKE

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

Para crear un clúster mediante Istio en GKE, sigue estos pasos:

Console

  1. Ve a la página de Kubernetes en Cloud Console y selecciona Crear clúster.
  2. Mediante el diálogo predeterminado de Clúster estándar, elige la cantidad de nodos y máquinas que prefieras, y ten 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. Selecciona Disponibilidad, Herramientas de redes, seguridad y funciones adicionales para mostrar las opciones de configuración adicionales, incluido Istio on GKE.
  5. Selecciona Habilitar Istio (Beta).
  6. En el menú desplegable, seleccione el modo de seguridad de mTLS que desee usar para su clúster.
  7. Haz clic en Crear para crear el 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

O bien, para crear un clúster de GKE con Istio habilitado y mTLS en el modo permisivo, haz 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 deseas actualizar un clúster con el complemento, es posible que primero debas cambiar el tamaño del clúster a fin de asegurarte de que tienes suficientes recursos para Istio. Al igual que cuando creas un clúster nuevo, te sugerimos al menos un clúster de 4 nodos con el tipo de máquina de 2 CPU virtuales.

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

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), selecciona Habilitado para mostrar Istio mTLS (Beta).
  4. En el menú desplegable, seleccione el modo de seguridad de mTLS que desee 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 para agregar Istio con mTLS en modo permisivo a un clúster existente, haz lo siguiente:

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 del clúster.

Si tienes una aplicación existente en el clúster, puedes averiguar cómo migrarla para que la administre Istio en la documentación de Istio.

Verifica la instalación

Para verificar que la instalación de Istio on GKE se haya realizado correctamente, sigue estos pasos:

  1. Si acabas de crear en lugar de actualizar un clúster, verifica que esté en funcionamiento con una versión de GKE 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 para el clúster nuevo a fin de que puedas 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 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 la aplicación debe tener un proxy de sidecar de Envoy que se ejecute 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 la configuración de Kubernetes de tus pods, o puedes usar la inserció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

Todos 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. Para inhabilitar la inserción automática en el espacio de nombres, quita la etiqueta y reinicia los Pods para quitar sus sidecars.

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

Configurar el plano de control

Aunque Istio on GKE administra la mayoría de la configuración de tu plano de control, para el uso en producción, te recomendamos que elijas y especifiques los valores adecuados a fin de usar la siguiente configuración. Puedes cambiarlas con kubectl o las herramientas de Kubernetes que elijas. Esta configuración no se modifica cuando el complemento actualiza la 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 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 Pods escala de forma automática 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, aquí se muestra cómo especificar 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 configurar la cantidad de réplicas para cada elemento del plano de control (excepto Citadel, que siempre es un singleton) para el escalamiento horizontal manual. , Por ejemplo, aquí te mostramos cómo especificar 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 la producción, recomendamos configurarlas con valores apropiados a fin de garantizar que los nodos tengan recursos suficientes para admitir los pods. Debes establecer 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 de cada componente en la guía Opciones de instalación de Istio. Por ejemplo, las solicitudes de recursos y los límites de Mixer se encuentran en las 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 funcionando.

Debes configurar PodDisruptionBudgets para todas las implementaciones que deben estar disponibles durante las actualizaciones de Istio on GKE. Como mínimo, te recomendamos que lo hagas 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, como si fuera tráfico externo que no puedan acceder a su aplicación durante la actualización.

La configuración del presupuesto de interrupción del Pod debe configurarse junto con la configuración de escalamiento horizontal, como se describió antes. La cantidad de réplicas o réplicas mínimas del escalador automático debe ser mayor que el mínimo de presupuesto de interrupción de Pods, ya que el proceso de actualización de Istio on GKE hace que las réplicas individuales no estén disponibles mientras están actualizadas. Esto garantiza que la configuración minAvailable en PodDisruptionBudget no se infrinja 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 la instalación de varias maneras, incluida la configuración de las herramientas de telemetría y la adición de puertas de enlace. En esta sección, se describe cómo realizar personalizaciones compatibles.

Actualiza los valores predeterminados de seguridad

Cambiar el modo de seguridad mTLS de Istio predeterminado en un clúster en ejecución de Estricto a Permisivo, o viceversa, usa el mismo comando que agregar Istio a 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), selecciona Habilitado para mostrar Istio mTLS (Beta).
  4. En el menú desplegable, seleccione el modo de seguridad de mTLS que desee usar para su clúster.
  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, para cambiar tu clúster a mTLS en el 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 tienes servicios que necesitan enviar o recibir tráfico no encriptado, tu aplicación puede fallar. Puedes obtener más información sobre la migración a mTLS estricta en Migración mutua de TLS. También puedes especificar políticas de autenticación más específicas de destino. Las políticas de autenticación específicas del destino siempre anularán cualquier configuración global de mTLS predeterminada, incluso si cambias de Estricto a Permisivo, o viceversa.

Puedes obtener más información sobre la configuración y el trabajo 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 en 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 esto en la Asistencia de Google Cloud's operations suite.

El seguimiento y el registro pueden generar costos adicionales por usar, en especial, con un gran volumen de datos provenientes de tu malla. Si deseas 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 en GKE

  1. Abre la regla stackdriver-log para editarla:

    kubectl edit -n istio-system rule stackdriver-log
    
  2. Reemplaza la condición (context.protocol == "http" || context.protocol == "grpc") && (context.reporter.kind | "inbound" == "inbound") de match 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 (context.protocol == "tcp") && (context.reporter.kind | "inbound" == "inbound") de match por "false".

  6. Guarda y cierra la regla.

Inhabilita 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's 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. Guarda y cierra 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. Guarda y cierra 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 actualizas GKE, el complemento Istio on GKE y todos los recursos que instala 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 predeterminada de la puerta de enlace de entrada 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 personalización, debes crear una puerta de enlace de entrada nueva. Si agregas una puerta de enlace de entrada o salida, estas estarán bajo tu control y no se modificarán 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 o posterior. Para agregar una puerta de enlace de entrada o salida, sigue estos pasos:

  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 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 que pase las solicitudes de servicios desconocidos, pero puedes configurar un control más estricto. Aunque puedesCrear ServiceEntries para permitir solicitudes salientes a destinos permitidos, por motivos de seguridad, puede que quieras agregar una puerta de enlace de salida, como se describe en el Control seguro del tráfico de salida en Istio entrada de blog

¿Qué sigue?

  • Instala y explora el ejemplo de Bookinfo para ver lo que Istio puede hacer. Para obtener la app de muestra y laistioctl ve aVersión 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 es necesario que implementes Istio) en el Instructivo de instalación de Istio de GKE.
  • Obtén mucho 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 en GKE.