Simple MSA 배포

Moondy·2022년 7월 4일
0

Kubernetes 에 올릴 테스트용 MSA 만들기

Spring Boot로 프로젝트 생성

    <groupId>com.moondy</groupId>
    <artifactId>simple-svc</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>simple-api-msa</name>
    <description>simple-api-msa</description>
  • IntelliJ에서 jar 파일 생성하기 : maven > package 실행

Docker Build & Push

로컬 환경에서 Container Registry에 Docker 이미지를 Push 해도 되지만, 여러명의 백엔드 개발자가 개발하기 때문에 jar파일의 버전관리 및 설정파일(Dockerfile 등) 통일을 위해 devsta-master 서버에서 Docker Build & Push 하는 방식을 채택

1. jar 파일 devsta-master 서버로 이동

  • sftp 툴 사용

2. application.yml파일을 서버로 이동

3. devsta-master 서버 접속

4. Dockerfile 생성

FROM adoptopenjdk:11-jre-openj9
ADD simple-svc-0.0.1-SNAPSHOT.jar simple-svc.jar
ADD application.yml application.yml
ENV JAVA_OPTS=""
ENTRYPOINT ["java","-jar","-Duser.timezone=Asia/Seoul","/simple-svc.jar"]
EXPOSE 8080
  • java 11 제공되는 open jdk docker image 가져오기
  • simple-svc-0.0.1-SNAPSHOT.jar 파일을 simple-svc.jar 이름으로 추가
  • application.yml 파일을 application.yml로 추가
  • jar 파일 실행
  • Docker 안에서 8080포트로 실행되기 때문에 외부에 8080 포트 노출

4. Build & Push

# 이동
cd ~/docker-files/<서비스 이름>

# Dockerfile 있는 위치에서 build (끝에 . 꼭 붙여야함)
sudo docker build -t mahnacwv.kr.private-ncr.ntruss.com/<서비스이름>:latest .

# push
sudo docker push mahnacwv.kr.private-ncr.ntruss.com/<서비스이름>:latest
  • build 할 때 Dockerfile의 path를 의미하는 . 을 잊지 말아야한다.

Kubernetes (이하: k8s)에 배포

1. k8s deployment 생성

# 이동
mkdir ~/msa-yaml
cd ~/msa-yaml

# 배포 파일 폴더로 이동
mkdir deployment
cd deployment

# yaml 파일 생성
vi simplesvc.yaml
# simplesvc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: simplesvc-deployment
  labels:
    app: simplesvc
spec:
  replicas: 1
  selector:
    matchLabels:
      app: simplesvc
  template:
    metadata:
      labels:
        app: simplesvc
    spec:
      imagePullSecrets:
      - name: regcred
      containers:
      - name: simplesvc
        image: mahnacwv.kr.private-ncr.ntruss.com/simplesvc:latest
        ports:
        - containerPort: 8080
# deployment 배포
kubectl apply -f simplesvc.yaml

# 확인
kubectl get deployment
  • 이렇게 뜨면 성공 NAME READY UP-TO-DATE AVAILABLE AGE
    simplesvc-deployment 1/1 1 1 10s

2. k8s service 생성 (Load Balancer)

💡 지금은 simple test 이기 때문에 바로 외부에서 접속 가능하게 Load Balancer로 만든 것이지만, 실제 운영될 서비스는 ClusterIP로 만들어서 내부접근만 가능하게 만드는 것이 바람직하다. (어차피 Gateway를 통해 들어올 것이니깐)

# 이동
mkdir ../svc
cd ../svc

# 파일 생성 <서비스이름>-svc.yaml
## 나만의 파일 생성 규칙일 뿐 파일 명은 상관 없다
vi simplesvc-svc.yaml
#simplesvc-svc.yaml
kind: Service 
apiVersion: v1 
metadata:
  name: simplesvc-svc
spec:
  type: LoadBalancer
  selector:
    app: simplesvc

  ports:
    # nodePort - a static port assigned on each the node
    # port - port exposed internally in the cluster
    # targetPort - the container port to send requests to
    - nodePort: 30163
      port: 8080 
      targetPort: 8080
# 적용
kubectl apply -f simplesvc-svc.yaml

# 확인
kubectl get svc

이렇게 나오면 성공

  • 결과
    NAME            TYPE           CLUSTER-IP      EXTERNAL-IP                                                            PORT(S)          AGE
    kubernetes      ClusterIP      198.19.128.1    <none>                                                                 443/TCP          28h
    simplesvc-svc   LoadBalancer   198.19.231.96   [default-simplesvc-svc-e1555-11422156-a9e5e7b2e004.kr.lb.naverncp.com](http://default-simplesvc-svc-e1555-11422156-a9e5e7b2e004.kr.lb.naverncp.com/)   8080:30163/TCP   69s

API 테스트

  • 내 로컬 환경에서 External-ip로 요청
curl --location --request GET 'http://default-simplesvc-svc-e1555-11422156-a9e5e7b2e004.kr.lb.naverncp.com:8080/health'
profile
LLM Application을 개발중인 BackEnd 개발자

0개의 댓글