kok202
스프링 부트 강의 정리 (39~40 : 배포)

2019. 5. 26. 00:18[공부] 영상/스프링 부트 강의

강의에서 시도하려는 배포 형태

1. 구글 클라우드 플랫폼을 사용한다. 

2. 스프링 부트 어플리케이션을 로컬 이미지로 생성한다.

3. 쿠버네티스 배포한다.

 

 

 

 

 

1. /project 에서 메이븐으로 로컬 이미지 생성

mvn package

/project/target 의 하위폴더에 jar 패키지가 생긴다.

jar 파일을 실행시켜서 제대로 jar 패키지가 생성되었는지 확인한다.

java -jar target/my-jar-project-1.0-SNAPSHOT.jar

 

 

 

 

 

2. jar 파일을 실행하는 Dockerfile 를 만든다.

/project 에 Dockerfile 파일을 생성하여 넣는다.

/project/dockerfile

FROM openjdk:8
ADD JAR_FILE=./target/*jar
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

1) openjdk 를 이용하는 도커 이미지다.

2) JAR_FILE 이라는 환경변수를 만들었다.

3) JAR_FILE 환경변수를 app.jar에 추가한다.

4) docker 를 실행하는 커맨드 ("-Djava.security.egd=file:/dev/./urandom 를 입력하면 Tomcat의 스타트 시간을 빨리할 수 있다.)

 

 

 

3. Dockerfile 을 Docker image로 만든다.

 

3-1. Local 에서 Dockerfile 을 Docker image로 만드는 테스트를 진행 해보고자한다.

/project

docker build -t myDockerImage .

현재 경로에서 Dockerfile 파일을 찾고 있으면 이를 myDockerImage라는 도커이미지로 만들어라

docker run -d myDockerImage -p 8080:8080

생성한 도커 이미지가 제대로 jar파일을 실행하는 이미지 인지 테스트 해본다.

 

 

 

3-2. 구글 클라우드 플랫폼에서 Dockerfile 을 Docker image로 만들고 배포하려고 한다.

구글 클라우드에 프로젝트를 하나 생성해둔다. (생성하고 나면 프로젝트_아이디 가 하나 생성된다.)

구글 클라우드에서 생성한 프로젝트에 스프링 프로젝트를 올리려고한다.

커맨드 라인으로도 올릴수 있고 클라우드 웹에서도 올릴 수 있다.

gcloud init

 

gcloud config set project 프로젝트_아이디

gcloud 를 프로젝트_아이디와 연결한다.

gcloud container builds submit --tar=gcr.io/프로젝트_아이디/demo:v1 .

프로젝트_아이디에 프로젝트를 Docker image로 만든다. 그리고 이를 컨테이너에 올린다. 컨테이너에 올라가는 프로젝트의 버전은 v1이다.

gcloud container images list

구글 클라우드에 올린 컨테이너 들을 확인할 수 있다.

gcloud container images list-tags gcr.op/프로젝트_아이디/demo

구글 클라우드에 올린 컨테이너 gcr.op/프로젝트_아이디/demo 의 테그(버전) 리스트를 확인 할 수 있다.

 

자세한 구글 클라우드 플랫폼 튜토리얼

https://cloud.google.com/community/tutorials/kotlin-springboot-container-engine

 

Run a Kotlin Spring Boot application on Google Kubernetes Engine  |  Google Cloud Platform Community  |  Google Cloud

 

cloud.google.com

 

 

 

 

 

4. 쿠버네티스 클러스터 생성

구글 클라우드 웹 에서 kubernetes engine -> kubernetes clusters -> enable billing 하여 클러스터를 활성화 시킨다.

gcloud container clusters create demo-cluster --num-nodes=2

클러스터를 만든다. 이름은 demo-cluster 다. 클러스터의 노드 갯수는 2개의 VM으로 한다. 2개의 VM 은 쿠버네티스로 묶인다. 그냥 커맨드 라인 치지말고 웹에서 클러스터를 생성할 수도 있다.

 

 

 

 

 

5. 쿠버네티스 Service 생성

kubectl run demo --image=gcr.io/프로젝트_아이디/demo:v1 --port 8080

 run 커맨드로 pod 에 올라간 프로젝트 이미지 (gcr.io/프로젝트_아이디/demo:v1) 를 실행한다. pod는 demo 라는 이름의 service 로 실행된다. 포트는 8080으로 열었다.

kubectl get pods

pod가 실행되고 있는것을 확인 할 수 있다.

kubectl expose deployment demo --type=LoadBalancer --port 80 --target-port 8080

demo service 의 loadbalance 를 열어준다. loadbalance 는 포트 80이다. 이로서 deployment 에 80으로 접근하면 loadbalancer 가 알아서 pod 를 잘 선택하고 pod 안에있는 8080 포트로 연결된다.

kubectl get services

demo 라는 이름의 service가 돌아가고 있는것을 확인한다. 그리고 demo 라는 이름의 service 중 LoadBalancer 외부 IP를 받아온다. 이 IP 가 외부 사용자들이 접근하는 주소다.

 

* 쿠버네티스에서는 pod 를 통해 서버를 scaling 할 수 있다. pod 의 크기를 2 -> 3으로

kubectl scale deployment demo --replicas=3

 

쿠버네티스

개략 : https://kok202.tistory.com/24?category=785942

읽으면 좋은 글 : https://subicura.com/2019/05/19/kubernetes-basic-1.html

Service 와 deploment 의 차이 : https://mindmajix.com/kubernetes-deployment-vs-kubernetes-services

 

 

 

 

 


6. 프로젝트 버전 up

gcloud container builds submit --tar=gcr.io/프로젝트_아이디/demo:v2 .

프로젝트의 버전을 v2 로 해서 컨테이너에 올린다.

gcloud container images list-tags gcr.op/프로젝트_아이디/demo

프로젝트 버전 v2 가 컨테이너에 제대로 들어갔는지 확인

kubectl set image deployment/demo demo=gcr.io/프로젝트_아이디/demo:v2

쿠버네티스가 다른 버전을 바라보도록 변경

 

 

 

 

 

완전히 실행 가능한 독립적인 jar 파일을 만들 수 도 있다. -> 생략