Skip to content

Commit

Permalink
fix pinger in dual stack cluster
Browse files Browse the repository at this point in the history
  • Loading branch information
zhangzujian committed Oct 16, 2021
1 parent 9364d2a commit cc8a4da
Show file tree
Hide file tree
Showing 5 changed files with 94 additions and 57 deletions.
6 changes: 5 additions & 1 deletion dist/images/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ if [ "$DUAL_STACK" = "true" ]; then
POD_GATEWAY="10.16.0.1,fd00:10:16::1"
SVC_CIDR="10.96.0.0/12" # Do NOT overlap with NODE/POD/JOIN CIDR
JOIN_CIDR="100.64.0.0/16,fd00:100:64::/64" # Do NOT overlap with NODE/POD/SVC CIDR
PINGER_EXTERNAL_ADDRESS="114.114.114.114"
PINGER_EXTERNAL_ADDRESS="114.114.114.114,2400:3200::1"
PINGER_EXTERNAL_DOMAIN="google.com"
SVC_YAML_IPFAMILYPOLICY="ipFamilyPolicy: PreferDualStack"
fi
Expand Down Expand Up @@ -2056,6 +2056,10 @@ spec:
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: POD_IPS
valueFrom:
fieldRef:
fieldPath: status.podIPs
- name: HOST_IP
valueFrom:
fieldRef:
Expand Down
11 changes: 11 additions & 0 deletions pkg/pinger/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,16 @@ package pinger
import (
"flag"
"os"
"strings"
"time"

"github.com/spf13/pflag"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/klog"

"github.com/kubeovn/kube-ovn/pkg/util"
)

type Configuration struct {
Expand All @@ -27,6 +30,8 @@ type Configuration struct {
HostIP string
PodName string
PodIP string
PodIPs []string
PodProtocols []string
ExternalAddress string
NetworkMode string

Expand Down Expand Up @@ -106,6 +111,7 @@ func ParseFlags() (*Configuration, error) {
InternalDNS: *argInternalDns,
ExternalDNS: *argExternalDns,
PodIP: os.Getenv("POD_IP"),
PodIPs: strings.Split(os.Getenv("POD_IPS"), ","),
HostIP: os.Getenv("HOST_IP"),
NodeName: os.Getenv("NODE_NAME"),
PodName: os.Getenv("POD_NAME"),
Expand All @@ -127,6 +133,11 @@ func ParseFlags() (*Configuration, error) {
ServiceOvnControllerFileLogPath: *argServiceOvnControllerFileLogPath,
ServiceOvnControllerFilePidPath: *argServiceOvnControllerFilePidPath,
}
config.PodProtocols = make([]string, len(config.PodIPs))
for i, podIP := range config.PodIPs {
config.PodProtocols[i] = util.CheckProtocol(podIP)
}

if err := config.initKubeClient(); err != nil {
return nil, err
}
Expand Down
126 changes: 70 additions & 56 deletions pkg/pinger/ping.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,16 @@ import (
"math"
"net"
"os"
"strings"
"time"

goping "github.com/oilbeater/go-ping"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/klog"

"github.com/kubeovn/kube-ovn/pkg/util"
)

func StartPinger(config *Configuration, e *Exporter) {
Expand Down Expand Up @@ -87,7 +90,7 @@ func pingNodes(config *Configuration) error {
var pingErr error
for _, no := range nodes.Items {
for _, addr := range no.Status.Addresses {
if addr.Type == v1.NodeInternalIP {
if addr.Type == v1.NodeInternalIP && util.ContainsString(config.PodProtocols, util.CheckProtocol(addr.Address)) {
func(nodeIP, nodeName string) {
pinger, err := goping.NewPinger(nodeIP)
if err != nil {
Expand Down Expand Up @@ -137,37 +140,39 @@ func pingPods(config *Configuration) error {

var pingErr error
for _, pod := range pods.Items {
if pod.Status.PodIP != "" {
func(podIp, podName, nodeIP, nodeName string) {
pinger, err := goping.NewPinger(podIp)
if err != nil {
klog.Errorf("failed to init pinger, %v", err)
pingErr = err
return
}
pinger.SetPrivileged(true)
pinger.Timeout = 1 * time.Second
pinger.Debug = true
pinger.Count = 3
pinger.Interval = 1 * time.Millisecond
pinger.Run()
stats := pinger.Statistics()
klog.Infof("ping pod: %s %s, count: %d, loss count %d, average rtt %.2fms",
podName, podIp, pinger.Count, int(math.Abs(float64(stats.PacketsSent-stats.PacketsRecv))), float64(stats.AvgRtt)/float64(time.Millisecond))
if int(math.Abs(float64(stats.PacketsSent-stats.PacketsRecv))) != 0 {
pingErr = fmt.Errorf("ping failed")
}
SetPodPingMetrics(
config.NodeName,
config.HostIP,
config.PodName,
nodeName,
nodeIP,
podIp,
float64(stats.AvgRtt)/float64(time.Millisecond),
int(math.Abs(float64(stats.PacketsSent-stats.PacketsRecv))),
int(float64(stats.PacketsSent)))
}(pod.Status.PodIP, pod.Name, pod.Status.HostIP, pod.Spec.NodeName)
for _, podIP := range pod.Status.PodIPs {
if util.ContainsString(config.PodProtocols, util.CheckProtocol(podIP.IP)) {
func(podIp, podName, nodeIP, nodeName string) {
pinger, err := goping.NewPinger(podIp)
if err != nil {
klog.Errorf("failed to init pinger, %v", err)
pingErr = err
return
}
pinger.SetPrivileged(true)
pinger.Timeout = 1 * time.Second
pinger.Debug = true
pinger.Count = 3
pinger.Interval = 1 * time.Millisecond
pinger.Run()
stats := pinger.Statistics()
klog.Infof("ping pod: %s %s, count: %d, loss count %d, average rtt %.2fms",
podName, podIp, pinger.Count, int(math.Abs(float64(stats.PacketsSent-stats.PacketsRecv))), float64(stats.AvgRtt)/float64(time.Millisecond))
if int(math.Abs(float64(stats.PacketsSent-stats.PacketsRecv))) != 0 {
pingErr = fmt.Errorf("ping failed")
}
SetPodPingMetrics(
config.NodeName,
config.HostIP,
config.PodName,
nodeName,
nodeIP,
podIp,
float64(stats.AvgRtt)/float64(time.Millisecond),
int(math.Abs(float64(stats.PacketsSent-stats.PacketsRecv))),
int(float64(stats.PacketsSent)))
}(podIP.IP, pod.Name, pod.Status.HostIP, pod.Spec.NodeName)
}
}
}
return pingErr
Expand All @@ -177,31 +182,40 @@ func pingExternal(config *Configuration) error {
if config.ExternalAddress == "" {
return nil
}
klog.Infof("start to check ping external to %s", config.ExternalAddress)
pinger, err := goping.NewPinger(config.ExternalAddress)
if err != nil {
klog.Errorf("failed to init pinger, %v", err)
return err
}
pinger.SetPrivileged(true)
pinger.Timeout = 5 * time.Second
pinger.Debug = true
pinger.Count = 3
pinger.Interval = 1 * time.Millisecond
pinger.Run()
stats := pinger.Statistics()
klog.Infof("ping external address: %s, total count: %d, loss count %d, average rtt %.2fms",
config.ExternalAddress, pinger.Count, int(math.Abs(float64(stats.PacketsSent-stats.PacketsRecv))), float64(stats.AvgRtt)/float64(time.Millisecond))
SetExternalPingMetrics(
config.NodeName,
config.HostIP,
config.PodIP,
config.ExternalAddress,
float64(stats.AvgRtt)/float64(time.Millisecond),
int(math.Abs(float64(stats.PacketsSent-stats.PacketsRecv))))
if int(math.Abs(float64(stats.PacketsSent-stats.PacketsRecv))) != 0 {
return fmt.Errorf("ping failed")

addresses := strings.Split(config.ExternalAddress, ",")
for _, addr := range addresses {
if !util.ContainsString(config.PodProtocols, util.CheckProtocol(addr)) {
continue
}

klog.Infof("start to check ping external to %s", addr)
pinger, err := goping.NewPinger(addr)
if err != nil {
klog.Errorf("failed to init pinger, %v", err)
return err
}
pinger.SetPrivileged(true)
pinger.Timeout = 5 * time.Second
pinger.Debug = true
pinger.Count = 3
pinger.Interval = 1 * time.Millisecond
pinger.Run()
stats := pinger.Statistics()
klog.Infof("ping external address: %s, total count: %d, loss count %d, average rtt %.2fms",
addr, pinger.Count, int(math.Abs(float64(stats.PacketsSent-stats.PacketsRecv))), float64(stats.AvgRtt)/float64(time.Millisecond))
SetExternalPingMetrics(
config.NodeName,
config.HostIP,
config.PodIP,
addr,
float64(stats.AvgRtt)/float64(time.Millisecond),
int(math.Abs(float64(stats.PacketsSent-stats.PacketsRecv))))
if int(math.Abs(float64(stats.PacketsSent-stats.PacketsRecv))) != 0 {
return fmt.Errorf("ping failed")
}
}

return nil
}

Expand Down
4 changes: 4 additions & 0 deletions yamls/kube-ovn-ipv6.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,10 @@ spec:
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: POD_IPS
valueFrom:
fieldRef:
fieldPath: status.podIPs
- name: HOST_IP
valueFrom:
fieldRef:
Expand Down
4 changes: 4 additions & 0 deletions yamls/kube-ovn.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,10 @@ spec:
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: POD_IPS
valueFrom:
fieldRef:
fieldPath: status.podIPs
- name: HOST_IP
valueFrom:
fieldRef:
Expand Down

0 comments on commit cc8a4da

Please sign in to comment.