Kekeの日記

エンジニア、読書なんでも

Kubernetesに2つのPodを高度スケジューリングしたときの通信時間の計測

f:id:bobchan1915:20180929123830p:plain

本記事

今回は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に接続してください。

f:id:bobchan1915:20180926233056p:plain

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 外部クライアントから

f:id:bobchan1915:20180929121143p:plain

これらの時間計測はスパイク値をのぞいています。

1つのPod単一でヘルスチェックを計測

一応、一つのPodでヘルスチェックしてみて計測が正しくできているのかを比較します。

  • 平均値: 7.7 ms

f:id:bobchan1915:20180927220444p:plain

Podを別々のNodeにスケジューリングして計測

実験環境は以下のようにPodは別々のNodeに格納されています。

f:id:bobchan1915:20180927191713p:plain

1000リクエストを送ります。

結果

以下のような結果になりました。

  • 平均値: 11.5 ms
  • 最大値: 24.3 ms

f:id:bobchan1915:20180928183348p:plain

同じNodeにスケジューリングしたとき

実験環境は以下のようにPodは同じNodeに格納されています。

f:id:bobchan1915:20180927193012p:plain

同様に1000リクエストを送ります。

結果

以下のような結果になりました。

  • 平均値: 12.1 ms
  • 最大値: 323 ms

f:id:bobchan1915:20180928182621p:plain

実験2 内部Pod -> Pod の測定

f:id:bobchan1915:20180929121214p:plain

Jobを使って計測用のコンテナを走らせてからアクセスしたいと思います。

同様にAffinityを使ってJobが同じNodeからの時と別々のNodeからのときを計測します。

Podを別々のNodeにスケジューリングして計測

以下のようになっています。

curl-job

f:id:bobchan1915:20180928212353p:plain

test-2

f:id:bobchan1915:20180928212401p:plain

結果

  • 平均値: 4.37 ms
  • 最大値: 13.1 ms

f:id:bobchan1915:20180928213417p:plain

同じNodeにスケジューリングしたとき

以下のようになっています。

curl-job

f:id:bobchan1915:20180928211239p:plain

test-2

f:id:bobchan1915:20180928211300p:plain

結果

  • 平均値: 4.12 ms
  • 最大値: 11.0 ms

f:id:bobchan1915:20180928212208p:plain

実験3 内部Pod -> Pod -> Podの測定

f:id:bobchan1915:20180929121517p:plain

内部PodはどちらのPodともNodeが異なることを前提にしています。

Podを別々のNodeにスケジューリングして計測

以下のようになっています。

curl-job

f:id:bobchan1915:20180929122219p:plain

test-1

f:id:bobchan1915:20180929122236p:plain

test-2

f:id:bobchan1915:20180929122243p:plain

結果

  • 平均値: 6.02 ms
  • 最大値: 19.1 ms

f:id:bobchan1915:20180929123026p:plain

同じNodeにスケジューリングしたとき

以下のようになっています。

curl-job

f:id:bobchan1915:20180929123339p:plain

test-1

f:id:bobchan1915:20180929123301p:plain

test-2

f:id:bobchan1915:20180929123247p:plain

結果

  • 平均値: 5.97 ms
  • 最大値: 19.2 ms

f:id:bobchan1915:20180929124414p:plain

実験結果整理

平均通信時間を表にまとめます。

 実験項目 別々の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によってサービスメッシュを構築して計測していきたいと思う。