说明

Kubernetes-1.22 版本引入了 alpha 支持,用于在每个节点的基础上为 Kubernetes 工作负载配置交换内存使用。

在之前的版本中,Kubernetes 不支持在 Linux 上使用交换内存,因为当涉及交换时,很难保证和说明 pod 内存利用率。作为 Kubernetes 早期设计的一部分,交换支持被认为是超出范围的,如果在节点上检测到交换,kubelet 将默认无法启动。

但是,有许多用例 可以从支持交换的 Kubernetes 节点中受益,包括提高节点稳定性、更好地支持具有高内存开销但工作集较小的应用程序、使用内存受限设备以及内存灵活性。

因此,在过去的两个版本中,SIG Node 一直在努力收集适当的用例和反馈,并提出一种设计,以受控、可预测的方式向节点添加交换支持,以便 Kubernetes 用户可以执行测试并提供数据以继续构建交换之上的集群功能。节点交换内存支持的 alpha 毕业是我们实现这一目标的第一个里程碑!

如何工作

人们可以设想在节点上使用交换的多种可能方式。为了保持此初始实现的范围可管理,当交换已经在节点上提供并可用时,我们建议 kubelet 应该能够配置为:

  • swap 开启时可以运行。
  • 默认情况下,它将指示容器运行时接口为 Kubernetes 工作负载分配零交换内存。
  • 您可以配置 kubelet 以指定整个节点的 swap 利用率。

节点上的 swap 配置通过 memorySwap KubeletConfiguration 中的暴露给集群管理员 。作为集群管理员,您可以通过设置 memorySwap.swapBehavior 来指定存在交换内存时节点的行为。

这可以通过 memory_swap_limit_in_bytes 向容器运行时接口 (CRI)添加一个字段来实现。kubelet 的配置将控制 kubelet 指示容器运行时通过 CRI 分配给每个容器的交换内存量。然后容器运行时会将交换设置写入容器级别的 cgroup

如何配置

1.修改 kubelet 配置文件

KUBELET_EXTRA_ARGS 参数后加上 --fail-swap-on=false

1vim /etc/sysconfig/kubelet
2KUBELET_EXTRA_ARGS=--fail-swap-on=false

2.修改 kubeadm 配置文件

先生成配置 kubeadm 配置文件

1kubeadm config print init-defaults --component-configs KubeletConfiguration > kubeadm-config.yaml

修改 kubelet 相关配置参数

 1...
 2apiVersion: kubelet.config.k8s.io/v1beta1
 3authentication:
 4  anonymous:
 5    enabled: false
 6  webhook:
 7    cacheTTL: 0s
 8    enabled: true
 9  x509:
10    clientCAFile: /etc/kubernetes/pki/ca.crt
11authorization:
12  mode: Webhook
13  webhook:
14    cacheAuthorizedTTL: 0s
15    cacheUnauthorizedTTL: 0s
16cgroupDriver: systemd # cgroup驱动,推荐 systemd
17clusterDNS:
18- 10.96.0.10
19clusterDomain: cluster.local
20cpuManagerReconcilePeriod: 0s
21evictionPressureTransitionPeriod: 0s
22fileCheckFrequency: 0s
23healthzBindAddress: 127.0.0.1
24healthzPort: 10248
25httpCheckFrequency: 0s
26imageMinimumGCAge: 0s
27kind: KubeletConfiguration
28logging: {}
29failSwapOn: false
30featureGates: # 启用 featureGates
31  NodeSwap: true # 启用 NodeSwap flag,默认为false
32memorySwap: 
33  swapBehavior: LimitedSwap # swap 支持 可选:LimitedSwap(默认)/UnlimitedSwap
34nodeStatusReportFrequency: 0s
35nodeStatusUpdateFrequency: 0s
36rotateCertificates: true
37runtimeRequestTimeout: 0s
38shutdownGracePeriod: 0s
39shutdownGracePeriodCriticalPods: 0s
40staticPodPath: /etc/kubernetes/manifests
41streamingConnectionIdleTimeout: 0s
42syncFrequency: 0s
43volumeStatsAggPeriod: 0s

3.执行初始化

1kubeadm init --config kubeadm-config.yaml --ignore-preflight-errors=swap

4.查看效果

1[root@k8s-m1 ~]# kubectl get node
2NAME     STATUS   ROLES                  AGE     VERSION
3k8s-m1   Ready    control-plane,master   9m22s   v1.22.2
4[root@k8s-m1 ~]# free -h
5              total        used        free      shared  buff/cache   available
6Mem:           3.7G        747M        398M         10M        2.6G        2.7G
7Swap:          2.0G          0B        2.0G

参考

New in Kubernetes v1.22: alpha support for using swap memory

Swap memory management