我正在尝试在kubernetes节点上添加交换空间,以防止内存不足问题。是否可以在节点(以前称为minion)上添加交换空间?如果可能,我应该遵循什么程序以及它如何影响pod验收测试?
doinxwow1#
Kubernetes不支持容器内存交换。即使您添加了交换空间,Kubelet也会创建--memory-swappiness=0的容器(使用Docker时)。已经有关于添加支持的讨论,但该提议未被批准。https://github.com/kubernetes/kubernetes/issues/7294
wz3gfoph2#
关于是否给予K8S用户决定是否启用交换的特权,存在着广泛的讨论。我先直接提到你的问题,然后再继续讨论。如果您在Kubeadm上运行K8S,并且已经向节点添加了交换-请按照以下步骤操作:1)重置当前群集设置,然后将fail-swap-on=false标志添加到kubelet配置:
fail-swap-on=false
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)重新加载服务:
etc/systemd/syste,/kubelet
/etc/default/kubelet
systemctl daemon-reload systemctl restart kubelet
3)再次初始化群集设置并忽略交换错误:
kubeadm init --ignore-preflight-errors Swap
或:如果您更喜欢使用kubeadm-config.yaml:1)添加failSwapOn标志:
kubeadm-config.yaml
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的设计有关)。
1)3个qos类-确保您的高优先级工作负载使用Guaranteed(或至少Burstable)类运行。2)Pod Priority and Preemption。我也建议阅读驱逐终端用户Pod:如果kubelet无法回收节点上的足够资源,则kubelet开始逐出Pod。Kubelet首先根据Pod对闲置资源的使用是否超过请求,然后根据优先级,最后根据相对于Pod的调度请求的闲置计算资源的消耗,对要驱逐的Pod进行排序。因此,Kubelet按以下顺序对Pod进行排序和驱逐:
Guaranteed
Burstable
祝你好运(:几点相关讨论:Kubelet/Kubernetes should work with Swap Enabled[ERROR Swap]: running with swap on is not supported. Please disable swapKubelet needs to allow configuration of container memory-swap
lmyy7pcs3#
Kubernetes 1.22引入了交换作为alpha特性。更多信息请访问:
uklbhaso4#
通常建议在Kubernetes节点上禁用交换,原因如下:性能:Kubernetes工作负载通常在容器中运行,这些容器是隔离的,并且有自己的资源限制,如果容器超过其资源限制并试图使用交换,则节点和在同一节点上运行的其他容器的性能可能会受到严重影响。稳定性:Kubernetes依靠Linux内核的内存不足(OOM)killer来终止超过内存限制的进程。如果启用了交换,OOM killer可能无法正常工作,从而导致不可预测的行为和潜在的不稳定性。安全性:交换可能包含敏感数据,这些数据不应暴露给同一节点上的其他容器或用户。禁用交换有助于最大限度地降低数据泄漏和未经授权访问的风险。可预测性:Kubernetes依靠Linux内核的内存管理来强制执行资源限制并确保可预测的行为。交换会给内存管理过程带来额外的复杂性和不可预测性。总之,在Kubernetes节点上禁用交换是一种最佳实践,有助于确保Kubernetes工作负载的性能、稳定性、安全性和可预测性。
4条答案
按热度按时间doinxwow1#
Kubernetes不支持容器内存交换。即使您添加了交换空间,Kubelet也会创建--memory-swappiness=0的容器(使用Docker时)。已经有关于添加支持的讨论,但该提议未被批准。https://github.com/kubernetes/kubernetes/issues/7294
wz3gfoph2#
关于是否给予K8S用户决定是否启用交换的特权,存在着广泛的讨论。
我先直接提到你的问题,然后再继续讨论。
如果您在Kubeadm上运行K8S,并且已经向节点添加了交换-请按照以下步骤操作:
1)重置当前群集设置,然后将
fail-swap-on=false
标志添加到kubelet配置:(*)如果您在Ubuntu上运行,请将Kubelet配置的路径从
etc/systemd/syste,/kubelet
替换为/etc/default/kubelet
。2)重新加载服务:
3)再次初始化群集设置并忽略交换错误:
或:
如果您更喜欢使用
kubeadm-config.yaml
:1)添加
failSwapOn
标志:2)并运行:
一方面,K8S对此非常清楚-Kubelet的设计不支持交换-你可以在我上面分享的Kubeadm链接中看到它:
交换已禁用。必须禁用交换才能使kubelet正常工作
另一方面,您可以看到用户报告在某些情况下部署需要启用交换。
(Not因为swap是内核无法管理的函数,而仅仅是因为Kube不推荐它-可能与Kubelet的设计有关)。
1)3个qos类-确保您的高优先级工作负载使用
Guaranteed
(或至少Burstable
)类运行。2)Pod Priority and Preemption。
我也建议阅读驱逐终端用户Pod:
如果kubelet无法回收节点上的足够资源,则kubelet开始逐出Pod。
Kubelet首先根据Pod对闲置资源的使用是否超过请求,然后根据优先级,最后根据相对于Pod的调度请求的闲置计算资源的消耗,对要驱逐的Pod进行排序。
因此,Kubelet按以下顺序对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
lmyy7pcs3#
Kubernetes 1.22引入了交换作为alpha特性。
更多信息请访问:
uklbhaso4#
通常建议在Kubernetes节点上禁用交换,原因如下:
性能:Kubernetes工作负载通常在容器中运行,这些容器是隔离的,并且有自己的资源限制,如果容器超过其资源限制并试图使用交换,则节点和在同一节点上运行的其他容器的性能可能会受到严重影响。
稳定性:Kubernetes依靠Linux内核的内存不足(OOM)killer来终止超过内存限制的进程。如果启用了交换,OOM killer可能无法正常工作,从而导致不可预测的行为和潜在的不稳定性。
安全性:交换可能包含敏感数据,这些数据不应暴露给同一节点上的其他容器或用户。禁用交换有助于最大限度地降低数据泄漏和未经授权访问的风险。
可预测性:Kubernetes依靠Linux内核的内存管理来强制执行资源限制并确保可预测的行为。交换会给内存管理过程带来额外的复杂性和不可预测性。
总之,在Kubernetes节点上禁用交换是一种最佳实践,有助于确保Kubernetes工作负载的性能、稳定性、安全性和可预测性。