是否可以在kubernetes节点上添加交换空间?

sycxhyv7  于 2023-03-01  发布在  Kubernetes
关注(0)|答案(4)|浏览(172)

我正在尝试在kubernetes节点上添加交换空间,以防止内存不足问题。是否可以在节点(以前称为minion)上添加交换空间?如果可能,我应该遵循什么程序以及它如何影响pod验收测试?

doinxwow

doinxwow1#

Kubernetes不支持容器内存交换。即使您添加了交换空间,Kubelet也会创建--memory-swappiness=0的容器(使用Docker时)。已经有关于添加支持的讨论,但该提议未被批准。https://github.com/kubernetes/kubernetes/issues/7294

wz3gfoph

wz3gfoph2#

    • 技术上来说**你能做到

关于是否给予K8S用户决定是否启用交换的特权,存在着广泛的讨论。
我先直接提到你的问题,然后再继续讨论。
如果您在Kubeadm上运行K8S,并且已经向节点添加了交换-请按照以下步骤操作:
1)重置当前群集设置,然后将fail-swap-on=false标志添加到kubelet配置:

kubeadm reset 
echo 'Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"' >> /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

(*)如果您在Ubuntu上运行,请将Kubelet配置的路径从etc/systemd/syste,/kubelet替换为/etc/default/kubelet
2)重新加载服务:

systemctl daemon-reload
systemctl restart kubelet

3)再次初始化群集设置并忽略交换错误:

kubeadm init --ignore-preflight-errors Swap

或:
如果您更喜欢使用kubeadm-config.yaml
1)添加failSwapOn标志:

---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
failSwapOn: false # <---- Here

2)并运行:

kubeadm init --config /etc/kubernetes/kubeadm-config.yaml --ignore-preflight-errors=Swap
    • 返回讨论天气以决定是否允许交换。**

一方面,K8S对此非常清楚-Kubelet的设计不支持交换-你可以在我上面分享的Kubeadm链接中看到它:
交换已禁用。必须禁用交换才能使kubelet正常工作
另一方面,您可以看到用户报告在某些情况下部署需要启用交换。

    • 我建议您先尝试不启用交换**。

(Not因为swap是内核无法管理的函数,而仅仅是因为Kube不推荐它-可能与Kubelet的设计有关)。

    • 请确保您熟悉K8S提供的用于对pod内存进行优先级排序的功能**:

1)3个qos类-确保您的高优先级工作负载使用Guaranteed(或至少Burstable)类运行。
2)Pod Priority and Preemption
我也建议阅读驱逐终端用户Pod:
如果kubelet无法回收节点上的足够资源,则kubelet开始逐出Pod。
Kubelet首先根据Pod对闲置资源的使用是否超过请求,然后根据优先级,最后根据相对于Pod的调度请求的闲置计算资源的消耗,对要驱逐的Pod进行排序。
因此,Kubelet按以下顺序对Pod进行排序和驱逐:

  • BestEffort或Burstable Pod,其对闲置资源的使用超过其请求。此类Pod按优先级排序,然后按使用超过请求排序。
  • 使用率低于请求数的受保证Pod和突发Pod最后被逐出。仅当为所有容器指定请求数和限制数并且这些值相等时,才能保证受保证Pod。保证此类Pod永远不会因为其他Pod的资源消耗而被逐出。如果系统守护程序(例如Kubelet、Docker和Journald)消耗的资源多于通过系统保留或Kube保留分配所保留的资源,并且节点仅具有保证Pod或突发Pod,使用的请求少于剩余请求,则节点必须选择逐出此类Pod,以保持节点稳定性并限制意外消耗对其他Pod的影响。在这种情况下,节点将选择首先逐出优先级最低的Pod。

祝你好运(:
几点相关讨论:
Kubelet/Kubernetes should work with Swap Enabled
[ERROR Swap]: running with swap on is not supported. Please disable swap
Kubelet needs to allow configuration of container memory-swap

lmyy7pcs

lmyy7pcs3#

Kubernetes 1.22引入了交换作为alpha特性。
更多信息请访问:

uklbhaso

uklbhaso4#

通常建议在Kubernetes节点上禁用交换,原因如下:
性能:Kubernetes工作负载通常在容器中运行,这些容器是隔离的,并且有自己的资源限制,如果容器超过其资源限制并试图使用交换,则节点和在同一节点上运行的其他容器的性能可能会受到严重影响。
稳定性:Kubernetes依靠Linux内核的内存不足(OOM)killer来终止超过内存限制的进程。如果启用了交换,OOM killer可能无法正常工作,从而导致不可预测的行为和潜在的不稳定性。
安全性:交换可能包含敏感数据,这些数据不应暴露给同一节点上的其他容器或用户。禁用交换有助于最大限度地降低数据泄漏和未经授权访问的风险。
可预测性:Kubernetes依靠Linux内核的内存管理来强制执行资源限制并确保可预测的行为。交换会给内存管理过程带来额外的复杂性和不可预测性。
总之,在Kubernetes节点上禁用交换是一种最佳实践,有助于确保Kubernetes工作负载的性能、稳定性、安全性和可预测性。

相关问题