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 설정 등을 확인한다.
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