Kubernetesに2つのPodを高度スケジューリングしたときの通信時間の計測
本記事
今回はKubernetesを使って、Affinity
によってPod間通信が高速化をするのかを検証したいと思います。
インフラ構築
インフラは以下のような構築になっています。
準備
InfluxDBを起動
インストールして起動します。
brew install influxdb
起動するには以下のようなコマンドを実行します。
# Run in background brew services start influxdb # Run in foregound influxd -config /usr/local/etc/influxdb.conf
またデータベースを作成してください。
influx CREATE DATABASE "test-affinity"
Grafanaを起動
# Run in background brew services start grafana
そして0.0.0.0:3000にアクセスしてください。
influxに接続してください。
Saveできれば成功です。
クラスタの構築
今回はGKEを使ってクラスタを構築します。
gcloud container clusters create test-affinity --region=$(gcloud config get-value compute/region)
そしてcredentialを取得します。
gcloud container clusters get-credentials test-affinity--region=(gcloud config get-value compute/region)
Cloud Registryへアプリケーションイメージのデプロイ
今回は2つのHTTP1.1で通信するコンテナを使って計測していきます。
以前作ったアプリケーションですが、特に条件が一緒であれば内容は関係ないので割愛させていただます
gcloud docker -- push asia.gcr.io/$(gcloud config get-value project)/test-1:latest gcloud docker -- push asia.gcr.io/$(gcloud config get-value project)/test-2:latest
実験1 外部クライアントから
これらの時間計測はスパイク値をのぞいています。
1つのPod単一でヘルスチェックを計測
一応、一つのPodでヘルスチェックしてみて計測が正しくできているのかを比較します。
- 平均値: 7.7 ms
Podを別々のNodeにスケジューリングして計測
実験環境は以下のようにPodは別々のNodeに格納されています。
1000リクエストを送ります。
結果
以下のような結果になりました。
- 平均値: 11.5 ms
- 最大値: 24.3 ms
同じNodeにスケジューリングしたとき
実験環境は以下のようにPodは同じNodeに格納されています。
同様に1000リクエストを送ります。
結果
以下のような結果になりました。
- 平均値: 12.1 ms
- 最大値: 323 ms
実験2 内部Pod -> Pod の測定
Job
を使って計測用のコンテナを走らせてからアクセスしたいと思います。
同様にAffinityを使ってJobが同じNodeからの時と別々のNodeからのときを計測します。
Podを別々のNodeにスケジューリングして計測
以下のようになっています。
curl-job
test-2
結果
- 平均値: 4.37 ms
- 最大値: 13.1 ms
同じNodeにスケジューリングしたとき
以下のようになっています。
curl-job
test-2
結果
- 平均値: 4.12 ms
- 最大値: 11.0 ms
実験3 内部Pod -> Pod -> Podの測定
内部PodはどちらのPodともNodeが異なることを前提にしています。
Podを別々のNodeにスケジューリングして計測
以下のようになっています。
curl-job
test-1
test-2
結果
- 平均値: 6.02 ms
- 最大値: 19.1 ms
同じNodeにスケジューリングしたとき
以下のようになっています。
curl-job
test-1
test-2
結果
- 平均値: 5.97 ms
- 最大値: 19.2 ms
実験結果整理
平均通信時間を表にまとめます。
実験項目 | 別々のNode(ms) | 同じNode(ms) |
---|---|---|
外部Job -> Pod -> Pod | 11.5 | 12.1 |
内部Job -> Pod -> Pod | 6.02 | 5.97 |
内部Job -> Pod | 4.37 | 4.12 |
まとめ
外部クライアントからだと、1ホップ(Pod→Pod)は変わりないかもしれない。
たまにスパイクするのは、Kubernetesの受け口が悪いのか、自分のネットワーク環境に問題があるかもしれない。
せっかくPod間通信をしているのなら、Istioによってサービスメッシュを構築して計測していきたいと思う。