Google Container Engine (GKE) を触ってみた

2014.11.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

この記事はこちらから転載したものです。

ども、大瀧です。 本日未明、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]ボタンで作成画面を表示します。

gke-ataglance01

クラスタ名や配置するゾーン、マシンタイプなどを選択します。

gke-ataglance02

gke-ataglance03

画面の注意書きにも出ていますが、クラスタはマスターVM1台+ノードVM1台の計2台が最小構成で、[CLUSTER SIZE]で選択するのはマスターVMを除いたノードVM数になります。

以下のように、クラスタが作成されました。

gke-ataglance04

ちなみに、各VMはGCEで実行されるので、メニューから[Compute Engine] - [VMインスタンス]を選択すると、GKEによって作成されたVMインスタンスを確認することもできます。インスタンス名の頭にあるk8sはKubernetesの略ですね。

gke-ataglance05

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環境よりも可用性やスケーラビリティの面でいろいろ機能があると思います。Kubernetesを勉強しつつ、使いこなしていきたいですね。

ちなみに、AWSのチーフエバンジェリストから以下のようなツイートが出ているので、来週にかけてAWSでもDockerについての動きがありそうですよ。乞うご期待!