@@ -15,14 +15,15 @@ import (
15
15
"syscall"
16
16
"time"
17
17
18
+ "github.com/vishvananda/netlink"
19
+ weaveapi "github.com/weaveworks/weave/api"
20
+ "github.com/weaveworks/weave/common"
21
+ "golang.org/x/sys/unix"
18
22
api "k8s.io/apimachinery/pkg/apis/meta/v1"
19
23
"k8s.io/client-go/informers"
20
24
"k8s.io/client-go/kubernetes"
21
25
"k8s.io/client-go/rest"
22
26
"k8s.io/client-go/tools/cache"
23
-
24
- weaveapi "github.com/weaveworks/weave/api"
25
- "github.com/weaveworks/weave/common"
26
27
)
27
28
28
29
type nodeInfo struct {
@@ -54,6 +55,10 @@ func getKubePeers(c kubernetes.Interface, includeWithNoIPAddr bool) ([]nodeInfo,
54
55
55
56
// Fallback for cases where a Node has an ExternalIP but no InternalIP
56
57
if internalIP != "" {
58
+ // exclude self from the list of peers this node will peer with
59
+ if isLocalNodeIp (internalIP ) {
60
+ continue
61
+ }
57
62
addresses = append (addresses , nodeInfo {name : peer .Name , addr : internalIP })
58
63
} else if externalIP != "" {
59
64
addresses = append (addresses , nodeInfo {name : peer .Name , addr : externalIP })
@@ -64,6 +69,20 @@ func getKubePeers(c kubernetes.Interface, includeWithNoIPAddr bool) ([]nodeInfo,
64
69
return addresses , nil
65
70
}
66
71
72
+ // returns true if given IP matches with one of the local IP's
73
+ func isLocalNodeIP (ip string ) bool {
74
+ addrs , err := netlink .AddrList (nil , unix .AF_INET )
75
+ if err != nil {
76
+ return false
77
+ }
78
+ for _ , addr := range addrs {
79
+ if addr .Peer .IP .String () == ip {
80
+ return true
81
+ }
82
+ }
83
+ return false
84
+ }
85
+
67
86
// (minimal, incomplete) interface so weaver can be mocked for testing.
68
87
type weaveClient interface {
69
88
RmPeer (peerName string ) (string , error )
0 commit comments