Istio CNI 插件故障排除

目录

日志

Istio CNI 插件日志提供了插件如何基于 PodSpec 配置应用 Pod 流量重定向的信息。

该插件运行在容器运行时进程空间,因此您可以在 kubelet 日志中看到 CNI 日志条目。 为了便于调试,CNI 插件还将其日志发送到 istio-cni-node DaemonSet。

CNI 插件的默认日志级别为 info。要获取更详细的日志输出,可以通过编辑 ServiceMesh 组件配置中 istioCNIcni.values.logLevel 来更改级别。

Istio CNI DaemonSet Pod 日志还提供了有关 CNI 插件安装和竞态条件修复的信息。

DaemonSet 就绪状态

CNI DaemonSet 的就绪状态表明 Istio CNI 插件已正确安装和配置。 如果 Istio CNI DaemonSet 未就绪,则说明存在问题。请查看 istio-cni-node DaemonSet 日志进行诊断。

竞态条件修复

默认情况下,Istio CNI DaemonSet 启用了竞态条件缓解, 它会驱逐在 CNI 插件准备好之前启动的 Pod。 要了解哪些 Pod 被驱逐,请查找如下日志行:

2021-07-21T08:32:17.362512Z     info   Deleting broken pod: service-graph00/svc00-0v1-95b5885bf-zhbzm

诊断 Pod 启动失败

CNI 插件的一个常见问题是 Pod 因容器网络设置失败而无法启动。 通常失败原因会写入 Pod 事件,并可通过 Pod 描述查看:

$ kubectl describe pod POD_NAME -n POD_NAMESPACE

如果 Pod 持续出现 init 错误,请检查 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 日志,了解插件无法正确安装的原因。

当使用 Multus 链接多个 CNI 提供者时,例如 Kube-OVN,可能会导致 Istio CNI 插件被多次安装配置(在 MultusKube-OVN 中均安装), 从而形成无法为 Pod 配置网络的循环 CNI 链。为缓解此问题,您可以显式指定 cni.values.cniConfFileNameMultus 配置文件名。 并手动检查所有 CNI 配置,确保没有重复配置。