ネイティブサービス健康チェックを使用しているDocker群連続配備
Docker swarm is a container orchestration tool similar Kubernetes, OpenShift, ECS, EKS and it comes as part of Docker engine. Read more about swarm in official docker docs
イメージバイWilfried Pohnke からPixabay
クラスタの作成
swarmクラスタは、少なくとも1つのマスターノードと任意のワーカーノードを含んでいます.このブログ記事は主にスワームクラスタ作成の代わりにヘルスチェックの設定に焦点を当てます.よりクラスタの作成を読むことができますhere
新しい群れクラスタを作成し、初期化
$ docker swarm init --advertise-addr 192.168.99.100
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \\
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \\
192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
リストノードノードを使用したクラスタノードの一覧
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
dxn1zf6l61qsb1josjja83ngz \* manager1 Ready Active Leader
クリエイトサービス
$ docker swarm init --advertise-addr 192.168.99.100
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \\
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \\
192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
dxn1zf6l61qsb1josjja83ngz \* manager1 Ready Active Leader
employee_service
(これは基本的なコマンドで、あとで追加されます)$ docker service create --replicas 2 -p 8080:8080 --name employee\_service employee\_springboot:latest
このサービスは、春のブートのDockerイメージを使用します.Docker Services lsコマンドを使用して利用可能なサービスを常に一覧表示できます
$ docker service ls
ID NAME SCALE IMAGE
9uk4639qpg7n employee\_service 2/2 employee
連続展開
更新イメージから新しいコンテナを持ち上げて、各々の容器最新版の間で120秒の遅れを維持することによって、サービスを更新してください.連続展開は次のコマンドを使用して実現できます.
各パラメータを見てみましょう
$ docker service update --force --detach=false --update-parallelism=1 --update-delay=300s --update-failure-action=rollback --update-order=start-first employee\_service
detach=false → Do not exit immediately and wait for the service to converge
update-parallelism=1 → Update one container at a time
update-delay=300s → Wait time between each container to come up(optional)
update-failure-action=rollback → Roll back to previous state if failed to update
update-order=start-first → Start new container first before killing existing container
しかし、ここで問題があります.既定では、Dockerサービスは、新しいコンテナを有効にして、アプリケーションの状態に関係なく、健康としてマークします.そこで、クライアントからのHTTPリクエストは、アプリケーションが起動する前に新しいコンテナに転送され、エラーを返します
コンテナヘルスチェック
このエラーを防ぐために、容器のカスタムヘルスチェックを追加する必要があります.それをするには二つの方法がある
$ docker service update --force --detach=false --update-parallelism=1 --update-delay=300s --update-failure-action=rollback --update-order=start-first employee\_service
detach=false → Do not exit immediately and wait for the service to converge
update-parallelism=1 → Update one container at a time
update-delay=300s → Wait time between each container to come up(optional)
update-failure-action=rollback → Roll back to previous state if failed to update
update-order=start-first → Start new container first before killing existing container
このエラーを防ぐために、容器のカスタムヘルスチェックを追加する必要があります.それをするには二つの方法がある
ヘルスチェック命令
まず、以下のHealthCheck命令の例を見てみましょう
Dockerfile
DockerFileに示すように、コンテナは2分の起動時間を取るように構成され、各試行で5秒のタイムアウトでステータスを30秒ごとにチェックします.
HealthCheck命令は、4つのパラメタを受け入れます
--interval=DURATION
(default:30s
)
--timeout=DURATION
(default:30s
)
--start-period=DURATION
(default:0s
)
--retries=N
(default:3
)
最初にチェックが完了した後に、再度チェックしてから、秒単位でコンテナを起動した後、ヘルスチェックを開始します.チェックの一回の実行がtimeout秒より長いならば、チェックは失敗したと思われます.開始期間は、ブートストラップに時間を必要とするコンテナの初期化時間を提供します.しかし、開始期間中にヘルスチェックが成功した場合、コンテナは開始され、すべての連続した失敗は再試行の最大数に向けてカウントされます.
健康Cmd旗
これを行う2番目の方法は、Docker
$ docker service update --force --detach=false --update-parallelism=1 --update-delay=300s --update-failure-action=rollback --update-order=start-first --health-cmd="curl -f http://localhost:8080/api/v1/health/find/status | grep UP || exit 1" --health-start-period=2m --health-interval=5s --health-timeout=30s employee\_service
dockerfileのHealthCheck命令と同じ値でパラメータを渡しますcurl -f http://localhost:8080/api/v1/health/find/status | grep UP || exit 1
"テスト
$ git clone [https://github.com/pavankjadda/DockerHealthCheckDemo.git](https://github.com/pavankjadda/DockerHealthCheckDemo.git)$ cd DockerHealthCheckDemo$ docker build -t employee\_springboot .
新規サービスの作成$ docker service create --replicas 2 -p 8080:8080 --name employee\_service employee\_springboot:latest
つのコンテナによる新しいサービスサービスが終了すると、Docker PSは2つのコンテナ1 A 995 CDE 59 CC、E 7 B 913 E 2 C 3 F 4(上記に示される)を示し、ステータスは健康であるべきです
3 .サービスの更新
$ docker service update --force --detach=false --update-parallelism=1 --update-delay=120s --update-failure-action=rollback --update-order=start-first --update-failure-action=rollback employee\_service
Dockerサービス更新既存のコンテナに要求を提供している間、Docker Service Updateコマンドは別のコンテナ665 ee 54 f 8 beを持ってきます.コンテナの状態は、健康として表示されます.あなたはコンテナの健康状態についての詳細を読むことができますhere
分後に、コンテナ665 ee 54 f 8 beが上がって、容器E 7 B 913 E 2 C 3 F 4が取り下げられます.2分後、両方のコンテナがダウンし、新しいコンテナは、ユーザーの要求を提供している
新しいコンテナで更新されたDockerサービス
注意:私たちは特にAWS ECSブルーグリーン展開のようなコンテナ間の遅延を必要としない限り、我々はDocker Service Updateコマンドから更新遅延フラグを削除することができます.
結論
Docker Service UpdateコマンドとDockerFile HealthCheck命令を使用すると、ユーザーワークフローを中断せずにアプリケーションを継続的に展開できます.
Reference
この問題について(ネイティブサービス健康チェックを使用しているDocker群連続配備), 我々は、より多くの情報をここで見つけました
https://dev.to/pavankjadda/docker-swarm-continuous-deployment-using-native-service-health-checks-52gn
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
Reference
この問題について(ネイティブサービス健康チェックを使用しているDocker群連続配備), 我々は、より多くの情報をここで見つけました https://dev.to/pavankjadda/docker-swarm-continuous-deployment-using-native-service-health-checks-52gnテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol