본문 바로가기

server/k8s

[k8s] nginx pod * 200개를 띄울수 있나요?

 

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로 시작이 가능하다.

 

pod 정상작동 확인

다음은 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

minikube에 적용 확인

하지만 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