11月5日に発表されたばかりのGoogle Container Engine (GKE)をさっそく試してみました。


こんにちは、[会社のブログ](http://liginc.co.jp)で書こうか迷ったのですが、こっちで書きます。
 
<p>さっそくですが、Google Container Engineが発表されましたね!</p>


<p>まだα版とのことですが、試しに使ってみたいと思います!</p>

`※ 単語とか理解していない部分も多いですし、間違った認識の部分もあるかと思います。コメントや生暖かい目で見守っていただければ幸いです。`

参考:
* [Google Container Engine (GKE)を触る](http://qiita.com/soundTricker/items/46b7a7fa87925ea6146a)
* [Google Container Engine (GKE) を触ってみた](http://dev.classmethod.jp/cloud/gke-ataglance/)

![](http://i.gyazo.com/5be11d9ec32f3708cb7e041f8f367ad5.png)

<h2>Google Container Engine(GKE)とは</h2>
<p>2014年11月4日（日本時間5日）にGoogleが発表したDockerコンテナ上でアプリケーションを実行し、それをKubernetesで管理するクラウドサービスです。</p>
<p>略称はGKEらしいです。Google Compute Engineの略称がGCEで名前が被るかららしいです。
</p>

>GKEとは(公式ページより)
Run Docker containers on Google Cloud Platform, powered by Kubernetes. Container Engine takes care of provisioning and maintaining the underlying virtual machine cluster, scaling your application, and operational logistics like logging, monitoring, and health management.
<strong>参考：Google Container Engine</strong></p>
<p class="link">
    <a href="https://cloud.google.com/container-engine/" target="_blank">https://cloud.google.com/container-engine/</a></p>
</dd></dl>

<img src="http://i.gyazo.com/a9dece895f70214d9547a25ffe610e04.png" alt="">

  
なんやらDockerを使ってコンテナをぽこぽこ立ち上げられるらしいですね。
公式チュートリアルをもとに進めてみます。
 
<h2>GKE入門</h2>
<p>さっそく始めて見ます。</p>

## 先に完成イメージ

今回は[公式チュートリアル](https://cloud.google.com/container-engine/docs/getting-started)をもとにDockerでコンテナを立ち上げて、webアプリケーションをwebサーバーとDBサーバー(redis)の複数台構成なものを作ってみます。

<img src="http://i.gyazo.com/5eea64f3884f3afe0ace8903339ebbb8.png" />

完成版はこんな感じのwebアプリケーションです。

裏側ではこんな感じでサーバー構成が作られるみたいです。

```
ID                                     Image(s)               Host                                                                  Labels                                                                 Status
----------                             ----------             ----------                                                            ----------                                                             ----------
redis-master-pod                       gurpartap/redis        k8s-first-vm2-node-1.c.glossy-infinity-756.internal/107.178.214.143   name=redis,role=master                                                 Running
e8efbf42-6646-11e4-9df1-42010af031e7   gurpartap/redis        k8s-first-vm2-node-1.c.glossy-infinity-756.internal/107.178.214.143   name=redis,replicationController=redis-worker-controller,role=worker   Running
e8f0c409-6646-11e4-9df1-42010af031e7   gurpartap/redis        k8s-first-vm2-node-1.c.glossy-infinity-756.internal/107.178.214.143   name=redis,replicationController=redis-worker-controller,role=worker   Running
a832b22e-6647-11e4-9df1-42010af031e7   kubernetes/guestbook   k8s-first-vm2-node-1.c.glossy-infinity-756.internal/107.178.214.143   name=guestbook,replicationController=guestbook-controller              Running
a833a97d-6647-11e4-9df1-42010af031e7   kubernetes/guestbook   k8s-first-vm2-node-1.c.glossy-infinity-756.internal/107.178.214.143   name=guestbook,replicationController=guestbook-controller              Running
a833cb33-6647-11e4-9df1-42010af031e7   kubernetes/guestbook   k8s-first-vm2-node-1.c.glossy-infinity-756.internal/107.178.214.143   name=guestbook,replicationController=guestbook-controller              Running
```

`※ 最後にクラスタ削除をしているので記事内に出てくるURLは死んでます`

<h3>手順1: 登録</h3>
https://cloud.google.com/container-engine/ でStart Your Free Trialから使い始めることができます。

<p>登録しようと思い、アクセスしたところ、<strong>さっそく怒られました苦笑</strong></p>
<img src="http://i.gyazo.com/0cdcd9f9b93d0a3c08da0d3c8c05043a.png" alt="">
<p>どうやら現在は新規ユーザーのみらしいので、一度Googleからログアウトして再度チャレンジしてみます。</p>
<p>Google Cloud Platformのサービスをそのアカウントで使ったことがあるとダメみたいなので、一度も利用していないアカウントでログインし直しました。</p>
 
<img src="http://i.gyazo.com/5a36c3b7c62fd87285ee4afef96321ce.png" alt="">
 
ユーザー登録が必要なので`Country,Account Type, Name and address, What you pay with, Billing communication language`に答えて最後のチェックを入れて「Acept and start free trial」を選択しましょう。
 
<p>「create project」から新規プロジェクトを作成しましょう。</p>
<img src="http://i.gyazo.com/d28a8a7378b9f0f6a9b26f23b59b7f34.png" alt="">
 
<p>任意の名前を付けて「Create」を押してプロジェクトを作成します。</p>
<img src="http://i.gyazo.com/2a55766b11436a6b9ac183540278a9de.png" alt="">
 
<p>右下にプログレス表示のようなものが表示されます。</p>
<img src="http://i.gyazo.com/b68e62e8eb54a5556d14ef49d1c3cff5.png" alt="">
 
<p>プログラス表示が終わると...プロジェクトのダッシュボードが見れます。</p>
<p><strong>ここでProject IDを確認しておきましょう。</strong>後ほど使います。</p>
<img src="http://i.gyazo.com/68751b1280052557bbad374f33383092.png" alt="">
 
<p>左側のメニューから「Compute -> Container Engine」を選び 「Create a cluster」を押しましょう。</p>
<img src="http://i.gyazo.com/f80bb1b413f0b9a680bb64cc6a844ed5.png" alt="">
 
<p>作成するclusterの情報を入力する必要があるみたいです。次のように入力しました。</p>
<ul>
	<li>Name: first-vm (任意の名前)</li>
	<li>Description: Hello GKE (無くても大丈夫)</li>
	<li>Zone: us-central1-f (デフォルト)</li>
	<li>Cluster Size: 1 (デフォルト)</li>
	<li>Machine type: f1-micro (試しに使ってみる程度なので最小に設定)</li>
</ul>
<p>「Create」を押して進みます。</p>
<img src="http://i.gyazo.com/3731aeed296bb7a112d3c5f24464d5c0.png" alt="">
<p>この状態になればとりあえず成功です。</p>
<img src="http://i.gyazo.com/2484dc379307446aefb136ab9a9ceeb1.png" alt="">
<p>Project ID同様に、<strong>ここのCluster Name(今回はfirst-vm)を確認しておきましょう。</strong>後ほど使います。</p>





<h2>手順2: Clusterとアプリケーションの立ち上げ</h2>
<p><a href="https://cloud.google.com/container-engine/docs/" target="_blank">GKEのドキュメントページ</a>から<a href="https://cloud.google.com/container-engine/docs/before-you-begin#install_the_gcloud_command_line_interface"  target="_blank">"Before You Begin"</a>を見てみましょう。</p>
 
<h3>gcloudコマンドラインツールをインストール</h3>
<p>ドキュメントを見ると、GKEはgcloud command line toolというものを利用するらしいのでインストールしてみます。</p>
 
<p>macの場合は以下のコマンドをターミナルで実行してターミナルを再起動すればOKです。</p>

```
$ curl https://sdk.cloud.google.com | bash
```
 
<p>上手くいかない...という人は<a href="http://qiita.com/n0bisuke/items/78054fa49b5118198f57" target="_blank">"gcloud command line toolのインストールで少し詰まった"</a>などを参考にしましょう。</p>
 
<h3>gcloudコマンドの準備</h3>
<p>まずは認証をする必要があります。</p>

```
$ gcloud auth login
```

<p>ブラウザが立ち上がって認証許可を求められるので許可しましょう。</p>
<img src="http://i.gyazo.com/08087246d18fcc8a3411987c4089da33.png" alt="">
<p>次にプレビュー版の機能を使えるようにします。以下のコマンドを実行します。</p>
 
```
$ gcloud components update preview
 
The following components will be installed:
    -----------------------------------------------------------------------------------
    | Developer Preview gcloud Commands                         | 2014.11.03 | < 1 MB |
    | Native extensions for preview commands (Mac OS X, x86_64) |        4.1 | 2.4 MB |
    -----------------------------------------------------------------------------------
 
Do you want to continue (Y/n)?  Y #←Yでenter!
 
Creating update staging area...
 
 
Installing: Developer Preview gcloud Commands ... Done
Installing: Native extensions for preview commands (Mac OS X, x86_64) ... Done
 
Creating backup and activating new installation...
 
Done!
```

 
<p>次に使うコマンドラインツールで利用するプロジェクトを登録します。</p>

```
$ gcloud config set project PROJECT_ID
```

<p>となります、今回はglossy-infinity-756というIDだったので</p>

```
$ gcloud config set project glossy-infinity-756
```

<p>としておきます。</p>
 
<h3>Container Engine clusterを作る</h3>
<p>
<a href="https://cloud.google.com/container-engine/docs/downloads/guestbook.zip">サンプルプロジェクトのGuestbookをDL</a>して解凍します。
</p>
<p>解凍したguestbookフォルダ内には以下のようなjsonファイル群が展開されると思います。</p>
<img src="http://i.gyazo.com/64fe83f8e3966774f46cf60121806d1d.png" alt="">

<p>CONFIG_DIRにguestbookフォルダのパスを指定してあげます。ZONEやCLUSTER_NAMEも先ほど指定したものを記述します。</p>

```
$ export CONFIG_DIR=/path/to/guestbook
$ export ZONE=us-central1-b
$ export CLUSTER_NAME=first-vm 
$ gcloud preview container clusters --zone=$ZONE create $CLUSTER_NAME
```

<p>これでContainer Engine Clusterが立ち上がったようです。</p>

<p>Clusterの情報を色々と確認してみましょう。</p>

```
$ gcloud preview container clusters --zone=$ZONE list
clusters:
- clusterApiVersion: 0.4.2
  containerIpv4Cidr: 10.176.0.0/16
  creationTimestamp: '2014-11-06T09:24:36+00:00'
  description: Hello GKE
  endpoint: 23.236.61.237
  masterAuth:
    password: Bgi9leQOu6CcucrC
    user: admin
  name: first-vm
  nodeConfig:
    machineType: f1-micro
    sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/backports-debian-7-wheezy-v20141021
  nodeRoutingPrefixSize: 24
  numNodes: 1
  servicesIpv4Cidr: 10.0.0.0/16
  status: running
  zone: us-central1-f
- clusterApiVersion: 0.4.2
  containerIpv4Cidr: 10.117.0.0/16
  creationTimestamp: '2014-11-06T14:54:16+00:00'
  description: ''
  endpoint: 146.148.45.116
  masterAuth:
    password: DJitqdgpUWIeTeOY
    user: admin
  name: first-vm2
  nodeConfig:
    machineType: n1-standard-1
    sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/backports-debian-7-wheezy-v20141021
  nodeRoutingPrefixSize: 24
  numNodes: 1
  servicesIpv4Cidr: 10.0.0.0/16
  status: running
  zone: us-central1-f
```

<p>コンテナを立ち上げる際にpodファイルと呼ばれるものを利用します。
先ほどのguestbookフォルダ内のredis-master-pod.jsonを利用します。
</p>


```
 gcloud preview container pods --cluster-name=$CLUSTER_NAME create redis-master-pod --zone=$ZONE --config-file=$CONFIG_DIR/redis-master-pod.json
Fetching cluster endpoint and auth data.
Waiting for cluster api initialization...done.
Using gcloud compute copy-files to fetch ssl certs from cluster master...
Warning: Permanently added '146.148.45.116' (RSA) to the list of known hosts.
kubecfg.key                                               100% 1708     1.7KB/s   00:00    
Warning: Permanently added '146.148.45.116' (RSA) to the list of known hosts.
kubecfg.crt                                               100% 4347     4.3KB/s   00:00    
Warning: Permanently added '146.148.45.116' (RSA) to the list of known hosts.
ca.crt                                                    100% 1159     1.1KB/s   00:00    
ID                  Image(s)            Host                Labels                   Status
----------          ----------          ----------          ----------               ----------
redis-master-pod    gurpartap/redis     <unassigned>        name=redis,role=master   Waiting


n0bisuke:guestbook sugawara_ryosuke$ gcloud preview container pods --cluster-name=$CLUSTER_NAME list --zone=$ZONE
ID                  Image(s)            Host                                                                  Labels                   Status
----------          ----------          ----------                                                            ----------               ----------
redis-master-pod    gurpartap/redis     k8s-first-vm2-node-1.c.glossy-infinity-756.internal/107.178.214.143   name=redis,role=master   Waiting
```

<p>上手く動いてくれているみたいです。</p>


<h2>手順3: Dockerログインしてみる</h2>
<p>立ち上がったDockerプロセスにSSHログインしてみます。</p>

`gcloud compute ssh --zone=$ZONE VM_NAME`という形になります。VM_NAMEは↑のHOSTだと`(VM_NAME).c.(PROJECT_ID).〜`となります。この場合はk8s-first-vm2-node-1がVM_NAMEです。


```
$ gcloud compute ssh --zone=$ZONE k8s-first-vm2-node-1
Updated [https://www.googleapis.com/compute/v1/projects/glossy-infinity-756].
Warning: Permanently added '107.178.214.143' (RSA) to the list of known hosts.
Warning: Permanently added '107.178.214.143' (RSA) to the list of known hosts.
Linux k8s-first-vm2-node-1 3.16-0.bpo.2-amd64 #1 SMP Debian 3.16.3-2~bpo70+1 (2014-09-21) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
```

<p><strong>ここはsshでのDocker上でのコマンドです。</strong></p>

`docker ps`で分かるようにdockerプロセスが立ち上がってることが分かります。

```
user@k8s-first-vm2-node-1:~$ sudo docker ps

CONTAINER ID        IMAGE                    COMMAND                CREATED             STATUS              PORTS                    NAMES
f8c165071d17        gurpartap/redis:latest   "/usr/local/bin/redi   2 hours ago         Up 2 hours                                   k8s_redis-master.b0c7a75c_redis-master-pod.etcd_cc1fa69d-662e-11e4-9df1-42010af031e7_0c84d4d9   
0605ed819e41        kubernetes/pause:go      "/pause"               2 hours ago         Up 2 hours                                   k8s_net.645f884a_redis-master-pod.etcd_cc1fa69d-662e-11e4-9df1-42010af031e7_78c237d9            
2c6c028b4da1        google/cadvisor:0.5.0    "/usr/bin/cadvisor"    15 hours ago        Up 15 hours                                  k8s_cadvisor.417cd83c_cadvisor-agent.file_9ab8bc25                                              
b2142690dd0b        kubernetes/pause:go      "/pause"               15 hours ago        Up 15 hours         0.0.0.0:4194->8080/tcp   k8s_net.f72d85c8_cadvisor-agent.file_439950d7  
```

###redis-master-serviceを設定する

<p>ここからはまた、一度Dockerからログアウトして<strong>自分のマシン上での作業です。</strong></p>

```
$ gcloud preview container services --cluster-name=$CLUSTER_NAME create --zone=$ZONE --config-file=$CONFIG_DIR/redis-master-service.json

ID                  Labels              Selector                 Port
----------          ----------          ----------               ----------
redis-master                            name=redis,role=master   6379
```

###redis-worker-controllerを設定する

```
$ gcloud preview container replicationcontrollers --cluster-name=$CLUSTER_NAME create --zone=$ZONE --config-file=$CONFIG_DIR/redis-worker-controller.json

ID                        Image(s)            Selector                 Replicas
----------                ----------          ----------               ----------
redis-worker-controller   gurpartap/redis     name=redis,role=worker   2
```

このあたりの細かい設定はjsonファイル側の設定を確認してください。とりあえずはデフォルトのものを使ってガンガン進めます。

<p>確認してみましょう。</p>

```
$ gcloud preview container pods --cluster-name=$CLUSTER_NAME list --zone=$ZONE
ID                                     Image(s)            Host                                                                  Labels                                                                 Status
----------                             ----------          ----------                                                            ----------                                                             ----------
redis-master-pod                       gurpartap/redis     k8s-first-vm2-node-1.c.glossy-infinity-756.internal/107.178.214.143   name=redis,role=master                                                 Running
e8efbf42-6646-11e4-9df1-42010af031e7   gurpartap/redis     k8s-first-vm2-node-1.c.glossy-infinity-756.internal/107.178.214.143   name=redis,replicationController=redis-worker-controller,role=worker   Running
e8f0c409-6646-11e4-9df1-42010af031e7   gurpartap/redis     k8s-first-vm2-node-1.c.glossy-infinity-756.internal/107.178.214.143   name=redis,replicationController=redis-worker-controller,role=worker   Running

```

```
$ gcloud preview container replicationcontrollers --cluster-name=$CLUSTER_NAME list --zone=$ZONE
ID                        Image(s)            Selector                 Replicas
----------                ----------          ----------               ----------
redis-worker-controller   gurpartap/redis     name=redis,role=worker   2
```

###redis-worker-serviceを設定する

```
$ gcloud preview container services --cluster-name=$CLUSTER_NAME create --zone=$ZONE --config-file=$CONFIG_DIR/redis-worker-service.json
ID                  Labels                   Selector                 Port
----------          ----------               ----------               ----------
redis-worker        name=redis,role=worker   name=redis,role=worker   6379
```

###guestbook-controllerを設定する
redisの設定が終わってWebアプリケーション側の設定です。

```
$ gcloud preview container replicationcontrollers --cluster-name=$CLUSTER_NAME create --zone=$ZONE --config-file=$CONFIG_DIR/guestbook-controller.json
ID                     Image(s)               Selector            Replicas
----------             ----------             ----------          ----------
guestbook-controller   kubernetes/guestbook   name=guestbook      3
```

確認してみます。

```
$ gcloud preview container replicationcontrollers --cluster-name=$CLUSTER_NAME list --zone=$ZONE

ID                        Image(s)               Selector                 Replicas
----------                ----------             ----------               ----------
redis-worker-controller   gurpartap/redis        name=redis,role=worker   2
guestbook-controller      kubernetes/guestbook   name=guestbook           3
```


```
$ gcloud preview container pods --cluster-name=$CLUSTER_NAME list --zone=$ZONE
ID                                     Image(s)               Host                                                                  Labels                                                                 Status
----------                             ----------             ----------                                                            ----------                                                             ----------
redis-master-pod                       gurpartap/redis        k8s-first-vm2-node-1.c.glossy-infinity-756.internal/107.178.214.143   name=redis,role=master                                                 Running
e8efbf42-6646-11e4-9df1-42010af031e7   gurpartap/redis        k8s-first-vm2-node-1.c.glossy-infinity-756.internal/107.178.214.143   name=redis,replicationController=redis-worker-controller,role=worker   Running
e8f0c409-6646-11e4-9df1-42010af031e7   gurpartap/redis        k8s-first-vm2-node-1.c.glossy-infinity-756.internal/107.178.214.143   name=redis,replicationController=redis-worker-controller,role=worker   Running
a832b22e-6647-11e4-9df1-42010af031e7   kubernetes/guestbook   k8s-first-vm2-node-1.c.glossy-infinity-756.internal/107.178.214.143   name=guestbook,replicationController=guestbook-controller              Running
a833a97d-6647-11e4-9df1-42010af031e7   kubernetes/guestbook   k8s-first-vm2-node-1.c.glossy-infinity-756.internal/107.178.214.143   name=guestbook,replicationController=guestbook-controller              Running
a833cb33-6647-11e4-9df1-42010af031e7   kubernetes/guestbook   k8s-first-vm2-node-1.c.glossy-infinity-756.internal/107.178.214.143   name=guestbook,replicationController=guestbook-controller              Running
```

###guestbook-serviceを設定する

```
$ gcloud preview container services --cluster-name=$CLUSTER_NAME create --zone=$ZONE --config-file=$CONFIG_DIR/guestbook-service.json

I1107 15:34:31.897271 03533 request.go:274] Waiting for completion of /operations/19
I1107 15:34:34.065865 03533 request.go:274] Waiting for completion of /operations/19
ID                  Labels              Selector            Port
----------          ----------          ----------          ----------
guestbook                               name=guestbook      3000
```

確認してみまる。 redis-master, redis-woerker, guestbookが表示されていればOKデス

```
$  gcloud preview container services --cluster-name=$CLUSTER_NAME list --zone=$ZONE

ID                  Labels                   Selector                 Port
----------          ----------               ----------               ----------
redis-master                                 name=redis,role=master   6379
redis-worker        name=redis,role=worker   name=redis,role=worker   6379
guestbook                                    name=guestbook           3000
```

### ファイヤーウォールの設定

外から接続したときのポートを指定したり(?)

```
$ gcloud compute firewall-rules create $CLUSTER_NAME-node-3000 --allow=tcp:3000 --target-tags k8s-$CLUSTER_NAME-node

Created [https://www.googleapis.com/compute/v1/projects/glossy-infinity-756/global/firewalls/first-vm2-node-3000].
NAME                NETWORK SRC_RANGES RULES    SRC_TAGS TARGET_TAGS
first-vm2-node-3000 default 0.0.0.0/0  tcp:3000          k8s-first-vm2-node
```

<h2>手順4: 使ってみる</h2>

ここまで来たら準備は完了です。実際にアクセスしてみましょう。

<p>いよいよ立ち上げたアプリケーションにアクセスしてみます。<a href="https://console.developers.google.com/" target="_blank">Developers Console</a>にアクセスします。</p>

<p>Compute > Compute Engine > Network load balancingにアクセスするとForwarding rulesのタブにIPアドレスが記載してあるので、http://IPアドレス:3000にアクセスします</p>
<img src="http://i.gyazo.com/d2a86b33b42e282828978540511ff44b.png" />

今回の場合だと http://173.255.118.66:3000/ にアクセスするとWebページが見れます。

<img src="http://i.gyazo.com/55a5cc3aad6c875efe6c0005d4cfaf12.png" />
<img src="http://i.gyazo.com/2309ae32e108492141edcbb4fe154f6b.png" />

<p>するとコンテナ上でアプリケーションが立ち上がっていて掲示板的なものが出来てます!
簡単でしたね。

弊社のまろ氏もご満悦です。</p>

この簡単な手順で複数台サーバー構成を実現できるのは凄いっすね〜

<h2>コンテナを消したり作ったりしてみる</h2>

<h3>消して見る</h3>

```
$ gcloud preview container replicationcontrollers --cluster-name=$CLUSTER_NAME delete guestbook-controller --zone=$ZONE

Status
----------
Success
```

<h3>また作る</h3>
```
$ gcloud preview container replicationcontrollers --cluster-name=$CLUSTER_NAME create --zone=$ZONE --config-file=$CONFIG_DIR/guestbook-controller.json

ID                     Image(s)               Selector            Replicas
----------             ----------             ----------          ----------
guestbook-controller   kubernetes/guestbook   name=guestbook      3
```

## Clusterを削除
色々使ったので最後に削除してみます。

```
$ export CLUSTER_NAME=first-vm
$ export ZONE=us-central1-f
$ gcloud preview container clusters  --zone=$ZONE delete $CLUSTER_NAME

Waiting for cluster deletion...done.
name: operation-1415348533410-c624d2ae
operationType: deleteCluster
status: done
target: /projects/374990605251/zones/us-central1-f/clusters/first-vm2
zone: us-central1-f
```

しばらく待つとClusterが削除されます。

##まとめ

GCPの種類が色々あってこんがらがりそうだけど、Docker使えるのがGKEって覚えておきます汗

もっと細かいこともスムーズにできるように勉強したいですね。