驚速のコンテナ起動!GKEでのPod生成時間計測結果発表

ご注意

この記事は 2016年2月1日 に書かれたものです。内容が古い可能性がありますのでご注意ください。

コンテナ使ってますか?

Google では裏側でコンテナを大量に運用していて、その一端をGKE(Google Container Engine)という形でサービス提供されております。 今回はそのコンテナ(Pod)起動時間をイメージサイズを変えて計測してみました。 ※ここでは生成時間=PodがRUNNINGになるまでとしました。 簡単に用語を説明します。 GKEは、DockerコンテナのオーケストレーションツールであるKubernetesをGCPの様々な機能を使ってホスティングしているサービスです。 Podとは、複数のdocker imageで構成される、GKEの実行単位です。 Podはクラスタのノード(GCE(Google Compute Engine)インスタンス)に適当に配置されます。 GKEのスケールアウトは、最初にPod数が増え、その後ノードを増やしてPodを増やしていきます。 このスケールスピードに直結する生成時間(スピンアップ時間)は、とても悩ましい問題です。 そこで、Docker Imageが、100MB※・500MB・1GBでそれぞれPodがどのくらいで生成されるのかを計測してみました。 ※ちょうど良いのがなかったので、実際の計測は134MBのイメージ ちなみに、500MBというと大きいように思えますが、公式の php-apache(5.5)のイメージサイズは480MBあります。 意外に大きいですね。

計測で利用するもの

今回の計測は、以下のイメージを用いました。
  • 100MB: nginxの公式イメージ(134MB)
  • 500MB: php-apache(5.5) + 20MBのダミーファイル
  • 1GB: php-apache+520MBのダミーファイル
クラスタは以下を用います。
  • サイズ: デフォルトの3
  • マシンタイプ: n1-standard-1
  • ゾーン: asia
コンテナレジストリは、GCPで用意されているGoogle Container Registryを用います。 実はContainer Registryの保存先はGCSです。 またゾーンも指定できます。(us, eu, asia) 詳しくはContainer Registryのページを確認してください。 https://cloud.google.com/container-registry/docs/   今回の計測では、クラスタのゾーンと同じasiaのRegistryと比較用にusのRegistryを使ってみます。 予想では、asia-asiaのほうがasia-usより早いはずです。

計測方法

概ね以下の通りです。
  1. ノードにイメージをPullしてRUNNINGになるまでを起動(初回)時間とします。
  2. Podを順にscaleしていきます。
  3. Podが全クラスタでRUNNINGになると、その次のscaleで、同一ノード上に2つめのPodが生成されます。これを2回目の起動時間として計測します。
  4. クラスタサイズが3なので、起動時間を各3回計測できることになりますのでそれの平均をとります。

計測結果

では、計測結果です。 クラスタ: asia Registry: asia
Imageサイズ 起動時間(秒) 起動時間2回目(秒)
134MB 11 2
500MB 25 2
1G 33 2
  クラスタ: asia Registry: us
Imageサイズ 起動時間(秒) 起動時間2回目(秒)
134MB 17 2
500MB 27 2
1G 35 2
  注目すべきポイントは、DockerイメージがノードにPullされたあとの起動はすごく早くなっている点です。 逆にいうと、如何にPullの時間がかかるかということになります。 ノードをauto scaleしている場合、ノードが増えそこにPodが生成される度に、初回の起動時間がかかることになります。 この点は運用上の注意点となるでしょう。 回避策としては、ノード(GCEインスタンス)のstartup scriptで予めPullだけしておく、というのが考えられます。 試しに、ノード上で、コマンドにてPull後、Podをscaleした場合は2回目の起動時間と同等でした。 最後に、Container Registryの実体であるGCSからノードに単純に1ファイルだけをコピーする際の時間を参考としてつけます。  

参考: GKEノードにGCSのファイルをコピーする時間(docker pullの部分に相当)

containar cluster file size GCS Bucket 平均時間(秒)
asia 134MB asia 4
us 7
500MB asia 12
us 14
1GB asia 18
us 22
  いずれも、asiaのbucketのほうがusのbucketより早いことがわかります。  

まとめ

クラスタ:asia, Registry:asiaで500MBのイメージサイズの場合は 初回起動 25秒 (うちPull時間 23秒)、2回目以降の起動時間 2秒(同一インスタンス内) ということになります。 最後に、Pod autoscalerのドキュメントです。 実際に動かしてみて、スケールするのを確認してみるのも面白いですよ。 http://kubernetes.io/v1.1/docs/user-guide/horizontal-pod-autoscaling/README.html  

Google のクラウドサービスについてもっと詳しく知りたい、直接話が聞いてみたいという方のために、クラウドエースでは無料相談会を実施しております。お申し込みは下記ボタンより承っておりますので、この機会にぜひ弊社をご利用いただければと思います。

無料相談会のお申込みはこちら