我正在尝试在kubernetes节点上添加交换空间,以防止它出现内存不足问题。是否可以在节点上添加交换空间(以前称为minion)?如果可能的话,我应该遵循什么程序以及它如何影响豆荚验收测试?
答案 0 :(得分:9)
Kubernetes不支持容器内存交换。即使你添加交换空间,kubelet也会使用--memory-swappiness = 0创建容器(使用Docker时)。有关添加支持的讨论,但该提案未获批准。 https://github.com/kubernetes/kubernetes/issues/7294
答案 1 :(得分:0)
技术上,您可以做到。
广泛的讨论环境使K8S用户有特权决定是否启用交换。
我将首先直接提及您的问题,然后继续进行讨论。
如果您在Kubeadm上运行K8S,并且已在节点上添加了swap-请遵循以下步骤:
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
OR:
如果您喜欢使用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正常工作 正确
另一方面,您可以看到用户报告在某些情况下需要启用交换的部署。
我建议您先尝试不启用交换功能。
(不是因为交换是内核无法管理的功能,而是因为Kube不推荐交换-可能与Kubelet的设计有关。)
请确保您熟悉K8S提供的功能,以优先考虑Pod的存储空间:
1)3 qos classes-确保您的高优先级工作负载正在与Guaranteed
(或至少Burstable
)类一起运行。
2)Pod Priority and Preemption。
我建议您同时阅读Evicting end-user Pods:
如果kubelet无法在节点上回收足够的资源, kubelet开始驱逐Pods。
小牛根据是否将小豆荚逐出而将其排在首位 饥饿资源的使用超出了请求,然后是优先级,并且 然后通过消耗相对于 Pods的调度请求。
结果,kubelet按以下顺序对Pod进行排名和逐出:
BestEffort或Burstable Pod,其饥饿资源的使用超出了其请求。此类容器按优先级排序,然后使用 以上要求。
使用率低于要求的保证的Pod和Burstable Pod被最后逐出。保证豆荚只有在有要求时才得到保证 并且为所有容器指定了限制,并且限制是相等的。 保证此类豆荚永远不会因为另一个豆荚而被逐出 资源消耗。系统守护程序(例如kubelet,docker和 日志)消耗的资源比通过保留的资源更多 系统保留或kube保留的分配,并且该节点仅具有 保证的或可爆的豆荚使用少于剩余请求的数量,然后 节点必须选择驱逐此类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