diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index a6695f4767f..0355438c48a 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -1798,6 +1798,9 @@ func (kl *Kubelet) syncPod(pod *api.Pod, mirrorPod *api.Pod, podStatus *kubecont return err } + if !kl.shapingEnabled() { + return nil + } ingress, egress, err := extractBandwidthResources(pod) if err != nil { return err @@ -2734,11 +2737,14 @@ func (kl *Kubelet) reconcileCBR0(podCIDR string) error { if err := ensureCbr0(cidr, kl.hairpinMode == componentconfig.PromiscuousBridge, kl.babysitDaemons); err != nil { return err } - if kl.shaper == nil { - glog.V(5).Info("Shaper is nil, creating") - kl.shaper = bandwidth.NewTCShaper("cbr0") + if kl.shapingEnabled() { + if kl.shaper == nil { + glog.V(5).Info("Shaper is nil, creating") + kl.shaper = bandwidth.NewTCShaper("cbr0") + } + return kl.shaper.ReconcileInterface() } - return kl.shaper.ReconcileInterface() + return nil } // updateNodeStatus updates node status to master with retries. @@ -3594,6 +3600,15 @@ func (kl *Kubelet) updatePodCIDR(cidr string) { kl.networkPlugin.Event(network.NET_PLUGIN_EVENT_POD_CIDR_CHANGE, details) } } + +func (kl *Kubelet) shapingEnabled() bool { + // Disable shaping if a network plugin is defined and supports shaping + if kl.networkPlugin != nil && kl.networkPlugin.Capabilities().Has(network.NET_PLUGIN_CAPABILITY_SHAPING) { + return false + } + return true +} + func (kl *Kubelet) GetNodeConfig() cm.NodeConfig { return kl.containerManager.GetNodeConfig() } diff --git a/pkg/kubelet/network/cni/cni.go b/pkg/kubelet/network/cni/cni.go index 584baeed490..03edbbaf6eb 100644 --- a/pkg/kubelet/network/cni/cni.go +++ b/pkg/kubelet/network/cni/cni.go @@ -38,6 +38,8 @@ const ( ) type cniNetworkPlugin struct { + network.NoopNetworkPlugin + defaultNetwork *cniNetwork host network.Host } @@ -96,9 +98,6 @@ func (plugin *cniNetworkPlugin) Init(host network.Host) error { return nil } -func (plugin *cniNetworkPlugin) Event(name string, details map[string]interface{}) { -} - func (plugin *cniNetworkPlugin) Name() string { return CNIPluginName } diff --git a/pkg/kubelet/network/exec/exec.go b/pkg/kubelet/network/exec/exec.go index 52d895d9962..24e8478400a 100644 --- a/pkg/kubelet/network/exec/exec.go +++ b/pkg/kubelet/network/exec/exec.go @@ -72,6 +72,8 @@ import ( ) type execNetworkPlugin struct { + network.NoopNetworkPlugin + execName string execPath string host network.Host @@ -120,9 +122,6 @@ func (plugin *execNetworkPlugin) getExecutable() string { return path.Join(plugin.execPath, execName) } -func (plugin *execNetworkPlugin) Event(name string, details map[string]interface{}) { -} - func (plugin *execNetworkPlugin) Name() string { return plugin.execName } diff --git a/pkg/kubelet/network/kubenet/kubenet_linux.go b/pkg/kubelet/network/kubenet/kubenet_linux.go index 92826d036e5..c601d382c21 100644 --- a/pkg/kubelet/network/kubenet/kubenet_linux.go +++ b/pkg/kubelet/network/kubenet/kubenet_linux.go @@ -41,6 +41,8 @@ const ( ) type kubenetNetworkPlugin struct { + network.NoopNetworkPlugin + host network.Host netConfig *libcni.NetworkConfig cniConfig *libcni.CNIConfig diff --git a/pkg/kubelet/network/kubenet/kubenet_unsupported.go b/pkg/kubelet/network/kubenet/kubenet_unsupported.go index 751db291370..05ef445e076 100644 --- a/pkg/kubelet/network/kubenet/kubenet_unsupported.go +++ b/pkg/kubelet/network/kubenet/kubenet_unsupported.go @@ -26,6 +26,7 @@ import ( ) type kubenetNetworkPlugin struct { + network.NoopNetworkPlugin } func NewPlugin() network.NetworkPlugin { @@ -35,8 +36,6 @@ func NewPlugin() network.NetworkPlugin { func (plugin *kubenetNetworkPlugin) Init(host network.Host) error { return fmt.Errorf("Kubenet is not supported in this build") } -func (plugin *kubenetNetworkPlugin) Event(name string, details map[string]interface{}) { -} func (plugin *kubenetNetworkPlugin) Name() string { return "kubenet" diff --git a/pkg/kubelet/network/plugins.go b/pkg/kubelet/network/plugins.go index dc56d9caee4..64cfd03c1a3 100644 --- a/pkg/kubelet/network/plugins.go +++ b/pkg/kubelet/network/plugins.go @@ -29,6 +29,7 @@ import ( kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" utilerrors "k8s.io/kubernetes/pkg/util/errors" utilexec "k8s.io/kubernetes/pkg/util/exec" + utilsets "k8s.io/kubernetes/pkg/util/sets" utilsysctl "k8s.io/kubernetes/pkg/util/sysctl" "k8s.io/kubernetes/pkg/util/validation" ) @@ -40,6 +41,12 @@ const DefaultPluginName = "kubernetes.io/no-op" const NET_PLUGIN_EVENT_POD_CIDR_CHANGE = "pod-cidr-change" const NET_PLUGIN_EVENT_POD_CIDR_CHANGE_DETAIL_CIDR = "pod-cidr" +// Plugin capabilities +const ( + // Indicates the plugin handles Kubernetes bandwidth shaping annotations internally + NET_PLUGIN_CAPABILITY_SHAPING int = 1 +) + // Plugin is an interface to network plugins for the kubelet type NetworkPlugin interface { // Init initializes the plugin. This will be called exactly once @@ -54,6 +61,9 @@ type NetworkPlugin interface { // for a plugin by name, e.g. Name() string + // Returns a set of NET_PLUGIN_CAPABILITY_* + Capabilities() utilsets.Int + // SetUpPod is the method called after the infra container of // the pod has been created but before the other containers of the // pod are launched. @@ -94,7 +104,7 @@ type Host interface { func InitNetworkPlugin(plugins []NetworkPlugin, networkPluginName string, host Host) (NetworkPlugin, error) { if networkPluginName == "" { // default to the no_op plugin - plug := &noopNetworkPlugin{} + plug := &NoopNetworkPlugin{} if err := plug.Init(host); err != nil { return nil, err } @@ -137,12 +147,12 @@ func UnescapePluginName(in string) string { return strings.Replace(in, "~", "/", -1) } -type noopNetworkPlugin struct { +type NoopNetworkPlugin struct { } const sysctlBridgeCallIptables = "net/bridge/bridge-nf-call-iptables" -func (plugin *noopNetworkPlugin) Init(host Host) error { +func (plugin *NoopNetworkPlugin) Init(host Host) error { // Set bridge-nf-call-iptables=1 to maintain compatibility with older // kubernetes versions to ensure the iptables-based kube proxy functions // correctly. Other plugins are responsible for setting this correctly @@ -159,21 +169,25 @@ func (plugin *noopNetworkPlugin) Init(host Host) error { return nil } -func (plugin *noopNetworkPlugin) Event(name string, details map[string]interface{}) { +func (plugin *NoopNetworkPlugin) Event(name string, details map[string]interface{}) { } -func (plugin *noopNetworkPlugin) Name() string { +func (plugin *NoopNetworkPlugin) Name() string { return DefaultPluginName } -func (plugin *noopNetworkPlugin) SetUpPod(namespace string, name string, id kubecontainer.DockerID) error { +func (plugin *NoopNetworkPlugin) Capabilities() utilsets.Int { + return utilsets.NewInt() +} + +func (plugin *NoopNetworkPlugin) SetUpPod(namespace string, name string, id kubecontainer.DockerID) error { return nil } -func (plugin *noopNetworkPlugin) TearDownPod(namespace string, name string, id kubecontainer.DockerID) error { +func (plugin *NoopNetworkPlugin) TearDownPod(namespace string, name string, id kubecontainer.DockerID) error { return nil } -func (plugin *noopNetworkPlugin) Status(namespace string, name string, id kubecontainer.DockerID) (*PodNetworkStatus, error) { +func (plugin *NoopNetworkPlugin) Status(namespace string, name string, id kubecontainer.DockerID) (*PodNetworkStatus, error) { return nil, nil }