mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-13 22:05:59 +00:00
do not touch swap for cgroup v1 if swap not enabled
This commit is contained in:
parent
fa88c0b779
commit
c4bf42199a
@ -20,21 +20,26 @@ limitations under the License.
|
|||||||
package kuberuntime
|
package kuberuntime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
cadvisorv1 "github.com/google/cadvisor/info/v1"
|
|
||||||
kubeapiqos "k8s.io/kubernetes/pkg/apis/core/v1/helper/qos"
|
|
||||||
"math"
|
"math"
|
||||||
"os"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/containerd/cgroups"
|
||||||
|
cadvisorv1 "github.com/google/cadvisor/info/v1"
|
||||||
libcontainercgroups "github.com/opencontainers/runc/libcontainer/cgroups"
|
libcontainercgroups "github.com/opencontainers/runc/libcontainer/cgroups"
|
||||||
|
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/resource"
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1"
|
runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1"
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper"
|
v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper"
|
||||||
|
kubeapiqos "k8s.io/kubernetes/pkg/apis/core/v1/helper/qos"
|
||||||
kubefeatures "k8s.io/kubernetes/pkg/features"
|
kubefeatures "k8s.io/kubernetes/pkg/features"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/cm"
|
"k8s.io/kubernetes/pkg/kubelet/cm"
|
||||||
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
|
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
|
||||||
@ -305,6 +310,36 @@ var isCgroup2UnifiedMode = func() bool {
|
|||||||
return libcontainercgroups.IsCgroup2UnifiedMode()
|
return libcontainercgroups.IsCgroup2UnifiedMode()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
swapControllerAvailability bool
|
||||||
|
swapControllerAvailabilityOnce sync.Once
|
||||||
|
)
|
||||||
|
|
||||||
|
func swapControllerAvailable() bool {
|
||||||
|
// See https://github.com/containerd/containerd/pull/7838/
|
||||||
|
swapControllerAvailabilityOnce.Do(func() {
|
||||||
|
const warn = "Failed to detect the availability of the swap controller, assuming not available"
|
||||||
|
p := "/sys/fs/cgroup/memory/memory.memsw.limit_in_bytes"
|
||||||
|
if libcontainercgroups.IsCgroup2UnifiedMode() {
|
||||||
|
// memory.swap.max does not exist in the cgroup root, so we check /sys/fs/cgroup/<SELF>/memory.swap.max
|
||||||
|
_, unified, err := cgroups.ParseCgroupFileUnified("/proc/self/cgroup")
|
||||||
|
if err != nil {
|
||||||
|
klog.V(5).ErrorS(fmt.Errorf("failed to parse /proc/self/cgroup: %w", err), warn)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
p = filepath.Join("/sys/fs/cgroup", unified, "memory.swap.max")
|
||||||
|
}
|
||||||
|
if _, err := os.Stat(p); err != nil {
|
||||||
|
if !errors.Is(err, os.ErrNotExist) {
|
||||||
|
klog.V(5).ErrorS(err, warn)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
swapControllerAvailability = true
|
||||||
|
})
|
||||||
|
return swapControllerAvailability
|
||||||
|
}
|
||||||
|
|
||||||
type swapConfigurationHelper struct {
|
type swapConfigurationHelper struct {
|
||||||
machineInfo cadvisorv1.MachineInfo
|
machineInfo cadvisorv1.MachineInfo
|
||||||
}
|
}
|
||||||
@ -337,10 +372,12 @@ func (m swapConfigurationHelper) ConfigureLimitedSwap(lcr *runtimeapi.LinuxConta
|
|||||||
|
|
||||||
func (m swapConfigurationHelper) ConfigureNoSwap(lcr *runtimeapi.LinuxContainerResources) {
|
func (m swapConfigurationHelper) ConfigureNoSwap(lcr *runtimeapi.LinuxContainerResources) {
|
||||||
if !isCgroup2UnifiedMode() {
|
if !isCgroup2UnifiedMode() {
|
||||||
|
if swapControllerAvailable() {
|
||||||
// memorySwapLimit = total permitted memory+swap; if equal to memory limit, => 0 swap above memory limit
|
// memorySwapLimit = total permitted memory+swap; if equal to memory limit, => 0 swap above memory limit
|
||||||
// Some swapping is still possible.
|
// Some swapping is still possible.
|
||||||
// Note that if memory limit is 0, memory swap limit is ignored.
|
// Note that if memory limit is 0, memory swap limit is ignored.
|
||||||
lcr.MemorySwapLimitInBytes = lcr.MemoryLimitInBytes
|
lcr.MemorySwapLimitInBytes = lcr.MemoryLimitInBytes
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user