サービスにローリング・アップデートを適用

チュートリアルの前のステップでは、サービスのインスタンス数を スケール しました。次のチュートリアルは Redis 3.0.6 コンテナ・イメージをベースとしたサービスをデプロイします。そして、ローリング・アップデートで Redis 3.0.7 コンテナ・イメージを使うサービスに更新します。

  1. 準備がまだであれば、ターミナルを開き、manager ノードを実行しているマシンに SSH で入ります。たとえば、このチュートリアルでは manager1 という名前のマシンを使います。

  1. 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 の応答があれば、スケジューラは更新を中止します。この挙動は dockerservicecreatedockerserviceupdate--update-failure-action のフラグを使って制御できます。

  1. redis サービスを調べます。

    $ docker service inspect --pretty redis
    ID: 0u6a4s31ybk7yw2wyvtikmu50
    Name: redis
    Service Mode: Replicated Replicas: 3Placement: Strategy: Spread
    UpdateConfig: Parallelism: 1 Delay: 10s
    ContainerSpec: Image: redis:3.0.6
    Resources:
  1. redis 用のコンテナ・イメージを更新します。 swarm マネージャ は UpdateConfig ポリシーに基づいてノード更新を適用します。

    $ docker service update --image redis:3.0.7 redis
    redis

    スケジューラが適用するローリング・アップデートは、以下がデフォルトです。

    • 1つめのタスクを停止

    • 停止したタスクの更新をスケジュール

    • 更新したタスク用コンテナの起動

    • 更新したタスクが RUNNING を返したら、指定した遅延期間を待機した後、次のタスクを開始

    • 更新中のあらゆる期間で FAILED が帰ってきたら、更新を停止

  1. dockerserviceinspect--prettyredis を実行し、新しいイメージの期待状態を確認します。

    $ docker service inspect --pretty redis
    ID: 0u6a4s31ybk7yw2wyvtikmu50
    Name: redis
    Service Mode: Replicated Replicas: 3Placement: Strategy: Spread
    UpdateConfig: Parallelism: 1 Delay: 10s
    ContainerSpec: Image: redis:3.0.7
    Resources:
    Endpoint Mode: vip

    serviceinspect の出力から、更新の失敗によって一時停止しているのが分かります。

    $ 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...

    一時停止した更新を再開するには、 dockerserviceupdate<サービスID> を実行します。実行例:

    docker service update redis

    更新失敗が続く状態を停止するには、 dockerserviceupdate にフラグを追加し、サービスの状態を調整する必要があるでしょう。

  1. dockerserviceps<タスク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 から ノードを解放 する方法を学びます。