ネイティブサービス健康チェックを使用しているDocker群連続配備


このブログ記事は、ネイティブのDockerサービスコマンドを使用して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

クリエイトサービス

  • Githubプロジェクトから構築されたこの記事で使用されるDockerイメージDockerHealthCheckDemo ,
  • マスタノードにsshを実行し、次のコマンドを実行して新しいサービスを作成します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はHealthCheck命令(コマンド)を提供します
  • または、Dockerサービスアップデートコマンドに健康Cmdフラグを加えてください
  • どちらも同じことですが、設定の場所を定義しています.

    ヘルスチェック命令


    まず、以下の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命令と同じ値でパラメータを渡します
  • -ヘルスcmd =curl -f http://localhost:8080/api/v1/health/find/status | grep UP || exit 1 "
  • --健康開始期間
  • --健康間隔= 5 s
  • --健康タイムアウト
  • テスト

  • repoをクローンし、イメージを構築する
  • $ 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命令を使用すると、ユーザーワークフローを中断せずにアプリケーションを継続的に展開できます.