클라우드 + DevOps/Kubernetes (k8s)

Kubernetes :: Application Pod 배포 실습

gamjadori 2024. 4. 15. 17:23
728x90

<Kubernetes :: Application Pod 배포 실습>

  • 일반적인 애플리케이션 Pod 배포 과정 (예시)
  1. 개발 팀에 Application 배포 요구 전달 > Node JS 테스트를 위한 source code 전달
  2. 요구 사항을 반영하여 Dockerfile 생성 > docker build를 통해 image 생성
  3. docker run~ 명령어를 통해 컨테이너화 확인
  4. Public or Private에 image update
  5. 해당 image를 이용한 Pod 및 Service를 생성하여 내부와 외부 연결 테스트 수행
  6. 성공적으로 테스트가 끝났다면 자동 배포 환경(CI/CD)이 포함된 Products 환경에 배포

 

  • k8s-pods 폴더를 생성해 VsCode에서 실습 진행

1. runapp.js 파일 생성

<파일 내용>

var http = require('http');

http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'});
res.end("Welcome to Kubernetes~! by mrsono0." + "\\n");
}).listen(8000);

 

2. 전달 받은 이미지 정상 가동 확인

PS C:\\Users\\admin\\Desktop\\k8s-pods> docker pull node:21-slim
PS C:\\Users\\admin\\Desktop\\k8s-pods> docker run -it -d --name=runapp-nodejs -p 8000:8000 node:21-slim
PS C:\\Users\\admin\\Desktop\\k8s-pods> docker cp runapp.js runapp-nodejs:/runapp.js
PS C:\\Users\\admin\\Desktop\\k8s-pods> docker exec -it runapp-nodejs node -v

 

3. Dockerfile 제작

 

<파일 내용>

FROM node:21-slim
EXPOSE 8000
COPY runapp.js .
CMD node runapp.js

 

4. 이미지 빌드

PS C:\\Users\\admin\\Desktop\\k8s-pods> docker build -t choiseen/mynode:1.0 .

 

5. 컨테이너 구축 및 docker container ps로 확인

PS C:\\Users\\admin\\Desktop\\k8s-pods> docker run -it -d --name=runapp-nodejs -p 8000:8000 choiseen/mynode:1.0
748622e35098dda9108328f0e4b1521f65931e6a0dedba4cad2c3ba1684fe824
PS C:\\Users\\admin\\Desktop\\k8s-pods> docker container ps
CONTAINER ID   IMAGE                 COMMAND                   CREATED         STATUS         PORTS
          NAMES
748622e35098   choiseen/mynode:1.0   "docker-entrypoint.s…"   7 seconds ago   Up 6 seconds   0.0.0.0:8000->8000/tcp   runapp-nodejs
  • Docker Desktop에서도 생성 확인 가능

 

  • Kubernetes로 배포 작업 진행

6. mynode.yaml 파일 생성

<파일 내용>

apiVersion: v1
kind: Pod
metadata:
  name: mynode-pod
  labels:
    app: hi-nodejs
spec:
  containers:
  - name: nodejs-container
    image: choiseen/mynode:1.0
    ports:
    - containerPort: 8000

 

7. Kubernetes에 리소스 배포 및 확인

PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl apply -f mynode.yaml
pod/mynode-pod created
PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl get po -o wide

  • 생성은 확인되었으나 쿠버네티스 클러스터에서 제작한 것이기 때문에 curl 했을 때 불가

 

8. 서비스 정의

  • mynode-svc.yaml 파일 생성

<파일 내용>

apiVersion: v1
kind: Service
metadata:
  name: mynode-svc
spec:
  selector:
    app: hi-nodejs
  ports:
  - port: 10001
    targetPort: 8000
  externalIPs: (개인마다 다름)
  - 192.168.56.101
  • externalIPs 입력 방법
PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl get po -o wide | grep mynode

>> 해당 명령어로 mynode-pod가 어느 노드에 생성됐는지 확인

  • 생성된 노드에 맞는 IP로 적어야 함
  • ex. k8s-node2에서 생성되면 192.168.56.102

  • 이름이 "mynode-svc"
  • 클러스터 내부 및 외부에서 10001 포트로 노출
  • 들어오는 트래픽은 8000 포트로 전달
  • 외부 IP로 192.168.56.101 사용

 

9. mynode-svc.yaml 파일 서비스 배포

PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl apply -f mynode-svc.yaml
service/mynode-svc created
PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl get po,sc -o wide | grep mynode

>> curl 192.168.56.101:10001 가능