Skip to content

Commit

Permalink
feat: pinger support check an address out of cluster.
Browse files Browse the repository at this point in the history
  • Loading branch information
oilbeater committed Dec 9, 2019
1 parent f009607 commit 4c966c3
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 0 deletions.
3 changes: 3 additions & 0 deletions pkg/pinger/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ type Configuration struct {
HostIP string
PodName string
PodIP string
ExternalAddress string
}

func ParseFlags() (*Configuration, error) {
Expand All @@ -35,6 +36,7 @@ func ParseFlags() (*Configuration, error) {
argInterval = pflag.Int("interval", 5, "interval seconds between consecutive pings")
argMode = pflag.String("mode", "server", "server or job Mode")
argDns = pflag.String("dns", "kubernetes.default", "check dns from pod")
argExternalAddress = pflag.String("external-address", "", "check ping connection to an external address, default empty that will disable external check")
)

klogFlags := flag.NewFlagSet("klog", flag.ExitOnError)
Expand Down Expand Up @@ -66,6 +68,7 @@ func ParseFlags() (*Configuration, error) {
HostIP: os.Getenv("HOST_IP"),
NodeName: os.Getenv("NODE_NAME"),
PodName: os.Getenv("POD_NAME"),
ExternalAddress: *argExternalAddress,
}
if err := config.initKubeClient(); err != nil {
return nil, err
Expand Down
39 changes: 39 additions & 0 deletions pkg/pinger/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,28 @@ var (
"target_node_name",
"target_node_ip",
})
externalPingLatencyHistogram = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: "pinger_external_ping_latency_ms",
Help: "the latency ms histogram for pod ping external address",
Buckets: []float64{.25, .5, 1, 2, 5, 10, 30, 50, 100},
},
[]string{
"src_node_name",
"src_node_ip",
"src_pod_ip",
"target_address",
})
externalPingLostCounter = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "pinger_node_external_lost_total",
Help: "the lost count for pod ping external address",
}, []string{
"src_node_name",
"src_node_ip",
"src_pod_ip",
"target_address",
})
)

func init() {
Expand All @@ -152,6 +174,8 @@ func init() {
prometheus.MustRegister(podPingLostCounter)
prometheus.MustRegister(nodePingLatencyHistogram)
prometheus.MustRegister(nodePingLostCounter)
prometheus.MustRegister(externalPingLatencyHistogram)
prometheus.MustRegister(externalPingLostCounter)
}

func SetOvsUpMetrics(nodeName string) {
Expand Down Expand Up @@ -231,3 +255,18 @@ func SetNodePingMetrics(srcNodeName, srcNodeIP, srcPodIP, targetNodeName, target
targetNodeIP,
).Add(float64(lost))
}

func SetExternalPingMetrics(srcNodeName, srcNodeIP, srcPodIP, targetAddress string, latency float64, lost int) {
externalPingLatencyHistogram.WithLabelValues(
srcNodeName,
srcNodeIP,
srcPodIP,
targetAddress,
).Observe(latency)
externalPingLostCounter.WithLabelValues(
srcNodeName,
srcNodeIP,
srcPodIP,
targetAddress,
).Add(float64(lost))
}
29 changes: 29 additions & 0 deletions pkg/pinger/ping.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ func ping(config *Configuration) {
pingNodes(config)
pingPods(config)
nslookup(config)
pingExternal(config)
}

func pingNodes(config *Configuration) {
Expand Down Expand Up @@ -113,6 +114,34 @@ func pingPods(config *Configuration) {
}
}

func pingExternal(config *Configuration) {
if config.ExternalAddress == "" {
return
}
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
}
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, count: %d, loss rate %.2f, average rtt %.2fms",
config.ExternalAddress, pinger.Count, math.Abs(stats.PacketLoss)*100, 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))))
}

func nslookup(config *Configuration) {
klog.Infof("start to check dns connectivity")
t1 := time.Now()
Expand Down

0 comments on commit 4c966c3

Please sign in to comment.