diff --git a/pkg/kubelet/network/kubenet/kubenet_linux.go b/pkg/kubelet/network/kubenet/kubenet_linux.go index 8551946d495..f41c59d843e 100644 --- a/pkg/kubelet/network/kubenet/kubenet_linux.go +++ b/pkg/kubelet/network/kubenet/kubenet_linux.go @@ -334,20 +334,18 @@ func (plugin *kubenetNetworkPlugin) setup(namespace string, name string, id kube // Put the container bridge into promiscuous mode to force it to accept hairpin packets. // TODO: Remove this once the kernel bug (#20096) is fixed. - // TODO: check and set promiscuous mode with netlink once vishvananda/netlink supports it if plugin.hairpinMode == kubeletconfig.PromiscuousBridge { - output, err := plugin.execer.Command("ip", "link", "show", "dev", BridgeName).CombinedOutput() - if err != nil || strings.Index(string(output), "PROMISC") < 0 { - _, err := plugin.execer.Command("ip", "link", "set", BridgeName, "promisc", "on").CombinedOutput() - if err != nil { - return fmt.Errorf("Error setting promiscuous mode on %s: %v", BridgeName, err) - } - } - link, err := netlink.LinkByName(BridgeName) if err != nil { return fmt.Errorf("failed to lookup %q: %v", BridgeName, err) } + if link.Attrs().Promisc != 1 { + // promiscuous mode is not on, then turn it on. + err := netlink.SetPromiscOn(link) + if err != nil { + return fmt.Errorf("Error setting promiscuous mode on %s: %v", BridgeName, err) + } + } // configure the ebtables rules to eliminate duplicate packets by best effort plugin.syncEbtablesDedupRules(link.Attrs().HardwareAddr)