일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Kubernets 이론
- Pods Evicted
- ₩
- k8s-driver-plugin
- kubernetes
- k8s
- #kubernetes
- 코틀린
- 삶이란...
- BigSur
- k8s-device-plugin
- worker node
- nvidia-docker
- face verification
- nvidia-driver-plugin
- k8s고장나면
- RunContainerError
- #Kuberspawner
- kubectl #
- 얼굴분류
- 얼굴검출
- kotin
- nvidia-container-cli
- GPU
- Kotlin
- kubernetes자동완성
- mac m1
- macm1
- kubectl completion bash
- 넘무무서웡...
- Today
- Total
더듬이
[Kubernetes] Pods Evicted error The node was low on resource 해결 방법 본문
[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
'Kubernetes' 카테고리의 다른 글
[kubernetes] k8s 클러스터에 gpu worker node 붙이기 (0) | 2021.07.01 |
---|---|
[kubernetes] gpu 노드에 gpu 없이 없이 pods 생성하기 (0) | 2021.07.01 |
[Kubernetes] gpu 장비 에러 nvidia-container-cli Error nvidia-device-plugin RunContinerError (0) | 2021.07.01 |
[Kubernetes] kubectx 설치 후 사용하기 (0) | 2021.05.07 |
[Kubespawner] kubernetes pkl 인증서 갱신 (1) | 2021.03.31 |