現在のすべての要求が終了するまで閉じ防止春ブートアプリケーション

WORDS:

私たちは、クライアントが時には非常に大きなファイル(〜200ギガバイト)を取得することができます一つはエンドポイントの数を、さらす春ブーツ(2.0.4)アプリケーションがあります。アプリケーションは、ローリング更新戦略で構成Kubernetes配備を介してポッド内に露出されています。

私たちは、ポッドが破壊を取得し、新しいものがスピンアップ最新バージョンに画像を設定することにより、当社の展開を更新するとき。当社のサービスの提供は、新しい要求のためのシームレスです。しかし、現在の要求が切断されますかすることができますと、これは非常に大きなファイルをダウンロードの途中でクライアント用いらいらすることができます。

我々はそれのPIDを経由してアプリにシャットダウン信号を送信する前に一時停止を注入するために、当社の展開仕様でコンテナのライフサイクル停止前のフックを設定することができます。これが終了するように設定されているポッドに行くのいずれかの新しいトラフィックを防ぐことができます。その後、アプリケーションのシャットダウンプロセス現在のすべての要求が完了するまで(これは数十分かかる場合があります)を一時停止する方法はありますか?

ここでは、春のブートアプリケーション内から試みているものです。

  • これを傍受シャットダウンリスナーを実装しますContextCloseEvents残念ながら、我々は確実にアクティブな要求のリストを取得することはできません。有用であった可能性のあるアクチュエータのメトリックは、シャットダウンプロセスのこの段階では使用できません。

  • 実装することにより、アクティブなセッションカウントHttpSessionListenerおよびオーバーライドsessionCreated/Destroyカウンタを更新する方法を。これは、メソッドは別のスレッドで呼び出されていないので、そう常にシャットダウンリスナーに同じ値を報告して失敗しました。

我々は試してみてくださいその他の戦略?アプリ自体、またはコンテナ内から、または直接Kubernetesリソース記述子て?アドバイス/ヘルプ/ポインタがはるかに高く評価されるだろう。

編集:我々は唯一の中に、現在接続しているクライアントにサービス停止を軽減しようとしているように、我々は、クラスタを管理する修正ポッドスペックを経て、当社の展開の管理更新

WORDS:

私たちは、私たちの問題を解決するには、上記の組み合わせをしました。

  • 我々は生産に見ることを期待絶対最大にterminationGracePeriodSecondsを増加
  • あまりにも早く私たちのポッドへのルーティングを防ぐTraefikにlivenessProbeを追加しました
  • 一時停止を注入し、監視スクリプトを起動停止前のフックを導入しました:
    1. 私たちのクラスタTraefikサービスの外国アドレスを持つ私たちのプロセスに確立された接続のために監視のnetstat(1 PID)
    2. PID 1にTERMを送りました

私たちが監視スクリプトからのpid 1にTERMを送信するためのポッドは、この時点で終了とterminationGracePeriodSecondsれることに注意してくださいは、ヒットを得ることはありません(それは予防措置としてあります)

ここではスクリプトは次のとおりです。

#!/bin/sh

while [ "$(/bin/netstat -ap 2>/dev/null | /bin/grep http-alt.*ESTABLISHED.*1/java | grep -c traefik-ingress-service)" -gt 0 ]
do
  sleep 1
done

kill -TERM 1

ここでは、新たなポッドの仕様は次のとおりです。

containers:
  - env:
    - name: spring_profiles_active
      value: dev
    image: container.registry.host/project/app:@@version@@
    imagePullPolicy: Always
    lifecycle:
      preStop:
        exec:
          command:
          - /bin/sh
          - -c
          - sleep 5 && /monitoring.sh
    livenessProbe:
      httpGet:
        path: /actuator/health
        port: 8080
      initialDelaySeconds: 60
      periodSeconds: 20
      timeoutSeconds: 3
    name: app
    ports:
    - containerPort: 8080
    readinessProbe:
      httpGet:
        path: /actuator/health
        port: 8080
      initialDelaySeconds: 60
    resources:
      limits:
        cpu: 2
        memory: 2Gi
      requests:
        cpu: 2
        memory: 2Gi
  imagePullSecrets:
  - name: app-secret
  serviceAccountName: vault-auth
  terminationGracePeriodSeconds: 86400

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=173119&siteId=1