Kubernetesのネットワヌキングの図解ガむド。 パヌト1および2

ご泚意 perev。 蚘事の著者であるAmanpreet Singhは自分自身を「ただネットワヌクの䞖界の初心者」ず呌んでいたすが、これが圌がKubernetesの基本的なデバむス本番で䜿甚を理解し、非垞にアクセスしやすい玠材をコミュニティずビゞュアルで共有するきっかけずなりたしたむラスト。 原文では2぀の 郚分に分かれおいたすが、この翻蚳ではそれらを1぀の蚘事にたずめたした。



したがっお、Kubernetesクラスタヌで倚くのサヌビスを開始し、その恩恵を享受しおいたす...たたは少なくずもそれを行う぀もりです。 ただし、クラスタヌを構成および管理するためのナヌティリティは倚数ありたすが、すべおが「内郚」でどのように機胜するかに関心がありたす。 䜕かが壊れおいる堎合はどこを探したすか 私はこれが重芁であるこずを自分で知っおいたす。

Kubernetesを䜿甚するず、簡単に開始できたす。 しかし、内郚を芋るず、耇雑なシステムが存圚したす。 倚数の「動く」コンポヌネントがあり、障害の可胜性に備えたい堎合は、その機胜ず盞互䜜甚を理解する必芁がありたす。 Kubernetesの最も耇雑で、おそらく最も重芁なコンポヌネントの1぀はネットワヌクです。

だから私はそれがどのように機胜するかを正確に理解するこずに決めたした私はドキュメントを読み、レポヌトを聞き、さらにコヌドベヌスを芋たした-そしおこれが私が芋぀けたものです...

ネットワヌクモデルKubernetes


Kubernetesネットワヌクデバむスの䞭心には、重芁なアヌキテクチャ䞊の原則がありたす。「 各炉には独自のIPがありたす 。」

IP囲炉裏はすべおのコンテナに分割され、他のすべおの囲炉裏からアクセス可胜ルヌティング可胜です。 ノヌドで䞀時停止コンテナが機胜しおいるこずに気付いたこずがありたすか それらは「 サンドボックスコンテナ」ずも呌ばれたす。これは、すべおのポッドコンテナで䜿甚されるネットワヌクネヌムスペヌスnetnsを予玄および管理するこずがその仕事であるためです。 このため、ポッドのIPは、コンテナが死んでその堎所に新しいコンテナが䜜成された堎合でも倉曎されたせん。 このモデル-各炉床のIPポッドごずのIP -の倧きな利点は、基盀ずなるホスト䞊のIP /ポヌトの衝突がないこずです。 たた、どのポヌトがアプリケヌションを䜿甚するかを心配する必芁はありたせん。

したがっお、Kubernetesの唯䞀の芁件は、ハヌスのこれらのすべおのIPアドレスが、どのホストにあるかに関係なく、他のハヌスからアクセス可胜/ルヌティング可胜でなければならないこずです。

ノヌド内の盞互䜜甚ノヌド内


最初のステップは、1぀のノヌドのポッドが盞互に通信できるこずを確認するこずです。 次に、このアむデアは、ノヌド間、むンタヌネットなどずの盞互䜜甚に拡匵されたす。

各Kubernetesノヌドこの堎合はLinuxマシンには、ルヌトネットワヌク名前空間-root netnsがありたす。 メむンネットワヌクむンタヌフェむス-eth0-は、このルヌトネットにありたす。



同様に、各囲炉裏には、ルヌトむヌサネットに接続する仮想むヌサネットむンタヌフェむスを備えた独自のネットがありたす。 実際、これは䞀方がルヌトネットに、もう䞀方がネットにある仮想リンクです。



囲炉裏の端はeth0ずいう名前ですeth0は基瀎ずなるホストを知らず、独自のルヌトネットワヌク構成があるず考えおいるためです。 もう䞀方の端には、 vethxxxような名前が付けられたす。 ifconfigたたはip aコマンドを䜿甚しお、Kubernetesホストでこれらのむンタヌフェむスをすべお衚瀺できたす。

これは、アセンブリ䞊のすべおの囲炉裏の配眮です。 ポッドが盞互に通信するために、Linuxむヌサネットブリッゞcbr0がcbr0たす。 Dockerはdocker0ず呌ばれる同様のブリッゞを䜿甚したす。



brctl showコマンドを䜿甚しお、ブリッゞをリストできたす。

パケットがpod1からpod1に送信されたpod1しpod2 

  1. eth0からeth0を介しおpod1を通過し、vethxxxを介しおルヌトネットに到達しvethxxx 。
  2. cbr0 、ARP芁求を䜿甚しお「このようなIPアドレスを持っおいるのは誰ですか」
  3. vethyyyは、正しいIPを持っおいるず応答したす。そのため、ブリッゞはパケットの転送先を認識したす。
  4. パケットはvethyyy到達し、仮想リンクを通過しお、pod2が所有するpod2たす。



したがっお、1぀のノヌドのコンテナは互いに通信したす。 明らかに、他の察話方法もありたすが、これがおそらく最も簡単です。 Dockerも䜿甚したす。

ノヌド間通信


前述のように、囲炉裏にはすべおのノヌドからアクセスできる必芁がありたす。 たた、Kubernetesにずっお、これがどのように実装されるかはたったく問題ではありたせん。 したがっお、L2ノヌド間のARP、L3ノヌド間のIPルヌティング-クラりドプロバむダヌのルヌティングテヌブルに類䌌、オヌバヌレむネットワヌク、さらにはハトを䜿甚できたす。 各ノヌドには、ポッドによっお発行されたIPアドレスの䞀意のCIDRブロックIP範囲が割り圓おられおいるため、各ポッドには独自の䞀意のIPがあり、他のノヌドのポッドず競合したせん。

ほずんどの堎合、特にクラりド環境では、クラりドプロバむダヌはルヌティングテヌブルを䜿甚しお、パケットが正しい受信者に確実に届くようにしたす。 同じこずは、各ノヌドのルヌトを䜿甚しお構成できたす。 問題を解決する他の倚くのネットワヌクプラグむンもありたす。

䞊蚘のような2぀のノヌドの䟋を考えおみたしょう。 各ノヌドには、異なるネットワヌク名前空間、ネットワヌクむンタヌフェむス、およびブリッゞがありたす。



パッケヌゞがpod1からpod4 別のノヌド䞊に続くず仮定したす。

  1. eth0からeth0を介しおpod1を通過し、vethxxxを介しおルヌトネットに到達しvethxxx 。
  2. これcbr0 、宛先を怜玢しおARP芁求を䜜成したす。
  3. このノヌドのpod4察応するIPアドレスを持たないため、 cbr0からメむンネットワヌクむンタヌフェむスeth0にpod4たす。
  4. node1マシンを残し、倀src=pod1およびdst=pod4ネットワヌクワむダに残りたす。
  5. ルヌティングテヌブルでは、各ノヌドのCIDRブロックに察しおルヌティングが蚭定されたす。それに応じお、パケットは、CIDRブロックにIPアドレスpod4が含たれるノヌドに送信されたす。
  6. パケットは、 node2メむンネットワヌクむンタヌフェむスeth0到着しnode2 。 珟圚、 pod4 eth0 IPアドレスでpod4たせんが、ノヌドでIP転送が有効になっおいるため、パケットはcbr0リダむレクトされたす。 ホストルヌティングテヌブルは、 pod4 IPアドレスに䞀臎するルヌトに぀いおスキャンされたす。 このノヌドのCIDRブロックの宛先ずしおcbr0を芋぀けたす。 route -nコマンドを䜿甚しおホストルヌティングテヌブルを衚瀺できたす。 cbr0ようにcbr0のルヌトが衚瀺されたす。

  7. ブリッゞはパケットをvethyyy 、ARP芁求をvethyyyし、IPがvethyyy属しおいるこずをvethyyyたす。
  8. パケットは仮想リンクを通過しおpod4入りpod4 。

オヌバヌレむネットワヌク


オヌバヌレむネットワヌクはデフォルトでは必芁ありたせんが、状況によっおは䟿利です。 たずえば、十分なIPアドレス空間がない堎合、たたはネットワヌクが远加のルヌトを管理できない堎合。 たたは、オヌバヌレむによっお提䟛される远加の管理機胜を取埗したい堎合。 よくあるケヌスは、クラりドプロバむダヌのルヌティングテヌブルでサポヌトされるルヌトの数に制限があるこずです。 たずえば、AWSのルヌティングテヌブルの堎合、ネットワヌクパフォヌマンスに圱響を䞎えるこずなく、最倧50のルヌトのサポヌトが宣蚀されたす。 50を超えるKubernetesノヌドが必芁な堎合、AWSルヌティングテヌブルでは䞍十分になりたす。 このような堎合、オヌバヌレむネットワヌクが圹立ちたす。

オヌバヌレむネットワヌクは、ノヌド間のネットワヌクを通過するパケットをカプセル化したす。 すべおのパケットをカプセル化およびカプセル化解陀するず、遅延ず耇雑さが少し増えるため、䜿甚しない方がよい堎合がありたす。 倚くの堎合、これは必芁ありたせん。䜿甚を決定する際に怜蚎する䟡倀がありたす。

オヌバヌレむネットワヌクでトラフィックがどのように実行されるかを理解するために、CoreOSのオヌプン゜ヌスプロゞェクトであるフランネルの䟋を考えおみたしょう。



ここでは、前の蚭定ず同様の蚭定が衚瀺されおいたすが、 flannel0ず呌ばれる新しい仮想むヌサネットデバむスが衚瀺されflannel0これはルヌトネヌムスペヌスルヌトネットにありたす。 これは、仮想拡匵LANVXLANの実装であり、Linuxの単なる別のネットワヌクむンタヌフェむスです。

パッケヌゞをpod1からpod4 別のノヌド䞊にあるに枡すず、次のようになりたす。

  1. eth0を通過するパケットは、pod1に属するpod1を残しお、vethxxxのルヌトネットにvethxxxたす。
  2. cbr0 、宛先を芋぀けるためにARP芁求を䜜成したす。
    • このノヌドにはpod4に察応するIPアドレスがないため、ブリッゞはpod4にパケットを送信したす。ノヌドのルヌティングテヌブルは、炉床のネットワヌク範囲のタヌゲットずしおflannel0を䜿甚するように構成されたす。
    • flanneldデヌモンは、Kubernetes apiserverたたは基盀ずなるetcdず察話し、そこから炉床のすべおのIPアドレスず、それらに配眮されおいるノヌドに関する情報を受信したす。 したがっお、flannelは、囲炉裏のIPアドレスずノヌドのIPアドレスの適切なマッピングナヌザヌ空間内を䜜成したす。 flannel0はパケットをflannel0 、送信元および宛先IPアドレスを察応するノヌドに倉曎する远加ヘッダヌ付きのUDPパケットでラップし、特別なvxlanポヌト通垞8472に送信したす。



      マッピングはナヌザヌ空間にありたすが、実際のデヌタのカプセル化ず通過はカヌネル空間で行われるため、十分に高速です。
    • カプセル化されたパケットは、ホストトラフィックのルヌティングを担圓するため、 eth0を介しお送信されたす。
  3. パケットは、ノヌドのIPアドレスを送信元および宛先ずしおノヌドを離れたす。
  4. クラりドプロバむダヌのルヌティングテヌブルは、ノヌド間でトラフィックをルヌティングする方法をすでに知っおいるため、パケットは受信ノヌドnode2送信されnode2 。
    • パケットはnode2 eth0に到着しnode2 。 特別なvxlanがポヌトずしお䜿甚されるため、カヌネルはパケットをflannel0送信しflannel0 。
    • flannel0はパッケヌゞのカプセル化をflannel0 、ルヌトネットに転送したす。 パケットは、ノヌドのIPアドレスを送信元および宛先ずしおノヌドを離れたす。 远加のパスは、通垞の非認蚌ネットワヌクの堎合ず䞀臎したす。
    • IP転送が有効になっおいるため、カヌネルはルヌティングテヌブルに埓っおパケットをcbr0に送信したす。
  5. ブリッゞはパケットをvethyyy 、ARP芁求を䜜成し、目的のIPアドレスがvethyyy属しおいるこずをvethyyyたす。
  6. パケットは仮想リンクを通過しおpod4入りpod4 。

実装ごずにわずかな違いがあるかもしれたせんが、党䜓ずしお、これがKubernetesのオヌバヌレむネットワヌクの仕組みです。 Kubernetesでの䜿甚が必芁であるずいう䞀般的な誀解がありたすが、真実はすべおが特定のケヌスに䟝存するずいうこずです。 そのため、たず絶察に必芁な堎合にのみ䜿甚するようにしおください。

翻蚳者からのPS


ブログもご芧ください。

Source: https://habr.com/ru/post/J346304/


All Articles