Work/개발 노트

[k8s] DaemonSet 실행 시 Pending

★용호★ 2020. 11. 17. 01:26

문제

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가 정상 실행된다.