OLD/ChatLink

[ChatLink] DevOps: Docker, Kubernetes를 이용한 프로젝트 관리

joseph0926 2024. 3. 18. 16:54

- 사용 기술

docker, kubernetes, tilt, npm package

 

- 과정

  1. 각 서비스에서 공통으로 사용될 로직등을 npm package로 배포했습니다.
    • 배경
      • 마이크로서비스를 구축하면서 공용으로 사용될 파일들이 매우 많았습니다 (ex: 타입, 에러 헨들링 등.,,)
      • 이를 각 서비스마다 중복되게 구현하는 것보단, 하나의 패키지로 만드는게 낫다는 판단을 하였습니다.
    • 기대효과
      • 각 서비스에서 별도의 중복 로직 없이 npm install을 통해 공용 로직 사용 가능
    • 문제 - 해결
      • 문제
        • 처음에는 공용 패키지를 private하게 관리하고 싶어서 .npmrc를 이용하여 http://npm.pkg.github.com/ 로 publish를 계획하였습니다
        • 하지만, 도커화하면서 계속되는 인증 문제가 발생하였습니다. (.npmrc에 사용되는 깃허브 토큰을 인식 못하는 문제)
      • 해결
        • 처음으로 시도한 것은 .npmrc 파일을 COPY 후 삭제하는 방법이였습니다
          • 문제는 여전히 지속되었습니다. 당연한게 .npmrc에 _authToken=${NPM_TOKEN} 형태로 토큰을 받지만, 도커화시 제공을 해주지 않았기 때문입니다.
        • 다음으로 시도한 것이 도커화시 NPM_TOKEN을 ARG로 넘겨주고, 해당 ARG를 받아서 임시 .npmrc를 생성한 후 해당 파일로 인증하는 방법이였습니다.
          • 하지만 이렇게 하여도 여전히 인증 문제가 발생하였습니다. (여전히 해결 못함)
        • 결국 https://www.npmjs.com/ 에 public으로 배포하는 것으로 수정하였습니다.
  2. 각 서비스들에 대한 k8s yaml 스크립트와 Dockerfile을 작성했습니다

ex) auth-service/Dockerfile

FROM node:21-alpine3.18 as builder

WORKDIR /app

COPY package*.json ./
COPY tsconfig.json ./
COPY prisma ./prisma
COPY src ./src

RUN npm install -g npm@latest
RUN npx prisma generate
RUN npm ci && npm run build

FROM node:21-alpine3.18

WORKDIR /app
RUN apk add --no-cache curl

COPY package*.json ./
COPY tsconfig.json ./
COPY prisma ./prisma

RUN npm install -g pm2 npm@latest
RUN npx prisma generate
RUN npm ci --production

COPY --from=builder /app/build ./build

EXPOSE 3002

CMD [ "npm", "run", "start" ]

ex) auth-depl.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: auth-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: auth
  template:
    metadata:
      labels:
        app: auth
    spec:
      containers:
        - name: auth
          image: joseph0926/chatlink-auth:latest
          env:
            - name: POSTGRES_USER
              valueFrom:
                secretKeyRef:
                  name: pg-user-pass
                  key: username
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: pg-user-pass
                  key: password
            - name: DATABASE_URL
              value: "postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@auth-postgres-srv:5432/authdb"
            - name: JWT_KEY
              valueFrom:
                secretKeyRef:
                  name: jwt-secret
                  key: JWT_KEY
          resources:
            requests:
              cpu: "250m"
              memory: "256Mi"
            limits:
              cpu: "500m"
              memory: "512Mi"

 

3. 이렇게 정의된 스크립트들을 tilt로 관리하였습니다

k8s_yaml(['k8s/elasticsearch/elasticsearch-depl.yaml', 'k8s/elasticsearch/elasticsearch-srv.yaml', 'k8s/elasticsearch/elasticsearch-pv.yaml'])

k8s_yaml(["k8s/kibana/kibana-depl.yaml", "k8s/kibana/kibana-srv.yaml", "k8s/kibana/configMap.yaml"])

k8s_yaml(["k8s/auth/auth-depl.yaml", "k8s/auth/auth-srv.yaml"])

k8s_yaml(["k8s/secret/elastic-secret.yaml", "k8s/secret/jwt-secret.yaml", "k8s/secret/pg-user-pass.yaml"])

 

- 최종 구상도

Skaffold -> Tilt로 대체

왜냐하면 tilt 스크립트 작성이 훨씬 간단하고, 시각화 해주는 UI도 제공해주었기 때문입니다.

 

- 관련링크

깃허브: https://github.com/joseph0926/ChatLink

 

GitHub - joseph0926/ChatLink: 마음이 맞는 이들과 깊이 있는 대화를 나누는, ChatLink로 연결하세요!

마음이 맞는 이들과 깊이 있는 대화를 나누는, ChatLink로 연결하세요! Contribute to joseph0926/ChatLink development by creating an account on GitHub.

github.com

블로그: https://joseph0926.tistory.com/category/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8/ChatLink

 

'프로젝트/ChatLink' 카테고리의 글 목록

김영훈(Pandora.TV Frontend) 블로그입니다 | GitHub: https://github.com/joseph0926 | Email: rkekqmf0926@gmail.com

joseph0926.tistory.com