Google Cloud Platform 에서 쿠버네티스를 운영하기 위한 방법으로 Kubernetes Engine 과 Kubernetes API 를 사용하여 어플리케이션을 배포 및 관리 할 수 있다. 간단하게 쿠버네티스를 이용하여 어플리케이션을 테스트 해보자.


GKE(Google Kubernetes Engine) 를 사용하여 쿠버네티스 클러스터 생성

kubectl 를 사용하여 Docker 컨테이너를 배포 및 관리

쿠버네티스의 Deployment 와 Service 를 사용하여 마이크로 서비스로 어플리케이션 분리



1. 구성 연결


GCP 콘솔의 APIs & services 에서 Kubernetes Engine API 와 Container Registry API 이 활성화 되어 있는지 체크하고, Cloud Shell 이나 Cloud SDK 를 사용하여 GCP 계정, 프로젝트, zone 설정 등을 확인한다.


> gcloud config list



2. 클러스터-노드 생성


> gcloud container clusters create bootcamp --num-nodes 5 --scopes "https://www.googleapis.com/auth/projecthosting,storage-rw"


NAME      LOCATION       MASTER_VERSION  MASTER_IP     MACHINE_TYPE   NODE_VERSION   NUM_NODES  STATUS

bootcamp  us-central1-a  1.11.7-gke.12   35.202.79.78  n1-standard-1  1.11.7-gke.12  5          RUNNING


위의 명령으로 클러스터(bootcamp) 와 node 가 5개 생성된다. --scopes 인수는 나중에 사용할 프로젝트 호스팅과 Google Cloud Storage API 에 대한 액세스를 제공한다.


> kubectl get nodes

NAME                                      STATUS    ROLES     AGE       VERSION

gke-bootcamp-default-pool-654208f7-2pc5   Ready     <none>    8m        v1.11.7-gke.12

gke-bootcamp-default-pool-654208f7-4hbc   Ready     <none>    8m        v1.11.7-gke.12

gke-bootcamp-default-pool-654208f7-9wxw   Ready     <none>    8m        v1.11.7-gke.12

gke-bootcamp-default-pool-654208f7-qf9k   Ready     <none>    8m        v1.11.7-gke.12

gke-bootcamp-default-pool-654208f7-x9vz   Ready     <none>    8m        v1.11.7-gke.12


GCP 콘솔에서 확인하고 싶다면 클러스터는 [Kubernetes Engine > Cluster], 노드는 [Compute Engine > VM Instances] 에서 확인할 수 있다. 아래 예제처럼 GCP 콘솔에서 직접 클러스터를 생성할 수도 있다.






3. 어플리케이션 배포


> kubectl create deployment nginx --image=nginx:1.10.0

deployment.apps/nginx created


> kubectl get pods -o wide

NAME                     READY   STATUS    RESTARTS  IP          NODE

nginx-7d79bd4478-86289   1/1     Running   0         10.48.1.5   gke-bootcamp-default-pool-654208f7-4hbc


위 명령으로 nginx 컨테이너를 담은 파드가 생성되고 노드에 배치됐다.



4. 서비스 생성 (외부IP 노출)


> kubectl expose deployment nginx --port 80 --type LoadBalancer

service/nginx exposed


> kubectl get services

NAME         TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE

kubernetes   ClusterIP      10.51.240.1     <none>          443/TCP        18m

nginx        LoadBalancer   10.51.250.242   34.66.113.107   80:32693/TCP   1m


위 명령으로 LoadBalancer 타입의 서비스를 생성하여 nginx 컨테이너를 외부에서 접근할 수 있게 한다. 생성된 External-IP 와 port 는 서비스가 유지되는 동안만 유효하다. (External-IP 생성에 일정 시간이 소요될 수 있음)



5. pod 수 확장


> kubectl scale deployment nginx --replicas 3

deployment.extensions/nginx scaled


> kubectl get pods -o wide

NAME                     READY   STATUS    RESTARTS  IP          NODE                                      NOMINATED NODE

nginx-7d79bd4478-86289   1/1     Running   0         10.48.1.5   gke-bootcamp-default-pool-654208f7-4hbc

nginx-7d79bd4478-j6wql   1/1     Running   0         10.48.2.4   gke-bootcamp-default-pool-654208f7-9wxw

nginx-7d79bd4478-zznhd   1/1     Running   0         10.48.3.5   gke-bootcamp-default-pool-654208f7-2pc5


위 명령은 생성해 놓은 nginx 배포(deployment) 의 pod 수를 3 개로 늘린다. 마스터는 요청에 따라 적절한 노드를 찾아 2개의 파드를 각각 추가로 배치한다. 트래픽이 많거나 적을 경우 위와 같이 파드 수를 늘리거나 줄일 수 있다.



6. 어플리케이션 테스트


> curl http://<External IP>:80





7. 삭제


파드나 서비스를 더 이상 사용하지 않을 경우 아래와 같이 삭제한다.


> kubectl delete deployment nginx

deployment.extensions "nginx" deleted


> kubectl get pods

No resources found.


> kubectl delete service nginx




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,