mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 12:18:16 +00:00 
			
		
		
		
	kubenet: set bridge promiscuous mode based on hairpinMode
Closes: https://github.com/kubernetes/kubernetes/issues/23657 Closes: https://github.com/kubernetes/kubernetes/issues/20475
This commit is contained in:
		@@ -32,6 +32,7 @@ import (
 | 
				
			|||||||
	cadvisorapi "github.com/google/cadvisor/info/v1"
 | 
						cadvisorapi "github.com/google/cadvisor/info/v1"
 | 
				
			||||||
	"k8s.io/kubernetes/cmd/kubelet/app/options"
 | 
						"k8s.io/kubernetes/cmd/kubelet/app/options"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api"
 | 
						"k8s.io/kubernetes/pkg/api"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/apis/componentconfig"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/client/record"
 | 
						"k8s.io/kubernetes/pkg/client/record"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/credentialprovider"
 | 
						"k8s.io/kubernetes/pkg/credentialprovider"
 | 
				
			||||||
	kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
 | 
						kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
 | 
				
			||||||
@@ -650,7 +651,7 @@ func TestFindContainersByPod(t *testing.T) {
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	fakeClient := NewFakeDockerClient()
 | 
						fakeClient := NewFakeDockerClient()
 | 
				
			||||||
	np, _ := network.InitNetworkPlugin([]network.NetworkPlugin{}, "", nettest.NewFakeHost(nil))
 | 
						np, _ := network.InitNetworkPlugin([]network.NetworkPlugin{}, "", nettest.NewFakeHost(nil), componentconfig.HairpinNone)
 | 
				
			||||||
	// image back-off is set to nil, this test should not pull images
 | 
						// image back-off is set to nil, this test should not pull images
 | 
				
			||||||
	containerManager := NewFakeDockerManager(fakeClient, &record.FakeRecorder{}, nil, nil, &cadvisorapi.MachineInfo{}, options.GetDefaultPodInfraContainerImage(), 0, 0, "", containertest.FakeOS{}, np, nil, nil, nil)
 | 
						containerManager := NewFakeDockerManager(fakeClient, &record.FakeRecorder{}, nil, nil, &cadvisorapi.MachineInfo{}, options.GetDefaultPodInfraContainerImage(), 0, 0, "", containertest.FakeOS{}, np, nil, nil, nil)
 | 
				
			||||||
	for i, test := range tests {
 | 
						for i, test := range tests {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,6 +37,7 @@ import (
 | 
				
			|||||||
	"k8s.io/kubernetes/cmd/kubelet/app/options"
 | 
						"k8s.io/kubernetes/cmd/kubelet/app/options"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api"
 | 
						"k8s.io/kubernetes/pkg/api"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/testapi"
 | 
						"k8s.io/kubernetes/pkg/api/testapi"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/apis/componentconfig"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/client/record"
 | 
						"k8s.io/kubernetes/pkg/client/record"
 | 
				
			||||||
	kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
 | 
						kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
 | 
				
			||||||
	containertest "k8s.io/kubernetes/pkg/kubelet/container/testing"
 | 
						containertest "k8s.io/kubernetes/pkg/kubelet/container/testing"
 | 
				
			||||||
@@ -105,7 +106,7 @@ func createTestDockerManager(fakeHTTPClient *fakeHTTP, fakeDocker *FakeDockerCli
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	fakeRecorder := &record.FakeRecorder{}
 | 
						fakeRecorder := &record.FakeRecorder{}
 | 
				
			||||||
	containerRefManager := kubecontainer.NewRefManager()
 | 
						containerRefManager := kubecontainer.NewRefManager()
 | 
				
			||||||
	networkPlugin, _ := network.InitNetworkPlugin([]network.NetworkPlugin{}, "", nettest.NewFakeHost(nil))
 | 
						networkPlugin, _ := network.InitNetworkPlugin([]network.NetworkPlugin{}, "", nettest.NewFakeHost(nil), componentconfig.HairpinNone)
 | 
				
			||||||
	dockerManager := NewFakeDockerManager(
 | 
						dockerManager := NewFakeDockerManager(
 | 
				
			||||||
		fakeDocker,
 | 
							fakeDocker,
 | 
				
			||||||
		fakeRecorder,
 | 
							fakeRecorder,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -356,7 +356,17 @@ func NewMainKubelet(
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		glog.Infof("Using node IP: %q", klet.nodeIP.String())
 | 
							glog.Infof("Using node IP: %q", klet.nodeIP.String())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if plug, err := network.InitNetworkPlugin(networkPlugins, networkPluginName, &networkHost{klet}); err != nil {
 | 
					
 | 
				
			||||||
 | 
						if mode, err := effectiveHairpinMode(componentconfig.HairpinMode(hairpinMode), containerRuntime, configureCBR0, networkPluginName); err != nil {
 | 
				
			||||||
 | 
							// This is a non-recoverable error. Returning it up the callstack will just
 | 
				
			||||||
 | 
							// lead to retries of the same failure, so just fail hard.
 | 
				
			||||||
 | 
							glog.Fatalf("Invalid hairpin mode: %v", err)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							klet.hairpinMode = mode
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						glog.Infof("Hairpin mode set to %q", klet.hairpinMode)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if plug, err := network.InitNetworkPlugin(networkPlugins, networkPluginName, &networkHost{klet}, klet.hairpinMode); err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		klet.networkPlugin = plug
 | 
							klet.networkPlugin = plug
 | 
				
			||||||
@@ -375,15 +385,6 @@ func NewMainKubelet(
 | 
				
			|||||||
	klet.podCache = kubecontainer.NewCache()
 | 
						klet.podCache = kubecontainer.NewCache()
 | 
				
			||||||
	klet.podManager = kubepod.NewBasicPodManager(kubepod.NewBasicMirrorClient(klet.kubeClient))
 | 
						klet.podManager = kubepod.NewBasicPodManager(kubepod.NewBasicMirrorClient(klet.kubeClient))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if mode, err := effectiveHairpinMode(componentconfig.HairpinMode(hairpinMode), containerRuntime, configureCBR0); err != nil {
 | 
					 | 
				
			||||||
		// This is a non-recoverable error. Returning it up the callstack will just
 | 
					 | 
				
			||||||
		// lead to retries of the same failure, so just fail hard.
 | 
					 | 
				
			||||||
		glog.Fatalf("Invalid hairpin mode: %v", err)
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		klet.hairpinMode = mode
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	glog.Infof("Hairpin mode set to %q", klet.hairpinMode)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Initialize the runtime.
 | 
						// Initialize the runtime.
 | 
				
			||||||
	switch containerRuntime {
 | 
						switch containerRuntime {
 | 
				
			||||||
	case "docker":
 | 
						case "docker":
 | 
				
			||||||
@@ -499,7 +500,7 @@ func NewMainKubelet(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// effectiveHairpinMode determines the effective hairpin mode given the
 | 
					// effectiveHairpinMode determines the effective hairpin mode given the
 | 
				
			||||||
// configured mode, container runtime, and whether cbr0 should be configured.
 | 
					// configured mode, container runtime, and whether cbr0 should be configured.
 | 
				
			||||||
func effectiveHairpinMode(hairpinMode componentconfig.HairpinMode, containerRuntime string, configureCBR0 bool) (componentconfig.HairpinMode, error) {
 | 
					func effectiveHairpinMode(hairpinMode componentconfig.HairpinMode, containerRuntime string, configureCBR0 bool, networkPlugin string) (componentconfig.HairpinMode, error) {
 | 
				
			||||||
	// The hairpin mode setting doesn't matter if:
 | 
						// The hairpin mode setting doesn't matter if:
 | 
				
			||||||
	// - We're not using a bridge network. This is hard to check because we might
 | 
						// - We're not using a bridge network. This is hard to check because we might
 | 
				
			||||||
	//   be using a plugin. It matters if --configure-cbr0=true, and we currently
 | 
						//   be using a plugin. It matters if --configure-cbr0=true, and we currently
 | 
				
			||||||
@@ -514,7 +515,7 @@ func effectiveHairpinMode(hairpinMode componentconfig.HairpinMode, containerRunt
 | 
				
			|||||||
			glog.Warningf("Hairpin mode set to %q but container runtime is %q, ignoring", hairpinMode, containerRuntime)
 | 
								glog.Warningf("Hairpin mode set to %q but container runtime is %q, ignoring", hairpinMode, containerRuntime)
 | 
				
			||||||
			return componentconfig.HairpinNone, nil
 | 
								return componentconfig.HairpinNone, nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if hairpinMode == componentconfig.PromiscuousBridge && !configureCBR0 {
 | 
							if hairpinMode == componentconfig.PromiscuousBridge && !configureCBR0 && networkPlugin != "kubenet" {
 | 
				
			||||||
			// This is not a valid combination.  Users might be using the
 | 
								// This is not a valid combination.  Users might be using the
 | 
				
			||||||
			// default values (from before the hairpin-mode flag existed) and we
 | 
								// default values (from before the hairpin-mode flag existed) and we
 | 
				
			||||||
			// should keep the old behavior.
 | 
								// should keep the old behavior.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,6 +37,7 @@ import (
 | 
				
			|||||||
	"k8s.io/kubernetes/pkg/api/resource"
 | 
						"k8s.io/kubernetes/pkg/api/resource"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/testapi"
 | 
						"k8s.io/kubernetes/pkg/api/testapi"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/unversioned"
 | 
						"k8s.io/kubernetes/pkg/api/unversioned"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/apis/componentconfig"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/capabilities"
 | 
						"k8s.io/kubernetes/pkg/capabilities"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
 | 
						"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/client/record"
 | 
						"k8s.io/kubernetes/pkg/client/record"
 | 
				
			||||||
@@ -128,7 +129,7 @@ func newTestKubelet(t *testing.T) *TestKubelet {
 | 
				
			|||||||
	kubelet.nodeName = testKubeletHostname
 | 
						kubelet.nodeName = testKubeletHostname
 | 
				
			||||||
	kubelet.runtimeState = newRuntimeState(maxWaitForContainerRuntime)
 | 
						kubelet.runtimeState = newRuntimeState(maxWaitForContainerRuntime)
 | 
				
			||||||
	kubelet.runtimeState.setNetworkState(nil)
 | 
						kubelet.runtimeState.setNetworkState(nil)
 | 
				
			||||||
	kubelet.networkPlugin, _ = network.InitNetworkPlugin([]network.NetworkPlugin{}, "", nettest.NewFakeHost(nil))
 | 
						kubelet.networkPlugin, _ = network.InitNetworkPlugin([]network.NetworkPlugin{}, "", nettest.NewFakeHost(nil), componentconfig.HairpinNone)
 | 
				
			||||||
	if tempDir, err := ioutil.TempDir("/tmp", "kubelet_test."); err != nil {
 | 
						if tempDir, err := ioutil.TempDir("/tmp", "kubelet_test."); err != nil {
 | 
				
			||||||
		t.Fatalf("can't make a temp rootdir: %v", err)
 | 
							t.Fatalf("can't make a temp rootdir: %v", err)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,6 +25,7 @@ import (
 | 
				
			|||||||
	"github.com/appc/cni/libcni"
 | 
						"github.com/appc/cni/libcni"
 | 
				
			||||||
	cnitypes "github.com/appc/cni/pkg/types"
 | 
						cnitypes "github.com/appc/cni/pkg/types"
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"github.com/golang/glog"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/apis/componentconfig"
 | 
				
			||||||
	kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
 | 
						kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/kubelet/dockertools"
 | 
						"k8s.io/kubernetes/pkg/kubelet/dockertools"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/kubelet/network"
 | 
						"k8s.io/kubernetes/pkg/kubelet/network"
 | 
				
			||||||
@@ -93,7 +94,7 @@ func getDefaultCNINetwork(pluginDir, vendorCNIDirPrefix string) (*cniNetwork, er
 | 
				
			|||||||
	return nil, fmt.Errorf("No valid networks found in %s", pluginDir)
 | 
						return nil, fmt.Errorf("No valid networks found in %s", pluginDir)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (plugin *cniNetworkPlugin) Init(host network.Host) error {
 | 
					func (plugin *cniNetworkPlugin) Init(host network.Host, hairpinMode componentconfig.HairpinMode) error {
 | 
				
			||||||
	plugin.host = host
 | 
						plugin.host = host
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,6 +34,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"k8s.io/kubernetes/cmd/kubelet/app/options"
 | 
						"k8s.io/kubernetes/cmd/kubelet/app/options"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api"
 | 
						"k8s.io/kubernetes/pkg/api"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/apis/componentconfig"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/client/record"
 | 
						"k8s.io/kubernetes/pkg/client/record"
 | 
				
			||||||
	kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
 | 
						kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
 | 
				
			||||||
	containertest "k8s.io/kubernetes/pkg/kubelet/container/testing"
 | 
						containertest "k8s.io/kubernetes/pkg/kubelet/container/testing"
 | 
				
			||||||
@@ -144,7 +145,7 @@ func newTestDockerManager() (*dockertools.DockerManager, *dockertools.FakeDocker
 | 
				
			|||||||
	fakeDocker := dockertools.NewFakeDockerClient()
 | 
						fakeDocker := dockertools.NewFakeDockerClient()
 | 
				
			||||||
	fakeRecorder := &record.FakeRecorder{}
 | 
						fakeRecorder := &record.FakeRecorder{}
 | 
				
			||||||
	containerRefManager := kubecontainer.NewRefManager()
 | 
						containerRefManager := kubecontainer.NewRefManager()
 | 
				
			||||||
	networkPlugin, _ := network.InitNetworkPlugin([]network.NetworkPlugin{}, "", nettest.NewFakeHost(nil))
 | 
						networkPlugin, _ := network.InitNetworkPlugin([]network.NetworkPlugin{}, "", nettest.NewFakeHost(nil), componentconfig.HairpinNone)
 | 
				
			||||||
	dockerManager := dockertools.NewFakeDockerManager(
 | 
						dockerManager := dockertools.NewFakeDockerManager(
 | 
				
			||||||
		fakeDocker,
 | 
							fakeDocker,
 | 
				
			||||||
		fakeRecorder,
 | 
							fakeRecorder,
 | 
				
			||||||
@@ -174,7 +175,7 @@ func TestCNIPlugin(t *testing.T) {
 | 
				
			|||||||
	installPluginUnderTest(t, testVendorCNIDirPrefix, testNetworkConfigPath, vendorName, pluginName)
 | 
						installPluginUnderTest(t, testVendorCNIDirPrefix, testNetworkConfigPath, vendorName, pluginName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	np := probeNetworkPluginsWithVendorCNIDirPrefix(path.Join(testNetworkConfigPath, pluginName), testVendorCNIDirPrefix)
 | 
						np := probeNetworkPluginsWithVendorCNIDirPrefix(path.Join(testNetworkConfigPath, pluginName), testVendorCNIDirPrefix)
 | 
				
			||||||
	plug, err := network.InitNetworkPlugin(np, "cni", NewFakeHost(nil))
 | 
						plug, err := network.InitNetworkPlugin(np, "cni", NewFakeHost(nil), componentconfig.HairpinNone)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatalf("Failed to select the desired plugin: %v", err)
 | 
							t.Fatalf("Failed to select the desired plugin: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -66,6 +66,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"github.com/golang/glog"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/unversioned"
 | 
						"k8s.io/kubernetes/pkg/api/unversioned"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/apis/componentconfig"
 | 
				
			||||||
	kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
 | 
						kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/kubelet/network"
 | 
						"k8s.io/kubernetes/pkg/kubelet/network"
 | 
				
			||||||
	utilexec "k8s.io/kubernetes/pkg/util/exec"
 | 
						utilexec "k8s.io/kubernetes/pkg/util/exec"
 | 
				
			||||||
@@ -104,7 +105,7 @@ func ProbeNetworkPlugins(pluginDir string) []network.NetworkPlugin {
 | 
				
			|||||||
	return execPlugins
 | 
						return execPlugins
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (plugin *execNetworkPlugin) Init(host network.Host) error {
 | 
					func (plugin *execNetworkPlugin) Init(host network.Host, hairpinMode componentconfig.HairpinMode) error {
 | 
				
			||||||
	err := plugin.validate()
 | 
						err := plugin.validate()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,6 +29,7 @@ import (
 | 
				
			|||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
	"text/template"
 | 
						"text/template"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/apis/componentconfig"
 | 
				
			||||||
	kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
 | 
						kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/kubelet/network"
 | 
						"k8s.io/kubernetes/pkg/kubelet/network"
 | 
				
			||||||
	nettest "k8s.io/kubernetes/pkg/kubelet/network/testing"
 | 
						nettest "k8s.io/kubernetes/pkg/kubelet/network/testing"
 | 
				
			||||||
@@ -134,7 +135,7 @@ func TestSelectPlugin(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	installPluginUnderTest(t, "", testPluginPath, pluginName, nil)
 | 
						installPluginUnderTest(t, "", testPluginPath, pluginName, nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	plug, err := network.InitNetworkPlugin(ProbeNetworkPlugins(testPluginPath), pluginName, nettest.NewFakeHost(nil))
 | 
						plug, err := network.InitNetworkPlugin(ProbeNetworkPlugins(testPluginPath), pluginName, nettest.NewFakeHost(nil), componentconfig.HairpinNone)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Errorf("Failed to select the desired plugin: %v", err)
 | 
							t.Errorf("Failed to select the desired plugin: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -156,7 +157,7 @@ func TestSelectVendoredPlugin(t *testing.T) {
 | 
				
			|||||||
	installPluginUnderTest(t, vendor, testPluginPath, pluginName, nil)
 | 
						installPluginUnderTest(t, vendor, testPluginPath, pluginName, nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	vendoredPluginName := fmt.Sprintf("%s/%s", vendor, pluginName)
 | 
						vendoredPluginName := fmt.Sprintf("%s/%s", vendor, pluginName)
 | 
				
			||||||
	plug, err := network.InitNetworkPlugin(ProbeNetworkPlugins(testPluginPath), vendoredPluginName, nettest.NewFakeHost(nil))
 | 
						plug, err := network.InitNetworkPlugin(ProbeNetworkPlugins(testPluginPath), vendoredPluginName, nettest.NewFakeHost(nil), componentconfig.HairpinNone)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Errorf("Failed to select the desired plugin: %v", err)
 | 
							t.Errorf("Failed to select the desired plugin: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -177,7 +178,7 @@ func TestSelectWrongPlugin(t *testing.T) {
 | 
				
			|||||||
	installPluginUnderTest(t, "", testPluginPath, pluginName, nil)
 | 
						installPluginUnderTest(t, "", testPluginPath, pluginName, nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wrongPlugin := "abcd"
 | 
						wrongPlugin := "abcd"
 | 
				
			||||||
	plug, err := network.InitNetworkPlugin(ProbeNetworkPlugins(testPluginPath), wrongPlugin, nettest.NewFakeHost(nil))
 | 
						plug, err := network.InitNetworkPlugin(ProbeNetworkPlugins(testPluginPath), wrongPlugin, nettest.NewFakeHost(nil), componentconfig.HairpinNone)
 | 
				
			||||||
	if plug != nil || err == nil {
 | 
						if plug != nil || err == nil {
 | 
				
			||||||
		t.Errorf("Expected to see an error. Wrong plugin selected.")
 | 
							t.Errorf("Expected to see an error. Wrong plugin selected.")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -205,7 +206,7 @@ func TestPluginValidation(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	f.Close()
 | 
						f.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	_, err = network.InitNetworkPlugin(ProbeNetworkPlugins(testPluginPath), pluginName, nettest.NewFakeHost(nil))
 | 
						_, err = network.InitNetworkPlugin(ProbeNetworkPlugins(testPluginPath), pluginName, nettest.NewFakeHost(nil), componentconfig.HairpinNone)
 | 
				
			||||||
	if err == nil {
 | 
						if err == nil {
 | 
				
			||||||
		// we expected an error here because validation would have failed
 | 
							// we expected an error here because validation would have failed
 | 
				
			||||||
		t.Errorf("Expected non-nil value.")
 | 
							t.Errorf("Expected non-nil value.")
 | 
				
			||||||
@@ -223,7 +224,7 @@ func TestPluginSetupHook(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	installPluginUnderTest(t, "", testPluginPath, pluginName, nil)
 | 
						installPluginUnderTest(t, "", testPluginPath, pluginName, nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	plug, err := network.InitNetworkPlugin(ProbeNetworkPlugins(testPluginPath), pluginName, nettest.NewFakeHost(nil))
 | 
						plug, err := network.InitNetworkPlugin(ProbeNetworkPlugins(testPluginPath), pluginName, nettest.NewFakeHost(nil), componentconfig.HairpinNone)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = plug.SetUpPod("podNamespace", "podName", kubecontainer.ContainerID{Type: "docker", ID: "dockerid2345"})
 | 
						err = plug.SetUpPod("podNamespace", "podName", kubecontainer.ContainerID{Type: "docker", ID: "dockerid2345"})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -251,7 +252,7 @@ func TestPluginTearDownHook(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	installPluginUnderTest(t, "", testPluginPath, pluginName, nil)
 | 
						installPluginUnderTest(t, "", testPluginPath, pluginName, nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	plug, err := network.InitNetworkPlugin(ProbeNetworkPlugins(testPluginPath), pluginName, nettest.NewFakeHost(nil))
 | 
						plug, err := network.InitNetworkPlugin(ProbeNetworkPlugins(testPluginPath), pluginName, nettest.NewFakeHost(nil), componentconfig.HairpinNone)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = plug.TearDownPod("podNamespace", "podName", kubecontainer.ContainerID{Type: "docker", ID: "dockerid2345"})
 | 
						err = plug.TearDownPod("podNamespace", "podName", kubecontainer.ContainerID{Type: "docker", ID: "dockerid2345"})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -279,7 +280,7 @@ func TestPluginStatusHook(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	installPluginUnderTest(t, "", testPluginPath, pluginName, nil)
 | 
						installPluginUnderTest(t, "", testPluginPath, pluginName, nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	plug, err := network.InitNetworkPlugin(ProbeNetworkPlugins(testPluginPath), pluginName, nettest.NewFakeHost(nil))
 | 
						plug, err := network.InitNetworkPlugin(ProbeNetworkPlugins(testPluginPath), pluginName, nettest.NewFakeHost(nil), componentconfig.HairpinNone)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ip, err := plug.GetPodNetworkStatus("namespace", "name", kubecontainer.ContainerID{Type: "docker", ID: "dockerid2345"})
 | 
						ip, err := plug.GetPodNetworkStatus("namespace", "name", kubecontainer.ContainerID{Type: "docker", ID: "dockerid2345"})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -315,7 +316,7 @@ func TestPluginStatusHookIPv6(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	installPluginUnderTest(t, "", testPluginPath, pluginName, execTemplate)
 | 
						installPluginUnderTest(t, "", testPluginPath, pluginName, execTemplate)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	plug, err := network.InitNetworkPlugin(ProbeNetworkPlugins(testPluginPath), pluginName, nettest.NewFakeHost(nil))
 | 
						plug, err := network.InitNetworkPlugin(ProbeNetworkPlugins(testPluginPath), pluginName, nettest.NewFakeHost(nil), componentconfig.HairpinNone)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Errorf("InitNetworkPlugin() failed: %v", err)
 | 
							t.Errorf("InitNetworkPlugin() failed: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,6 +22,7 @@ import (
 | 
				
			|||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"syscall"
 | 
						"syscall"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
@@ -31,6 +32,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"github.com/appc/cni/libcni"
 | 
						"github.com/appc/cni/libcni"
 | 
				
			||||||
	"github.com/golang/glog"
 | 
						"github.com/golang/glog"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/apis/componentconfig"
 | 
				
			||||||
	kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
 | 
						kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/kubelet/dockertools"
 | 
						"k8s.io/kubernetes/pkg/kubelet/dockertools"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/kubelet/network"
 | 
						"k8s.io/kubernetes/pkg/kubelet/network"
 | 
				
			||||||
@@ -38,7 +40,6 @@ import (
 | 
				
			|||||||
	utilexec "k8s.io/kubernetes/pkg/util/exec"
 | 
						utilexec "k8s.io/kubernetes/pkg/util/exec"
 | 
				
			||||||
	utilsets "k8s.io/kubernetes/pkg/util/sets"
 | 
						utilsets "k8s.io/kubernetes/pkg/util/sets"
 | 
				
			||||||
	utilsysctl "k8s.io/kubernetes/pkg/util/sysctl"
 | 
						utilsysctl "k8s.io/kubernetes/pkg/util/sysctl"
 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -61,6 +62,7 @@ type kubenetNetworkPlugin struct {
 | 
				
			|||||||
	mu          sync.Mutex //Mutex for protecting podCIDRs map and netConfig
 | 
						mu          sync.Mutex //Mutex for protecting podCIDRs map and netConfig
 | 
				
			||||||
	execer      utilexec.Interface
 | 
						execer      utilexec.Interface
 | 
				
			||||||
	nsenterPath string
 | 
						nsenterPath string
 | 
				
			||||||
 | 
						hairpinMode componentconfig.HairpinMode
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewPlugin() network.NetworkPlugin {
 | 
					func NewPlugin() network.NetworkPlugin {
 | 
				
			||||||
@@ -71,8 +73,9 @@ func NewPlugin() network.NetworkPlugin {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (plugin *kubenetNetworkPlugin) Init(host network.Host) error {
 | 
					func (plugin *kubenetNetworkPlugin) Init(host network.Host, hairpinMode componentconfig.HairpinMode) error {
 | 
				
			||||||
	plugin.host = host
 | 
						plugin.host = host
 | 
				
			||||||
 | 
						plugin.hairpinMode = hairpinMode
 | 
				
			||||||
	plugin.cniConfig = &libcni.CNIConfig{
 | 
						plugin.cniConfig = &libcni.CNIConfig{
 | 
				
			||||||
		Path: []string{DefaultCNIDir},
 | 
							Path: []string{DefaultCNIDir},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -281,6 +284,19 @@ func (plugin *kubenetNetworkPlugin) SetUpPod(namespace string, name string, id k
 | 
				
			|||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 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 == componentconfig.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)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// The first SetUpPod call creates the bridge; ensure shaping is enabled
 | 
						// The first SetUpPod call creates the bridge; ensure shaping is enabled
 | 
				
			||||||
	if plugin.shaper == nil {
 | 
						if plugin.shaper == nil {
 | 
				
			||||||
		plugin.shaper = bandwidth.NewTCShaper(BridgeName)
 | 
							plugin.shaper = bandwidth.NewTCShaper(BridgeName)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,6 +21,7 @@ package kubenet
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/apis/componentconfig"
 | 
				
			||||||
	kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
 | 
						kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/kubelet/network"
 | 
						"k8s.io/kubernetes/pkg/kubelet/network"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -33,7 +34,7 @@ func NewPlugin() network.NetworkPlugin {
 | 
				
			|||||||
	return &kubenetNetworkPlugin{}
 | 
						return &kubenetNetworkPlugin{}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (plugin *kubenetNetworkPlugin) Init(host network.Host) error {
 | 
					func (plugin *kubenetNetworkPlugin) Init(host network.Host, hairpinMode componentconfig.HairpinMode) error {
 | 
				
			||||||
	return fmt.Errorf("Kubenet is not supported in this build")
 | 
						return fmt.Errorf("Kubenet is not supported in this build")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,6 +26,7 @@ import (
 | 
				
			|||||||
	"github.com/golang/glog"
 | 
						"github.com/golang/glog"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api"
 | 
						"k8s.io/kubernetes/pkg/api"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/unversioned"
 | 
						"k8s.io/kubernetes/pkg/api/unversioned"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/apis/componentconfig"
 | 
				
			||||||
	kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
 | 
						kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
 | 
				
			||||||
	utilerrors "k8s.io/kubernetes/pkg/util/errors"
 | 
						utilerrors "k8s.io/kubernetes/pkg/util/errors"
 | 
				
			||||||
	utilexec "k8s.io/kubernetes/pkg/util/exec"
 | 
						utilexec "k8s.io/kubernetes/pkg/util/exec"
 | 
				
			||||||
@@ -51,7 +52,7 @@ const (
 | 
				
			|||||||
type NetworkPlugin interface {
 | 
					type NetworkPlugin interface {
 | 
				
			||||||
	// Init initializes the plugin.  This will be called exactly once
 | 
						// Init initializes the plugin.  This will be called exactly once
 | 
				
			||||||
	// before any other methods are called.
 | 
						// before any other methods are called.
 | 
				
			||||||
	Init(host Host) error
 | 
						Init(host Host, hairpinMode componentconfig.HairpinMode) error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Called on various events like:
 | 
						// Called on various events like:
 | 
				
			||||||
	// NET_PLUGIN_EVENT_POD_CIDR_CHANGE
 | 
						// NET_PLUGIN_EVENT_POD_CIDR_CHANGE
 | 
				
			||||||
@@ -104,11 +105,11 @@ type Host interface {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// InitNetworkPlugin inits the plugin that matches networkPluginName. Plugins must have unique names.
 | 
					// InitNetworkPlugin inits the plugin that matches networkPluginName. Plugins must have unique names.
 | 
				
			||||||
func InitNetworkPlugin(plugins []NetworkPlugin, networkPluginName string, host Host) (NetworkPlugin, error) {
 | 
					func InitNetworkPlugin(plugins []NetworkPlugin, networkPluginName string, host Host, hairpinMode componentconfig.HairpinMode) (NetworkPlugin, error) {
 | 
				
			||||||
	if networkPluginName == "" {
 | 
						if networkPluginName == "" {
 | 
				
			||||||
		// default to the no_op plugin
 | 
							// default to the no_op plugin
 | 
				
			||||||
		plug := &NoopNetworkPlugin{}
 | 
							plug := &NoopNetworkPlugin{}
 | 
				
			||||||
		if err := plug.Init(host); err != nil {
 | 
							if err := plug.Init(host, hairpinMode); err != nil {
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return plug, nil
 | 
							return plug, nil
 | 
				
			||||||
@@ -133,7 +134,7 @@ func InitNetworkPlugin(plugins []NetworkPlugin, networkPluginName string, host H
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	chosenPlugin := pluginMap[networkPluginName]
 | 
						chosenPlugin := pluginMap[networkPluginName]
 | 
				
			||||||
	if chosenPlugin != nil {
 | 
						if chosenPlugin != nil {
 | 
				
			||||||
		err := chosenPlugin.Init(host)
 | 
							err := chosenPlugin.Init(host, hairpinMode)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			allErrs = append(allErrs, fmt.Errorf("Network plugin %q failed init: %v", networkPluginName, err))
 | 
								allErrs = append(allErrs, fmt.Errorf("Network plugin %q failed init: %v", networkPluginName, err))
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
@@ -155,7 +156,7 @@ type NoopNetworkPlugin struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
const sysctlBridgeCallIptables = "net/bridge/bridge-nf-call-iptables"
 | 
					const sysctlBridgeCallIptables = "net/bridge/bridge-nf-call-iptables"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (plugin *NoopNetworkPlugin) Init(host Host) error {
 | 
					func (plugin *NoopNetworkPlugin) Init(host Host, hairpinMode componentconfig.HairpinMode) error {
 | 
				
			||||||
	// Set bridge-nf-call-iptables=1 to maintain compatibility with older
 | 
						// Set bridge-nf-call-iptables=1 to maintain compatibility with older
 | 
				
			||||||
	// kubernetes versions to ensure the iptables-based kube proxy functions
 | 
						// kubernetes versions to ensure the iptables-based kube proxy functions
 | 
				
			||||||
	// correctly.  Other plugins are responsible for setting this correctly
 | 
						// correctly.  Other plugins are responsible for setting this correctly
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,12 +19,13 @@ package network
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/apis/componentconfig"
 | 
				
			||||||
	nettest "k8s.io/kubernetes/pkg/kubelet/network/testing"
 | 
						nettest "k8s.io/kubernetes/pkg/kubelet/network/testing"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestSelectDefaultPlugin(t *testing.T) {
 | 
					func TestSelectDefaultPlugin(t *testing.T) {
 | 
				
			||||||
	all_plugins := []NetworkPlugin{}
 | 
						all_plugins := []NetworkPlugin{}
 | 
				
			||||||
	plug, err := InitNetworkPlugin(all_plugins, "", nettest.NewFakeHost(nil))
 | 
						plug, err := InitNetworkPlugin(all_plugins, "", nettest.NewFakeHost(nil), componentconfig.HairpinNone)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatalf("Unexpected error in selecting default plugin: %v", err)
 | 
							t.Fatalf("Unexpected error in selecting default plugin: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,6 +24,7 @@ import (
 | 
				
			|||||||
	cadvisorapi "github.com/google/cadvisor/info/v1"
 | 
						cadvisorapi "github.com/google/cadvisor/info/v1"
 | 
				
			||||||
	cadvisorapiv2 "github.com/google/cadvisor/info/v2"
 | 
						cadvisorapiv2 "github.com/google/cadvisor/info/v2"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api"
 | 
						"k8s.io/kubernetes/pkg/api"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/apis/componentconfig"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
 | 
						"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/client/record"
 | 
						"k8s.io/kubernetes/pkg/client/record"
 | 
				
			||||||
	cadvisortest "k8s.io/kubernetes/pkg/kubelet/cadvisor/testing"
 | 
						cadvisortest "k8s.io/kubernetes/pkg/kubelet/cadvisor/testing"
 | 
				
			||||||
@@ -78,7 +79,7 @@ func TestRunOnce(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	kb.containerManager = cm.NewStubContainerManager()
 | 
						kb.containerManager = cm.NewStubContainerManager()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	kb.networkPlugin, _ = network.InitNetworkPlugin([]network.NetworkPlugin{}, "", nettest.NewFakeHost(nil))
 | 
						kb.networkPlugin, _ = network.InitNetworkPlugin([]network.NetworkPlugin{}, "", nettest.NewFakeHost(nil), componentconfig.HairpinNone)
 | 
				
			||||||
	if err := kb.setupDataDirs(); err != nil {
 | 
						if err := kb.setupDataDirs(); err != nil {
 | 
				
			||||||
		t.Errorf("Failed to init data dirs: %v", err)
 | 
							t.Errorf("Failed to init data dirs: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user