diff --git a/pkg/proxy/ipvs/proxier.go b/pkg/proxy/ipvs/proxier.go index 21b5048663a..94208533b4a 100644 --- a/pkg/proxy/ipvs/proxier.go +++ b/pkg/proxy/ipvs/proxier.go @@ -23,7 +23,9 @@ package ipvs import ( "bytes" "fmt" + "io/ioutil" "net" + "regexp" "strconv" "strings" "sync" @@ -412,6 +414,25 @@ func NewLinuxKernelHandler() *LinuxKernelHandler { // GetModules returns all installed kernel modules. func (handle *LinuxKernelHandler) GetModules() ([]string, error) { + // Check whether IPVS required kernel modules are built-in + kernelVersionFile := "/proc/sys/kernel/osrelease" + b, err := ioutil.ReadFile(kernelVersionFile) + if err != nil { + glog.Errorf("Failed to read file %s with error %v", kernelVersionFile, err) + } + kernelVersion := strings.TrimSpace(string(b)) + builtinModsFilePath := fmt.Sprintf("/lib/modules/%s/modules.builtin", kernelVersion) + b, err = ioutil.ReadFile(builtinModsFilePath) + if err != nil { + glog.Errorf("Failed to read file %s with error %v", builtinModsFilePath, err) + } + var bmods []string + for _, module := range ipvsModules { + if match, _ := regexp.Match(module+".ko", b); match { + bmods = append(bmods, module) + } + } + // Try to load IPVS required kernel modules using modprobe first for _, kmod := range ipvsModules { err := handle.executor.Command("modprobe", "--", kmod).Run() @@ -428,7 +449,7 @@ func (handle *LinuxKernelHandler) GetModules() ([]string, error) { } mods := strings.Split(string(out), "\n") - return mods, nil + return append(mods, bmods...), nil } // CanUseIPVSProxier returns true if we can use the ipvs Proxier.