Google Container Engine(GKE) を使ってみよう

年末に C87 という比較的大規模なイベントがありまして、代表者ではありませんでしたがメンバーの一員としてサークル参加をしていました。
そして、サークルのホームページを GKE を用いて kubernetes 1 マスター、nginx 1 マスター、1 レプリケーションの 3 サーバーを Google HTTP Load Balancing させて運用しておりました(運用開始後一ヶ月経った今大体 $31.39 程度の課金、無駄に豪華!)。


触ってみないと気づきにくいのですが、Google のロードバランサは Network Load Balancing(L4) と HTTP Load Balancing(L7) があります(ネットワーク負荷分散と、HTTP 負荷分散)。
Network Load Balancing の方はセッションアフィニティーが設定できるため、現実的にはこちらを使うことになると思います。
HTTP Load Balancing の方は、現時点ではスティッキーセッションにはできないようです(Google さんはよ!)。
サークルのホームページとして構築したクラスターは単なる静的ファイルの塊を nginx で捌くだけなので、スティッキーでなくても問題ないため、HTTP Load Balancing の方を(無駄に)利用していました。
残念なのが、ノード間での共有ディスクは読み取り専用となってしまうことです。クラスタリングしつつストレージを共有しなければならないとき、共有はできても書き込みはできないため、使えません。そのような場合には、Google Cloud Storage を使用するしかなさそうです。
s3fs 等を利用しマウントによるストレージの共有を試してみたりしましたが、はっきりいって遅すぎて使い物になりませんでした。
(Compute Engine の中で s3fs を利用して Cloud Storage をマウントしても、実用に耐えうるスピードは得られませんでした)
ノード間で書き込みも可能な共有ディスクがいつか接続できるようになるといいですね。


GKE ですが、様々な方が記事にされていますが、公式のチュートリアルが一番素直です。

Hello Wordpress の方ですと、設定ファイルを用意せずにサクっと作れるチュートリアルになっており、Guestbook ですと、基本的な概念は一通り押えるチュートリアルになっています。
この二つをやってみるのがいいと思います。
日本語の記事ですと、私はこの方の記事がとても分かりやすかったです。まずはこちらを読み、その後 Googleチュートリアルを両方試してみるとほとんどつかめると思います。


Google Compute Engine(GCE) の方ですと、GUI からある程度(ssh やりだすとやっぱり CLI...で ssh はかなり使うよね...)はできるのですが、GKE の方ですと、CLI がもう前提です。
というわけで、Google Cloud SDK をまずはインストールしましょう。


GKE では、基本的に gcloud preview container で始まるコマンドを使います。で、以下をご覧ください。
Known issues with Google Container Engine
> Windows is not currently supported. The gcloud preview container command is built on top of the Kubernetes client’s kubecfg binary, which is not yet available on Windows.
Windows ユーザなら誰もが通る道だと思いますが、WindowsSDK をインストールしても今は GKE を使えません!
GKE を使いたい場合、Linux 環境を用意して、そこに SDK をインストールしましょう。


というわけで、以下は Ubuntu 14.04 の利用を前提に説明します。

  • Google Cloud SDK のインストール
    1. apt-get install -y curl
    2. curl https://sdk.cloud.google.com | bash
    3. (私は mkdir -p /opt/google してこの中にに入れました)
    4. source ~/.bashrc (zsh とか使ってる人には釈迦に説法ですよね?)
    5. gcloud components update preview
    6. さらに認証を行います
gcloud auth login
  • Google API プロジェクトの作成
    1. Google Developers Console より適当にプロジェクトを作成します(名前やIDは何でもいいです)
    2. プロジェクト作成後画面上部に表示されるプロジェクト番号をメモします。
    3. ここではプロジェクト番号を 1234567891234 とします
    4. [API と認証] - [API] より、Google Container Engine APIGoogle Compute Engine を ON にします(GKE のノードは結局 GCE で動きます)
  • gcloud にデフォルトのプロジェクト番号、ゾーンを設定
    • gcloud に毎度毎度プロジェクト番号等を渡すのは面倒くさいので、最初に設定してあげます。ゾーンはアジアにします。今のところアジアは三箇所(a, b, c)有りますが、アジアのどこにあるのかは中の人しか分かりません。
gcloud config set project 1234567891234
gcloud config set compute/zone asia-east1-a
  • Kubernetes クラスタを作成します。唯一これだけは画面からできますが、CLI でやっちゃいましょう
gcloud preview container clusters create test --num-nodes 1 --machine-type f1-micro
    • クラスタ名を test とし、マシンタイプは一番安いヤーツ(f1-micro)にしています。--num-nodes が 1 なので、Kubernetes マスターと合わせて 2 台構成になります(--num-nodes にはマスターを除く台数を指定します)
    • しばらくすると処理が終わります。その後、[計算処理] - [Container Engine] に
test 	asia-east1-a 	1 	1 vCPUs 	0.6 GB 	xxx.yyy.zzz.www

と表示されるはずです。同様に、
[計算処理] - [Compute Engine] - [VM インスタンス] に

k8s-test-master asia-east1-a k8s-test-master default xxx.yyy.zzz.www
k8s-test-node-1 asia-east1-a k8s-test-node-1 default www.xxx.yyy.zzz

と表示されるはずです。

gcloud preview container clusters list
gcloud preview container clusters describe test

などとすることで、クラスターの一覧を表示したり、詳細を見たりすることが可能です。
作成された k8s-test-master や k8s-test-node-1 は単に Google Compute Engine のインスタンスでしかないので、ssh で適当に入って Web サーバーを建てたり等普通の仮想環境としても利用できます。

  • Pod を作成
    1. Pod を作りましょう。Pod とはコンテナの集合です。折角ですから、Dockerfile を作ってみよう で作成したコンテナを利用してみましょう(イメージを yourdockerhub/mynginx として push しているとします)。俺はもっと簡単に試したいんだ!という方は、yourdockerhub/mynginx を単に nginx に置換して進めてください。
    2. 以下のファイルを /root/test-pod.json として置いておきます
{
  "id": "test",
  "kind": "Pod",
  "apiVersion": "v1beta1",
  "desiredState": {
    "manifest": {
      "version": "v1beta1",
      "id": "test",
      "containers": [{
        "name": "test",
        "image": "yourdockerhub/mynginx",
        "cpu": 100,
        "ports": [
          {
            "name": "test-http",
            "containerPort": 80,
            "hostPort": 80
          }
        ]
      }]
    }
  },
  "labels": {
    "name": "test",
    "role": "master"
  }
}

containerPort や hostPort は docker -p と同様ですね。名前や ID は適当に付ければ OK です。ラベルはちょっと重要ですが、使ってると後で分かってきます。まずはやってみましょう!
"kind": "Pod", "apiVersion": "v1beta1", "version": "v1beta1" は固定です。今は必ずこれを指定しなければいけないと Google のドキュメントに書かれているので、言われたとおりに指定します。
毎回コマンドにクラスター名を指定するのが面倒なので、最初のステップと同様にデフォルトとして設定しておきます(--cluster-name test を毎回付けるか、このコマンドを一回だけ実行しておくかの違い)。

gcloud config set container/cluster test

いよいよ Pod を作成します。

gcloud preview container pods create --config-file /root/test-pod.json

しばらくすると作成されます。

gcloud preview container pods list
gcloud preview container pods describe test

などとすることで、pod のリストや詳細を表示することが可能です。

  • そして service の作成・・・
    • は必要ないんです!実はもう、あなたはほとんど GKE の試用を達成しているのです。他の記事ですと service の作成まで、あるいは Replication Controller の作成までを解説しているかも知れませんが、今回作成したのは 1 ノードしかない nginx です。service は裏にある「複数個」の Pod への接続、環境の受け渡し、あるいはロードバランスが必要なため作成します。今回は、Pod は 1 個しかない上に、何の情報もなくとも 80 番ポートで勝手に動作するため、不要なのです。
  • 残る手順・・それはポートの開放
    1. gcloud compute firewall-rules create コマンドでできるのですが、ポートの開放は GUI からでも色々できるようになっているため、GUI でやりましょう。
    2. [計算処理] - [Compute Engine] - [VM インスタンス] を表示し、[k8s-test-node-1] をクリックします。このノードの詳細が表示されるはずです。
    3. [HTTP トラフィックを許可する] というチェックボックスがあるので、これをチェックします。これで、このノードの nginx に外からつなげられるようになりました。HTTP, HTTPS 以外のポートについても、[Compute Engine] - [ネットワーク] の画面から開放が可能です。
  • k8s-test-node-1 の [外部IP] にアクセスしてみましょう。nginx が表示されたかと思います。


如何でしたでしょうか?
なるべく簡単な手順で GKE を紹介したため、使えることは使えたけど応用力にかける感想をお持ちかも知れません。
上記の例ですと、確かにその通りです。が、GKE には本当に様々な機能があります。そして、それは公式のチュートリアルや他の方の記事に詳細に書かれています。
本記事が、そのための足がかりとなり、より深い理解への一助となることを祈ります。


以上で本記事は終了です。
ありがとうございました。