Google Container Engine (GKE) を触ってみた #gcpja
ども、takiponeです。
本日未明、Google社のイベントGCP Liveで新サービスのGoogle Container Engine(GKE)が発表されました。
GKEは、Googleを中心に開発されているDockerコンテナの管理ソフトウェアKubernetesのクラスタを簡単にデプロイできるサービスです。Dockerコンテナの実行にはGCE(Google Compute Engine)を利用します。現在はAlpha Releaseです(リリースポリシーはこのブログエントリーが詳しいです)。
既に実際に動かせるようになっていたので、コンテナをデプロイするまでを試してみた感想をレポートします。
クラスタの作成
GKEのドキュメントでは、全てCLI(gcloud
ユーティリティー)で説明されていますが、クラスタ作成はDevelopers Console画面から行うことができました。
Developer Consoleのメニューに[計算処理] - [Container Engine]という項目が増えているので、クリックし、[Create a cluster]ボタンで作成画面を表示します。
クラスタ名や配置するゾーン、マシンタイプなどを選択します。
画面の注意書きにも出ていますが、クラスタはマスターVM1台+ノードVM1台の計2台が最小構成で、[CLUSTER SIZE]で選択するのはマスターVMを除いたノードVM数になります。
以下のように、クラスタが作成されました。
ちなみに、各VMはGCEで実行されるので、メニューから[Compute Engine] - [VMインスタンス]を選択すると、GKEによって作成されたVMインスタンスを確認することもできます。インスタンス名の頭にあるk8s
はKubernetesの略ですね。
Podの作成
クラスタを作成したらgcloud
コマンドでPodを作成します。Podとは、Dockerコンテナをグループ化した単位です。Kubernetesでは、Podを始めとする各設定をあらかじめJSONファイルに記述し読み込んで利用します。今回はドキュメントのチュートリアルにあるguestbook.zipのJSONファイルを利用しました。
redis-master-pod.json
{
"apiVersion": "v1beta1",
"kind": "Pod",
"id": "redis-master-pod",
"desiredState": {
"manifest": {
"version": "v1beta1",
"id": "redis-master-pod",
"containers": [{
"name": "redis-master",
"image": "gurpartap/redis",
"ports": [{ "name": "redis-server", "containerPort": 6379 }]
}]
}
},
"labels": { "name": "redis", "role": "master" }
}
このファイルをgcloud preview container pods create
コマンドで読み込み、Podを作成します。
$ gcloud preview container pods create redis-master-pod --cluster-name=cluster1 --zone=asia-east1-a --config-file=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...
Updated [https://www.googleapis.com/compute/v1/projects/takipone-sandbox].
Warning: Permanently added 'XX.XX.XX.XX' (RSA) to the list of known hosts.
Warning: Permanently added 'XX.XX.XX.XX' (RSA) to the list of known hosts.
kubecfg.key 100% 1708 1.7KB/s 00:00
Warning: Permanently added 'XX.XX.XX.XX' (RSA) to the list of known hosts.
kubecfg.crt 100% 4347 4.3KB/s 00:00
Warning: Permanently added 'XX.XX.XX.XX' (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
$
コマンドの出力結果から、Kubernetesの各設定ファイルをVMにSCPで転送し、有効化している様子が見えますね。少し待ち、gcloud preview container pods list
コマンドでPodをリストします。
$ gcloud preview container pods list --cluster-name=cluster1 --zone asia-east1-a
ID Image(s) Host Labels Status
---------- ---------- ---------- ---------- ----------
redis-master-pod gurpartap/redis k8s-cluster1-node-1.c.XXXXXXXXXX.internal/YY.YY.YY.YY name=redis,role=master Running
実行されていますね!
VMインスタンスの確認
今度は、gcloud compute ssh
でVMにSSH接続して様子を見てみます。まずはマスターVMに。
ryuta@k8s-cluster1-master:~$ ps ax
:
5861 ? Sl 0:01 /usr/local/bin/etcd -peer-addr k8s-cluster1-master:7001 -name k8s-cluster1-master
5979 ? Sl 0:00 /usr/local/bin/apiserver -address=127.0.0.1 -machines=k8s-cluster1-node-1.c.takipone-sandbox.internal -etcd_ser
6062 ? Sl 0:00 /usr/local/bin/controller-manager -master=127.0.0.1:8080
6145 ? Sl 0:00 /usr/local/bin/scheduler --master=127.0.0.1:8080 -master=127.0.0.1:8080
6755 ? Ss 0:00 nginx: master process /usr/sbin/nginx
6756 ? S 0:00 nginx: worker process
6757 ? S 0:00 nginx: worker process
6758 ? S 0:00 nginx: worker process
6759 ? S 0:00 nginx: worker process
マスターVMでは、Kubernetesの各プロセスが実行されています。コンテナで動作しているわけではないようですね。
続いて、ノードVMです。
ryuta@k8s-cluster1-node-1:~$ ps ax
:
4968 ? Sl 0:04 /usr/bin/docker -d -p /var/run/docker.pid --bridge cbr0 --iptables=false --ip-masq=false -r=false
5065 ? Sl 0:01 /usr/local/bin/kubelet -etcd_servers=http://10.240.153.219:4001 -address=0.0.0.0 -config=/etc/kubernetes/manife
5147 ? Sl 0:01 /usr/local/bin/kube-proxy -etcd_servers=http://10.240.153.219:4001
:
こちらは、DockerとKubernetesのエージェントであるKubeletが動作していますね。
では、最後にdocker ps
で実行しているDockerコンテナを確認します。
ryuta@k8s-cluster1-node-1:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7b1b752e80d7 gurpartap/redis:latest "/usr/local/bin/redi 7 minutes ago Up 7 minutes k8s_redis-master.8776a695_redis-master-pod.etcd_2db2de6c-6470-11e4-8135-42010af099db_c92d61a3
0366a5df1261 kubernetes/pause:go "/pause" 8 minutes ago Up 8 minutes k8s_net.645f884a_redis-master-pod.etcd_2db2de6c-6470-11e4-8135-42010af099db_1b1c83de
ddb1d86698b8 google/cadvisor:0.5.0 "/usr/bin/cadvisor" 21 minutes ago Up 21 minutes k8s_cadvisor.417cd83c_cadvisor-agent.file_ca5ade9b
cda608d5366b kubernetes/pause:go "/pause" 21 minutes ago Up 21 minutes 0.0.0.0:4194->8080/tcp k8s_net.f72d85c8_cadvisor-agent.file_fea895e4
KubernetesのJSONファイルの指定の通り、コンテナが実行されていますね!
感想とまとめ
触った感じとしては、勝手にVMが作成されてコンテナがデプロイされる様子がAWSのElastic Beanstalkに似ているなぁと思いました。もちろんGKEの特徴はKubernetesサポートにあるので、BeanstalkのDocker環境よりも可用性やスケーラビリティの面でいろいろ機能があると思います。Kubenetesを勉強しつつ、使いこなしていきたいですね。
ちなみに、AWSのチーフエバンジェリストから以下のようなツイートが出ているので、来週にかけてAWSでもDockerについての動きがありそうですよ。乞うご期待!
Using #Docker and #AWS? You are in for a pleasant surprise at re:Invent!
— Jeff Barr (@jeffbarr) November 4, 2014