Kubernetes清理管理器正在驱逐控制平面Pod以回收临时存储空间。

10
我正在使用Kubernetes v1.13.0。我的主节点也作为工作节点运行,因此除了控制平面pod之外,还有工作负载pod在上面运行。
我的主节点kubelet日志显示以下行:
eviction_manager.go:340] eviction manager: must evict pod(s) to reclaim ephemeral-storage eviction_manager.go:358] eviction manager: pods ranked for eviction: kube-controller-manager-vm2_kube-system(1631c2c238e0c5117acac446b26d9f8c), kube-apiserver-vm2_kube-system(ce43eba098d219e13901c4a0b829f43b), etcd-vm2_kube-system(91ab2b0ddf4484a5ac6ee9661dbd0b1c)
一旦kube-apiserver pod被驱逐,集群将变得无法使用。
我该怎么办来解决这个问题?我应该添加更多的临时存储吗?我该如何操作?这意味着在主机上的根分区上添加更多空间?
我理解ephemeral存储包括/var/log和/var/lib/kubelet文件夹,都属于根分区。
我的主机df -h命令显示:
Filesystem Size Used Avail Use% Mounted on /dev/vda1 39G 33G 6.2G 85% /
所以看起来根分区还有很多可用内存,没有磁盘压力。那么是什么原因导致这个问题呢?我的一些工作节点可能正在做一些与存储有关的疯狂事情,但它仍然有6G的空间,似乎足够了。
将更多空间添加到根分区会暂时解决这个问题吗?
kubectl describe vm2给出以下信息:
条件: 类型 状态 上次心跳时间 上次转换时间 原因 消息 ---- ------ ----------------- ------------------ ------ ------- 内存压力 False Fri, 11 Jan 2019 21:25:43 +0000 Wed, 05 Dec 2018 19:16:41 +0000 KubeletHasSufficientMemory kubelet有足够的可用内存 磁盘压力 False Fri, 11 Jan 2019 21:25:43 +0000 Fri, 11 Jan 2019 20:58:07 +0000 KubeletHasNoDiskPressure kubelet没有磁盘压力 进程ID(PID)压力 False Fri, 11 Jan 2019 21:25:43 +0000 Wed, 05 Dec 2018 19:16:41 +0000 KubeletHasSufficientPID kubelet有足够的可用进程ID 就绪 True Fri, 11 Jan 2019 21:25:43 +0000 Thu, 06 Dec 2018 17:00:02 +0000 KubeletReady kubelet正在发布就绪状态。AppArmor已启用 容量: cpu: 8 瞬态存储: 40593708Ki hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 32946816Ki pods: 110 可分配的: cpu: 8 瞬态存储: 37411161231 hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 32844416Ki pods: 110
看起来短暂的存储空间有压力,驱逐管理器正在尝试通过清除最近未使用的Pod来回收一些存储空间。但是它不应该清除控制平面Pods,否则集群将无法使用。
目前,Kubelet正在驱逐控制平面Pods。然后我尝试通过在/etc/kubernetes/manifests文件中添加和删除一个空格来手动启动apiserver和其他控制平面Pods。这确实启动了apiserver,但是它再次被驱逐。理想情况下,Kubelet应确保/etc/kubernetes/manifests中的静态Pod始终是开启且正确管理。
我正在尝试理解这里发生了什么,并且如何修复此问题,以使我的Kubernetes集群变得更加健壮,我不必继续手动重新启动apiserver。
2个回答

11

我曾经遇到过同样的问题,并通过将驱逐硬阈值(evictionHard)进行更改来解决它。

查看/etc/systemd/system/kubelet.service.d/10-kubeadm.conf,我有:

[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
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配置文件是/var/lib/kubelet/config.yaml

打开该文件,我将evitionHard设置更改为(我认为之前是10或15%):

...
evictionHard:
  imagefs.available: 1%
  memory.available: 100Mi
  nodefs.available: 1%
  nodefs.inodesFree: 1%
...
还有一个--experimental-allocatable-ignore-eviction设置(https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/),应该完全禁用驱逐。

1
这是因为你的kubelet配置设置了驱逐nodefs和imagefs的百分比太高,将其降低,问题就会得到解决: 修改/var/lib/kubelet/config.yaml中的配置。
找到eviction部分,并将百分比设置得更低,如下所示:
 evictionHard:
   imagefs.available: 1%
   memory.available: 100Mi
   nodefs.available: 1%
   nodefs.inodesFree: 1%

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接