*

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

公開日: : 投稿者: GKE

コンテナ使ってますか?

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

 

この記事を書いた人

hjmkwn
お酒と珈琲をこよなく愛するIT戦士。

関連記事

記事はありませんでした

PAGE TOP ↑