Skip to content

Commit 077ff86

Browse files
Lars Ekmanmurali-reddy
authored andcommitted
Ipv6; BGP peering (#545)
* Use ip6tables for ipv6 and handle ipv6 for egress rules * Make the temp ipset's fit into 31 characters This should be improved. Some hash string should be used for temp names.
1 parent a47e0f4 commit 077ff86

File tree

4 files changed

+63
-35
lines changed

4 files changed

+63
-35
lines changed

pkg/controllers/routing/network_routes_controller.go

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ type NetworkRoutingController struct {
6060
nodeName string
6161
nodeSubnet net.IPNet
6262
nodeInterface string
63+
isIpv6 bool
6364
activeNodes map[string]bool
6465
mu sync.Mutex
6566
clientset kubernetes.Interface
@@ -151,7 +152,7 @@ func (nrc *NetworkRoutingController) Run(healthChan chan<- *healthcheck.Controll
151152
}
152153

153154
glog.V(1).Info("Performing cleanup of depreciated rules/ipsets (if needed).")
154-
err = deleteBadPodEgressRules()
155+
err = nrc.deleteBadPodEgressRules()
155156
if err != nil {
156157
glog.Errorf("Error cleaning up old/bad Pod egress rules: %s", err.Error())
157158
}
@@ -160,14 +161,14 @@ func (nrc *NetworkRoutingController) Run(healthChan chan<- *healthcheck.Controll
160161
if nrc.enablePodEgress {
161162
glog.V(1).Infoln("Enabling Pod egress.")
162163

163-
err = createPodEgressRule()
164+
err = nrc.createPodEgressRule()
164165
if err != nil {
165166
glog.Errorf("Error enabling Pod egress: %s", err.Error())
166167
}
167168
} else {
168169
glog.V(1).Infoln("Disabling Pod egress.")
169170

170-
err = deletePodEgressRule()
171+
err = nrc.deletePodEgressRule()
171172
if err != nil {
172173
glog.Warningf("Error cleaning up Pod Egress related networking: %s", err)
173174
}
@@ -458,18 +459,18 @@ func (nrc *NetworkRoutingController) injectRoute(path *table.Path) error {
458459
// Cleanup performs the cleanup of configurations done
459460
func (nrc *NetworkRoutingController) Cleanup() {
460461
// Pod egress cleanup
461-
err := deletePodEgressRule()
462+
err := nrc.deletePodEgressRule()
462463
if err != nil {
463464
glog.Warningf("Error deleting Pod egress iptable rule: %s", err.Error())
464465
}
465466

466-
err = deleteBadPodEgressRules()
467+
err = nrc.deleteBadPodEgressRules()
467468
if err != nil {
468469
glog.Warningf("Error deleting Pod egress iptable rule: %s", err.Error())
469470
}
470471

471472
// delete all ipsets created by kube-router
472-
ipset, err := utils.NewIPSet(false)
473+
ipset, err := utils.NewIPSet(nrc.isIpv6)
473474
if err != nil {
474475
glog.Errorf("Failed to clean up ipsets: " + err.Error())
475476
}
@@ -535,12 +536,20 @@ func (nrc *NetworkRoutingController) syncNodeIPSets() error {
535536
return nil
536537
}
537538

539+
func (nrc *NetworkRoutingController) newIptablesCmdHandler() (*iptables.IPTables, error) {
540+
if nrc.isIpv6 {
541+
return iptables.NewWithProtocol(iptables.ProtocolIPv6)
542+
} else {
543+
return iptables.NewWithProtocol(iptables.ProtocolIPv4)
544+
}
545+
}
546+
538547
// ensure there is rule in filter table and FORWARD chain to permit in/out traffic from pods
539548
// this rules will be appended so that any iptable rules for network policies will take
540549
// precedence
541550
func (nrc *NetworkRoutingController) enableForwarding() error {
542551

543-
iptablesCmdHandler, err := iptables.New()
552+
iptablesCmdHandler, _ := nrc.newIptablesCmdHandler()
544553

545554
comment := "allow outbound traffic from pods"
546555
args := []string{"-m", "comment", "--comment", comment, "-i", "kube-bridge", "-j", "ACCEPT"}
@@ -661,7 +670,7 @@ func (nrc *NetworkRoutingController) startBgpServer() error {
661670
}
662671

663672
if ipv6IsEnabled() {
664-
localAddressList = append(localAddressList, "::")
673+
localAddressList = append(localAddressList, "::1")
665674
}
666675

667676
global := &config.Global{
@@ -795,6 +804,21 @@ func NewNetworkRoutingController(clientset kubernetes.Interface,
795804
nrc.disableSrcDstCheck = kubeRouterConfig.DisableSrcDstCheck
796805
nrc.initSrcDstCheckDone = false
797806

807+
nrc.hostnameOverride = kubeRouterConfig.HostnameOverride
808+
node, err := utils.GetNodeObject(clientset, nrc.hostnameOverride)
809+
if err != nil {
810+
return nil, errors.New("Failed getting node object from API server: " + err.Error())
811+
}
812+
813+
nrc.nodeName = node.Name
814+
815+
nodeIP, err := utils.GetNodeIP(node)
816+
if err != nil {
817+
return nil, errors.New("Failed getting IP address from node object: " + err.Error())
818+
}
819+
nrc.nodeIP = nodeIP
820+
nrc.isIpv6 = nodeIP.To4() == nil
821+
798822
// lets start with assumption we hace necessary IAM creds to access EC2 api
799823
nrc.ec2IamAuthorized = true
800824

@@ -808,7 +832,7 @@ func NewNetworkRoutingController(clientset kubernetes.Interface,
808832
}
809833
}
810834

811-
nrc.ipSetHandler, err = utils.NewIPSet(false)
835+
nrc.ipSetHandler, err = utils.NewIPSet(nrc.isIpv6)
812836
if err != nil {
813837
return nil, err
814838
}
@@ -872,20 +896,6 @@ func NewNetworkRoutingController(clientset kubernetes.Interface,
872896
return nil, fmt.Errorf("Error processing Global Peer Router configs: %s", err)
873897
}
874898

875-
nrc.hostnameOverride = kubeRouterConfig.HostnameOverride
876-
node, err := utils.GetNodeObject(clientset, nrc.hostnameOverride)
877-
if err != nil {
878-
return nil, errors.New("Failed getting node object from API server: " + err.Error())
879-
}
880-
881-
nrc.nodeName = node.Name
882-
883-
nodeIP, err := utils.GetNodeIP(node)
884-
if err != nil {
885-
return nil, errors.New("Failed getting IP address from node object: " + err.Error())
886-
}
887-
nrc.nodeIP = nodeIP
888-
889899
nrc.nodeSubnet, nrc.nodeInterface, err = getNodeSubnet(nodeIP)
890900
if err != nil {
891901
return nil, errors.New("Failed find the subnet of the node IP and interface on" +

pkg/controllers/routing/pod_egress.go

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,38 @@ import (
44
"errors"
55
"fmt"
66

7-
"github.com/coreos/go-iptables/iptables"
87
"github.com/golang/glog"
98
)
109

1110
// set up MASQUERADE rule so that egress traffic from the pods gets masquraded to node's IP
1211

1312
var (
14-
podEgressArgs = []string{"-m", "set", "--match-set", podSubnetsIPSetName, "src",
13+
podEgressArgs4 = []string{"-m", "set", "--match-set", podSubnetsIPSetName, "src",
1514
"-m", "set", "!", "--match-set", podSubnetsIPSetName, "dst",
1615
"-m", "set", "!", "--match-set", nodeAddrsIPSetName, "dst",
1716
"-j", "MASQUERADE"}
18-
podEgressArgsBad = [][]string{{"-m", "set", "--match-set", podSubnetsIPSetName, "src",
17+
podEgressArgs6 = []string{"-m", "set", "--match-set", "inet6:" + podSubnetsIPSetName, "src",
18+
"-m", "set", "!", "--match-set", "inet6:" + podSubnetsIPSetName, "dst",
19+
"-m", "set", "!", "--match-set", "inet6:" + nodeAddrsIPSetName, "dst",
20+
"-j", "MASQUERADE"}
21+
podEgressArgsBad4 = [][]string{{"-m", "set", "--match-set", podSubnetsIPSetName, "src",
1922
"-m", "set", "!", "--match-set", podSubnetsIPSetName, "dst",
2023
"-j", "MASQUERADE"}}
24+
podEgressArgsBad6 = [][]string{{"-m", "set", "--match-set", "inet6:" + podSubnetsIPSetName, "src",
25+
"-m", "set", "!", "--match-set", "inet6:" + podSubnetsIPSetName, "dst",
26+
"-j", "MASQUERADE"}}
2127
)
2228

23-
func createPodEgressRule() error {
24-
iptablesCmdHandler, err := iptables.New()
29+
func (nrc *NetworkRoutingController) createPodEgressRule() error {
30+
iptablesCmdHandler, err := nrc.newIptablesCmdHandler()
2531
if err != nil {
2632
return errors.New("Failed create iptables handler:" + err.Error())
2733
}
2834

35+
podEgressArgs := podEgressArgs4
36+
if nrc.isIpv6 {
37+
podEgressArgs = podEgressArgs6
38+
}
2939
err = iptablesCmdHandler.AppendUnique("nat", "POSTROUTING", podEgressArgs...)
3040
if err != nil {
3141
return errors.New("Failed to add iptable rule to masqurade outbound traffic from pods: " +
@@ -37,12 +47,16 @@ func createPodEgressRule() error {
3747
return nil
3848
}
3949

40-
func deletePodEgressRule() error {
41-
iptablesCmdHandler, err := iptables.New()
50+
func (nrc *NetworkRoutingController) deletePodEgressRule() error {
51+
iptablesCmdHandler, err := nrc.newIptablesCmdHandler()
4252
if err != nil {
4353
return errors.New("Failed create iptables handler:" + err.Error())
4454
}
4555

56+
podEgressArgs := podEgressArgs4
57+
if nrc.isIpv6 {
58+
podEgressArgs = podEgressArgs6
59+
}
4660
exists, err := iptablesCmdHandler.Exists("nat", "POSTROUTING", podEgressArgs...)
4761
if err != nil {
4862
return errors.New("Failed to lookup iptable rule to masqurade outbound traffic from pods: " + err.Error())
@@ -60,12 +74,15 @@ func deletePodEgressRule() error {
6074
return nil
6175
}
6276

63-
func deleteBadPodEgressRules() error {
64-
iptablesCmdHandler, err := iptables.New()
77+
func (nrc *NetworkRoutingController) deleteBadPodEgressRules() error {
78+
iptablesCmdHandler, err := nrc.newIptablesCmdHandler()
6579
if err != nil {
6680
return errors.New("Failed create iptables handler:" + err.Error())
6781
}
68-
82+
podEgressArgsBad := podEgressArgsBad4
83+
if nrc.isIpv6 {
84+
podEgressArgsBad = podEgressArgsBad6
85+
}
6986
for _, args := range podEgressArgsBad {
7087
exists, err := iptablesCmdHandler.Exists("nat", "POSTROUTING", args...)
7188
if err != nil {

pkg/controllers/routing/utils.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ func getNodeSubnet(nodeIp net.IP) (net.IPNet, string, error) {
9898
return net.IPNet{}, "", errors.New("Failed to get list of links")
9999
}
100100
for _, link := range links {
101-
addresses, err := netlink.AddrList(link, netlink.FAMILY_V4)
101+
addresses, err := netlink.AddrList(link, netlink.FAMILY_ALL)
102102
if err != nil {
103103
return net.IPNet{}, "", errors.New("Failed to get list of addr")
104104
}

pkg/utils/ipset.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,8 @@ func (set *Set) Swap(setTo *Set) error {
440440
// Refresh a Set with new entries.
441441
func (set *Set) Refresh(entries []string, extraOptions ...string) error {
442442
var err error
443-
tempName := set.Name + "-temp"
443+
// The set-name must be < 32 characters!
444+
tempName := set.Name + "-"
444445

445446
newSet := &Set{
446447
Parent: set.Parent,

0 commit comments

Comments
 (0)