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
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 파일을 만들 수 도 있다. -> 생략
'[공부] 영상 > 스프링 부트 강의' 카테고리의 다른 글
스프링 부트 강의 정리 (35~37 : Actuator) (0) | 2019.05.25 |
---|---|
스프링 부트 강의 정리 (31~34 : NoSQL, API Client) (0) | 2019.05.19 |
스프링 부트 강의 정리 (28~30 : Database) (0) | 2019.05.19 |
스프링 부트 강의 정리 (26 ~ 27 : Security) (0) | 2019.05.11 |
스프링 부트 강의 정리 (23 ~ 25 : 웹플럭스, 컨테이너) (0) | 2019.05.11 |