더듬이

[Kubernetes] Pods Evicted error The node was low on resource 해결 방법 본문

Kubernetes

[Kubernetes] Pods Evicted error The node was low on resource 해결 방법

dbhang 2021. 5. 25. 14:02

상황  설명

Message:      The node was low on resource: ephemeral-storage. Container notebook was using 1704Ki, which exceeds its request of 0.

 

어느날 갑자기 kubernetes api 가 안되서 kubectl get pods -A를 해보니 아래와 같은 container 상태를 확인할 수 있었다. 

 

kube-system                metrics-server-8bbd5674f-224lj                       0/1     Evicted            0          17d
kube-system                metrics-server-8bbd5674f-22jk8                       0/1     Evicted            0          18d
kube-system                metrics-server-8bbd5674f-25x5c                       0/1     Evicted            0          17d
kube-system                metrics-server-8bbd5674f-25zkq                       0/1     Evicted            0          17d
kube-system                metrics-server-8bbd5674f-27w5j                       0/1     Evicted            0          16d
kube-system                metrics-server-8bbd5674f-27xtk                       0/1     Evicted            0          16d
kube-system                metrics-server-8bbd5674f-28zfr                       0/1     Evicted            0          17d
kube-system                metrics-server-8bbd5674f-2b4xh                       0/1     Evicted            0          16d
kube-system                metrics-server-8bbd5674f-2c94w                       0/1     Evicted            0          18d
kube-system                metrics-server-8bbd5674f-2hzwt                       0/1     Evicted            0          16d
kube-system                metrics-server-8bbd5674f-2jrnc                       0/1     Evicted            0          17d
kube-system                metrics-server-8bbd5674f-2lkr2                       0/1     Evicted            0          16d
kube-system                metrics-server-8bbd5674f-2xl5r                       0/1     Evicted            0          16d
kube-system                metrics-server-8bbd5674f-42xj4                       0/1     Evicted            0          18d
kube-system                metrics-server-8bbd5674f-462pc                       0/1     Evicted            0          18d

 

kubectl describe pods -n NS-name

으로 Evicted 된 pod들의 상태를 살펴보니 아래와 같이 표기되어 있었다.

Status:       Failed
Reason:       Evicted
Message:      The node was low on resource: ephemeral-storage. Container notebook was using 1704Ki, which exceeds its request of 0.

 

원인 

이런 에러는  worker node 에 리소스 자원 제한때문이다. 

 

kubelet은 해당 VM(worker node)에 얼마만큼의 리소스 까지 kubernetes container를 생성할 수 있는지 설정되어있는데 그  limit을 넘어버리게 되면 위에 처럼 worker node에서 자원을 만들기위해 container를 쫒아낸다 ㅠㅠ 

 

그리고 deployment에 container restart always 설정한 pods 라면 쫒아내면 다시 생성하고 worker node는 다시 쫒아내고 를 반복해서 위와 같은 상황이 발생한다.

 

이 경우에는 2가지해결방법이 있는데

제일  첫번쩨 방법은 부족한 리소스 자원 자체를 늘리는 법이다.  사실 리소스 자원이 부족하다면 늘리는게 맞지....

 

두번째 방법은 저 worker node에서 자원이 부족하다고 파악하는 임계값자체를 내리는 것이다.

 

worker에서 저장공간이 10Gi밖에 안남았다! => container 쫒아내자.

에서 

worker에서 저장공간이 1Gi밖에 안남았다! => container 쫒아내자.

로 바꾸는 것이다. 

 

내 경우에는 VM 자체가 용량이 매우 큰편이였는데 kubelet 기본값이 10% 이런식으로 %로 되어있어서 100G가 남아있더라도 리소스부족으로 컨테이너를 생성할 수 없었기에 두번째 방법을 적용했다.

 

해결방법  ( 임계값 조정)

  내 경우처럼 처럼 The node was low on resource: ephemeral-storage. (임시저장공간이 부족하다 !)의 경우는

systemctl stop kubelet
kubelet --eviction-hard="nodefs.available<1G"

 

위 명령어 한줄로 해결 할 수 있다.

 

하지만 저 경우에는 kubelet을 실행할때마다 옆에 붙여줘야하고 번거롭기 때문에 kubelet service 파일에 등록된 config 파일을 수정해주도록 하자. 

 

vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

명령으로 읽어보면 systemctl start kubelet시에 실행되는 코드가 들어있는데 아래와 같다. 

# 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"
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

 

이중 ExecStart 에서 kubelet  실행시에 인자로 전달되는 config 파일중에 /var/lib/kubelet/config.yaml 을 읽어보면 evictionHard 로 설정되어있는 부분이 있는데 저값들이 아무것도 설정안하고 kubelet을 실행하면 설정되는 기본 값들이다. 

evictionHard:
  imagefs.available: 15%
  memory.available: 100Mi
  nodefs.available: 10%
  nodefs.inodesFree: 5%

nodefs 가 10%라니.... 

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

나는 위처럼 변경했다. 

 

이후 아래 명령어로 kubelet을 재실행 해주면 끝!

systemctl stop kubelet
systemctl start kubelet