Skip to content

Commit 7a6ed5e

Browse files
committed
Allow egress-router to connect to its node's IP, via the SDN
1 parent e9277a4 commit 7a6ed5e

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

images/egress/router/egress-router.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ function gen_iptables_rules() {
106106
fi
107107
fi
108108
done <<< "${EGRESS_DESTINATION}"
109-
echo -A POSTROUTING -j SNAT --to-source "${EGRESS_SOURCE}"
109+
echo -A POSTROUTING -o macvlan0 -j SNAT --to-source "${EGRESS_SOURCE}"
110110
}
111111

112112
function setup_iptables() {

pkg/network/sdn-cni-plugin/openshift-sdn.go

+30-1
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ func (p *cniPlugin) CmdAdd(args *skel.CmdArgs) error {
146146
if err != nil {
147147
return fmt.Errorf("failed to convert IPAM result: %v", err)
148148
}
149+
defaultGW := result020.IP4.Gateway
149150
result020.IP4.Gateway = nil
150151

151152
result030, err := current.NewResultFromResult(result020)
@@ -164,7 +165,7 @@ func (p *cniPlugin) CmdAdd(args *skel.CmdArgs) error {
164165
}
165166
result030.IPs[0].Interface = current.Int(0)
166167

167-
err = ns.WithNetNSPath(args.Netns, func(ns.NetNS) error {
168+
err = ns.WithNetNSPath(args.Netns, func(hostNS ns.NetNS) error {
168169
// Set up eth0
169170
if err := ip.SetHWAddrByIP(args.IfName, result030.IPs[0].Address.IP, nil); err != nil {
170171
return fmt.Errorf("failed to set pod interface MAC address: %v", err)
@@ -186,9 +187,37 @@ func (p *cniPlugin) CmdAdd(args *skel.CmdArgs) error {
186187
link, err = netlink.LinkByName("macvlan0")
187188
if err == nil {
188189
err = netlink.LinkSetUp(link)
190+
if err != nil {
191+
return fmt.Errorf("failed to enable macvlan device: %v", err)
192+
}
193+
194+
// A macvlan can't reach its parent interface's IP, so we need to
195+
// add a route to that via the SDN
196+
var addrs []netlink.Addr
197+
err = hostNS.Do(func(ns.NetNS) error {
198+
parent, err := netlink.LinkByIndex(link.Attrs().ParentIndex)
199+
if err != nil {
200+
return err
201+
}
202+
addrs, err = netlink.AddrList(parent, netlink.FAMILY_V4)
203+
return err
204+
})
189205
if err != nil {
190206
return fmt.Errorf("failed to configure macvlan device: %v", err)
191207
}
208+
for _, addr := range addrs {
209+
route := &netlink.Route{
210+
Dst: &net.IPNet{
211+
IP: addr.IP,
212+
Mask: net.CIDRMask(32, 32),
213+
},
214+
Gw: defaultGW,
215+
}
216+
err = netlink.RouteAdd(route)
217+
if err != nil {
218+
return fmt.Errorf("failed to configure macvlan device: %v")
219+
}
220+
}
192221
}
193222

194223
return nil

0 commit comments

Comments
 (0)