파이널 프로젝트 - 16주차 4일(4/6)

최수환·2023년 4월 6일
0

Kubernetes

목록 보기
73/75
post-thumbnail

Flask 도커라이징

  • EC2인스턴스에서 빌드테스트하는 것은 아래 블로그를 참조하였고, 정상적으로 빌드가 되었다.
    📒 flask 빌드 테스트 참조
  • Dockerfile을 작성하여 빌드하여 이미지를 생성할 것이다.

1 . Dockerfile

vi Dockerfile

FROM python:3.8
ENV FLASK_APP=main
COPY . /usr/src/main/
WORKDIR /usr/src/main
RUN pip3 install -r requirements.txt
CMD ["flask", "run", "--host=0.0.0.0", "--port=5000"]
EXPOSE 5000/tcp

docker run -it --name myweb -p 5000:5000 flask:testv1 
  • 생성한 이미지를 컨테이너로 실행하고 브라우저에
    인스턴스 퍼블릭IP:5000 입력하면 정상적으로 작동되는 것을 확인

  • 기존의 인프라에 머신러닝 서버를 위한 Deployment, Service, Ingress를 추가할 것이다.
  • Deployment의 이미지는 위에서 도커라이징한 이미지를 사용할 것이다.

1 . ml-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ml-deploy
spec:
  replicas: 2
  selector:
    matchLabels:
      tier: ml
  template:
    metadata:
      name: ml-deploy
      labels:
        tier: ml
    spec:
      containers:
      - name: ml-deploy
        image: suhwan11/test1:flaskv2 #위에서 도커라이징한 이미지 
        ports:
        - containerPort: 5000 
  • 이미지는 5000 포트를 사용하므로 파드의 컨테이너는 5000포트를 뚫어준다

2 . ml-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: ml-svc
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 5000
    nodePort: 31117
  selector:
    tier: ml
  • ingress를 통해 들어오는 port는 80, 파드의 컨테이너는 5000번이 뚫려있으므로 5000번 포트로 포트포워딩해준다.

3 . ml-ing.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ml-ing
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: instance
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: ml-svc
            port:
              number: 80
  • 서비스의 80포트로 전달한다.

  • User-Frontend 코드 수정

1 . nginx.conf

. . .
  location /mlapp {
      proxy_pass <ML Backend주소>;
      proxy_buffer_size   128k;
      proxy_buffers       4 256k;
      proxy_busy_buffers_size 256k;
    }
. . . 
  • 위에서 Deployment ,Service ,Ingress 구축을 통해 AWS ALB가 Provision되었고, ML Backend서버의 퍼블릭IP가 생성되었다.
  • 해당 ML Backend서버의 IP를 nginx에 등록한다.
  1. vite.config.js
. . . 
  "/mlapp":{
    target: "<ML Backend주소>/mlapp/",
    rewrite: (path)=>path.replace(/^\/mlapp/,""),
      },
. . . 
  • User-Frontend 코드에서 nginx와 마찬가지로 Front 설정에서도
    ML Backend서버의 IP를 등록한다.

📒 기존의 Backend 코드에서 DB에 대한 Warning을 해결하기 위해 application.yaml파일에 open-in-view: false 를 추가하였는데 오히려 이것이 역효과가 나서 DB에 대한 쿼리 오류가 발생하였고, Frontend의 요청에서 에러가 발생했다.

결과 테스트

  • 머신러닝 서버가 정상적으로 배포된것을 ArgoCD로 확인

  • 수강신청 유저페이지에 접속하여 동물판독기 페이지에 들어가 동물 이미지를 입력하면 분류해주는 것을 확인

📒 브라우저에서 새로 배포한 웹을 테스트할때 이전에 캐시된 웹 때문에 새로 배포한 웹에 문제가 없음에도 이전에 웹이 그대로 남아있어서 오류가 해결 안된것처럼 보일 수 있다.
-> Ctrl + Shift + R 을 누르면 새로 배포한 웹의 스크립트로 바꿔준다.

profile
성실하게 열심히!

0개의 댓글