この記事は MicroAd Advent Calendar 2022 の16日目の記事です。
概要
コンテナオーケストレーションツールのdocker swarmモードとkubernetes(k8s)ですが、サービスの負荷を分散のため、コンテナのレプリカ(replicas)機能を提供しています。
仕事で両方を使う機会があったので比べてみました。
詳細
docker swarmモードでのレプリカ設定
設定値をdocker compose
ファイルに定義すれば、docker単体と同様にデプロイすることが可能です。
docker swarmモードの場合、デプロイコマンドは docker stack deploy
になります。
以下はレプリカ3つを設定した例です。
...
services:
xxx-service:
image: xxx:1.0.0
...
deploy:
replicas: 3 # レプリカ数
...
ちなみに、現時点 docker swarmモードではレプリカのオートスケーリング機能を提供していません。
レプリカ数の変更はマニュアルで再デプロイする必要があります。
[www@test-server ~]$ docker stack services test
ID NAME MODE REPLICAS IMAGE PORTS
13a7gaf3dtio test_xxx-service replicated 3/3 xxx:1.0.0
デプロイ後、コンテナのレプリカ3つが作られたことを確認しました。
[参考]
k8sでのレプリカ設定
k8sのDeploymentファイルの中に設定しています。
以下はレプリカ数3つの例です。設定項目は docker compose
とは似ていますね。
apiVersion: apps/v1
kind: Deployment
metadata:
name: xxx-deployment
namespace: test
...
spec:
replicas: 3 # レプリカ数
...
さらに、k8sの場合は負荷面の計測指標に応じるpodのレプリカのオートスケーリング機能も提供しています。
以下の例では、レプリカ数が最小1つ、最大12で設定して、CPU使用率によってpodのレプリカのオートスケーリングが適用されます。
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
...
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: xxx-deployment
minReplicas: 1 # 最小レプリカ数
maxReplicas: 12 # 最大レプリカ数
targetCPUUtilizationPercentage: 80 # CPU利用率の期待値
デプロイ直後、podのレプリカは3つが作られまして、その後負荷に応じて8つまでscala out
したことを確認しました。
[www@test-server ~]$ kubectl get pod --namespace test
NAME READY STATUS RESTARTS AGE
xxx-deployment-5cd8d7cb86-ckqc4 1/1 Running 0 89m
xxx-deployment-5cd8d7cb86-l9wrw 1/1 Running 0 87m
xxx-deployment-5cd8d7cb86-lddth 1/1 Running 0 89m
xxx-deployment-5cd8d7cb86-ll7s4 1/1 Running 0 94m
xxx-deployment-5cd8d7cb86-rtm4b 1/1 Running 0 94m
xxx-deployment-5cd8d7cb86-szgd7 1/1 Running 0 89m
xxx-deployment-5cd8d7cb86-v4kw5 1/1 Running 0 87m
xxx-deployment-5cd8d7cb86-wjjpb 1/1 Running 0 94m
ちなみに、オートスケーリングの計算アルゴリズムは以下となります。
desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
[参考]
まとめ
コンテナ(or pod)のレプリカ | レプリカのマニュアルスケーリング | レプリカのオートスケーリング | |
---|---|---|---|
docker swarmモード | ⭕️ | ⭕️ | ❌ |
kubernetes | ⭕️ | ⭕️ | ⭕️ |
以上、docker swarmとk8sのレプリカ(replicas)機能の比較結果でした。