kube-ovn 子网网关检查

252 阅读3分钟

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 没有使用任何安全组:

  1. 如果存在 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,我会补充一下。