본문 바로가기

리눅스

node-app 도커 이미지를 쿠버네티스로 배포하는 방법

728x90

node-app 도커 이미지를 쿠버네티스(Kubernetes)로 배포하는 방법

  • node-app-deployment.yaml 파일 생성
vim node-app-deployment.yaml
# node-app-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: node-app  # Deployment의 이름
spec:
  replicas: 1  # Replica 수
  selector:
    matchLabels:
      app: node-app  # Pod를 식별하기 위한 라벨
  template:
    metadata:
      labels:
        app: node-app  # Pod에 부여되는 라벨
      name: node-app  # Pod의 이름
    spec:
      containers:
      - name: node-app
        image: anti1346/node-app:latest  # 사용할 이미지
        ports:
        - containerPort: 3000  # 컨테이너에서 노출할 포트

---
apiVersion: v1
kind: Service
metadata:
  name: node-app  # Service의 이름
spec:
  selector:
    app: node-app  # 해당 Service가 라우팅할 Pod를 선택하는 라벨
  ports:
  - protocol: TCP
    port: 3000  # Service가 사용하는 포트
    targetPort: 3000  # Pod의 포트
    nodePort: 31000  # 노드포트 (외부로 노출되는 포트)
  type: NodePort  # 서비스 유형 (노드포트)
  • 쿠버네티스 클러스터에 node-app 애플리케이션 배포
kubectl apply -f node-app-deployment.yaml
$ kubectl apply -f node-app-deployment.yaml
deployment.apps/node-app created
service/node-app created
  • 현재 배포된 파드와 서비스의 상태를 확인
kubectl get pods,services
$ kubectl get pods,services
NAME                            READY   STATUS    RESTARTS   AGE
pod/node-app-5776f68947-qmmlh   1/1     Running   0          5s

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
service/kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          4d23h
service/node-app     NodePort    10.110.145.167   <none>        3000:31000/TCP   5s
728x90
  • 실행 중인 파드의 이름에 대한 대화형 bash 쉘을 실행
kubectl exec -it node-app-5776f68947-qmmlh -- /bin/bash
kubectl exec -it $(kubectl get pods -o jsonpath='{.items[0].metadata.name}') -- /bin/bash
  • 로컬에서 실행 중인 파드의 웹 서버에 HTTP GET 요청(쿠버네티스 내부에서만 동작합니다)
curl -fsSL http://localhost:3000
root@node-app-5776f68947-qmmlh:/usr/src/app# curl -fsSL http://localhost:3000
Hostname: node-app-5776f68947-qmmlh
Internal IP: 10.244.0.71
External IP: 111.111.111.111
Current Time: 2024. 2. 7. 오후 1:24:09
  • 클러스터 내에서 파드의 외부 IP 주소를 사용하여 파드의 웹 서버에 HTTP GET 요청(클러스터 내부에서만 동작합니다)
curl http://10.110.145.167:3000
root@node-app-5776f68947-qmmlh:/usr/src/app# curl http://10.110.145.167:3000
Hostname: node-app-5776f68947-qmmlh
Internal IP: 10.244.0.71
External IP: 111.111.111.111
Current Time: 2024. 2. 7. 오후 1:24:23
  • Minikube 클러스터의 외부 IP 주소를 사용하여 서비스에 HTTP GET 요청(클러스터 외부에서 동작합니다.)
curl http://$(minikube ip):31000
$ curl http://$(minikube ip):31000
Hostname: node-app-5776f68947-qmmlh
Internal IP: 10.244.0.71
External IP: 111.111.111.111
Current Time: 2024. 2. 7. 오후 1:25:34
  • node-app 디플로이먼트 삭제
kubectl delete deployment node-app
$ kubectl delete deployment node-app
deployment.apps "node-app" deleted
  • node-app 서비스 삭제
kubectl delete service node-app
$ kubectl delete service node-app
service "node-app" deleted
728x90