본문 바로가기
Kubernetes/Management

K8s - No more than 110 pods per node

by 여행을 떠나자! 2021. 10. 2.

1. Node limit

https://kubernetes.io/docs/setup/best-practices/cluster-large/
   ✓ Considerations for large clusters
       A cluster is a set of nodes (physical or virtual machines) running Kubernetes agents, managed by the control plane. Kubernetes v1.22 supports clusters with up to 5000 nodes.

       More specifically, Kubernetes is designed to accommodate configurations that meet all of the following criteria:
           * No more than 110 pods per node
           * No more than 5000 nodes
           * No more than 150000 total pods
           * No more than 300000 total containers

       You can scale your cluster by adding or removing nodes. The way you do this depends on how your cluster is deployed.

 

 

2. 연관 장애 

- 정상 노드 Pod 수용 한계 도달

   테스트 클러스터의 Worker 노드는 총 4대 (iap10, iap11, iap12, iap13)이며, 장애 노드(iap12, iap13)를 수동으로 클러스터에서 제거 하였음

   이에 장애 노드에서 수행되었던 pod들이 재 스케줄링 되면서 정상 노드(iap10, iap11)들이 수용 한계(110 pod)에 도달 함

$ k get nodes
NAME    STATUS   ROLES    AGE    VERSION
iap01   Ready    master   414d   v1.16.15
iap02   Ready    master   414d   v1.16.15
iap03   Ready    master   413d   v1.16.15
iap10   Ready    <none>   132d   v1.16.15
iap11   Ready    <none>   135d   v1.16.15
$ k describe nodes iap10 iap11 | grep Non-terminated
Non-terminated Pods:         (110 in total)
Non-terminated Pods:         (110 in total)
$

 

- FailedShceduling 에러 발생

   신규 Pod들이 노드 할당이 불가함에 따라 스케줄링 단계에서 에러가 발생되었고 Pending 상태로 남아 있음

      0/5 nodes are available: 2 Insufficient pods, 3 node(s) had taints that the pod didn't tolerate

         ▷ 3 node : master node (iap01, iap02, iap03) - taint (No Scheduling)

         ▷ 2 node : node (iap10, iap11) - Pod 수용 한계 도달

$ k get pod -n ptts | egrep -v 'Run|Com'
NAME                        READY   STATUS    RESTARTS   AGE
ptts-db-mariadb-0           0/1     Pending   0          65m
ptts-redis-cluster-1        0/2     Pending   0          65m
ptts-redis-cluster-4        0/2     Pending   0          65m
ptts-redis-cluster-5        0/2     Pending   0          14m
$ k describe pod ptts-db-mariadb-0 -n ptts | grep Events -A10
Events:
  Type     Reason            Age        From               Message
  ----     ------            ----       ----               -------
  Warning  FailedScheduling  <unknown>  default-scheduler  0/5 nodes are available: 2 Insufficient pods, 3 node(s) had taints that the pod didn't tolerate.
$

 

- 장애 해결 방안

   ✓ 장애 노드 (iap12, iap13) 복구 

   ✓ 마스터 노드 taint 설정 제거 (임시 그러나 권고하지 않음)

       kubectl taint nodes iap01 iap02 iap02 node-role.kubernetes.io=master:NoSchedule-

       추후 taint를 재 설정하여도, Master 노드에 스케줄링 된 deployments, statefulsets 타입의 Pod들은 수동으로 옮겨야 한다 

 

 

3. Fault tolerance 

- daemonsets 현황 파악

   ✓ daemonsets 타입 Pod는 노드별 1개만 기동 되며 Pod 다운 시 다른 노드에서 재 기동 되지 않음

   ✓ 'Node selector' 설정 값에 따라 전체 노드 또는 Worekr 노드 또는 특정 노드만 기동 될 수 있음

$ k get daemonsets.apps -A
NAMESPACE                NAME                                                        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGE
gpu-monitor              kube-prometheus-stack-1608276926-prometheus-node-exporter   7         7         7       7            7           <none>                        286d
gpu-operator-resources   gpu-feature-discovery                                       2         2         2       2            2           nvidia.com/gpu.present=true   286d
gpu-operator-resources   nvidia-container-toolkit-daemonset                          2         2         2       2            2           nvidia.com/gpu.present=true   286d
gpu-operator-resources   nvidia-dcgm-exporter                                        2         2         2       2            2           nvidia.com/gpu.present=true   286d
gpu-operator-resources   nvidia-device-plugin-daemonset                              2         2         2       2            2           nvidia.com/gpu.present=true   286d
gpu-operator-resources   nvidia-driver-daemonset                                     2         2         2       2            2           nvidia.com/gpu.present=true   286d
gpu-operator             gpu-operator-1608268482-node-feature-discovery-worker       4         4         4       4            4           <none>                        286d
istio-system             istio-nodeagent                                             7         7         7       7            7           <none>                        136d
kube-system              filebeat                                                    4         4         2       4            2           <none>                        128d
kube-system              kube-flannel-ds-amd64                                       7         7         7       5            7           <none>                        421d
kube-system              kube-flannel-ds-arm                                         0         0         0       0            0           <none>                        421d
kube-system              kube-flannel-ds-arm64                                       0         0         0       0            0           <none>                        421d
kube-system              kube-flannel-ds-ppc64le                                     0         0         0       0            0           <none>                        421d
kube-system              kube-flannel-ds-s390x                                       0         0         0       0            0           <none>                        421d
kube-system              kube-proxy                                                  7         7         7       7            7           beta.kubernetes.io/os=linux   421d
kube-system              metricbeat                                                  4         4         4       4            4           <none>                        128d
metallb-system           speaker                                                     4         4         4       4            4           kubernetes.io/os=linux        199d
rook-ceph                csi-cephfsplugin                                            4         4         4       4            4           <none>                        6d18h
rook-ceph                csi-rbdplugin                                               4         4         4       4            4           <none>                        6d18h
$

 

- 노드별 실행 중인 Pod 수 파악

$ k describe nodes iap10 iap11 iap12 iap13 | grep 'Non-terminated Pods'
Non-terminated Pods:          (104 in total)
Non-terminated Pods:          (47 in total)
Non-terminated Pods:          (77 in total)
Non-terminated Pods:          (67 in total)
$

 

- 실행 중인 Pod 수 (daemonsets 중복 제거) ? 

   253 = (104 + 47 + 77 + 67) - (14 * (4 - 1))

      daemonsets : 14 (node selector 설정 무시)

      Worker 노드 : 4

 

- Redundancy별 최대 수용 가능 Pod 수 (N = 4)

Redundancy 장애 허용 노드 수 수용 Pod 수
N+1 1  <= 330 = (4-1) * 110
N+2 2  <= 220 = (4-2) * 110
N+3 3  <= 110 = (4-3) * 110

 

- Fault tolerance 범위

   실행 중인 Pod 수는 253이며 수용 Pod수를 고려할 경우 Redundancy(N+1)에 해당 하므로 노드 1대만 장애를 허용 함

   Worker 노드의 리소스(CPU, Memory, GPU)가 동일 하다는 전제 조건이며, 리소스 사용량은 고려하지 않았음

 

 

'Kubernetes > Management' 카테고리의 다른 글

Knative - Custom domain 변경  (0) 2021.10.06
Knative 이해  (0) 2021.10.05
K8s - Master node의 role이 '<none>' 일 때  (0) 2021.09.30
Istio - Virtual service config  (0) 2021.09.23
Istio 1.5 구성  (0) 2021.09.23

댓글