こんにちは、会社のブログで書こうか迷ったのですが、こっちで書きます。
さっそくですが、Google Container Engineが発表されましたね!
まだα版とのことですが、試しに使ってみたいと思います!
※ 単語とか理解していない部分も多いですし、間違った認識の部分もあるかと思います。コメントや生暖かい目で見守っていただければ幸いです。
参考:
Google Container Engine(GKE)とは
2014年11月4日(日本時間5日)にGoogleが発表したDockerコンテナ上でアプリケーションを実行し、それをKubernetesで管理するクラウドサービスです。
略称はGKEらしいです。Google Compute Engineの略称がGCEで名前が被るかららしいです。
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.
参考:Google Container Engine
https://cloud.google.com/container-engine/
なんやらDockerを使ってコンテナをぽこぽこ立ち上げられるらしいですね。
公式チュートリアルをもとに進めてみます。
GKE入門
さっそく始めて見ます。
先に完成イメージ
今回は公式チュートリアルをもとにDockerでコンテナを立ち上げて、webアプリケーションをwebサーバーとDBサーバー(redis)の複数台構成なものを作ってみます。
完成版はこんな感じの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は死んでます
手順1: 登録
https://cloud.google.com/container-engine/ でStart Your Free Trialから使い始めることができます。登録しようと思い、アクセスしたところ、さっそく怒られました苦笑
どうやら現在は新規ユーザーのみらしいので、一度Googleからログアウトして再度チャレンジしてみます。
Google Cloud Platformのサービスをそのアカウントで使ったことがあるとダメみたいなので、一度も利用していないアカウントでログインし直しました。
ユーザー登録が必要なのでCountry,Account Type, Name and address, What you pay with, Billing communication language
に答えて最後のチェックを入れて「Acept and start free trial」を選択しましょう。
「create project」から新規プロジェクトを作成しましょう。
任意の名前を付けて「Create」を押してプロジェクトを作成します。
右下にプログレス表示のようなものが表示されます。
プログラス表示が終わると...プロジェクトのダッシュボードが見れます。
ここでProject IDを確認しておきましょう。後ほど使います。
左側のメニューから「Compute -> Container Engine」を選び 「Create a cluster」を押しましょう。
作成するclusterの情報を入力する必要があるみたいです。次のように入力しました。
- Name: first-vm (任意の名前)
- Description: Hello GKE (無くても大丈夫)
- Zone: us-central1-f (デフォルト)
- Cluster Size: 1 (デフォルト)
- Machine type: f1-micro (試しに使ってみる程度なので最小に設定)
「Create」を押して進みます。
この状態になればとりあえず成功です。
Project ID同様に、ここのCluster Name(今回はfirst-vm)を確認しておきましょう。後ほど使います。
手順2: Clusterとアプリケーションの立ち上げ
GKEのドキュメントページから"Before You Begin"を見てみましょう。
gcloudコマンドラインツールをインストール
ドキュメントを見ると、GKEはgcloud command line toolというものを利用するらしいのでインストールしてみます。
macの場合は以下のコマンドをターミナルで実行してターミナルを再起動すればOKです。
$ curl https://sdk.cloud.google.com | bash
上手くいかない...という人は"gcloud command line toolのインストールで少し詰まった"などを参考にしましょう。
gcloudコマンドの準備
まずは認証をする必要があります。
$ gcloud auth login
ブラウザが立ち上がって認証許可を求められるので許可しましょう。
次にプレビュー版の機能を使えるようにします。以下のコマンドを実行します。
$ 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!
次に使うコマンドラインツールで利用するプロジェクトを登録します。
$ gcloud config set project PROJECT_ID
となります、今回はglossy-infinity-756というIDだったので
$ gcloud config set project glossy-infinity-756
としておきます。
Container Engine clusterを作る
サンプルプロジェクトのGuestbookをDLして解凍します。
解凍したguestbookフォルダ内には以下のようなjsonファイル群が展開されると思います。
CONFIG_DIRにguestbookフォルダのパスを指定してあげます。ZONEやCLUSTER_NAMEも先ほど指定したものを記述します。
$ 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
これでContainer Engine Clusterが立ち上がったようです。
Clusterの情報を色々と確認してみましょう。
$ 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
コンテナを立ち上げる際にpodファイルと呼ばれるものを利用します。 先ほどのguestbookフォルダ内のredis-master-pod.jsonを利用します。
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
上手く動いてくれているみたいです。
手順3: Dockerログインしてみる
立ち上がったDockerプロセスにSSHログインしてみます。
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.
ここはsshでのDocker上でのコマンドです。
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を設定する
ここからはまた、一度Dockerからログアウトして自分のマシン上での作業です。
$ 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ファイル側の設定を確認してください。とりあえずはデフォルトのものを使ってガンガン進めます。
確認してみましょう。
$ 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
手順4: 使ってみる
ここまで来たら準備は完了です。実際にアクセスしてみましょう。
いよいよ立ち上げたアプリケーションにアクセスしてみます。Developers Consoleにアクセスします。
Compute > Compute Engine > Network load balancingにアクセスするとForwarding rulesのタブにIPアドレスが記載してあるので、http://IPアドレス:3000にアクセスします
今回の場合だと http://173.255.118.66:3000/ にアクセスするとWebページが見れます。
するとコンテナ上でアプリケーションが立ち上がっていて掲示板的なものが出来てます! 簡単でしたね。
弊社のまろ氏もご満悦です。
この簡単な手順で複数台サーバー構成を実現できるのは凄いっすね〜
コンテナを消したり作ったりしてみる
消して見る
$ gcloud preview container replicationcontrollers --cluster-name=$CLUSTER_NAME delete guestbook-controller --zone=$ZONE
Status
----------
Success
また作る
``` $ gcloud preview container replicationcontrollers --cluster-name=$CLUSTER_NAME create --zone=$ZONE --config-file=$CONFIG_DIR/guestbook-controller.jsonID 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って覚えておきます汗
もっと細かいこともスムーズにできるように勉強したいですね。