ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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.yaml

     

     

    3. 배포 및 서비스 확인

    파드 상태 확인

    디플로이먼트와 서비스가 정상적으로 설정되었는지 확인하려면 다음 명령어로 파드와 서비스를 조회합니다.

    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이면 라운드 로빈 방식으로 요청이 분산됨

     

     

     

     

    이후 결과!

Designed by Tistory.