其他常见问题¶
为了更好的分析问题请先参考 总体架构 了解 Kube-OVN 的组件和组件之间的交互。
通用排查步骤¶
- 判断网络链路问题:
- 测试 Pod 和 Pod 之间是否互通
- 测试 Pod 和宿主机之间是否互通
- 测试 Pod 访问 Service 是否正常
- 测试 Pod 解析域名是否正常
- 测试 Pod 访问外部网络是否正常
- 观察出问题节点
kube-ovn-pinger
日志,确认是否存在网络访问失败的情况
- 检查各个组件日志,判断是否有错误日志输出
- 检查 Pod 日志,确认是否存在网络访问失败的情况
- 检查节点 kube-ovn-cni 日志,确认 CNI 是否存处理错误
- 检查节点 ovs-ovn 日志,确认是否存在 OVS 处理错误
- 检查 kube-ovn-controller 日志,确认是否存在控制器处理错误
- 检查 ovn-central 日志,确认是否存在 OVN 处理错误
- 检查节点 dmesg 日志,确认是否存在内核处理错误
- 检查节点
netstat -s
日志,确认是否存在网络错误
- 检查各个组件监控信息,判断是否存在 CPU, 内存和 IO 方面的监控异常
以上的日志和信息可通过 kubectl ko logs
命令进行收集
Pod 创建失败,事件提示 IP 冲突¶
现象¶
Pod 无法进入 Running 状态,kubectl describe Pod 提示事件 duplicate IPv4 address <ip> found on logical switch port <port>
解决方法¶
- 确认当前 Pod 为非固定 IP Pod,若为固定 IP 则说明 IP 已被占用,需要更换 IP 或删除已占用 IP Pod
- 检查 kube-ovn-controller 日志,过滤冲突 IP 的申请和释放过程
- 观察是否存在 kube-ovn-controller 重启或者切主过程导致 IP 回收错误
kubectl ko nbctl show
观察 OVN 数据库中实际分配端口和 IP 情况- 若 OVN 数据库中信息和实际 Kubernetes 信息不一致,存在残留 IP 端口,需要手动通过
kubectl ko nbctl del-port <port>
进行清理
Pod 创建失败,事件提示 ping gateway failed¶
现象¶
Pod 无法进入 Running 状态,kubectl describe Pod 提示事件 network <ip> with gateway <gw ip> is not ready for interface eth0 after 30 checks
解决方法¶
kubectl ko sbctl show
确认 Pod 端口信息是否已经存在- 若信息不存在,收集 ovn-central 和 ovs-ovn 日志信息,观察是否存在错误,并重启 ovn-central 和 ovs-ovn 重试解决
- 若信息存在,观察是否存在网络策略阻止 Pod 访问网关
- 若为 Underlay 网络,询问网络管理员底层网络是否有安全限制,参考 Underlay 网络安装 文档
Pod 无法访问外部网络¶
现象¶
默认 VPC 下 Pod 在集群内访问正常,无法访问集群外部网络。
解决方法¶
- 使用
kubectl ko trace
判断 OVN 逻辑流表链路上是否存在 ACL 限制 - 若存在 ACL 限制,调整 ACL 策略
- 若不存在 ACL 限制,查看 Subnet stats 信息,确认网关节点信息是否正确,且网关节点网络正常
- 若网关节点信息不正确,或对应节点出现网络异常,修改 Subnet Spec 更新为新的网关节点
- 收集
kube-ovn-controller
日志,确认是否存在网关切换的异常日志
Pod IP 不在指定的 CIDR 内¶
现象¶
Pod 创建成功,但是 IP 不在指定的 CIDR 内。
解决方法¶
- 查找主机路径的
/etc/cni/net.d/
目录下是否存在其他非 Kube-OVN 的 CNI 配置文件 - 若存在,重命名该文件,或者删除该文件
- 重启 kubelet 以及对应节点上的所有 Pod
Debug Pod 无法正常创建¶
现象¶
kubectl debug 创建的 Pod 一直处于 ContainerCreating 状态,Pod Event 报错 network not ready 或 no address allocated
解决方法¶
创建 debug Pod 后,导出其 yaml 文件,删除 yaml 中的 Annotation:
ovn.kubernetes.io/ip_address
ovn.kubernetes.io/mac_address
ovn.kubernetes.io/allocated
ovn.kubernetes.io/routed
删除 debug Pod,使用修改后的 yaml 创建新的 debug Pod。
ARM 系统跨主机容器访问间歇失败¶
现象¶
ARM 系统和部分网卡 Offload 配合存在问题,会导致容器网络间歇故障。
使用 netstat
确认问题:
# netstat -us
IcmpMsg:
InType0: 22
InType3: 24
InType8: 117852
OutType0: 117852
OutType3: 29
OutType8: 22
Udp:
3040636 packets received
0 packets to unknown port received.
4 packet receive errors
602 packets sent
0 receive buffer errors
0 send buffer errors
InCsumErrors: 4
UdpLite:
IpExt:
InBcastPkts: 10244
InOctets: 4446320361
OutOctets: 1496815600
InBcastOctets: 3095950
InNoECTPkts: 7683903
若存在 InCsumErrors
,且随着访问失败增加,可确认是该问题。
解决方法¶
根本解决需要和操作系统以及对应网卡厂商沟通,更新系统和驱动。临时解决可先关闭物理 网卡的 tx offload
但是会导致 TCP 性能有较明显下降。
ethtool -K eth0 tx off
经社区用户反馈 CentOS 7 和麒麟操作系统都可能出现类似问题,其中麒麟操作系统在 4.19.90-25.16.v2101
内核后可以解决该问题。
Pod 访问 Service 不通¶
现象¶
Pod 内无法访问 Service 对应的服务,dmesg
显示异常:
netlink: Unknown conntrack attr (type=6, max=5)
openvswitch: netlink: Flow actions may not be safe on all matching packets.
该日志说明内核内 OVS 版本过低不支持对应 NAT 操作。
解决方法¶
- 升级内核模块或手动编译 OVS 内核模块。
- 若只使用 Overlay 网络可以更改
kube-ovn-controller
启动参数设置--enable-lb=false
关闭 OVN LB 使用 kube-proxy 进行 Service 转发。
ovn-central 出现频繁选主¶
现象¶
从 v1.11.x 版本开始,1w Pod 以上的集群,如果 OVN NB 或者 SB 出现频繁选主的情况,可能原因是 Kube-OVN 周期进行了 ovsdb-server/compact 动作,影响到选主逻辑。
解决方法¶
可以给 ovn-central 配置环境变量如下,关闭 compact:
- name: ENABLE_COMPACT
value: "false"