サービスにローリング・アップデートを適用¶
チュートリアルの前のステップでは、サービスのインスタンス数を スケール しました。次のチュートリアルは Redis 3.0.6 コンテナ・イメージをベースとしたサービスをデプロイします。そして、ローリング・アップデートで Redis 3.0.7 コンテナ・イメージを使うサービスに更新します。
準備がまだであれば、ターミナルを開き、manager ノードを実行しているマシンに SSH で入ります。たとえば、このチュートリアルでは
manager1
という名前のマシンを使います。
Redis のタグを swarm にデプロイし、swarm 上での更新遅延(update delay)を 10 秒に設定します。以下の例では古い Redis タグを使っているので注意してください。
$ docker service create \ --replicas 3 \ --name redis \ --update-delay 10s \ redis:3.0.6 0u6a4s31ybk7yw2wyvtikmu50
これはサービスのデプロイ時のローリング・アップデート・ポリシーを設定しました。
--update-delay
フラグは、サービス・タスクやタスク・セットを更新する遅延時間を指定します。時間T
を、秒数Ts
、分Tm
、時Th
の組み合わせで記述できます。たとえば10m30s
は 10 分 30 秒の遅延です。デフォルトでは、スケジューラは1度に1つのタスクを更新します。
--update-parallelism
フラグを指定することで、スケジューラが同時に更新するサービス・タスクの最大数を調整できます。デフォルトでは、アップデート時に個々のタスクが
RUNNING
(実行中)の状態を返したら、スケジューラは他の全てのタスク更新が完了するまでスケジュールします。もしもタスクの更新中にFAILED
の応答があれば、スケジューラは更新を中止します。この挙動はdocker service create
やdocker service update
で--update-failure-action
のフラグを使って制御できます。
redis
サービスを調べます。$ docker service inspect --pretty redis ID: 0u6a4s31ybk7yw2wyvtikmu50 Name: redis Service Mode: Replicated Replicas: 3 Placement: Strategy: Spread UpdateConfig: Parallelism: 1 Delay: 10s ContainerSpec: Image: redis:3.0.6 Resources:
redis
用のコンテナ・イメージを更新します。 swarm マネージャ はUpdateConfig
ポリシーに基づいてノード更新を適用します。$ docker service update --image redis:3.0.7 redis redis
スケジューラが適用するローリング・アップデートは、以下がデフォルトです。
1つめのタスクを停止
停止したタスクの更新をスケジュール
更新したタスク用コンテナの起動
更新したタスクが
RUNNING
を返したら、指定した遅延期間を待機した後、次のタスクを開始更新中のあらゆる期間で
FAILED
が帰ってきたら、更新を停止
docker service inspect --pretty redis
を実行し、新しいイメージの期待状態を確認します。$ docker service inspect --pretty redis ID: 0u6a4s31ybk7yw2wyvtikmu50 Name: redis Service Mode: Replicated Replicas: 3 Placement: Strategy: Spread UpdateConfig: Parallelism: 1 Delay: 10s ContainerSpec: Image: redis:3.0.7 Resources: Endpoint Mode: vip
service inspect
の出力から、更新の失敗によって一時停止しているのが分かります。$ docker service inspect --pretty redis ID: 0u6a4s31ybk7yw2wyvtikmu50 Name: redis ...snip... Update status: State: paused Started: 11 seconds ago Message: update paused due to failure or early termination of task 9p7ith557h8ndf0ui9s0q951b ...snip...
一時停止した更新を再開するには、
docker service update <サービス ID>
を実行します。実行例:docker service update redis
更新失敗が続く状態を停止するには、
docker service update
にフラグを追加し、サービスの状態を調整する必要があるでしょう。
docker service ps <タスクID>
を実行し、ローリング・アップデートを監視します。$ docker service ps redis NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR redis.1.dos1zffgeofhagnve8w864fco redis:3.0.7 worker1 Running Running 37 seconds \_ redis.1.88rdo6pa52ki8oqx6dogf04fh redis:3.0.6 worker2 Shutdown Shutdown 56 seconds ago redis.2.9l3i4j85517skba5o7tn5m8g0 redis:3.0.7 worker2 Running Running About a minute \_ redis.2.66k185wilg8ele7ntu8f6nj6i redis:3.0.6 worker1 Shutdown Shutdown 2 minutes ago redis.3.egiuiqpzrdbxks3wxgn8qib1g redis:3.0.7 worker1 Running Running 48 seconds \_ redis.3.ctzktfddb2tepkr45qcmqln04 redis:3.0.6 mmanager1 Shutdown Shutdown 2 minutes ago
Swarm が全てのタスクを更新するまで、 redis:3.0.6
として実行中のイメージが redis:3.0.7
に切り替わるのが見えるでしょう。先ほどの出力はローリング・アップデートが完了した状態です。
次は swarm から ノードを解放 する方法を学びます。
参考
- Apply rolling updates to a service
https://docs.docker.com/engine/swarm/swarm-tutorial/rolling-update/