본문 바로가기
Tech/Containers

[Kubernetes]컨테이너를 이용하여 웹 어플리케이션 배포하기(3티어구조) #3

by 타이호 2018. 3. 28.
반응형

이전 포스트에서는 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의 샘플 어플리케이션이 접속된다.



반응형