-
Kubernetes(K8S): 멀티 Pod 배포Software engineer/Infra 2024. 10. 26. 19:43

Kubernetes logo 이전 포스팅: https://jhjoo.tistory.com/46[Kubernetes(K8S):로컬에서 간단한 웹 서버배포]
이번 포스팅에서는 Node.js 서버를 2개의 파드(Pod)로 배포하여 트래픽이 두 개의 인스턴스에 분산되도록 하는 방법을 설명합니다. Kubernetes의 Deployment를 사용하여 여러 파드를 쉽게 관리하고 확장할 수 있습니다.
1. Deployment로 Node.js 서버를 2개의 파드에 배포하기
이전에는 node-pod.yaml을 사용해 단일 파드를 생성했지만 이번에는 Deployment를 사용하여 동일한 이미지를 사용한 2개의 파드를 생성해 보겠습니다.
1) 디플로이먼트 설정 파일 생성 (node-deployment.yaml)
node-deployment.yaml 파일을 생성하고, replicas를 2로 설정합니다. 이를 통해 Kubernetes가 Node.js 서버 파드 2개를 생성하여 트래픽을 자동으로 분산시킬 수 있습니다.
# node-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: node-deployment spec: replicas: 2 # 2개의 파드 생성 selector: matchLabels: app: node-app template: metadata: labels: app: node-app spec: containers: - name: node-server image: yourusername/simple-k8s-server:latest # Docker Hub에 업로드한 이미지 사용 ports: - containerPort: 3000❗️참고: yourusername/simple-k8s-server:latest는 Docker Hub에 올린 이미지의 이름을 사용합니다.
2) 디플로이먼트 생성
다음 명령어로 디플로이먼트를 생성합니다.
kubectl apply -f node-deployment.yaml디플로이먼트가 정상적으로 생성되면 Kubernetes가 자동으로 2개의 파드를 생성합니다.
2. NodePort 서비스로 두 개의 파드 연결
이제 두 개의 파드로 요청을 분산할 수 있도록 NodePort 서비스를 생성하여 외부에서 접근할 수 있게 합니다.
NodePort 서비스 설정 파일 생성 (node-service.yaml)
node-service.yaml 파일을 생성하여 Node.js 파드를 외부에서 접근할 수 있도록 설정합니다.
# node-service.yaml apiVersion: v1 kind: Service metadata: name: node-service spec: type: NodePort selector: app: node-app # 디플로이먼트와 동일한 라벨 ports: - protocol: TCP port: 3000 targetPort: 3000 nodePort: 30001 # 외부 접근 포트서비스 생성
kubectl apply -f node-service.yaml3. 배포 및 서비스 확인
파드 상태 확인
디플로이먼트와 서비스가 정상적으로 설정되었는지 확인하려면 다음 명령어로 파드와 서비스를 조회합니다.
kubectl get pods -l app=node-app kubectl get service node-service파드 두 개가 Running 상태가 되면 두 개의 파드가 생성되어 정상적으로 배포된 상태입니다.
서비스를 통해 요청 테스트
Minikube 환경에서 NodePort로 접근하려면 Minikube의 IP 주소를 사용해 외부에서 접근할 수 있습니다.
minikube ip # Minikube IP 확인 curl http://MINIKUBE_IP:30001여러 번 요청을 보내면 두 개의 파드가 트래픽을 나누어 응답하게 됩니다. 이를 통해 Kubernetes가 요청을 두 파드에 분산하는 것을 확인할 수 있습니다.
+) 추가
환경변수를 추가하여 각 파드 node 서버의 응답이 달라지도록 수정.
// server.js const http = require('http'); const serverNumber = process.env.SERVER_NUMBER || 'unknown'; const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end(`${serverNumber}번 서버 OK\n`); }); server.listen(3000, () => { console.log(`Server ${serverNumber} is running on port 3000`); });이를통해 요청이 라우팅되는 모습을 확인할 수 있다.
수정 node-deployment.yaml
# node-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: node-deployment spec: replicas: 2 # 2개의 파드 생성 selector: matchLabels: app: node-app template: metadata: labels: app: node-app spec: containers: - name: node-server image: yourusername/simple-k8s-server:latest ports: - containerPort: 3000 env: - name: SERVER_NUMBER valueFrom: fieldRef: fieldPath: metadata.name # 각 파드 이름을 환경 변수로 사용기억할 명령어 모음
# 이미지 빌드 docker build -t simple-k8s-server:latest . docker login # 이미지 태깅 docker tag simple-k8s-server:latest yourname/simple-k8s-server:latest # docker hub에 배포 docker push yourname/simple-k8s-server:latest # kube pod 이미지 강제 롤링 업데이트 kubectl rollout restart deployment node-deployment # minikube 서비스 확인 및 실행 명령어 minikube service node-service -n default+) 추가
테스트 진행시 1개 pod로만 요청이 들어가는것을 확인하여 라운드로빈 으로 설정 변경
# node-service.yaml apiVersion: v1 kind: Service metadata: name: node-service spec: type: NodePort selector: app: node-app ports: - protocol: TCP port: 3000 targetPort: 3000 nodePort: 30001 sessionAffinity: None # None이면 라운드 로빈 방식으로 요청이 분산됨이후 결과!

'Software engineer > Infra' 카테고리의 다른 글
AWS EC2 Free Tier 기반 부하 테스트 (1) 2024.12.06 Kubernetes(K8S): 로컬에서 간단한 웹 서버 배포 (3) 2024.10.26 [Docker] image를 삭제하는 방법들! (4) 2023.11.02 [RDS] 파라미터 그룹 (2) 2023.10.06 [EC2] 웹서버 설치 및 정적페이지 호스팅(w/ Apache web server) (1) 2023.09.25