参考:
https://kubernetes.io/zh/docs/tasks/administer-cluster/out-of-resource/
https://kubernetes.io/zh/docs/concepts/scheduling-eviction/taint-and-toleration/
https://www.jianshu.com/p/29bebed74eda
基于污点的驱逐
当某种条件为真时,节点控制器会自动给节点添加一个污点。当前内置的污点包括:
node.kubernetes.io/not-ready
:节点未准备好。这相当于节点状态Ready
的值为 "False
"。node.kubernetes.io/unreachable
:节点控制器访问不到节点. 这相当于节点状态Ready
的值为 "Unknown
"。node.kubernetes.io/memory-pressure
:节点存在内存压力。node.kubernetes.io/disk-pressure
:节点存在磁盘压力。node.kubernetes.io/pid-pressure
: 节点的 PID 压力。node.kubernetes.io/network-unavailable
:节点网络不可用。node.kubernetes.io/unschedulable
: 节点不可调度。node.cloudprovider.kubernetes.io/uninitialized
:如果 kubelet 启动时指定了一个 "外部" 云平台驱动, 它将给当前节点添加一个污点将其标志为不可用。在 cloud-controller-manager 的一个控制器初始化这个节点后,kubelet 将删除这个污点。
解决方法:
node上的kubelet负责采集资源占用数据,并和预先设置的threshold值进行比较,如果超过threshold值,kubelet会杀掉一些Pod来回收相关资源。
使用 systemctl status kubelet查看kubelet状态
systemctl status kubelet
得知 Drop-In: /etc/systemd/system/kubelet.service.d
└─10-kubeadm.conf
systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active: active (running) since Tue 2021-07-27 20:43:57 CST; 2h 5min ago
Docs: https://kubernetes.io/docs/home/
Main PID: 19711 (kubelet)
Tasks: 24 (limit: 4915)
CGroup: /system.slice/kubelet.service
└─19711 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubele
所以修改10-kubeadm.conf
vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
修改配置文件增加传参数,添加此配置项 --eviction-hard=nodefs.available<3%
如下所示:
# Note: This dropin only works with kubeadm and kubelet v1.11+
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf ----eviction-hard=nodefs.available<3%"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
重启kubelet,验证修改值是否生效。
bxx@bxx1050ti:~$ systemctl daemon-reload
bxx@bxx1050ti:~$ systemctl restart kubelet
原理补充:
配置资源不足时的处理方式
使用 kubelet
配置资源不足时的处理方式。
驱逐阈值
kubelet
支持指定驱逐阈值,用于触发 kubelet
回收资源。
每个阈值形式如下:
[eviction-signal][operator][quantity]
- 合法的
eviction-signal
标志如上所示。 operator
是所需的关系运算符,例如<
。quantity
是驱逐阈值值标志,例如1Gi
。合法的标志必须匹配 Kubernetes 使用的数量表示。 驱逐阈值也可以使用%
标记表示百分比。
举例说明,如果一个节点有 10Gi
内存,希望在可用内存下降到 1Gi
以下时引起驱逐操作, 则驱逐阈值可以使用下面任意一种方式指定(但不是两者同时)。
memory.available<10%
memory.available<1Gi