문제
DaemonSet으로 Pod를 실행하면 각 워커노드에 Pod가 하나씩 실행이 되는데 특정 노드에서만 Pending이 발생하는 현상이 있었다.
example-9sz7d 1/1 Running 0 3d16h 10.0.62.16 ip-10-0-38-38.ap-northeast-2.compute.internal <none> <none>
example-d7jf6 1/1 Running 0 3d16h 10.0.110.150 ip-10-0-96-136.ap-northeast-2.compute.internal <none> <none>
example-gdkpk 1/1 Running 0 3d16h 10.0.113.194 ip-10-0-126-203.ap-northeast-2.compute.internal <none> <none>
example-jt2lv 1/1 Running 0 3d16h 10.0.70.49 ip-10-0-94-110.ap-northeast-2.compute.internal <none> <none>
example-mnlsb 1/1 Running 0 3d16h 10.0.39.22 ip-10-0-61-198.ap-northeast-2.compute.internal <none> <none>
example-xx577 0/1 Pending 0 3d16h 10.0.121.162 ip-10-0-97-75.ap-northeast-2.compute.internal <none> <none>
노드에 리소스가 부족한 경우 Cluster Autoscaler로 인해 노드가 Scale out 되어 새로 추가된 노드에 Pod가 할당 되기 때문에 노드만 준비가 되면 Pod가 정상 실행 되지만 DaemonSet의 경우에는 노드가 추가된다고 하더라도 이 Pod는 현재 리소스가 부족한 워커 노드에 반드시 실행이 되어야 하기 때문에 해소가 되지 않는다.
해결
먼저 리소스 부족이 맞는지 원인 파악을 위해 대상 노드의 상태를 확인한다.
kubectl describe node <대상 노드>
아래와 같이 노드 정보 중 대상 노드에서 실행 중인 Pod 목록과 각 Pod가 리소스를 얼마나 요청했고 Limit은 어느정도인지 확인이 가능하다.
... 생략 ...
Non-terminated Pods: (17 in total)
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE
--------- ---- ------------ ---------- --------------- ------------- ---
develop grafana-865f978f49-v5jbf 120m (6%) 200m (10%) 256Mi (9%) 400Mi (14%) 3d23h
develop redis-79b5f79b8f-gqgxh 0 (0%) 0 (0%) 0 (0%) 0 (0%) 5d7h
develop vault-ui-65696ddb59-skc82 0 (0%) 0 (0%) 0 (0%) 0 (0%) 5d7h
kube-system aws-node-p6rf8 10m (0%) 0 (0%) 0 (0%) 0 (0%) 10d
kube-system coredns-685bd65d99-5t7tk 100m (5%) 0 (0%) 70Mi (2%) 170Mi (6%) 10d
kube-system coredns-685bd65d99-9p695 100m (5%) 0 (0%) 70Mi (2%) 170Mi (6%) 10d
kube-system kube-proxy-zm724 100m (5%) 0 (0%) 0 (0%) 0 (0%) 10d
... 생략 ...
그 아래에는 실제 이 노드에서 Pod가 점유하고 있는 리소스량이 어느정도 되는지 확인할 수 있다.
Allocated resources:
(Total limits may be over 100 percent, i.e., overcommitted.)
Resource Requests Limits
-------- -------- ------
cpu 1450m (75%) 1900m (98%)
memory 2572Mi (96%) 4140Mi (154%)
ephemeral-storage 0 (0%) 0 (0%)
hugepages-1Gi 0 (0%) 0 (0%)
hugepages-2Mi 0 (0%) 0 (0%)
attachable-volumes-aws-ebs 0 0
위 지표를 보면 메모리가 96%를 사용하여 더이상 Pod를 할당할 수 없는 상태인 것을 확인할 수 있다. 이 경우에는 현재 해당 노드에서 실행 중인 Pod 수를 줄여줘야하는데 이중화되어있거나 재시작 되어도 문제가 없는 Pod들을 대상으로 delete를 해주면 다시 스케쥴링 되어서 리소스에 여유가 있는 노드로 Pod가 할당된다.
이 후 DaemonSet을 실행하기 위한 리소스가 확보되면 DaemonSet Pod가 정상 실행된다.
'Work > 개발 노트' 카테고리의 다른 글
[Go언어] API 서버간 내부 통신 시 too many open files 문제 (0) | 2020.12.05 |
---|---|
[k8s] kube-prometheus #1 - 설치 (0) | 2020.11.18 |
[Go언어] for 루프에서 포인터 사용 시 동일 객체 참조 문제 (0) | 2020.11.17 |
[k8s] ALB Ingress 사용 시 다수의 리스너 등록하기 (1) | 2020.10.15 |
[Docker] Secret 사용 해보기 (0) | 2020.10.04 |
댓글