クラスター内のポッドからの出口接続用の SNAT ポートが不足しているのはなぜですか?
Red Hat OpenShift on IBM Cloud 4.12 以降、送信元ネットワーク・アドレス変換 (NAT) ポート範囲が 32768 - 65535
(以前は 1024 - 65535
) に変更されました。 この変更は、以下のシナリオが発生する可能性がある問題を解決するために行われました。
- NNAT ポートは、NLB タイプの LoadBalancer の NodePort と競合する VPC クラスター内で選択されます。 この場合、その出口接続は失敗します。
- SNAT ポートは、クラスター・サービスが後で NodePortに使用する必要がある、30,000 から 32,767 の範囲の NodePort 範囲の長時間実行出口接続用に選択されます。 この場合、その SNAT ポートを使用する接続が終了してクローズされるまで、そのクラスター・サービスはその NodePort でトラフィックを取得しません。
- SNAT ポートは、 Linux サービス、
hostPort
ポッド・ポート、またはhostNetwork
ポッド・ポートが後で使用する長期実行 Egress 接続用に選択されます。 その場合、その SNAT ポートを使用している接続が終了してクローズされるまで、そのサービスまたはポッドは開始されず、機能しません。
通常、このポート範囲を制限しても問題ありません。 ただし、ポッド・ネットワーク・ポッドで非常にスケーラブルなアプリケーションを実行している場合は、単一のワーカーに以下のいずれかのケースがあります。
- クラスター内のポッドまたはノード以外の宛先への 30,000 を超える Egress 接続が一度に開かれます。
- 30,000 個の Egress 接続が、相互に数分以内にオープンされています。
32768 から 65535 の範囲の大きさが十分でない可能性があります。 これに対して考えられる 2 つの解決策は、以下のオプションです。
- さらにノードを追加し、各ノードが必要とする SNAT ポートが 30,000 個未満になるように、これらのすべての Egress 接続を行うノードごとに少なくとも 1 つのポッドを用意します。 これが望ましい解決策である
- Calico 内のポッド
natPortRange
をより大きな範囲に明示的に設定します。 VPC NLB を使用したり、特定のハードコーディングされたポートを使用する NodePort サービスまたはhostPort
ポッドを追加したりすると、上記のポート競合が発生する可能性があることに注意してください。
このポート範囲を設定する場合は、 calicoctl
バイナリーをダウンロードし、クラスターの KUBECONFIG
環境変数を設定して、以下のコマンドを実行する必要があります。ここで、 LOWER_RANGE_LIMIT
は 1025
と 32767
の間です。
この変更は即時に有効になります。クラスター・マスターを 1.25 に更新する前にこれを行った場合、設定した内容は更新によって上書きされません。
calicoctl patch felixconfiguration default --patch '{"spec":{"natPortRange": "LOWER_RANGE_LIMIT:65535"}}'