맥OS 로컬 개발환경 "쿠버네티스"에 스프링 부트 애플리케이션을 배포하는 방법에 대해서 정리하였다.
이 글은 맥북을 사용하는 개발자 중에서 쿠버네티스를 처음 접하는 초보자에게 추천하는 글이다. 쿠버네티스를 이미 사용중인 개발자는 해당 글은 읽지 않아도 된다. 필자의 글에서 잘못된 내용이 있다면, 그냥 지나가지 말고 댓글로 이런저런 의견을 남겨주길 바란다.
[위키피디아]쿠버네티스(Kubernetes)는 디플로이 자동화, 스케일링, 컨테이너화된 애플리케이션의 관리를 위한 오픈 소스 시스템으로서 구글에 의해 설계되었고 현재 리눅스 재단에 의해 관리되고 있다. 목적은 여러 클러스터의 호스트 간에 애플리케이션 컨테이너의 배치, 스케일링, 운영을 자동화하기 위한 플랫폼을 제공하기 위함이다. 도커를 포함하여 일련의 컨테이너 도구들과 함께 동작한다. 이 글에서는 쿠버네티스에 대해서 자세하게 다루지 않는다. 자세한 내용은 쿠버네티스 한글화 문서를 참고하길 바란다.
https://kubernetes.io/ko/docs/concepts/overview/what-is-kubernetes/
맥북 로컬 환경에 도커, 쿠버네티스 환경을 구축한다.
"docker desktop" 를 설치하면 아주 쉽게 도커, 쿠버네티스를 실행할 수 있다. "docker desktop" 최신 버전을 설치하자.
https://www.docker.com/products/docker-desktop
필자가 맥북에 설치한 버전은 2.1.0.5 이다.
설치를 하면 상단에 도커 이미지가 표시된다.
메뉴에서 Preferences 를 선택하면 아래와 같은 설정화면이 나오는데, 쿠버네티스 탭에서 Enable Kubernetes 를 선택하도록 하자.
하단에 보면 쿠버네티스가 시작하고 있는 것을 확인할 수 있다.
쿠버네티스가 정상적으로 실행이 되면 맥 터미널에서 kubectl cluster-info 명령어를 사용해서 쿠버네티스가 정상적으로 실행되었는지 확인할 수 있다.
:kubectl cluster-info
kubectl get all 명령어는 Pod, Service 등의 정보를 확인할 수 있다.
:kubectl get all
쿠버네티스 대시보드를 사용하기 위해서, 커맨드라인 프록시를 실행한다.
:kubectl proxy
https://kubernetes.io/ko/docs/tasks/access-application-cluster/web-ui-dashboard/
kubectl은 http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ 에 대시보드를 사용하는 것을 가능하게 해줄 것이다. 하지만, 아직 로그인에 필요한 계정이 없기 때문에 계정을 먼저 만들어야 한다.
계정 생성 및 로그인은 이 글에서는 생략하겠다. 어렵지 않다. 직접 구글링을 해서 찾아서 해보길 바란다.
도커 Repository 를 사용하기 위해서 docker.com 에 가입한다.
참고로 회사에서는 Private Docker Repository 를 구축해야 한다. 이 글은 로컬 개발환경에서의 테스트 환경이므로 가볍게 Public 도커 허브를 사용해보겠다.
배포하는 과정은 크게 도커 이미지 빌드, 도커 이미지 푸쉬, 쿠버네티스에 배포 의 세가지 순서로 진행된다.
아주 심플한 스프링부트 애플리케이션을 Gradle 환경에서 시작한다.
RestController 에 심플한 코드를 추가하였다.
프로젝트 루트에 Dockerfile 를 생성한다.
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
일단, 애플리케이션을 빌드해서 jar 파일을 생성해야 한다. 루트 디렉토리에서 gradlew 명령어를 수행한다.
이 글은 gradle 환경으로 작성하였다. maven 에서는 디렉토리 위치가 다르다는 점을 명심하길 바란다. jar파일이 생성되었다면 도커 이미지를 빌드하자. Dockerfile 이 있는 루트에서 실행해야 하며 반드시 쩜(.) 을 입력해야 한다.
도커 이미지가 빌드가 잘 되면 아래 명령어를 실행해서 정상적으로 되었는지 확인할 수 있다.
:docker images
빌드가 잘 된 도커 이미지를 도커 허브에 푸쉬하자. 위에서도 설명했지만, 일반적인 회사에서는 Private Docker Registry 를 운영해야 한다. 참고로 sieunkr 은 필자의 아이디이다. 각자의 아이디를 사용하길 바란다.
:docker login
:docker push id/sample
명령어를 실행하면 도커 허브에 도커 이미지가 푸쉬된다. 만약, docker login 이 안되어있다면 로그인을 먼저 하자. 정상적으로 푸쉬가 되면 아래와 같다.
도커 허브에 접속해서, 방금 올린 푸쉬한 도커 이미지를 확인할 수 있다.
이제 드디어 쿠버네티스에 배포를 하자.
:kubectl create deployment sample --image=sieunkr/sample --dry-run -o=yaml > deployment.yaml
:echo --- >> deployment.yaml
:kubectl create service clusterip sample --tcp=8080:8080 --dry-run -o=yaml >> deployment.yaml
위 세개의 명령어를 수행하면 deployment.yml 파일이 생성이 된다.
배포를 위해 명령어를 수행한다.
:kubectl apply -f deployment.yaml
아래와 같이 명령어가 나오면 일단 성공이다.
하지만, 정상적으로 배포가 되었는지 자세히 확인해보자.
:kubectl get all | grep sample
pod 에도 잘 올라갔다. 쿠버네티스 대시보드를 확인해보자. Deployments 메뉴에서는 아래와 같다.
Pods 메뉴에서는 아래와 같다.
Pods 에 우측 햄버거 버튼을 클릭하면 Log 를 확인할 수 있다.
마지막으로, 외부에서 HTTP 접근하기 위해서 port-forward 를 사용해보자.
:kubectl port-forward svc/sample 8080:8080
크롬에서 한번 localhost:8080/api 를 호출해보자.
수차례 강조하지만, 해당 과정은 맥OS 의 로컬 개발환경에서 테스트 하는 과정이다. 실무 환경은 절대 이렇게 구축해서는 안된다.
위에도 설명하였지만, Docker Registry 는 Private하게 구축해야 한다. 회사의 자산(소스코드)는 외부에 공개가 되어서는 안된다. 필자의 회사에서는 Harbor 이라는 기업용 Regisitry로 운영중이다. 또한, Gradle 에서 스프링 애플리케이션 빌드 시 자동으로 도커 이미지가 빌드 및 푸쉬가 되도록 구성되어 있다. 매번 개발자가 docker build, push 명령어를 수행하지 않는다. 그리고, 쿠버네티스는 클러스트 환경으로 구축되어 그라파나, 프로메테우스가 연동되어 실시간 모니터링할 수 있는 시스템이 구축되어있다. 실무에서의 환경에 대해서는 이 글에서 자세하게 다루지 않겠다. 필자가 쿠버네티스에 익숙해지면 그때 다시 각잡고 글을 작성해보겠다.