쿠버네티스 환경에서 nodejs 어플리케이션 배포해보기

cometLEE·2023년 9월 22일
0

kubernetes

목록 보기
4/16

nodejs 설치

우선, nodejs 어플리케이션을 배포하기 위해선, docker, nodejs가 설치되어있어야 한다.


docker 설치

$ yum install -y docker

nodejs 설치

nodejs 공식홈페이지

원래는 linux binarycode로 최신버전인 v18.18.0 버전으로 다운을 받아서 진행을 해보았지만,

이런 에러가 발생해서 알아보았다.

참고자료

이 블로그를 통해서 알아낸 점음, v18.18.0버전보다 버전을 낮춰야 한다는 것을 알았고, 저는 v16.20.2 버전으로 다운을 받았더니 오류가 해결되었습니다.

/opt/nodejs에 설치파일들 위치시키고, dev 디렉토리를 만들어 동작 어플리케이션 파일들을 위치시켰습니다.


간단한 웹 배포 app.js

var express = require('express');
var app = express();


app.get('/', function (req, res) {
  res.send('Hello World!');
});

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

Express 설치

그리고 express를 사용할 것이기 때문에

$ npm install express

동작시켜보면, 3000번 포트로 nodejs 웹서버가 오픈되었습니다.


docker 이미지파일 만들기

nodejs홈페이지 - docker이미지파일만들기

  • docker ps -a # 컨테이너 모두 출력
  • docker images # 이미지 모두 출력
  • docker run -d -it --name 000 --gpus all \
    --mount type=bind,source=(서버경로),target=(컨테이너 내부경로) (이미지 이름)
  • dockedocker image prune # 이름 없는 모든 이미지를 삭제한다
  • docker network prune # 사용되지 않는 도커 네트워크를 모두 삭제한다.
  • docker volume prune # 도커 컨테이너에서 사용하지 않는 모든 도커 볼륨을 삭제한다.
  • docker system prune -a # 중지된 모든 컨테이너, 사용되지 않은 모든 네트워크, 하나 이상의 컨테이너에서 사용되지 않는 모든 이미지를 삭제

Dockerfile 생성

  • app.js와 다른 환경파일들이 위치한 디렉터리로 이동 후 생성합니다.
FROM node:16.20.2
WORKDIR /app
COPY app.js .
COPY package.json .
RUN npm install --save
EXPOSE 3000
CMD [ "node", "app.js" ]
  • .dockerIgnore 파일도 생성합니다.
node_modules
npm-debug.log
  • 도커 이미지를 이미지 빌드합니다.
$ docker build . -t [사용자이름]/web-app

-t를 사용해서 태그를 지정하면 찾기 더 쉽다고 합니다!

  • 도커 이미지를 빌드하고 나고, 잘 빌드되어 있는지 확인합니다.
docker images

docker 이미지 실행

$ docker run -p 49999:3000 -d root/web-app

-p 플래그는 공개 포트를 컨테이너 내의 비공개 포트로 리다이렉트합니다.
49999->3000은 이후 생성될 pod의 ip접근 방식을 나타냅니다.
pod ip:49999로 접속하면 pod의 3000번 포트로 접속하라는 뜻입니다.

  • 실행되고 있는지 확인합니다.
$ docker ps -a | grep root

$ curl localhost:49999

하지만, 여기서 문제가 발생했다. deployment와 service를 생성해서 pods를 생성해보았지만, ErrImageNeverPull이라는 에러가 발생했다.

열심히 구글링해본 결과, 동작하는 이미지 레포지토리는 controlplane 노드에만 동작을 하고 있던 것이었다.. 만약, 워커노드 2번에만 빌드를 진행했다면, 워커노드 2번에만 pod가 할당될 것이다.

그렇다면 방법은?

  1. worker노드에 각각 이미지빌드를 해준다.
  2. dockerhub에 이미지를 등록한 후 내려받게 한다.

저는 간단하게 2번으로 진행해보겠습니다.

도커 허브에 등록

도커허브에 등록하려면, 사용자 이름이 맞아야 올라간다고 해서 tag를 바꾸고 올렸습니다.

$ docker image tag 981fd cometlee/web-app

음.. 따로 생성한다기 보다는 복사하는 느낌이더라구요

docker hub에 내 이미지 등록시키기

이 블로그를 참고하였고, 도커허브에 잘 등록시켰습니다.

# node-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  labels:
    app: web-app
spec:
  selector:
    matchLabels:
      app: web-app
  replicas: 3
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
      - name: web-app
        image: cometlee/web-app    # <--- 이름도 바꿔서 다시 해봐요!
        imagePullPolicy: Always
        ports:
        - containerPort: 3000

# node-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: web-app
spec:
  selector:
    app: web-app
  type: NodePort
  ports:
  - protocol: "TCP"
    port: 3000
    targetPort: 3000
    nodePort: 30008

네, 이제 다시 배포 해보겠습니다


서비스로 접근해보기

그리고 NodePort 형태의 서비스로 pod에 접근해보겠습니다.

$ curl [node01 ip]:30008


끝내면서

service내용을 접목해서 nodejs를 배포해보고 싶은 마음에 시도를 해보았는데, 자신의 어플리케이션을 이미지화하는 과정에 대해 배울 수 있었고, 많은 것을 배운 것 같다.
특히 imagePullPolicy에 대해서도 알게 되었다. MSA(Micro System Architecture)에 한 걸음 다가간 것 같아서 기분이 좋다.


Reference

블로그 - 끄적끄적
블로그 - 나름개발자의 it블로그
블로그 - 꼬예의블로그
쿠버네티스 공식홈페이지 - image

profile
server, kubernetes에 관심이 많이 있습니다

0개의 댓글