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 con gcloud CLI o con 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
Siga los pasos que se indican a continuación para habilitar la API de Google Kubernetes Engine:
- Visita la página de Kubernetes Engine en Google Cloud Console.
- Crea o selecciona un proyecto.
- Espera a que la API y los servicios relacionados se habiliten. Esto puede tomar varios minutos.
-
Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud. Obtén información sobre cómo verificar si la facturación está habilitada en un proyecto.
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, incluida la creación y actualización de clústeres con el complemento Istio on GKE. La CLI de gcloud se incluye en Google Cloud CLI: 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 Google Cloud CLI, verifica que sea al menos la versión 208.0.0:
gcloud version
Ten en cuenta que no necesitas instalargcloud
para crear un clúster nuevo habilitado para Istio, ya que puedes usar Google Cloud Console en su lugar, pero sigue siendo útil para administrar clústeres existentes y, también, instalar otras herramientas comokubectl
. -
kubectl
se usa para administrar Kubernetes, el sistema de organización de clúster que usa GKE. Puedes instalarkubectl
mediantegcloud
: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.
Hay dos opciones de seguridad predeterminadas posibles para toda la malla que puedes elegir cuando creas o actualizas un clúster con Istio en GKE. El que elijas dependerá de las necesidades iniciales de tu 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 del destino. Todas las llamadas dentro de la malla están encriptadas y los servicios no aceptan tráfico sin encriptar.
- Permisivos: En este modo de seguridad, Istio de forma predeterminada permite 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 mTLS estricto, puedes anular esto para servicios específicos. Usa esta opción si tienes servicios que aún deben aceptar tráfico no encriptado, por ejemplo, si no migraste tus servicios por completo a Istio y tienes tráfico proveniente 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 una mTLS estricta más adelante para mayor seguridad.
Puedes obtener información para actualizar tus valores predeterminados de seguridad y seguir configurando la seguridad de Istio en Actualiza los valores predeterminados de seguridad, a continuación.
Instalar Istio on GKE
Puedes instalar Istio on GKE en un clúster nuevo o en uno existente. En ambos casos, se 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.
Crea un clúster con Istio en GKE
Recomendamos usar 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 clúster nuevo de GKE, pero es posible que no proporcione recursos suficientes para explorar aplicaciones de muestra.
Para crear un clúster con Istio en GKE, haz lo siguiente:
Consola
- Ve a la página de Kubernetes en Google Cloud Console y selecciona Crear clúster.
- Mediante el diálogo Clúster estándar, elige la cantidad de nodos y máquinas que prefieras, teniendo en cuenta el tamaño mínimo de clúster recomendado para Istio.
- En el menú desplegable Versión principal, selecciona un clúster de Istio en GKE.
- Selecciona Availability, networking, security, and additional features para ver opciones de configuración adicionales, incluida Istio on GKE.
- Selecciona Habilitar Istio (Beta).
- Seleccione el modo de seguridad mTLS que desea usar para el clúster en el menú desplegable.
- Haz clic en Crear para crear tu 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, sigue estos pasos:
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 en 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 crear un clúster nuevo, 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:
Consola
- Ve a la página de clústeres de Kubernetes en Google Cloud Console y selecciona el clúster que deseas actualizar.
- Selecciona Editar.
- En Istio (Beta), seleccione Enabled para que se muestre Istio mTLS (Beta).
- Seleccione el modo de seguridad mTLS que desea usar para el clúster en el menú desplegable.
- 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:
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 en el clúster, puedes averiguar cómo migrarla para que Istio la administre 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:
- Si acabas de crear un clúster en lugar de actualizarlo, verifica que esté en funcionamiento con una versión de GKE 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
- Obtén las credenciales para tu clúster nuevo a fin de que puedas interactuar con él mediante
kubectl
.gcloud container clusters get-credentials CLUSTER_NAME
- 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
yistio-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
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-*
yistio-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 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 adicional 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
Cualquier Pod en ejecución debe reiniciarse para que el cambio surta efecto, 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 a fin de 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 las opciones de configuración del plano de control, para el uso de producción, te recomendamos que elijas y especifiques los valores adecuados de tu caso práctico en la siguiente configuración. Puedes cambiarlos mediante kubectl
o las herramientas de Kubernetes que elijas. 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 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 en función del uso de CPU observado. 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, a continuación, se muestra cómo especificar con
kubectl edit
que deseas editar la configuración del escalador automático de 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 ajuste de escala horizontal manual. Por ejemplo, aquí se muestra 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 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.
Debes establecer solicitudes de recursos para cada contenedor en el pod; de lo contrario, la CPU en los HPA muestra 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 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.
Debes 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 proporcionada (istio-ingressgateway
) del complemento, si no implementaste ni configuraste tu propia puerta de enlace de entrada, ya que, de lo contrario, es posible que el tráfico externo no pueda llegar a tu aplicación durante la actualización.
La configuración del presupuesto de interrupción del pod debe configurarse junto con la configuración del escalamiento horizontal, como se describió anteriormente. La cantidad mínima de réplicas o réplicas del escalador automático debe ser superior al 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 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, incluidas 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 compatibles.
Actualiza los valores predeterminados de seguridad
Si cambias el modo de seguridad predeterminado de Istio mTLS en un clúster en ejecución de Estricto a Permisivo, o viceversa, usa el mismo comando que agregas Istio a un clúster:
Consola
- Ve a la página de clústeres de Kubernetes en Google Cloud Console y selecciona el clúster que deseas actualizar.
- Selecciona Editar.
- En Istio (Beta), seleccione Enabled para que se muestre Istio mTLS (Beta).
- Seleccione el modo de seguridad mTLS que desea usar para el clúster en el menú desplegable.
- Haz clic en Guardar para actualizar tu clúster.
Línea de comandos
Para cambiar tu clúster y usar 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 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 todavía 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 estricto en Migración mutua de TLS. También puedes especificar políticas de autenticación más detalladas y específicas de un destino. Las políticas de autenticación específicas del destino siempre anularán cualquier configuración de mTLS predeterminada global, 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 registros y métricas a Cloud Logging y Cloud Monitoring, siempre y cuando hayas habilitado las funciones relevantes para tu proyecto y clúster. Las versiones de Istio on GKE anteriores a la 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.
Tanto el seguimiento como el registro pueden generar costos adicionales por su uso, en especial si un gran volumen de datos proviene de tu malla. Si deseas inhabilitar esta función sin inhabilitar por completo las API de Google Cloud's operations suite para tu proyecto, actualiza la configuración de Istio en GKE de la siguiente manera.
Inhabilita Cloud Logging para Istio en GKE
Abre la regla
stackdriver-log
para editar:kubectl edit -n istio-system rule stackdriver-log
Reemplaza la condición
match
(context.protocol == "http" || context.protocol == "grpc") && (context.reporter.kind | "inbound" == "inbound")
por"false"
.Guarda y cierra la regla.
Abre la regla
stackdriver-log-tcp
.kubectl edit -n istio-system rule stackdriver-log-tcp
Reemplaza la condición
match
(context.protocol == "tcp") && (context.reporter.kind | "inbound" == "inbound")
por"false"
.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:
Abre la regla
stackdriver-tracing-rule
para editar:kubectl edit -n istio-system rule stackdriver-tracing-rule
Reemplaza la condición
match
context.protocol == "http" || context.protocol == "grpc"
por"false"
.Guarda y cierra la regla.
Habilita 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:
Asegúrate de que la API de Cloud Trace esté habilitada en tu proyecto de Google Cloud.
Abre la regla
stackdriver-tracing-rule
para editar:kubectl edit -n istio-system rule stackdriver-tracing-rule
Reemplaza la condición
match
"false"
porcontext.protocol == "http" || context.protocol == "grpc"
.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 en GKE. La puerta de enlace de entrada predeterminada es adecuada para 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 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 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, 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 las versiones 1.1 y posteriores. Para agregar una puerta de enlace de entrada o salida, haz lo siguiente:
Otorga permisos de administrador de clúster al usuario actual.
Configura tu cuenta de usuario para que sea el usuario actual.
gcloud auth login
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)"
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 que pase las solicitudes de servicios desconocidos, pero puedes configurar un control más estricto. Aunque puedes crear ServiceEntries para permitir solicitudes de salida a destinos permitidos, por razones de seguridad, puedes agregar una puerta de enlace de salida, como se describe en la entrada de blog Control de tráfico de salida seguro 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 la versión de Istio para descargar el archivo de instalación correspondiente al SO en el que ejecutas tus 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 necesitas quitar el complemento de Istio de un clúster, consulta Desinstala Istio en GKE.