みなさんこんにちは。私は次男です。 公開アカウントのフォロワーからプライベートメッセージが届き、次のような質問を受けました。「ポッドから外部ネットワークへのアクセス プロセスには VTEP が関係しますか?」関係する NAT の詳細は何ですか? それをざっくり整理してこの記事を書きました。 公開アカウントに書き始めて半年ほどになります。ここで少し考えてみましょう。私にとって、各記事のトピックの選択、記事に含まれる知識ポイントの編集、研究、整理、執筆はすべてトレーニングのプロセスです。あなたにとっては、ほんの数分間の短い滞在です。私たちにとって、それはコミュニケーションのつながりです。利益はまったくなく、少しは誤った評判があるかもしれませんが、それは決して私の当初の意図ではありませんでした。 関連トピック記事「Tun デバイスの魔法の使用 - フランネル UDP モード」では、Tun デバイスの助けを借りていくつかの高解像度の写真を描き、ポッドが相互に通信するときのデータ フロー、このデータ フロー プロセスに関係するネットワーク デバイス、およびこれらのデバイスが各ネットワーク パケットをそれぞれの位置で慎重に処理して移動する方法について友人と詳細に話し合いました。 その記事には、ポッド間のネットワーク通信のシナリオが含まれています。 K8s Overlay ネットワーク モデルでは、このプロセスでは、ポッドに出入りするトラフィックに対して NAT は必要ありません。 VXLAN を使用すると、トラフィックがカプセル化されるため、ホスト ネットワークは Pod トラフィックの詳細を気にしたり確認したりする必要がありません。 しかし、Pod が www.baidu.com などのインターネットにアクセスしようとすると、シナリオは異なります。まず、VXLAN はここでは役に立ちません。 VXLAN は、通信に関与する作業ノードの VTEP を使用して、それぞれパケットのカプセル化とカプセル化解除を実行します。明らかに、外部リモート サービスにはこれと同等の VTEP は存在しません。 2 番目に、VXLAN を使用する必要はありません。 実際、NAT がここで関係していることは、誰でも多かれ少なかれ推測したり漠然と感じたりすることができます。しかし、私は次のような詳細な質問をせずにはいられません。
まず最初の質問に答えると、トラフィックがホスト マシンから出るときに NAT が必ずしも必要というわけではありません。これは、K8s で使用されるネットワーク モデルによって異なります。たとえば、アンダーレイ モデルでは、NAT を使用する必要はありません。詳細については、次兄の「VPC と 3 つの K8s ネットワーク モデルのマルチ画像概要」をご覧ください。ただし、オーバーレイ モデルでは NAT が非常に必要となるため、この記事のシナリオはオーバーレイ モデルに限定されます。 さらに、この記事で説明する NAT はワーカー ノード レベルにのみ到達します。ネットワーク パケットが作業ノードを離れてから最終的に Baidu サーバーに到達するまでの間に、途中で複数の NAT を通過する可能性があることはわかっていますが、それを制御することはできません。しかし、次兄は「Wide Angle - Let's Talk About Underlay」という記事で、データセンターのネットワーク トポロジの高解像度の図を描きました。興味があれば開いて見てみてください。 さあ、本題に入りましょう。 ネットフィルター接続トラックいつものように、NAT に関わる基本から始めます。 Netfilter conntrack は CT とも呼ばれ、接続追跡を意味します。追跡可能なプロトコルの接続状態を維持するカーネルモジュール (nf_conntrack) です。現在サポートされているプロトコルは、TCP、UDP、ICMP、DCCP、SCTP、GRE の 6 つだけです。 追跡に関しては、記録、検索、およびバックトラックのためのマークまたはマークのグループが必要です。ここで CT は、各ネットワーク パケット内の送信元 IP、宛先 IP、送信元ポート、宛先ポート、プロトコルの 5 つのパラメータで構成されるタグのセットを使用します。もっと簡単に言えば、CT は、これら 5 つのパラメータを使用して単方向接続を一意に識別できると考えています。これは一方向の接続であることに注意してください。ネットワーク通信には、送信と返信という 2 つの単方向接続が含まれます。 このマシンの CT レコードを表示するには、conntrack -L コマンドを使用できます。次の表に示すように、最初のエントリには出発方向と帰路方向の両方が記録されます。このような各レコードは、接続追跡エントリ (conntrack エントリ) と呼ばれます。 # 接続トラック- L conntrack エントリがどのようなものかを確認したので、レコードがどこで発生するかを見てみましょう。次の図では、ルート名前空間のルーティング + iptables に、楕円でマークされた 2 つの conntrack が表示されます。 1 つは PREROUTING チェーンの近くにあり、もう 1 つは OUTPUT チェーンの近くにあります。 これら 2 つのフック ポイントが接続追跡レコードを作成するのはなぜですか?これらは、新しい接続の最初のパケットが到着する最初の場所であるためです。
もちろん、新しく作成された conntrack エントリが新しい単方向接続に対応していること、およびこの接続の最初のパケットがまだ有効であり、さまざまな処理後に破棄されていないことを確認するために、LOCAL_IN および POSTROUTING で確認操作が実行されます。これはこの記事の焦点ではないので、省略します。 特別な状況がない限り、上記の conntrack エントリは、後で使用するために PREROUTING チェーンと OUTPUT チェーンに正常に記録されていると大まかに想定できます。 図1: Pod aから外部ネットワークにアクセスする際のデータフロー NAT接続追跡は、Kubernetes Service、ServiceMesh サイドカー、ソフトウェア 4 層ロード バランサー LVS/IPVS、Docker ネットワーク、OVS、iptables ホスト ファイアウォールなど、多くのネットワーク アプリケーションの基礎であり、これらはすべて接続追跡機能に依存しています。 NAT は CT とさらに切り離せない関係にあります。 上の図を使用して、Pod a が Baidu にアクセスしたときに、ネットワーク パケットがプロトコル スタックを通過し、ルーティング テーブルと iptables の組み合わせのアクションによって何が起こるかを確認してみましょう。 www.baidu.com の IP アドレスは 180.101.49.11 で、Pod a の IP アドレスは 10.244.0.2 です。 1.1: Pod a から開始されたリクエストは、1.1 から 1.5 まで送信されます。詳細については、私の次男がすでに「Tun デバイスの魔法の使用 - Flannel UDP モード」で説明しているので、ここでは省略します。 1.6:ブリッジがネットワーク パケットをネットワーク層に配信すると、ネットワーク パケットは 1.6 のルート ネットワーク名前空間で新たな旅を始めます。同様に、1.1 から 1.4 では、ネットワーク パケットは引き続き Pod a 自身のネットワーク名前空間内でのみ循環します。 1.5 では、ネットワーク パケットは 1 つのネットワーク名前空間から別のネットワーク名前空間に移動しました。 1.7:前のセクションで述べたように、ここでの conntrack は新しい接続を記録します。 1.8:ルーティング選択後、ネットワーク パケットはホスト マシンの eth0 から発信される必要があります。そこで、FORWARD チェーンをたどって POSTROUTING チェーンにたどり着きました。 1.9:次は NAT シーンです。以下の iptables ダンプと組み合わせると、ソース IP が CIDR 10.244.0.0/16 にあり、docker0 インターフェイスに送信されていない場合は、NAT が実行されることがわかります。 Pod a の送信元 IP アドレスをノード 1 の IP アドレスに変更します。 1.10:リンク層へのネットワーク パケットの送信を開始します。 1.11:ネットワーク パケットは eth0 からホストから送信されます。 - A POSTROUTING - s 10.244.0.0 / 16 ! - o docker0 - j マスカレード 問題をもう一度見てみましょうPod が Baidu にアクセスするときの CT と NAT の介入の詳細を読んだ後、学生の質問「Pod a が Baidu にアクセスしたときに VTEP が介入しないのはなぜですか?」を整理してみましょう。 図 2 は、「Tun デバイスの魔法の使用 - Flannel UDP モード」という記事からの画像です。これは、ノード 1 の Pod a がノード X の Pod b にアクセスする際のデータ フローを詳しく説明しています。理解を容易にするために、Flannel VXLAN モードで使用される VTEP を、UDP モードで使用される tun デバイス + flannel デーモンの組み合わせに置き換えました。この変更は、元々カーネル状態にあったデータの解凍とカプセル化の操作をユーザー状態デーモンに移動するだけで、名前は変更されたものの、実質的な変更ではありません。 Pod a からリクエストが開始されると、外部ネットワークにアクセスするか別の Pod にアクセスするかに関係なく、図 1 および 2 の 1.1 から 1.5 までのプロセスは変更されません。 ネットワーク パケットが 1.5 からネットワーク層に入ると、ネットワーク パケットの宛先が変わります。
図2: ポッド間の通信時のデータフロー 上記がこの記事の全内容です。 |
cloudcone メールからの最新ニュース: SSD VPS をいくつかインストールした後、パフォ...
フェーズ1: コンテンツ関連コンテンツの関連性とは、ユーザーが検索エンジンでキーワードを検索すると、...
ウェブ編集者は特別な職業であり、特別なグループでもあります。関連の推計によると、現在、全国でウェブ編...
locvpsは現在、シンガポールVPS(シンガポールクラウドサーバー)を40%永久割引で提供していま...
SEO 技術を勉強すると、誰もがこのような感覚を抱くでしょう。つまり、ウェブサイトのキーワードを上位...
すべての SEO チュートリアルでは、「ウェブサイトのタイトルは簡単に変更できない」と教えられます。...
IDC Review Network (idcps.com) は 3 月 17 日に次のように報告し...
SEO は、ランキングを上げるために多数の外部リンクを使用する従来の方法から、ウェブサイトの総合的な...
クラウド コンピューティングは、ソフトウェアの開発、展開、配信へのアプローチ方法に革命をもたらしまし...
情報フローを作成する際に、最適化技術の他に最も注意すべきことはトラフィックです。交通量は多いですか?...
今日、クラウド コンピューティングは、ほぼすべての企業にとって基本的な IT インフラストラクチャ戦...
今日は、ウェブサイトの起動速度がウェブサイト全体の動作に与える影響を詳しく分析します。ぜひ私とコミュ...
1.ブランドマーケティング計画が2019年の新たなトレンドを形成する2019 年には、創造性、データ...
序文最近、分散トランザクションに関するブログ投稿をいくつか読んで、メモを取りました。ハハハ〜データベ...
2019年に最初の祭りが開かれて以来、ダブルイレブンカーニバルは11年間開催されています。これは人気...