diff --git a/docs/feature.md b/docs/feature.md index 650b18e310adda45c53f6ad6ed817eaffd89c2a2..63218319108501d22f01fcc2aa98de91a5f951a1 100644 --- a/docs/feature.md +++ b/docs/feature.md @@ -37,6 +37,11 @@ annotations: insmod /lib/modules/bwm/bwm.ko ``` +#### 约束限制 + - 网络绝对抢占不支持统计主机网络命名空间内的网络带宽。包括: + - 忽略主机进程所使用的网络带宽; + - 忽略与主机共享网络命名空间的容器内部进程所使用的网络带宽(包括kube-proxy容器等); + ## dynCache 内存带宽和LLC限制 rubik支持业务的Pod内存带宽(memory bandwidth)和LLC(Last Level Cache)限制,通过限制离线业务的内存带宽/LLC使用,减少其对在线业务的干扰。 diff --git a/pkg/core/typedef/podinfo.go b/pkg/core/typedef/podinfo.go index bc63962d927fe9b55bbfc9e96b1f36b401601bfd..4af68639468964b8d0beaea7f64567678eba31f4 100644 --- a/pkg/core/typedef/podinfo.go +++ b/pkg/core/typedef/podinfo.go @@ -32,6 +32,7 @@ type PodInfo struct { Labels map[string]string `json:"labels,omitempty"` ID string `json:"id,omitempty"` // id of the sandbox container in pod StartTime *metav1.Time `json:"startTime,omitempty"` + HostNetwork bool `json:"hostNetwork,omitempty"` nriContainerRequest map[string]ResourceMap nriContainerLimit map[string]ResourceMap } @@ -47,6 +48,7 @@ func NewPodInfo(pod *RawPod) *PodInfo { Annotations: pod.DeepCopy().Annotations, Labels: pod.DeepCopy().Labels, StartTime: pod.Status.StartTime, + HostNetwork: pod.Spec.HostNetwork, } } diff --git a/pkg/services/preemption/net.go b/pkg/services/preemption/net.go index 8e4e361a66939c11ec7cd182dc79e5262cf26225..fecd8fb55e43c285f10f3fd5b81ae2f23ace756e 100644 --- a/pkg/services/preemption/net.go +++ b/pkg/services/preemption/net.go @@ -65,20 +65,24 @@ func validateNetResConf(conf *PreemptionConfig) error { return nil } -func enableNetRes(pod *typedef.PodInfo) error { +func enableNetRes(pod *typedef.PodInfo) (bool, error) { var err error var pid string if pid, err = getPodProcID(pod); err != nil { - return fmt.Errorf("failed to get Pod procID %s: %v", pid, err) + return true, fmt.Errorf("failed to get Pod procID %s: %v", pid, err) + } + + if pod.HostNetwork { + return false, nil } if err = enablePodNetqos(pid); err != nil { disablePodNetqos(pid) - return err + return true, err } - return nil + return true, nil } func initNetRes(conf *PreemptionConfig) error { diff --git a/pkg/services/preemption/preemption.go b/pkg/services/preemption/preemption.go index 1dc9190292feaa3935ad30b2ad1f383b658ff559..d40b050587c4e06026a25b7ab59d3537181a5ca3 100644 --- a/pkg/services/preemption/preemption.go +++ b/pkg/services/preemption/preemption.go @@ -32,7 +32,7 @@ type resOpt struct { getQosStr func(int) string validateResConf func(*PreemptionConfig) error initRes func(*PreemptionConfig) error - enableRes func(*typedef.PodInfo) error + enableRes func(*typedef.PodInfo) (bool, error) // Return true to indicate that the res needs to enable qos } var supportCgroupTypes = map[string]resOpt{ @@ -178,7 +178,12 @@ func (q *Preemption) SetQoSLevel(pod *typedef.PodInfo) error { for _, r := range q.config.Resource { resOpt := supportCgroupTypes[r] if resOpt.enableRes != nil { - if err := resOpt.enableRes(pod); err != nil { + needQos, err := resOpt.enableRes(pod) + if !needQos { + log.Infof("ignore pod %s(%s) %s-qos", pod.Name, pod.UID, r) + continue + } + if err != nil { return err } }