クラシック・クラスター: テイント適用ノードを使用するとソース IP 保持が失敗するのはなぜですか?
クラシック・インフラストラクチャー
クラシック・クラスターで、サービス構成ファイルの を に変更して、externalTrafficPolicy
バージョン 1.0 ロード・バランサーLocal
・サービスのソース IP 保持を有効にしました。
しかし、トラフィックがアプリのバックエンド・サービスに到達しません。
ロード・バランサー・サービスのソース IP 保持を有効にすると、クライアント要求のソース IP アドレスは保持されます。
これらのサービスは、要求パケットの IP アドレスが変更されないようにするために、同じワーカー・ノード上の各アプリ・ポッドにのみトラフィックを転送します。 通常、ロード・バランサーのサービス・ポッドは、各アプリ・ポッドがデプロイされたワーカー・ノードと同じワーカー・ノードにデプロイされます。 しかし、次のように、サービス・ポッドとアプリ・ポッドが同じワーカー・ノードにスケジュールされない状況もあります。 Kubernetes taints をワーカーノードで使用する場合、汚染されたワーカーノードでは、汚染耐性を持っていないポッドは実行できなくなります。 ソース IP 保持が、次に示すように、使用しているテイントのタイプに基づいて動作していない可能性があります。
-
エッジ・ノードのテイント: クラスター内の各パブリック VLAN 上の複数のワーカー・ノードに
dedicated=edge
ラベルを追加して、ロード・バランサー・ポッドがそれらのワーカー・ノードにのみデプロイされるようにしました。 その後、それらのエッジ・ノードにテイントも適用して、他のすべてのワークロードがエッジ・ノードで実行されないようにしました。 しかし、アプリ・デプロイメントにエッジ・ノードのアフィニティー・ルールと容認を追加しませんでした。 アプリ・ポッドは、サービス・ポッドと同じテイント適用ノードにスケジュールすることはできず、トラフィックはアプリのバックエンド・サービスに到達しません。 -
カスタム・テイント: カスタム・テイントをいくつかのノード上で使用して、そのテイントの容認があるアプリ・ポッドだけをそれらのノードにデプロイできるようにしました。 アプリのデプロイメントと、ロード・バランサー・サービスにアフィニティー・ルールと耐障害性を追加したので、それらのポッドはそれらのノードにのみデプロイされます。 しかし、
ibm-cloud-provider-ip
名前空間に自動的に作成されるkeepalived
ibm-system
ポッドがあるので、ロード・バランサーとアプリ・ポッドは必ず同じワーカー・ノードにスケジュールされます。 これらのkeepalived
ポッドには、使用したカスタムのテイントに対する容認がありません。 これらのポッドをアプリ・ポッドが実行されているノードと同じテイント適用ノードにスケジュールすることはできず、トラフィックはアプリのバックエンド・サービスに到達しません。
以下のいずれかのオプションを選択して、この問題を解決します。
エッジ・ノードのテイント: ロード・バランサー・ポッドとアプリ・ポッドをテイント適用エッジ・ノードに確実にデプロイするには、アプリ・デプロイメントにエッジ・ノードのアフィニティー・ルールと容認を追加します。 ロード・バランサー・ポッドには、デフォルトでこれらのアフィニティー・ルールと耐障害性があります。
カスタム・テイント: keepalived
ポッドが容認を保持していないカスタム・テイントを削除します。 代わりに、ワーカー・ノードにエッジ・ノードのラベルを付けてから、それらのエッジ・ノードにテイントを適用することができます。
前のオプションのいずれかを完了しても keepalived
ポッドがスケジュールされない場合は、keepalived
ポッドに関する詳細な情報を得ることができます:
keepalived
ポッドを取得します。kubectl get pods -n ibm-system
- 出力で、
ibm-cloud-provider-ip
Status** が ** になっているPending
ポッドを探します。 例:ibm-cloud-provider-ip-169-61-XX-XX-55967b5b8c-7zv9t 0/1 Pending 0 2m <none> <none> ibm-cloud-provider-ip-169-61-XX-XX-55967b5b8c-8ptvg 0/1 Pending 0 2m <none> <none>
- それぞれの
keepalived
ポッドに対して describe を実行して、Events セクションを探します。 リストされたエラー・メッセージまたは警告メッセージに対処します。kubectl describe pod ibm-cloud-provider-ip-169-61-XX-XX-55967b5b8c-7zv9t -n ibm-system