라즈베리파이 64bit에서 k3s를 사용한 환경이며, 공유기를 통해 ip를 할당받은 상황이다.
FROM node:16-alpine
WORKDIR /usr/src/app
COPY . .
RUN npm install
RUN npm run build
CMD ["npm", "start"]
.git
Dockerfile
node_modules
dist
라즈베리파이는 arm64인데, 도커를 빌드한 컴퓨터는 amd64이기에, 해당 이미지를 라파이에서 빌드하면 에러가 뜬다. 그렇기에 도커를 빌드할때 플랫폼을 arm64로 해줘야한다. 안그러면 에러뜬다 ㅎㅎ
docker build . --platform linux/arm64/v8 -t nestjs_image_arm64
docker tag nestjs_image pipisebastian/nestjs_image_arm64
docker push pipisebastian/nestjs_image_arm64
빌드된 이미지가 로컬에서 잘 되는지 확인가능하다.(생략 가능하지만.. 해보는걸 추천합니다..)
docker run -e MONGODB_URL=mongodb://127.0.0.1:27017 -e JWT_SECRET_KEY="key" pipisebastian/nestjs_image_test
+) nestjs로 만든 서버는 환경변수로 mongodb 주소와, jwt key를 넣어줘야 제대로 동작한다.
백엔드 서버와 연결할 mongoDB를 띄운다. 테스트를 위해 볼륨 타입은 hostPath를 사용한다.
hostPath는 각 노드의 로컬 파일시스템을 사용하기에, 각 노드마다 볼륨이 존재한다. 추후 다른방법을 공부해볼 예정이다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongodb-deployment
spec:
replicas: 1
selector:
matchLabels:
app: mongodb
template:
metadata:
labels:
app: mongodb
spec:
containers:
- name: mongodb
image: mongo:4.4.8
ports:
- containerPort: 27017
volumeMounts:
- name: mongodb-volume
mountPath: /data/db
volumes:
- name: mongodb-volume
hostPath:
path: /data/db
---
apiVersion: v1
kind: Service
metadata:
name: mongodb-service
spec:
ports:
- port: 27017
targetPort: 27017
selector:
app: mongodb
MongoDB 컨테이너는 기본적으로 데이터를 /data/db 경로에 저장하기에, 해당 데이터를 가져왔고,
저장되는 로컬 디렉토리도 /data/db 경로 에 지정해줬다.(디렉토리 만들었음)
kubectl apply -f db.yaml
kuebectl get svc
curl [몽고db service ip:27017]
했을때 잘 나오면 된다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nest-app
labels:
app: nest-app
spec:
replicas: 1
selector:
matchLabels:
app: nest-app
template:
metadata:
labels:
app: nest-app
spec:
containers:
- name: nest-app
image: pipisebastian/nestjs_image_arm64
env:
- name: MONGODB_URL
value: "mongodb://10.43.128.49:27017"
- name: JWT_SECRET_KEY
value: "key"
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
name: nest-app
labels:
app: nest-app
spec:
selector:
app: nest-app
ports:
- protocol: TCP
port: 80
targetPort: 3000
kubectl apply -f back.yaml
kubectl logs -f [백엔드 pod 이름]
으로 로그를 확인해보자. 잘된다!
백엔드 서비스 ip로 접근해서, 잘되는지 확인해봅시다
curl [백엔드 pod 이름]/docs
<- 이건 각자 만든 api로 테스트해보면 됩니다!
ingress로 외부접근을 확인해보자. 현재는 모두 내부, cluster Ip다.
라즈베리파이에서 ingress구축을 정리한 링크다. 해당 링크를 참고해, ingress controller등 환경이 구축된 상황이라 가정하겠다!
우리가 총 2개의 애플리케이션을 만들기에, 각각의 백엔드 서버가 필요하다.
그래서 /app1/login, /app2/login 와 같이 라우팅경로로 접근할 예정이기에, 다음과 같이 ingress 파일을 작성해준다.
그러나 현재 백엔드서버는 1개만 띄워놓은 상태라, 임시로 다른 서비스를 넣었다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nest-app
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /app(/|$)(.*)
pathType: ImplementationSpecific
backend:
service:
name: nest-app
port:
number: 80
- path: /blue
pathType: Prefix
backend:
service:
name: nginx-deploy-blue
port:
number: 80
kubectl apply -f ingress.yaml
curl 192.168.123.130/app/docs
curl 192.168.123.130/app/users
curl 192.168.123.130/blue
외부접근도 잘된다.
오옹 멋있어요~~!! 굿굿