kube-ovn ovn 默认有一个 pinger pod,可以从 pinger pod 检查默认vpc子网内连通性以及到外部网络的连通性。但是对于 vlan 网络的用户,往往需要快速检测所有节点到 vlan gw 的网络。基于 kube-ovn 本身的镜像拉起一个 ds,可以快速确认所有节点到 vlan gw 是否正常。
# cat subnet-pinger.sh
#!/usr/bin/env bash
set -euo pipefail
echo "该脚本默认只检查 ipv4, 如果需要检查 ipv6, 请修改 pod command 参数中的 -4 为 -6"
sleep 1
REGISTRY="docker.io/kubeovn"
VERSION="v1.13.0"
SUBNET="ovn-default"
NAMESPACE="kube-system"
cat <<EOF > "$SUBNET-pinger".yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: "$SUBNET-pinger"
namespace: "$NAMESPACE"
spec:
selector:
matchLabels:
app: "$SUBNET-pinger"
template:
metadata:
annotations:
ovn.kubernetes.io/logical_switch: "$SUBNET"
labels:
app: "$SUBNET-pinger"
spec:
containers:
- args:
command: ["sh", "-c", "set -e; while true; do ip -4 r | grep via | awk '{print \$3}'|xargs ping -c 3 -i 1 ; done"]
securityContext:
capabilities:
add:
- NET_ADMIN
image: "$REGISTRY/kube-ovn:$VERSION"
imagePullPolicy: IfNotPresent
name: "$SUBNET-pinger"
resources:
limits:
cpu: 100m
memory: 100Mi
requests:
cpu: 100m
memory: 100Mi
dnsPolicy: ClusterFirst
hostPID: true
nodeSelector:
kubernetes.io/os: linux
priorityClassName: system-node-critical
restartPolicy: Always
schedulerName: default-scheduler
updateStrategy:
rollingUpdate:
maxSurge: 0
maxUnavailable: 1
type: RollingUpdate
EOF
kubectl apply -f "$SUBNET-pinger".yaml
kubectl rollout status ds/"$SUBNET-pinger" -n "$NAMESPACE" --timeout 30s
sleep 10
echo "确保所有 pinger pod STATUS 为 Runnning, RESTARTS 为0,则表示所有节点 pod ping 交换机网关正常"
kubectl get po -n "$NAMESPACE" -l app="$SUBNET-pinger" -o wide
注意使用该脚本需要修改镜像仓库,版本号,子网名,命名空间可不修改。
执行 bash subnet-pinger.sh 后,确认所有 pod 正常 running 即可。
测试结果如下
(go) root@kube:~/test/cluster# bash subnet-pinger.sh
该脚本默认只检查 ipv4, 如果需要检查 ipv6, 请修改 pod command 参数中的 -4 为 -6
daemonset.apps/ovn-default-pinger configured
daemon set "ovn-default-pinger" successfully rolled out
确保所有 pinger pod STATUS 为 Runnning, RESTARTS 为0,则表示所有节点 pod ping 交换机网关正常
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ovn-default-pinger-d42lq 1/1 Running 0 5m24s 10.16.0.13 kube-ovn-worker <none> <none>
ovn-default-pinger-pmjzt 1/1 Running 0 12m 10.16.0.10 kube-ovn-control-plane <none> <none>
(go) root@kube:~/test/cluster# cat subnet-pinger.sh
虚拟机检测
可以建一个反亲和虚拟机组,然后挑一个pinger pod,全 ping 一遍 vm ip 即可。
网关问题分析
首先该 ds 没有使用任何安全组:
- 如果存在 pod 有重启记录,则表示这个节点ovs虚拟网卡--> ovs网桥 -->物理网卡 -->网线 这四个因素可能存在问题,这个时候可以进这个节点 kube-ovn-cni 抓包
tcpdump -i any host <gw ip> -netvv
# 1. 没有看到任何包,则 pod 网卡 veth-pair 存在问题(我没遇到过)
# 2. 看到 包从 veth-pair 出来, 则 veth-pair 没问题
# 3. 从veth-pair出来后,会转到 ovs 业务网桥,如果没有看到 网桥出包,则ovs网桥相关问题(我没遇到过),如果没有出包,则大多是安全组限制(这个ds没有安全组))。
# 4. 从 业务网桥出来后,应该会看到包从帮到业务网桥的网卡(bond)出来,如果没有,则该网卡有问题。
# 5. 如果看到从网卡出去,而没有看到回包,则为交换机(外部)问题。如果看到这里可以看下tracepath或者traceroute,确定流量没有重路由到别的地方去。如果没有路由到别的地方,直接查交换机,如果有要看中间路由到的设备的问题。
从第四步之后,则和 ovs 无关。
kube-ovn 镜像中存在tracepath6 工具,但是没有 tracepath,我会补充一下。