Google Cloud Platform에서 Docker 사용하기

이재홍 http://www.pyrasis.com 2014.08.02 ~ 2014.09.20

Container Engine에서 Docker 사용하기

구글 클라우드 콘솔(https://console.developers.google.com)에 접속한 뒤 프로젝트를 선택합니다. 그리고 컴퓨팅 → Container Engine을 클릭하고 Create a cluster 버튼을 클릭합니다.


그림 11-6 Container Engine 클러스터 만들기

클러스터를 생성합니다.

  • 이름: 클러스터 이름입니다. 여기서는 examplecluster를 입력합니다.
  • 설명: 클러스터 설명입니다. 각자 상황에 맞게 입력합니다.
  • 영역: VM 인스턴스가 생성될 영역입니다. 저는 asia-east1-a를 설정하였습니다.
  • CLUSTER SIZE: 클러스터 VM 인스턴스 개수입니다. 여기서 기본값 그대로 사용합니다. 배포를 위한 인스턴스는 제외되므로 1을 설정하면 VM 인스턴스는 2개 생성됩니다.
  • 머신 유형: VM 인스턴스 머신 유형입니다. 저는 f1-micro를 설정하였습니다.

설정이 완료되었으면 만들기 버튼을 클릭합니다.


그림 11-7 Container Engine 클러스터 만들기

Container Engine 클러스터가 만들어졌습니다.


그림 11-8 Container Engine 클러스터 생성 완료

Container Engine은 이 책을 쓰는 시점에 Alpha 버전입니다. 따라서 Google Cloud SDK에 preview 명령을 설치하고, 이 명령을 기준으로 설명하겠습니다. 추후 정식 버전이 출시되면 preview 명령은 설치하지 않아도 됩니다.

$ gcloud components update preview

 

다음 내용을 nginx-pod.json 파일로 저장합니다.

nginx-pod.json

{
  "apiVersion": "v1beta1",
  "kind": "Pod",
  "id": "nginx-pod",
  "desiredState": {
    "manifest": {
      "version": "v1beta1",
      "id": "nginx-pod",
      "containers": [{
        "name": "hello-nginx",
        "image": "nginx",
        "ports": [{ "hostPort": 80, "containerPort": 80 }]
      }]
    }
  },
  "labels": { "name": "hello-nginx" }
}

Kubernetes Pod 형식이며 주요 부분만 간단하게 설명하겠습니다.

  • apiVersion: Pod 설정 파일 버전입니다. 이 부분은 추후 바뀔 수 있으므로 다음 링크를 참조하기 바랍니다.
    https://cloud.google.com/container-engine/docs/pods/operations#manifest
  • kind: Pod을 만들어야 하므로 Pod을 설정합니다. Pod은 여러 개의 컨테이너를 포함하고 있으며 동일한 물리 호스트(Physical host)에서 실행됩니다.
  • id: Pod을 구별하는 ID입니다.
  • desiredState: 실행할 컨테이너를 설정합니다.
    • containers: 컨테이너 설정을 배열 형태로 작성합니다.
      • name: Docker 컨테이너 이름입니다.
      • image: 컨테이너로 생성할 Docker 이미지입니다. Docker Hub에서 이미지를 받아오며, 여기서는 nginx 공식 이미지를 사용하겠습니다.
      • ports: 외부에서 접속할 수 있도록 hostPort, containerPort에 80번을 설정합니다.
  • labels: Pod을 구분하는 값이며 여러 개를 설정할 수 있습니다. 서비스에서 Pod을 연결할 때 labels에 설정된 값을 사용합니다.

다음 명령을 실행하여 Pod을 생성합니다.

$ gcloud preview container pods --cluster=examplecluster create --name nginx-pod \
    --zone=asia-east1-a \
    --config-file=./nginx-pod.json
  • --cluster: 클러스터 이름입니다. 앞에서 생성한 examplecluster를 설정합니다.
  • --name: 생성할 Pod 이름입니다. nginx-pod을 설정합니다.
  • --zone: VM 인스턴스가 생성된 영역입니다. 앞에서 asia-east1-a에 생성했으므로 asia-east1-a를 설정합니다.
  • --config-file: 설정 파일 경로입니다. nginx-pod.json을 설정합니다.

다음 내용을 nginx-service.json으로 저장합니다.

nginx-service.json

{
  "apiVersion": "v1beta1",
  "kind": "Service",
  "id": "nginx",
  "port": 80,
  "containerPort": 80,
  "selector": { "name": "hello-nginx" },
  "createExternalLoadBalancer": true
}
  • apiVersion: 서비스 설정 파일 버전입니다.
  • kind: 서비스를 만들어야 하므로 Service을 설정합니다.
  • id: 서비스를 구분하는 ID입니다.
  • port: 서비스 포트 번호입니다. 여기서는 80번을 설정합니다.
  • containerPort: Pod의 컨테이너에서 열어놓은 포트번호입니다. 앞에서 설정한대로 80번을 설정합니다.
  • selector: 연결할 Pod을 설정합니다. 앞에서 설정한대로 hello-nginx를 설정합니다.
  • createExternalLoadBalancer: 네트워크 부하 분산을 생성 설정입니다. 네트워크 부하 분산을 생성할 것이므로 true로 설정합니다.

다음 명령을 실행하여 서비스를 생성합니다.

$ gcloud preview container services --cluster=examplecluster create \
    --zone=asia-east1-a \
    --config-file=./nginx-service.json
  • --cluster: 클러스터 이름입니다. 앞에서 생성한 examplecluster를 설정합니다.
  • --zone: VM 인스턴스가 생성된 영역입니다. 앞에서 asia-east1-a에 생성했으므로 asia-east1-a를 설정합니다.
  • --config-file: 설정 파일 경로입니다. nginx-service.json을 설정합니다.

다음 명령을 실행하여 클러스터 노드의 방화벽에서 80번 포트를 열어줍니다.

$ gcloud compute firewall-rules create examplecluster-node-80 \
    --allow=tcp:80 \
    --target-tags k8s-examplecluster-node
  • examplecluster-node-80: 방화벽 규칙 이름입니다. 각자 상황에 맞게 설정합니다.
  • --allow: 허용할 프로토콜과 포트 번호입니다. 여기서는 tcp:80으로 설정합니다.
  • --target-tags: 방화벽 규칙을 적용할 노드입니다. k8s-<클러스터 이름>-node 형식입니다. 클러스터 이름을 examplecluster로 생성했으므로 k8s-examplecluster-node를 설정합니다.

다시 구글 클라우드 콘솔로 접속하여 컴퓨팅 → Compute Engine → 네트워크 부하 분산을 클릭한 뒤 IP 주소를 확인합니다.


그림 11-9 네트워크 부하 분산의 IP 주소 확인

웹 브라우저를 실행하고 네트워크 부하 분산의 IP 주소로 접속하면 Container Engine의 Pod에서 실행한 nginx의 기본 페이지가 표시됩니다.


그림 11-10 Container Engine의 Pod에서 실행한 nginx에 접속

Kubernetes
Kubernetes는 구글에서 개발하고 있는 컨테이너, 클러스터 관리 도구입니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

30 November 2014