Kubernetes开启Swap支持
说明
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
- 原文作者:黄忠德
- 原文链接:https://huangzhongde.cn/post/Kubernetes/Kubernetes_enable_Swap_support/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。