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 |
댓글