Kubernetes驱逐经理驱逐控制平面吊舱以回收临时存储

时间:2019-01-11 23:54:31

标签: kubernetes kubernetes-apiserver

我正在使用Kubernetes v1.13.0。我的主服务器还充当工作节点,因此除了控制平面容器外,它还运行着工作负载容器。

我的母版上的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容器被驱逐,集群将无法使用。

该如何解决?我应该添加更多临时存储吗?我将如何去做?这意味着要在主机的根分区上增加更多空间?

我的理解是,临时存储由/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提供以下信息:

Conditions:
  Type             Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
  ----             ------  -----------------                 ------------------                ------                       -------
  MemoryPressure   False   Fri, 11 Jan 2019 21:25:43 +0000   Wed, 05 Dec 2018 19:16:41 +0000   KubeletHasSufficientMemory   kubelet has sufficient memory available
  DiskPressure     False   Fri, 11 Jan 2019 21:25:43 +0000   Fri, 11 Jan 2019 20:58:07 +0000   KubeletHasNoDiskPressure     kubelet has no disk pressure
  PIDPressure      False   Fri, 11 Jan 2019 21:25:43 +0000   Wed, 05 Dec 2018 19:16:41 +0000   KubeletHasSufficientPID      kubelet has sufficient PID available
  Ready            True    Fri, 11 Jan 2019 21:25:43 +0000   Thu, 06 Dec 2018 17:00:02 +0000   KubeletReady                 kubelet is posting ready status. AppArmor enabled
Capacity:
 cpu:                8
 ephemeral-storage:  40593708Ki
 hugepages-1Gi:      0
 hugepages-2Mi:      0
 memory:             32946816Ki
 pods:               110
Allocatable:
 cpu:                8
 ephemeral-storage:  37411161231
 hugepages-1Gi:      0
 hugepages-2Mi:      0
 memory:             32844416Ki
 pods:               110

在我看来,临时存储有压力,驱逐管理员正在试图通过驱逐最近最少使用的吊舱来回收一些存储。但这不应该驱逐控制平面吊舱,否则群集将无法使用。

当前,Kubelet将控制平面吊舱逐出。然后,我尝试通过在/etc/kubernetes/manifests文件中添加和删除空格来手动启动apiserver和其他控制平面容器。这确实启动了apiserver,但随后又被逐出了。理想情况下,Kubelet应该确保/etc/kubernetes/manifests中的静态Pod始终处于打开状态并得到适当管理。

我试图了解这里发生的情况以及如何解决此问题,以便使我的kubernetes群集变得更强大,而不必继续手动重新启动apiserver。

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,并通过更改逐出硬门槛来解决了这个问题。

看着/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-evictionhttps://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/)设置应完全禁止驱逐。

答案 1 :(得分:0)

这是因为您的逐出nodefs和imagefs%的kubelet配置设置太高,将其设置得较低,则可以解决以下问题: 在/var/lib/kubelet/config.yaml

中修改配置

找出逐出部分并设置较低的百分比,如下所示:

 evictionHard:
   imagefs.available: 1%
   memory.available: 100Mi
   nodefs.available: 1%
   nodefs.inodesFree: 1%