- 사용 기술
docker, kubernetes, tilt, npm package
- 과정
- 각 서비스에서 공통으로 사용될 로직등을 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으로 배포하는 것으로 수정하였습니다.
- 처음으로 시도한 것은 .npmrc 파일을 COPY 후 삭제하는 방법이였습니다
- 문제
- 배경
- 각 서비스들에 대한 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
'OLD > ChatLink' 카테고리의 다른 글
[ChatLink] Frontend: NextJs v14 - shadcn을 이용한 로그인 / 회원가입 폼 구현 (0) | 2024.03.09 |
---|---|
[ChatLink] Backend: Microservice - API gateway, Load Balancer (0) | 2024.03.02 |
[ChatLink] 프로젝트 구성: 기획 (Microservice, Microfront, Monorepo) (0) | 2024.02.28 |