Solucionar problemas de conectividad con ztunnel

Esta guía describe algunas opciones para monitorear la configuración y la ruta de datos del proxy ztunnel. Esta información también puede ayudar con algunas soluciones de problemas de alto nivel y en la identificación de información que sería útil recopilar y proporcionar en un informe de error si hay algún problema.

Ver el estado del proxy ztunnel

El proxy ztunnel obtiene la configuración y la información de descubrimiento del control plane de istiod a través de las API de xDS.

El comando istioctl ztunnel-config te permite ver las cargas de trabajo descubiertas tal como las ve un proxy ztunnel.

En el primer ejemplo, ves todas las cargas de trabajo y los componentes del control plane que ztunnel está rastreando actualmente, incluida la información sobre la dirección IP y el protocolo que se debe usar al conectarse a ese componente y si hay un proxy de waypoint asociado con esa carga de trabajo.

$ istioctl ztunnel-config workloads
NAMESPACE          POD NAME                                IP          NODE                  WAYPOINT PROTOCOL
default            bookinfo-gateway-istio-59dd7c96db-q9k6v 10.244.1.11 ambient-worker        None     TCP
default            details-v1-cf74bb974-5sqkp              10.244.1.5  ambient-worker        None     HBONE
default            productpage-v1-87d54dd59-fn6vw          10.244.1.10 ambient-worker        None     HBONE
default            ratings-v1-7c4bbf97db-zvkdw             10.244.1.6  ambient-worker        None     HBONE
default            reviews-v1-5fd6d4f8f8-knbht             10.244.1.16 ambient-worker        None     HBONE
default            reviews-v2-6f9b55c5db-c94m2             10.244.1.17 ambient-worker        None     HBONE
default            reviews-v3-7d99fd7978-7rgtd             10.244.1.18 ambient-worker        None     HBONE
default            curl-7656cf8794-r7zb9                   10.244.1.12 ambient-worker        None     HBONE
istio-system       istiod-7ff4959459-qcpvp                 10.244.2.5  ambient-worker2       None     TCP
istio-system       ztunnel-6hvcw                           10.244.1.4  ambient-worker        None     TCP
istio-system       ztunnel-mf476                           10.244.2.6  ambient-worker2       None     TCP
istio-system       ztunnel-vqzf9                           10.244.0.6  ambient-control-plane None     TCP
kube-system        coredns-76f75df574-2sms2                10.244.0.3  ambient-control-plane None     TCP
kube-system        coredns-76f75df574-5bf9c                10.244.0.2  ambient-control-plane None     TCP
local-path-storage local-path-provisioner-7577fdbbfb-pslg6 10.244.0.4  ambient-control-plane None     TCP

El comando ztunnel-config se puede usar para ver los secretos que contienen los certificados TLS que el proxy ztunnel ha recibido del control plane de istiod para usar en mTLS.

$ istioctl ztunnel-config certificates "$ZTUNNEL".istio-system
CERTIFICATE NAME                                              TYPE     STATUS        VALID CERT     SERIAL NUMBER                        NOT AFTER                NOT BEFORE
spiffe://cluster.local/ns/default/sa/bookinfo-details         Leaf     Available     true           c198d859ee51556d0eae13b331b0c259     2024-05-05T09:17:47Z     2024-05-04T09:15:47Z
spiffe://cluster.local/ns/default/sa/bookinfo-details         Root     Available     true           bad086c516cce777645363cb8d731277     2034-04-24T03:31:05Z     2024-04-26T03:31:05Z
spiffe://cluster.local/ns/default/sa/bookinfo-productpage     Leaf     Available     true           64c3828993c7df6f85a601a1615532cc     2024-05-05T09:17:47Z     2024-05-04T09:15:47Z
spiffe://cluster.local/ns/default/sa/bookinfo-productpage     Root     Available     true           bad086c516cce777645363cb8d731277     2034-04-24T03:31:05Z     2024-04-26T03:31:05Z
spiffe://cluster.local/ns/default/sa/bookinfo-ratings         Leaf     Available     true           720479815bf6d81a05df8a64f384ebb0     2024-05-05T09:17:47Z     2024-05-04T09:15:47Z
spiffe://cluster.local/ns/default/sa/bookinfo-ratings         Root     Available     true           bad086c516cce777645363cb8d731277     2034-04-24T03:31:05Z     2024-04-26T03:31:05Z
spiffe://cluster.local/ns/default/sa/bookinfo-reviews         Leaf     Available     true           285697fb2cf806852d3293298e300c86     2024-05-05T09:17:47Z     2024-05-04T09:15:47Z
spiffe://cluster.local/ns/default/sa/bookinfo-reviews         Root     Available     true           bad086c516cce777645363cb8d731277     2034-04-24T03:31:05Z     2024-04-26T03:31:05Z
spiffe://cluster.local/ns/default/sa/curl                    Leaf     Available     true           fa33bbb783553a1704866842586e4c0b     2024-05-05T09:25:49Z     2024-05-04T09:23:49Z
spiffe://cluster.local/ns/default/sa/curl                    Root     Available     true           bad086c516cce777645363cb8d731277     2034-04-24T03:31:05Z     2024-04-26T03:31:05Z

Usando estos comandos, puedes verificar que los proxies ztunnel estén configurados con todas las cargas de trabajo y el certificado TLS esperados. Además, la información faltante se puede usar para solucionar cualquier error de red.

Puedes usar la opción all para ver todas las partes de la configuración de ztunnel con un solo comando de la CLI:

$ istioctl ztunnel-config all -o json

También puedes ver el volcado de configuración sin procesar de un proxy ztunnel a través de un curl a un punto final dentro de su pod:

$ kubectl debug -it $ZTUNNEL -n istio-system --image=curlimages/curl -- curl localhost:15000/config_dump

Ver el estado de Istiod para los recursos xDS de ztunnel

A veces, es posible que desees ver el estado de los recursos de configuración del proxy ztunnel tal como se mantienen en el control plane de istiod, en el formato de los recursos de la API de xDS definidos especialmente para los proxies ztunnel. Esto se puede hacer ejecutando un comando dentro del pod de istiod y obteniendo esta información desde el puerto 15014 para un proxy ztunnel determinado, como se muestra en el siguiente ejemplo. Esta salida también se puede guardar y ver con una utilidad de formateo de impresión bonita de JSON para facilitar la navegación (no se muestra en el ejemplo).

$ export ISTIOD=$(kubectl get pods -n istio-system -l app=istiod -o=jsonpath='{.items[0].metadata.name}')
$ kubectl debug -it $ISTIOD -n istio-system --image=curlimages/curl -- curl localhost:15014/debug/config_dump?proxyID="$ZTUNNEL".istio-system

Verificar el tráfico de ztunnel a través de los registros

Los registros de tráfico de ztunnel se pueden consultar utilizando las instalaciones de registro estándar de Kubernetes.

$ kubectl -n default exec deploy/curl -- sh -c 'for i in $(seq 1 10); do curl -s -I http://productpage:9080/; done'
HTTP/1.1 200 OK
Server: Werkzeug/3.0.1 Python/3.12.1
--snip--

La respuesta que se muestra confirma que el pod cliente recibe respuestas del servicio. Ahora puedes verificar los registros de los pods de ztunnel para confirmar que el tráfico se envió a través del túnel HBONE.

$ kubectl -n istio-system logs -l app=ztunnel | grep -E "inbound|outbound"
2024-05-04T09:59:05.028709Z info    access  connection complete src.addr=10.244.1.12:60059 src.workload="curl-7656cf8794-r7zb9" src.namespace="default" src.identity="spiffe://cluster.local/ns/default/sa/curl" dst.addr=10.244.1.10:9080 dst.hbone_addr="10.244.1.10:9080" dst.service="productpage.default.svc.cluster.local" dst.workload="productpage-v1-87d54dd59-fn6vw" dst.namespace="productpage" dst.identity="spiffe://cluster.local/ns/default/sa/bookinfo-productpage" direction="inbound" bytes_sent=175 bytes_recv=80 duration="1ms"
2024-05-04T09:59:05.028771Z info    access  connection complete src.addr=10.244.1.12:58508 src.workload="curl-7656cf8794-r7zb9" src.namespace="default" src.identity="spiffe://cluster.local/ns/default/sa/curl" dst.addr=10.244.1.10:15008 dst.hbone_addr="10.244.1.10:9080" dst.service="productpage.default.svc.cluster.local" dst.workload="productpage-v1-87d54dd59-fn6vw" dst.namespace="productpage" dst.identity="spiffe://cluster.local/ns/default/sa/bookinfo-productpage" direction="outbound" bytes_sent=80 bytes_recv=175 duration="1ms"
--snip--

Estos mensajes de registro confirman que el tráfico se envió a través del proxy ztunnel. Se puede realizar un monitoreo adicional de grano fino verificando los registros en las instancias específicas del proxy ztunnel que se encuentran en los mismos nodos que los pods de origen y destino del tráfico. Si no se ven estos registros, entonces una posibilidad es que la redirección de tráfico no funcione correctamente.

Verificar el balanceo de carga de ztunnel

El proxy ztunnel realiza automáticamente el balanceo de carga del lado del cliente si el destino es un servicio con múltiples puntos finales. No se necesita configuración adicional. El algoritmo de balanceo de carga es un algoritmo interno fijo de Round Robin L4 que distribuye el tráfico en función del estado de la conexión L4 y no es configurable por el usuario.

Al llamar a un servicio con múltiples backends, podemos validar que el tráfico del cliente se equilibra entre las réplicas del servicio.

$ kubectl -n default exec deploy/curl -- sh -c 'for i in $(seq 1 10); do curl -s -I http://reviews:9080/; done'
$ kubectl -n istio-system logs -l app=ztunnel | grep -E "outbound"
--snip--
2024-05-04T10:11:04.964851Z info    access  connection complete src.addr=10.244.1.12:35520 src.workload="curl-7656cf8794-r7zb9" src.namespace="default" src.identity="spiffe://cluster.local/ns/default/sa/curl" dst.addr=10.244.1.9:15008 dst.hbone_addr="10.244.1.9:9080" dst.service="reviews.default.svc.cluster.local" dst.workload="reviews-v3-7d99fd7978-zznnq" dst.namespace="reviews" dst.identity="spiffe://cluster.local/ns/default/sa/bookinfo-reviews" direction="outbound" bytes_sent=84 bytes_recv=169 duration="2ms"
2024-05-04T10:11:04.969578Z info    access  connection complete src.addr=10.244.1.12:35526 src.workload="curl-7656cf8794-r7zb9" src.namespace="default" src.identity="spiffe://cluster.local/ns/default/sa/curl" dst.addr=10.244.1.9:15008 dst.hbone_addr="10.244.1.9:9080" dst.service="reviews.default.svc.cluster.local" dst.workload="reviews-v3-7d99fd7978-zznnq" dst.namespace="reviews" dst.identity="spiffe://cluster.local/ns/default/sa/bookinfo-reviews" direction="outbound" bytes_sent=84 bytes_recv=169 duration="2ms"
2024-05-04T10:11:04.974720Z info    access  connection complete src.addr=10.244.1.12:35536 src.workload="curl-7656cf8794-r7zb9" src.namespace="default" src.identity="spiffe://cluster.local/ns/default/sa/curl" dst.addr=10.244.1.7:15008 dst.hbone_addr="10.244.1.7:9080" dst.service="reviews.default.svc.cluster.local" dst.workload="reviews-v1-5fd6d4f8f8-26j92" dst.namespace="reviews" dst.identity="spiffe://cluster.local/ns/default/sa/bookinfo-reviews" direction="outbound" bytes_sent=84 bytes_recv=169 duration="2ms"
2024-05-04T10:11:04.979462Z info    access  connection complete src.addr=10.244.1.12:35552 src.workload="curl-7656cf8794-r7zb9" src.namespace="default" src.identity="spiffe://cluster.local/ns/default/sa/curl" dst.addr=10.244.1.8:15008 dst.hbone_addr="10.244.1.8:9080" dst.service="reviews.default.svc.cluster.local" dst.workload="reviews-v2-6f9b55c5db-c2dtw" dst.namespace="reviews" dst.identity="spiffe://cluster.local/ns/default/sa/bookinfo-reviews" direction="outbound" bytes_sent=84 bytes_recv=169 duration="2ms"

Este es un algoritmo de balanceo de carga de round robin y es independiente de cualquier algoritmo de balanceo de carga que se pueda configurar dentro del campo TrafficPolicy de un VirtualService, ya que, como se discutió anteriormente, todos los aspectos de los objetos de la API de VirtualService se instancian en los proxies de Waypoint y no en los proxies de ztunnel.

Observabilidad del tráfico en modo ambient

Además de verificar los registros de ztunnel y otras opciones de monitoreo mencionadas anteriormente, también puedes usar las funciones normales de monitoreo y telemetría de Istio para monitorear el tráfico de la aplicación usando el modo de data plane ambient.

Si un servicio solo usa la superposición segura proporcionada por ztunnel, las métricas de Istio informadas solo serán las métricas de TCP L4 (a saber, istio_tcp_sent_bytes_total, istio_tcp_received_bytes_total, istio_tcp_connections_opened_total, istio_tcp_connections_closed_total). El conjunto completo de métricas de Istio y Envoy se informará si se utiliza un proxy de waypoint.

¿Fue útil esta información?
¿Tienes alguna sugerencia para mejorar?

¡Gracias por tus comentarios!