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/portprometheus.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 日志, 以获取为什么插件未被正确安装的信息。

这些信息有用吗?
您是否有更多建议和改进意见?

感谢您的反馈!