Allow multiple peer routers specified through global BGP peer router flag '--peer-router'.

Node annotation to specifiy BGP peer routers also supports one or more BGP peers.

Fixes #37
This commit is contained in:
Murali Reddy 2017-07-03 22:53:04 +05:30
parent f1823e9853
commit a757ea3203
2 changed files with 65 additions and 36 deletions

View File

@ -32,16 +32,17 @@ Only nodes with in same ASN form full mesh. Two nodes with different configured
An optional global BGP peer can be configured by specifying `--peer-asn` and `--peer-router` parameters. When configured An optional global BGP peer can be configured by specifying `--peer-asn` and `--peer-router` parameters. When configured
each node in the cluster forms a peer relationship with specified global peer. Pod cidr, cluster IP's get advertised to each node in the cluster forms a peer relationship with specified global peer. Pod cidr, cluster IP's get advertised to
the global BGP peer. the global BGP peer. For redundancy you can also configure more than one peer router by specifying comma seperated list
of BGP peers for `--peer-router` flag, like `--peer-router=192.168.1.99,192.168.1.100`
### Node specific BGP peer ### Node specific BGP peer
Alternativley, each node can be configured with node specific BGP peer. Information regarding node specific BGP peer is Alternativley, each node can be configured with one or mode node specific BGP peer. Information regarding node specific BGP peer is
read from node API object annotations `net.kuberouter.node.bgppeer.address` and `net.kuberouter.node.bgppeer.asn`. read from node API object annotations `net.kuberouter.node.bgppeer.address` and `net.kuberouter.node.bgppeer.asn`.
For e.g users can annotate node object with below commands For e.g users can annotate node object with below commands
``` ```
kubectl annotate node <kube-node> “net.kuberouter.node.bgppeer.address=192.168.1.98” kubectl annotate node <kube-node> “net.kuberouter.node.bgppeer.address=192.168.1.98,192.168.1.99
kubectl annotate node <kube-node> "net.kuberouter.node.bgppeer.asn=64513”" kubectl annotate node <kube-node> "net.kuberouter.node.bgppeer.asn=64513”"
``` ```

View File

@ -35,7 +35,7 @@ type NetworkRoutingController struct {
advertiseClusterIp bool advertiseClusterIp bool
defaultNodeAsnNumber uint32 defaultNodeAsnNumber uint32
nodeAsnNumber uint32 nodeAsnNumber uint32
globalPeerRouter string globalPeerRouters []string
globalPeerAsnNumber uint32 globalPeerAsnNumber uint32
bgpFullMeshMode bool bgpFullMeshMode bool
} }
@ -258,9 +258,9 @@ func (nrc *NetworkRoutingController) syncPeers() {
glog.Infof("Not peering with the Node %s as ASN number of the node is invalid.", nodeIP.String()) glog.Infof("Not peering with the Node %s as ASN number of the node is invalid.", nodeIP.String())
continue continue
} }
// if the nodes ASN number is different from ASN number of current node skipp peering // if the nodes ASN number is different from ASN number of current node skipp peering
if nrc.nodeAsnNumber != uint32(asnNo) { if nrc.nodeAsnNumber != uint32(asnNo) {
glog.Infof("Not peering with the Node %s as ASN number of the node is different.", nodeIP.String()) glog.Infof("Not peering with the Node %s as ASN number of the node is different.", nodeIP.String())
continue continue
} }
@ -396,47 +396,64 @@ func (nrc *NetworkRoutingController) startBgpServer() bool {
// if the global routing peer is configured then peer with it // if the global routing peer is configured then peer with it
// else peer with node specific BGP peer // else peer with node specific BGP peer
if len(nrc.globalPeerRouter) != 0 && nrc.globalPeerAsnNumber != 0 { if len(nrc.globalPeerRouters) != 0 && nrc.globalPeerAsnNumber != 0 {
n := &config.Neighbor{ for _, peer := range nrc.globalPeerRouters {
Config: config.NeighborConfig{ n := &config.Neighbor{
NeighborAddress: nrc.globalPeerRouter, Config: config.NeighborConfig{
PeerAs: nrc.globalPeerAsnNumber, NeighborAddress: peer,
}, PeerAs: nrc.globalPeerAsnNumber,
} },
if err := nrc.bgpServer.AddNeighbor(n); err != nil { }
panic("Failed to peer with global peer router due to: " + nrc.globalPeerRouter) if err := nrc.bgpServer.AddNeighbor(n); err != nil {
panic("Failed to peer with global peer router due to: " + peer)
}
} }
} else { } else {
nodeBgpPeer, ok := node.ObjectMeta.Annotations["net.kuberouter.node.bgppeer.address"]
if !ok {
glog.Infof("Could not find BGP peer info for the node in the node annotations so skipping configuring peer.")
return true
}
nodeBgpPeerAsn, ok := node.ObjectMeta.Annotations["net.kuberouter.node.bgppeer.asn"] nodeBgpPeerAsn, ok := node.ObjectMeta.Annotations["net.kuberouter.node.bgppeer.asn"]
if !ok { if !ok {
glog.Infof("Could not find BGP peer info for the node in the node annotations so skipping configuring peer.") glog.Infof("Could not find BGP peer info for the node in the node annotations so skipping configuring peer.")
return true return true
} }
asnNo, err := strconv.ParseUint(nodeBgpPeerAsn, 0, 32) asnNo, err := strconv.ParseUint(nodeBgpPeerAsn, 0, 32)
if err != nil { if err != nil {
panic("Failed to parse ASN number specified for the the node in the annotations") panic("Failed to parse ASN number specified for the the node in the annotations")
} }
peerAsnNo := uint32(asnNo) peerAsnNo := uint32(asnNo)
glog.Infof("Node is configured to peer with %s in ASN %v from the node annotations", nodeBgpPeer, peerAsnNo)
n := &config.Neighbor{ nodeBgpPeersAnnotation, ok := node.ObjectMeta.Annotations["net.kuberouter.node.bgppeer.address"]
Config: config.NeighborConfig{ if !ok {
NeighborAddress: nodeBgpPeer, glog.Infof("Could not find BGP peer info for the node in the node annotations so skipping configuring peer.")
PeerAs: peerAsnNo, return true
},
} }
if err := nrc.bgpServer.AddNeighbor(n); err != nil { nodePeerRouters := make([]string, 0)
panic("Failed to peer with node specific BGP peer router: " + nodeBgpPeer + " due to " + err.Error()) if strings.Contains(nodeBgpPeersAnnotation, ",") {
ips := strings.Split(nodeBgpPeersAnnotation, ",")
for _, ip := range ips {
if net.ParseIP(ip) == nil {
panic("Invalid node BGP peer router ip in the annotation: " + ip)
}
}
nodePeerRouters = append(nodePeerRouters, ips...)
} else {
if net.ParseIP(nodeBgpPeersAnnotation) == nil {
panic("Invalid node BGP peer router ip: " + nodeBgpPeersAnnotation)
}
nodePeerRouters = append(nodePeerRouters, nodeBgpPeersAnnotation)
}
for _, peer := range nodePeerRouters {
glog.Infof("Node is configured to peer with %s in ASN %v from the node annotations", peer, peerAsnNo)
n := &config.Neighbor{
Config: config.NeighborConfig{
NeighborAddress: peer,
PeerAs: peerAsnNo,
},
}
if err := nrc.bgpServer.AddNeighbor(n); err != nil {
panic("Failed to peer with node specific BGP peer router: " + peer + " due to " + err.Error())
}
} }
glog.Infof("Successfully configured %s in ASN %v as BGP peer to the node", nodeBgpPeer, peerAsnNo) glog.Infof("Successfully configured %s in ASN %v as BGP peer to the node", nodeBgpPeersAnnotation, peerAsnNo)
} }
return true return true
@ -472,11 +489,22 @@ func NewNetworkRoutingController(clientset *kubernetes.Clientset, kubeRouterConf
} }
if len(kubeRouterConfig.PeerRouter) != 0 && len(kubeRouterConfig.PeerAsn) != 0 { if len(kubeRouterConfig.PeerRouter) != 0 && len(kubeRouterConfig.PeerAsn) != 0 {
if net.ParseIP(kubeRouterConfig.PeerRouter) == nil {
panic("Invalid global BGP peer router ip: " + nrc.globalPeerRouter)
}
nrc.globalPeerRouter = kubeRouterConfig.PeerRouter if strings.Contains(kubeRouterConfig.PeerRouter, ",") {
ips := strings.Split(kubeRouterConfig.PeerRouter, ",")
for _, ip := range ips {
if net.ParseIP(ip) == nil {
panic("Invalid global BGP peer router ip: " + kubeRouterConfig.PeerRouter)
}
}
nrc.globalPeerRouters = append(nrc.globalPeerRouters, ips...)
} else {
if net.ParseIP(kubeRouterConfig.PeerRouter) == nil {
panic("Invalid global BGP peer router ip: " + kubeRouterConfig.PeerRouter)
}
nrc.globalPeerRouters = append(nrc.globalPeerRouters, kubeRouterConfig.PeerRouter)
}
asn, err := strconv.ParseUint(kubeRouterConfig.PeerAsn, 0, 32) asn, err := strconv.ParseUint(kubeRouterConfig.PeerAsn, 0, 32)
if err != nil { if err != nil {