k8s (minikube) 에서 과연 몇개의 pod까지 띄울수 있을까?
나는 순진하게 무한대라고 생각했다. 정확히는 서버의 자원이 허락하는한 무한히 띄울수 있다고 생각했다.
일단 테스트 시작
apiVersion: apps/v1
kind: Deployment
metadata:
name: smallest-web-server
spec:
replicas: 2 # 두 개의 Pod를 생성합니다.
selector:
matchLabels:
app: web-server
template:
metadata:
labels:
app: web-server
spec:
containers:
- name: web-server
image: nginx:alpine
resources:
requests:
memory: "8Mi"
cpu: "5m"
limits:
memory: "32Mi"
cpu: "10m"
일단 메모리와 CPU를 최소로 잡는 pod중에서 실시간으로 확인이 가능한 것으로 하기 위해서 nginx로 골랐다.
보는 바와 같이 메모리 8M로 시작이 가능하다.
다음은 svc로 포트를 연결해준다.
apiVersion: v1
kind: Service
metadata:
name: web-server-service
spec:
selector:
app: web-server
ports:
- protocol: TCP
port: 80
targetPort: 8080
$ kubectl apply -f service.yaml
$ minikube service web-server-service
정상 작동 확인!!
동작 확인. 이제 pod를 200개로 늘려보자
apiVersion: apps/v1
kind: Deployment
metadata:
name: smallest-web-server
spec:
replicas: 200
selector:
matchLabels:
app: web-server
template:
metadata:
labels:
app: web-server
spec:
containers:
- name: web-server
image: nginx:alpine
resources:
requests:
memory: "8Mi"
cpu: "5m"
limits:
memory: "32Mi"
cpu: "10m"
200개로 늘리자 몇몇 pod는 pending 상태가 되어 버렸다…
minikube의 상태도 거의 쓸수 있는 자원을 모두 쓰고 있는 상태인것으로 보인다.
자원 문제인가 싶어 모든 리소스 삭제 후 minikube의 자원을 늘려준다.(CPU 2->4 / memory 2024 -> 8192)
$ kubectl delete depoly -f depoly.yaml
$ kubectl delete svc -f svc.yaml
$ minikube stop
$ minikube delete # 꼭 삭제까지 해줘야 start시 설정이 동작한다.
$ minikube config set cpus 4
#❗ These changes will take effect upon a minikube delete and then a minikube start
$ minikube config set memory 8192
#❗ These changes will take effect upon a minikube delete and then a minikube start
$ minikube start --cpus=4 --memory=8192
하지만 127개 이상 running이 되질 않는다. (나머지는 계속 padding 상태) 왜?
“Kubernetes는 노드당 최대 110개의 파드를 허용합니다.“
https://kubernetes.io/ko/docs/setup/best-practices/cluster-large/
아! 앗앗앗….
kubelet의 설정을 수정해보자. 아래는 시도하지 말자. 실행안된다.
$ minikube start --cpus=4 --memory=8192 --extra-config=kubelet.MaxPods=150
흠…결국 node를 늘려야겠다.
지금 설정된 노드는 하나다
$ kubectl get node
minikube에서는 간단하게 노드 추가가 가능하다.(이름은 자동으로 설정된다)
$ minikube node add
$ kubectl get node
이제 pod를 각 노드에 올려주면 될듯하다.
참고 사항 : https://kubernetes.io/ko/docs/tasks/configure-pod-container/assign-pods-nodes/
먼저 node에 라벨을 추가해야 한다. 각 노드에 설정된 라벨을 확인하자.
$ kubectl get nodes --show-labels
첫번째 노드는 master 노드 역활로 라벨이 엄청 많지만 두번째 노드는 간단한걸 볼수 있다.
이제 두번째 노드에 라벨을 추가 하자.
$ kubectl label nodes minikube-m02 disktype=ssd
$ kubectl get nodes --show-labels
두번째 노드에 pod를 적용하기 위해서는 nodeSelector로 라벨 값을 넣어주면 된다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: smallest-web-server
spec:
replicas: 1
selector:
matchLabels:
app: web-server
template:
metadata:
labels:
app: web-server
spec:
containers:
- name: web-server
image: nginx:alpine
resources:
requests:
memory: "8Mi"
cpu: "5m"
limits:
memory: "32Mi"
cpu: "10m"
nodeSelector:
disktype: ssd
output=wide로 확인하면 node를 확인 할 수 있다.
$ kubectl get pods --output=wide
이제 노드(minikube / minikube-m02) 마다 100개씩 올려보자 (nodeSelector에 100개씩 설정해서 실행)
현재 running 상태의 파드 갯수를 세고 싶다면 다음과 같다.
$ kubectl get pods --field-selector=status.phase=Running --no-headers | wc -l
200!! 드디어 성공!!
결국 100개 이상의 pod가 필요하다면 노드마다 100개씩 pod가 올라간다고 생각하고 100단위로 node 서버를 증설해야 한다.
(물론 CPU / 메모리 / 네트워크 까지 포함까지 고려해야 한다.)
끝!
'server > k8s' 카테고리의 다른 글
[k8s] argocd (minikube에 올려보기) (0) | 2024.03.08 |
---|---|
[k8s] fastapi + helm (minikube에 올려보기) (0) | 2024.03.06 |