이전 포스트에서는 PC에 Docker를 설치하고 3 티어 어플리케이션 구성을 했지만,
이제 Kubernetes 에다가 컨테이너로 구성된 3티어 어플리케이션을 배포해본다.
준비사항
기존에 빌드한 docker image를 kubernetes에서 가져올 수 있도록 dockerhub에 저장한다.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
apache-petclinic latest fb2b159ac038 18 hours ago 242MB
tomcat-petclinic latest 3a818df03a1d 43 hours ago 584MB
docker images를 통해 apache, tomcat 컨테이너 이미지를 확인 한 뒤 dockerhub에 올린다.
DockerHub에 이미지 올리기
docker push image에 대한 가이드는 공식 문서를 참조하자
https://docs.docker.com/docker-cloud/builds/push-images/
가이드대로 dockerhub에 로그인을 한다.
$ export DOCKER_ID_USER="thkang0"
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: thkang0
Password:
Login Succeeded
docker tag 명령을 통해 업로드할 이미지에 Tag를 단다.
$ docker tag --help
Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
저장되어 있는 docker image에 tag를 추가한다.
docker tag apache-petclinic $DOCKER_ID_USER/apache-petclinic
docker tag tomcat-petclinic $DOCKER_ID_USER/tomcat-petclinic
위와 같이 tag를 달게 되면 latest로 자동적으로 tag가 부여되고, 만약 dev, stage, prod등과 같이 tag를 부여한다면 아래와 같이 수행한다.
docker tag thkang0/tomcat-petclinic thkang0/tomcat-petclinic:prod
tag가 추가된 이미지를 dockerhub로 업로드 한다.
docker push $DOCKER_ID_USER/apache-petclinic
docker push $DOCKER_ID_USER/tomcat-petclinic
성공적으로 업로드가 되고 나면 https://hub.docker.com 에 본인이 업로드한 이미지가 아래와 같이 보인다
Kubernetes에 3티어 어플리케이션 배포하기
위에서 저장한 docker 이미지를 kubernetes에 배포를 해본다.
Deploy MySQL
MySQL 기본 이미지를 kubectl run 명령어로 배포한다.
kubectl run mysql-petclinic --image=mysql:5.7.8 --port=3306 --replicas=1 --env="MYSQL_ROOT_PASSWORD=petclinic" --env="MYSQL_DATABASE=petclinic" --labels="name=mysql-petclinic,tier=backend,app=tomcat-petclinic"
컨테이너가 생성되면 아래와 같이 pod안에 Running 상태로 변경된다
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-petclinic-b854f5ccc-tlvzt 1/1 Running 0 2m
Tomcat이 MySQL로 접속하기 위한 내부 LoadBalancer를 생성한다.
kubectl expose deployment mysql-petclinic --type=ClusterIP
ClusterIP로 생성된 SVC는 kubectl get svc 명령어로 확인 할 수 있다.
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql-petclinic ClusterIP 10.152.183.134 <none> 3306/TCP 49s
Deploy Tomcat
Docker Hub에 업로드 된 이미지로 배포한다.
kubectl run tomcat-petclinic --image=thkang0/tomcat-petclinic:latest --port=8009 --replicas=1 --labels="name=tomcat-petclinic,tier=backend,app=tomcat-petclinic"
컨테이너가 생성된 것을 확인한다.
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-petclinic-b854f5ccc-knrmf 1/1 Running 0 2h
tomcat-petclinic-6c66899d7b-2bdwz 1/1 Running 0 3m
Apache가 접속할 수 있도록 내부 LoadBalancer를 생성한다.
kubectl expose deployment tomcat-petclinic --type=ClusterIP
생성되고 나면 아래와 같이 ClusterIP가 할당된다
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql-petclinic ClusterIP 10.152.183.134 <none> 3306/TCP 24m
tomcat-petclinic ClusterIP 10.152.183.100 <none> 8009/TCP 6s
Deploy Apache2
이제 마지막 Apache 컨테이너를 배포한다.
kubectl run apache-petclinic --image=thkang0/apache-petclinic:latest --port=80 --replicas=1 --labels="name=apache-petclinic,tier=frontend,app=tomcat-petclinic"
생성되고 나면 WEB, WAS, DB가 각각 POD로 생성된다.
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
apache-petclinic-54bf9c58cb-5w46p 1/1 Running 0 56s
mysql-petclinic-b854f5ccc-knrmf 1/1 Running 0 2h
tomcat-petclinic-58d6f5959c-kqsw5 1/1 Running 0 4m
외부에서 접속해야 하는 방식은 NodePort, LoadBalancer, Ingress가 있는데 현재 테스트 환경은 Openstack위에 Kubernetes를 구성해서 Ingress 타입으로 생성한다.
우선 NodePort로 내부에서 접속할 수 있도록 expose한다.
kubectl expose deployment apache-petclinic --target-port=80 --type=NodePort
현재 서비스를 확인한다.
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
apache-petclinic NodePort 10.152.183.19 <none> 80:30124/TCP 1m
mysql-petclinic ClusterIP 10.152.183.134 <none> 3306/TCP 47m
tomcat-petclinic ClusterIP 10.152.183.100 <none> 8009/TCP 23m
아래와 같이 yaml파일을 만들어서 Ingress Resource를 생성한다.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: frontend-ingress
spec:
backend:
serviceName: apache-petclinic
servicePort: 80
kubectl create -f 명령어로 생성한다.
kubectl create -f apache-ingress.yaml
생성되고 나면 아래와 같이 해당 ip를 확인할 수 있다
$ kubectl get ing
NAME HOSTS ADDRESS PORTS AGE
frontend-ingress * 172.16.1.14,1... 80 11s
3티어 어플리케이션 확인
오픈스택 환경에서 ingress로 외부 접속을 생성했기 때문에 아래와 같은 네트워크 경로가 생성되었다.
internet
|
[ Ingress ]
--|-----|--
[ Services ]
공유기 아래에 오픈스택(Openstack)위로 Kubernetes를 구성했기 때문에 공유기에 설정된 IP대역(192.168.76.0/24)이 외부 IP가 되고, 위의 Ingress IP에 나오는 호스트의 Floating IP로 접속을 하게 되면 아래와 같이 Petclinic Spring Framework의 샘플 어플리케이션이 접속된다.