在我的前两篇博客中:
我向你详细介绍了 Istio 数据平面中的流量,但数据平面并不能孤立的存在,本文将向你展示 Istio 中的控制平面和数据平面各组件的端口及其功能,有助于你了解这些流量之间的关系及故障排查。
按照习惯,我们首先展示一个全局示意图。下图展示的是 Istio 数据平面中 sidecar 的组成,以及与其交互的对象。
我们可以使用 nsenter
命令进入 Bookinfo 示例的 productpage
Pod 的网络空间,查看其内部监听的端口信息。
从图中我们可以看到除了 productpage
应用本身监听的 9080 端口以外,Sidecar 容器还有监听大量的其他端口,如 15000
、15001
、15004
、15006
、15021
、15090
等,你可以在 Istio 文档上了解 Istio 中使用的端口。
我们再进入 productpage
Pod 中,使用 lsof -i
命令查看它打开的端口,如下图所示。
我们可以看到其中有 pilot-agent
与 istiod
建立了 TCP 连接,上文中所述的监听中的端口,还有在 Pod 内部建立的 TCP 连接,这些连接对应了文章开头的示意图。
Sidecar 容器(istio-proxy
)的根进程是 pilot-agent
,启动命令如下图所示:
从图中我们可以看到,它 pilot-agent
进程的 PID 是 1,是它拉起了 envoy
进程。
在 istiod
的 Pod 中查看它打开的端口,如下图所示。
我们可以看到其中的监听的端口、进程间和远程通信连接。
这些端口在你进行问题排查时可以起着举足轻重的作用。下面将根据端口所在的组件和功能分类描述。
Istiod 中的端口相对比较少且功能单一:
istiod
的进程信息istiod
调试端口,通过该端口可以查询网格的配置和状态信息从上文中,我们看到 sidecar 中有众多端口:
pilot-agent
进程,将在下文中详细解释。/healthz/ready
路径上设置了就绪探针,Istio 把 sidecar 的就绪检测交给了 kubelet
,最大化利用 Kubernetes 平台自身的功能。envoy
进程将健康检查路由到 pilot-agent
进程的 15020 端口,实际的健康检查将发生在那里。pilot-agent
将通过此端口收集统计信息。以上端口可以分为以下几类:
下文将对几个重点端口详解。
15000 是 Envoy 的 Admin 接口,该接口允许我们修改 Envoy,并获得一个视图和查询指标和配置。
管理接口由一个具有多个端点的 REST API 和一个简单的用户界面组成,你可以使用下面的命令开启 productpage
Pod 中的 Envoy 管理接口视图。
kubectl -n default port-forward deploy/productpage-v1 15000
在浏览器中访问 http://localhost:15000
,你将看到 Envoy Admin 界面如下图所示。
通过 pilot-agent
代理 istiod
8080 端口上的调试端点,你可以进入数据平面 Pod 中访问 localhost 的 15004 端口查询网格信息,其效果与下面的 8080 端口等同。
你还可以在本地转发 istiod
8080 端口,请运行下面的命令。
kubectl -n istio-system port-forward deploy/istiod 8080
在浏览器中访问 http://localhost:8080/debug
,你将看到调试端点,如下图所示。
当然,这只是一种获取网格信息和调试网格的方式,你还可以使用 istioctl
命令或 Kiali 来调试,那样将更加高效和直观。
15020 端口有三大功能:
envoy
的指标,也可以配置查询应用程序的指标,将 envoy
、应用程序和自身的指标汇总以供 Prometheus 收集。对应的调试端点是 /stats/prometheus
。/healthz/ready
和 /app-health
。pilot-agent
进程:对应的调试端点是 /quitquitquit
、debug/ndsz
和 /debug/pprof
。下图展示的是使用本地端口转发后,在浏览器中打开 http://localhost:15020/debug/pprof
看到的调试信息。
图中信息展示的是 pilot-agent
的堆栈信息。
通过对 Istio 中各组件端口的了解,你应该对 Istio 中各组件的关系及其内部流量有了更进一步的认识,熟悉这些端口的功能,有助于对网格的故障排除。
最后更新于 2024/11/07