コンテナ使ってますか?
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より早いはずです。
計測方法
概ね以下の通りです。
- ノードにイメージをPullしてRUNNINGになるまでを起動(初回)時間とします。
- Podを順にscaleしていきます。
- Podが全クラスタでRUNNINGになると、その次のscaleで、同一ノード上に2つめのPodが生成されます。これを2回目の起動時間として計測します。
- クラスタサイズが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