Istio CNI 插件故障排除
本页介绍如何解决 Istio CNI 插件的问题。在阅读本文之前,您须阅读 CNI 安装和操作指南。
日志
Istio CNI 插件日志基于 PodSpec
提供了有关插件如何配置应用程序 Pod 流量重定向的信息。
该插件在容器运行时进程空间中运行,因此您可以在 kubelet
日志中看到 CNI 日志条目。 为了使调试更容易,CNI 插件还将其日志发送到 istio-cni-node
DaemonSet。
CNI 插件的默认日志级别是 info
。要获得更详细的日志输出,可以通过编辑 values.cni.logLevel
安装选项并重新启动 CNI DaemonSet Pod 来更改级别。
Istio CNI DaemonSet Pod 日志还提供了有关 CNI 插件安装的信息以及竞争条件和缓解措施。
监控
CNI DaemonSet 生成指标, 可用于监视 CNI 的安装、准备就绪和竞争条件缓解措施。默认情况下,Prometheus 抓取的注解 (prometheus.io/port
、prometheus.io/path
)被添加到 istio-cni-node
DaemonSet Pod 中。 您可以通过标准 Prometheus 配置来收集生成的指标。
DaemonSet 准备就绪
CNI DaemonSet 的就绪表明 Istio CNI 插件已被正确安装和配置。 如果 Istio CNI DaemonSet 尚未准备好,则表明出现了问题。查看 istio-cni-node
DaemonSet 日志进行诊断。您还可以通过 istio_cni_install_ready
指标跟踪 CNI 安装就绪与否。
竞争条件和缓解措施
Istio CNI DaemonSet 默认启用竞争条件和缓解措施, 这将驱逐在 CNI 插件准备就绪之前启动的 Pod。要了解哪些 Pod 被驱逐,请查找如下所示的日志行:
2021-07-21T08:32:17.362512Z info Deleting broken pod: service-graph00/svc00-0v1-95b5885bf-zhbzm
您还可以通过 istio_cni_repair_pods_repaired_total
指标追踪修复的 Pod。
诊断 Pod 启动失败
CNI 插件的一个常见问题是由于容器网络设置失败,使得 Pod 无法启动。 通常,失败原因会写入 Pod 事件,Pod 描述中会包含这些失败原因:
$ kubectl describe pod POD_NAME -n POD_NAMESPACE
如果 Pod 持续出现初始化错误,请检查 Init 容器 istio-validation
日志是否存在如下 “connection refused” 错误:
$ kubectl logs POD_NAME -n POD_NAMESPACE -c istio-validation
...
2021-07-20T05:30:17.111930Z error Error connecting to 127.0.0.6:15002: dial tcp 127.0.0.1:0->127.0.0.6:15002: connect: connection refused
2021-07-20T05:30:18.112503Z error Error connecting to 127.0.0.6:15002: dial tcp 127.0.0.1:0->127.0.0.6:15002: connect: connection refused
...
2021-07-20T05:30:22.111676Z error validation timeout
istio-validation
Init 容器设置一个本地虚拟服务器,该服务器监听流量重定向目标的出入端口, 并检查测试流量是否可以重定向到此虚拟服务器。当 CNI 插件未正确设置 Pod 流量重定向时, istio-validation
Init 容器会阻止 Pod 启动,以防止流量绕过。 要查看网络设置行为是否有任何错误或意外,请在 istio-cni-node
中搜索 Pod ID。
CNI 插件出现故障的另一个症状是,应用程序 Pod 在启动时不断被逐出。 这通常是因为插件没有被正确安装,因此无法设置 Pod 流量重定向。 CNI 的竞争条件和缓解措施逻辑 认为由于竞争条件引起的问题导致 Pod 损坏,并连续逐出 Pod。遇到此问题时,请检查 CNI DaemonSet 日志, 以获取为什么插件未被正确安装的信息。