땃쥐네

[GKE] 구글 쿠버네티스 클러스터로 애플리케이션 배포하기 본문

DevOps/Google Cloud Platform

[GKE] 구글 쿠버네티스 클러스터로 애플리케이션 배포하기

ttasjwi 2024. 2. 28. 21:51

[GKE] Google Kubernetes Engine (GKE) 시작하기 글에서 이어집니다.

 

이전 글에서, 구글 클라우드 플랫폼 상에서 쿠버네티스 클러스터를 실행하는 것을 다뤄봤습니다.

클러스터에 접근하여 애플리케이션을 배포해보겠습니다.


 

Cloud Shell 에서 클러스터 연결

우선 우측 상단에 보이시는 Cloud Shell 활성화 버튼을 누릅니다.

 

아래에 터미널이 활성화되고 명령을 입력할 수 있습니다.

 

지금 우리가 접속한 쉘은 클러스터와 별도로 존재하는 VM에 위치해있다는 점에 주의합시다.

이제 우리가 아까 만든 클러스터에 원격으로 접근할 수 있도록 해야합니다.

 

클러스터 페이지의 우리가 만든 클러스터를 선택하고, 연결 버튼을  클릭합니다.

 

 

명령줄을 통해 우리 클러스터에 연결하는 방법을 제공해주네요.

 

CLOUD SHELL에서 실행 버튼을 클릭하면 쉘에 그대로 저 내용이 붙여넣기 됩니다.(수동으로 복사-붙여넣기 해도 됩니다.)

엔터를 입력하여 실행하면 됩니다.

 

 

승인 창이 뜨면 승인.

 

Fetching cluster endpoint and auth data.
kubeconfig entry generated for my-first-cluster.

 

이제 클러스터에 접근하는데 필요한 정보 및 인증 정보를 가져오는데 성공했습니다.

이를 기반으로 my-first-cluster에 접근하는데 필요한 설정이 구성됩니다.


클러스터에 위치한 노드들 조회

$ kubectl get nodes
NAME                                              STATUS   ROLES    AGE   VERSION
gke-my-first-cluster-default-pool-21ba8116-h6ks   Ready    <none>   12m   v1.27.8-gke.1067004
gke-my-first-cluster-default-pool-21ba8116-ntq4   Ready    <none>   12m   v1.27.8-gke.1067004
gke-my-first-cluster-default-pool-21ba8116-rkt8   Ready    <none>   12m   v1.27.8-gke.1067004

 

kubectrl get nodes 명령어를 통해, 클러스터에 위치한 쿠버네티스 노드 목록을 조회해올 수 있어요.

3개의 노드들이 있는 것을 확인할 수 있네요.


톰캣 포드(pod) 5대 배포하기

서비스 실행

kubectl create deploy tc --image=consol/tomcat-7.0 --replicas=5

 

create deploy tc : tc라는 이름의 서비스를 실행합니다.

 

--image=consol/tomcat-7.0 : consol/tomcat-7.0 이미지를 이용하여

--replicas=5 : 5대의 포드로 구성된

 

 

여기서 우리는 톰캣 이미지를 사용했는데, 이를 응용하여

 

spring boot 서버 이미지를 가져다 여러대 띄운다거나

next.js 서버 이미지를 가져다 여러대 띄운다거나

nest.js 서버 이미지를 가져다 여러대 띄운다거나

nginx 이미지를 가져다 여러대 띄운다거나 하는 것들이

 

가능해집니다.

ttasjwi20240228@cloudshell:~ (ttasjwi-2024-0228-1649)$ kubectl get pods
NAME                 READY   STATUS              RESTARTS   AGE
tc-744f85d54-9tmpv   0/1     ContainerCreating   0          29s
tc-744f85d54-hmqx7   0/1     ContainerCreating   0          29s
tc-744f85d54-nsqgd   0/1     ContainerCreating   0          28s
tc-744f85d54-vgw2h   0/1     ContainerCreating   0          29s
tc-744f85d54-xssq4   0/1     ContainerCreating   0          29s
ttasjwi20240228@cloudshell:~ (ttasjwi-2024-0228-1649)$ kubectl get pods
NAME                 READY   STATUS    RESTARTS   AGE
tc-744f85d54-9tmpv   1/1     Running   0          68s
tc-744f85d54-hmqx7   1/1     Running   0          68s
tc-744f85d54-nsqgd   1/1     Running   0          67s
tc-744f85d54-vgw2h   1/1     Running   0          68s
tc-744f85d54-xssq4   1/1     Running   0          68s

 

get pods 명령어를 통해 포드들의 상태를 조회해보면, 컨테이너 생성을 거쳐서, 실행된 것을 확인할 수 있어요.

하지만 이렇게 놓고보면 각각의 톰캣 포드들이 실행됐지만 여기에 접근할 수 없죠?

 

 

서비스를 외부에 노출

kubectl expose deploy tc --type=LoadBalancer --port=80 --target-port=8080

 

expose deploy tc : tc를 노출시켜라

 

--type:LoadBalancer : 로드밸런싱 방식으로

--port=80 : 80번 포트를 노출 시켜라

--target-port: 그 노출을 각 포드의 8080번 포트에 연결

 

 

ttasjwi20240228@cloudshell:~ (ttasjwi-2024-0228-1649)$ kubectl get pods,svc

NAME                     READY   STATUS    RESTARTS   AGE
pod/tc-744f85d54-9tmpv   1/1     Running   0          12m
pod/tc-744f85d54-hmqx7   1/1     Running   0          12m
pod/tc-744f85d54-nsqgd   1/1     Running   0          12m
pod/tc-744f85d54-vgw2h   1/1     Running   0          12m
pod/tc-744f85d54-xssq4   1/1     Running   0          12m

NAME                 TYPE           CLUSTER-IP   EXTERNAL-IP    PORT(S)        AGE
service/kubernetes   ClusterIP      10.84.0.1    <none>         443/TCP        43m
service/tc           LoadBalancer   10.84.1.69   34.64.58.188   80:30265/TCP   55s

 

좀 기다려보면, 서비스가 퍼블릭 ip 34.64.58.188에 배포되고 80번 포트가 열려있는 것을 확인할 수 있네요.

포드 5대 역시 정상적으로 동작중입니다.


배포된 톰캣 확인

 

해당 ip 에 브라우저를 통해 접속해보면 톰캣이 띄워진 것을 확인할 수 있어요.

 

Server Status를 클릭하면 로그인 창이 뜨는데, admin / admin 을 입력하여 로그인 가능합니다.

 

HostName과 Ip Address가 나옵니다.

그런데 새로고침을 반복해보시면 HostName이 계속 바뀌고 IP Address도 계속 바뀌는 것을 볼 수 있어요

 

ttasjwi20240228@cloudshell:~ (ttasjwi-2024-0228-1649)$ kubectl get pods -owide
NAME                 READY   STATUS    RESTARTS   AGE   IP           NODE                                              NOMINATED NODE   READINESS GATES
tc-744f85d54-9tmpv   1/1     Running   0          21m   10.80.2.8    gke-my-first-cluster-default-pool-21ba8116-ntq4   <none>           <none>
tc-744f85d54-hmqx7   1/1     Running   0          21m   10.80.0.6    gke-my-first-cluster-default-pool-21ba8116-h6ks   <none>           <none>
tc-744f85d54-nsqgd   1/1     Running   0          21m   10.80.0.7    gke-my-first-cluster-default-pool-21ba8116-h6ks   <none>           <none>
tc-744f85d54-vgw2h   1/1     Running   0          21m   10.80.2.7    gke-my-first-cluster-default-pool-21ba8116-ntq4   <none>           <none>
tc-744f85d54-xssq4   1/1     Running   0          21m   10.80.1.14   gke-my-first-cluster-default-pool-21ba8116-rkt8   <none>           <none>

 

 

kubectl get pods -owide 를 입력해보면 각 포드별로 어느 ip가 할당 됐는지, 어느 node에 배포됐는 지 확인해볼 수 있는데요.

5개의 포드가 3대의 노드에 골고루 배치된 것을 확인할 수 있어요.(2개 / 2개 / 1개)

 

위에서 확인한 hostname과 ip address가 대응되어 있는 것을 볼 수 있습니다.

 

퍼블릭 ip를 통해 접속할 때, 우리의 요청이 5대의 톰캣으로 골고루 로드밸런싱되는 것입니다.


클러스터 삭제

 

톰캣이 잘 배포된 것을 확인했으니 클러스터를 삭제하여 불필요한 비용이 청구되는 것을 방지합시다.

Comments