サイドカープロキシがPodに注入されると、Podの停止後に時間のかかるリクエストが失われたり、失敗したりすることがあります。このトピックでは、この問題の説明と原因、およびこの問題の解決策について説明します。
問題の説明
サイドカープロキシがPodに注入されると、Podの停止後に次の問題が発生する可能性があります。
このPodへの時間のかかるリクエストの一部が失われます。
このPodを使用して他のサービスに対して開始されたリクエストが失敗します。
原因
サイドカープロキシがPodに注入されると、Podのトラフィックはサイドカープロキシによって制御されます。Podの停止が開始された後、対応するサービスはPodにトラフィックをルーティングしなくなります。
デフォルトでは、Istioは、Podが停止されたというシグナルを受信してから5秒後に、サイドカープロキシを強制的に停止します。サイドカープロキシが停止すると、受信トラフィックは受信されなくなりますが、確立済みの受信接続は引き続き処理できます。送信接続は影響を受けず、予期したとおりに開始できます。停止されたサービスのPodへのリクエストに時間がかかる場合、接続が処理されているかどうかに関係なく、既存の受信接続と送信接続は終了します。
解決策
解決策 1:サイドカープロキシの終了ドレイン期間を変更する
サイドカープロキシの終了ドレイン期間を延長して、この期間内に受信接続と送信接続を処理できるようにすることができます。
ASMコンソール にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASMインスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。
[サイドカープロキシ設定] ページで、[名前空間] タブをクリックします。
[名前空間] ドロップダウンリストから名前空間を選択します。[ライフサイクル管理] をクリックし、[pod終了時のサイドカープロキシドレイン期間] を選択し、[Pod終了時のサイドカープロキシドレイン期間] に適切な値を入力して、[設定の更新] をクリックします。
解決策 2:サイドカープロキシのライフサイクルを設定する
リクエストの最大待機時間を推定できない場合は、preStopパラメーターを設定してサイドカープロキシのライフサイクルを設定することをお勧めします。 preStopパラメーターは、リクエストが存在するかどうかを確認するために使用されます。リクエストが存在しない場合、サイドカープロキシはデフォルトの時間(5秒)が経過した後に停止します。
ASMコンソール にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASMインスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。
[サイドカープロキシ設定] ページで、[名前空間] タブをクリックします。
[名前空間] ドロップダウンリストから名前空間を選択します。 [ライフサイクル管理] をクリックし、[サイドカープロキシのライフサイクル] を選択し、[サイドカープロキシのライフサイクル] コードエディターに次のコンテンツを入力して、[設定の更新] をクリックします。
{ "postStart": { "exec": { "command": [ "pilot-agent", // pilot-agent "wait" // wait ] } }, "preStop": { "exec": { "command": [ "/bin/sh", // /bin/sh "-c", // -c "while [ $(netstat -plunt | grep tcp | grep -v envoy | wc -l | xargs) -ne 0 ]; do sleep 1; done" // envoy 以外の tcp 接続が存在する間、1 秒待機する ] } } }