問題タブ [kube-proxy]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
amazon-ec2 - Kubernetes - 接続追跡は、パッケージを元の宛先 IP (DNAT) に戻すことはありません。
KOPS を使用して作成した AWS EC2 インスタンスを使用して Kubernetes クラスターをセットアップしました。kubernetes サービス (宛先ポッド間でトラフィックを負荷分散します) を介した内部ポッド通信で問題が発生しています。この問題は、ソース ポッドと宛先ポッドが同じ EC2 インスタンス (ノード) にある場合に発生します。Kubernetes は vxlan を使用したノード間通信用に flannel でセットアップされ、kubernetes サービスは iptables を使用して kube-proxy によって管理されます。
次のようなシナリオでは:
- EC2 インスタンス 1 で実行されている PodA (ip-172-20-121-84、us-east-1c): 100.96.54.240
- EC2 インスタンス 1 で実行されている PodB (ip-172-20-121-84、us-east-1c): 100.96.54.247
- ServiceB (PodB が可能な宛先エンドポイントであるサービス): 100.67.30.133
PodA 内に移動して「curl -v http://ServiceB/」を実行すると、応答が得られず、最終的にタイムアウトが発生します。
トラフィック (インスタンス 1 の cni0 インターフェイス) を調べると、次のことがわかります。
- PodA は SYN パッケージを ServiceB IP に送信します
- パッケージが破損し、宛先 IP が ServiceB IP から PodB IP に変更される
変更される Conntrack レジスタ:
/li>PodB は SYN+ACK パッケージを PodA に送信します
- SYN+ACK パッケージのソース IP が PodB IP から ServiceB IP に戻されない
- PodA が PodB から予期しない SYN+ACK パッケージを受信し、RESET パッケージを返送する
- PodA はタイムアウト後に再度 ServiceB に SYN パッケージを送信し、プロセス全体が繰り返されます
ここで tcpdump 注釈付きの詳細:
インスタンス 1 (ip-172-20-121-84、us-east-1c) の関連する iptable ルール (kube-proxy によって自動的に管理される):
これはサービス定義です:
サービスの代わりに PodB IP を直接使用する場合 (したがって、パッケージをマングルする必要はありません)、接続は機能します。
サービスを使用しているが、ランダムに選択された宛先ポッドが別のインスタンスで実行されている場合、接続追跡メカニズムが適切に機能し、PodA が予想どおりに (ServiceB IP からの) SYN+ACK パッケージを認識できるようにパッケージをマングルします。 . この場合、トラフィックは cni0 および flannel.0 インターフェイスを通過します。
この動作は数週間前に始まり、問題が発生することはありませんでした (1 年以上)。クラスターのセットアップや実行中のポッドに大きな変更があったことは覚えていません。SYN+ACK パッケージが予想される src/dst IP に戻されない理由を説明する考えを持っている人はいますか?