私が最初に Kubernetes に出会ったとき、そのネットワーク モデルは影響を与えました 魔法を解決するのに十分なほど大きな影響を与えました。 アキュムレート 22 の状況は次のとおりです。このブログ投稿で、Kubernetes Networking に関する難解な期待を台無しにしたいと考えています。これは、私が書き始めた後に必要だった Kubernetes ネットワーキングの短いマニュアルです Ergomake.
エルゴメイクとは何かを説明して、この投稿を開始します。
ergomake up.
で賑わうと、Kubernetes クラスター内で何が起こるかという雰囲気です。次に、これらの各ステップを手動で実行し、ポッドとサービスを作成するときに Kubernetes 自体が行うすべてのことを示します。簡単に準備できるように、3 ノードの Minikube クラスターを作成し、ある程度多くのメモリを割り当てることをお勧めします。 エルゴメイクの雰囲気とは?Ergomake では、
docker-produce.yml の詳細、それらを「クラウド」にぶつけて、全体を組み立てます
localhost.
の世話をしてください*)次の
docker-produce.yml ファイルを取得できると想像してみてください。
そのファイルのフォルダー内で
ergomake up
をバストすると、our の Kibana と Elasticsearch がバストされます。 ) インフラストラクチャを作成し、すべての「カバーされていない」ポートを
localhost.
にバインドします。その後、
localhost: 5601 で Kibana にアクセスする準備が整います。上記の
ELASTICSEARCH_URL 環境変数によって証明されているように、現在は IP ではなく、プロバイダー ID の使用。
あなたがエルゴメイクアップをするとき、Kubernetesでは何が起こりますか?
ergomake up をせっせとやると、私たちの CLI はあなたの生成ファイルを読み込んで、 と名付けた) 私たちのメリットドウェルに送ります。 台所。 ファイルの内容が kitchen に到達するとすぐに、それらは解析され、に変換されます。 カスタマイズされたリソース定義: ErgomakeEnv.その ErgomakeEnv は、プロデュース ファイル内のすべてのサービス、異議を唱える写真、発見したポートなどの問題を表します。
ergomake up をせっせとやると、私たちの CLI はあなたの生成ファイルを読み込んで、 と名付けた) 私たちのメリットドウェルに送ります。 台所。 ファイルの内容が kitchen に到達するとすぐに、それらは解析され、に変換されます。 カスタマイズされたリソース定義: ErgomakeEnv.その ErgomakeEnv は、プロデュース ファイル内のすべてのサービス、異議を唱える写真、発見したポートなどの問題を表します。
ErgomakeEnvを作成した後、私たちの長所である
kitchen
、その
ErgomakeEnv をクラスタに「適用」します。
、
ErgomakeEnv が「適用」されるとすぐに、 がトリガーされます。私たちの持っている Kubernetes Operator は、
dishwasher
.
と名付けました。
食器洗い機は、
ErgomakeEnv
を変換するソフトウェア プログラムの一部です。 Kubernetes のソースに接続すると、ポッドとサービスが処理され、環境が問題なく繰り返し動作することが保証されます。、これで、Ergomake が
docker-produce.yml ファイルを Kubernetes ソースに変換する方法がわかりました。
ステップを手動で再生中このフラグメントでは、これらの Kubernetes ソースのそれぞれを手動で準備し、実際に Ergomake の手順を再現します。 そのシステムでは、これらの Kubernetes ソースが過剰なレベルで相互にアクセスする方法を学習します。ポッドが作成されるたびに、Kubernetes はそのポッドに IP を割り当てます。 ポッドが起動するとすぐに、クラスターの 任意の 他のポッドにアクセスし、クラスターを明示的に構成して、それが考えられなくなるまで Kibana 用の Pod と Elasticsearch 用の別の Pod を作成すると、Kibana は Elasticsearch にアクセスする準備が整います
elasticsearch
に割り当てられた IP の使用率*) さや 、突き進んで、自分自身のために努力しましょう。 まず、Kibana 用の Pod と Elasticsearch 用の Pod を作成します 。これらを
kubectl prepare -f ./instance.yml でデプロイした後、
でポッド IP を取得します。 kubectl receive pods -o huge.
Elasticsearch の IP を使用して、Kibana のコンテナー内のシェルを取得し、
curl 9200
を目指します.
ポッド が IP の使用率にアクセスできる という明白な真実にもかかわらず、その図には 2 つの主な問題があります 。最初の累積 22 の状況は、ポッドを実際にデプロイするまで、ポッドが受け取る IP がわからないということです 。その Kibana インスタンスを Elasticsearch に接続するように構成する必要があると想像してください。 その場合は、最初に Elasticsearch ポッドを開始し、その IP を取得し、最も現実的な方法で Kibana 環境を
ELASTICSEARCH_URL
にデプロイする必要があります。 ) をその IP に送信します。 言い換えれば、Kibana と Elasticsearch の IP を前もって話すシステムがないということで、両方のポッドを同時にデプロイする準備ができていない可能性があります。IP の使用に伴う 22 番目の累積状況は、IP が交互に使用される可能性があることです 。例として、大気変数を
elasticsearch ポッドに置き換えることが価値がある場合は、新しいポッドをデプロイする必要があります。 それを獲得すると、Kubernetes はそのポッドへの IP をもう一度設定します。 その一意の IP は、以前と同等のものであるとは限りません (ネタバレ: 今はそうではないかもしれません)。
deployment がレプリカを再作成すると、スケールアップまたはスケールダウンされ、ポッドが異なるノードに再割り当てされるため、同等の要素が発生します。 これらの問題を解決するために、
プロバイダー
. プロバイダーを利用することで、サービスの特定の物語を参照する準備ができます。また、IP の代わりに静的 ID を利用することもできます。私たちの例では、
elasticsearch として知られているプロバイダーを作成することができます。 次に、Kibana の
ELASTICSEARCH_URL.
でそのプロバイダー ID に異議を唱えることができます。、そのプロバイダーが機能するためには、トラフィックをルーティングする可能性のあるポッドを示すセレクターと、ポッドの期間中にどの論理ポートがどのポートに描画されるかの定義を含める必要があります。 そのファイルに異議を唱えた後、もう一度 Kibana 内のシェルを取得するように努めます。 そこから
curl
elasticsearch ポッドのポート
9200 ポッド IP の代わりとしてプロバイダーの ID を使用します。
これで、
kibana の
ELASTICSEARCH_URL
をさらにナレーションする準備が整いました。 elasticsearch プロバイダーの過程で Elasticsearch に接続するためのポッド
これらすべての調整をクラスターに準備すると同時に、Kibana がホスト名の使用率で Elasticsearch に正常に接続されていることを確認します 。これらのソースが過剰なレベルでどのように相互にアクセスするかがわかったので、Kubernetes をより深く掘り下げて、魔法のように組み立てることにします. 何が起こるかKibana が
elasticsearch? にリクエストを送信したときこのフラグメントでは、Pod がプロバイダー ID を使用して別の Pod にアクセスする方法を学習します 。アプリケーションが実行される場所に関係なく、リクエストを送信する前に、ホスト名を IP に分解する必要があります。 例として、
google.com から検索情報を送信すると、
を解決したいとします。 google.com
を IP に入力し、そこから検索情報を送信します。
前の例では、内部 Kibana から
elasticsearch に検索情報を送信すると、同等のコンポーネントがビルドされました。検索情報を送信する前に、送信者は
elasticsearch を IP に「変換」する必要がありました。 検索情報を送信する準備ができたら、最も簡単に変更できます。、詳細な検索情報を(
--vvvv) with curl Kibana ポッドから .上記で証明されているように、
elasticsearch からの検索情報は、IP
に送信されると変更されます。 10.100.34.205、これは
elasticsearch プロバイダーの IP です。
その可能性を尋ねると、検索情報をプロバイダーの IP に送信すると、
elasticsearch
に検索情報を送信する場合と同等の最終結果が得られます。 .これは、Elasticsearch に到達する必要があるときに Kibana がリクエストを送信する IP です 。、ここで、2 つの疑問が残ります: 誰が
elasticsearch をプロバイダーの IP に変換するのか、そしてどの IP が必要かを彼らが知るための図
質問 1: 誰が変わるか
elasticsearch
を IP に? Linux システムでは、/etc/unravel.conf ファイルに異議を唱えて、DNS ルックアップが要求するサーバーを決定する準備ができています。作成可能でお送りしますKibana コンテナー内のそのファイルの内容を調べると、DNS 要求が
10.96.0.10
に送信されていることがわかります。 .その IP は、
kube にある
kube-dns として知られるプロバイダーを参照します。 -machine
名前空間なので、ほとんどの場合、それを見ないでください.
次に、そのプロバイダーは、特定の DNS サーバーを実行する
coredns
ポッドにアスペクトします: CoreDNS。 そのポッドはさらに kube-machine 名前空間にあるため、両方を頻繁に参照することはほとんどありません.
coredns
ポッド
elasticsearch プロバイダーの IP を識別します。
質問 2: CoreDNS は
elasticsearch
の IP をどのように認識しますか?
kube-machine
にある多くのポッドの中で、あまり頻繁に見ないものがあるかもしれませんが、kube-controller-manager.
kube-controller-manager
ポッドは、クラスターの目的のナレーションを監視し、その 目的の クラスターの 有効な ナレーションに変更するナレーション. プロバイダーを作成する場合は、
kube-controller-manager
は、Endpoint および
として知られるさらなるソースにそれを台無しにします。 )EndpointSlices
.
CoreDNS は、これらの
Endpoint および
EndpointSlices を使用します。 DNS クエリを解決します。 質問を受けるたびに、これらのソースを調べて、特定の IP で応答します 。、その構成をよく見てみると、正しい
ConfigMap 内部の
kube です。 -マシン は、への参照を参照してください。 CoreDNS Kubernetes プラグイン.そのプラグインは、CoreDNS を「クラスターに配慮した」DNS サーバーに変えます。 別のケースでは、DNS サーバーが別の処理を行っている可能性があります。 Pod へのサービスの「先行」リクエストを取得するにはどうすればよいですか?このフラグメントでは、プロバイダーへのリクエストが特定のポッドにリダイレクトされる方法を学習します。今では、鋭敏な読者は、
elasticsearch プロバイダーの IP が now を行っていることを見て、ふけることさえあるかもしれません。 Elasticsearch ポッドの IP と一致しません。 その IP はさらに、どのポッドまたは仮想マシンにも進まなくなりました。その場合、にリクエストするにはどうすればよいですか プロバイダーの IP はそのプロバイダーのポッドを取得しますか?
検索情報がプロバイダーのポッドに到達するシステムは、そのパケットが実際にはプロバイダーの IP に送信されない ことはありません 。 別の例として、ノードはプロバイダーの IP 宛てのパケットを書き換え、ポッドの IP 宛てにアドレス指定します。 .
システム ノードは、
. このプログラムにより、ディレクターは、ネットワーク パケットの処理方法を決定する原則を構成できます 。、これらの iptables
iptables
原則のほとんどを発見したいことを教えてください。 その場合は、
minikube ssh -n minikube-m02 を使用して、これらのポッドを操作している Minikube ノードに SSH で接続する準備ができています。次に、
iptables 原則全体を
iptables-keep
でリストします。 。 または、を使用して、"
elasticsearch" を含む絶対的に最も現実的な原則をフィルター処理する準備をすることができます。 iptables-キープ | grep elasticsearch.
自分の原則全体を決定することを恐れてはなりません。 注意すべきことは、それら (および他のペア) が特定のビルド (ポッド) に宛てられたパケットを取得することです。 誰がこれらの
iptables
を作成しますか? 原則?私たちの友人
kube-controller-manager
を覚えていますか? そのフェローがエンドポイントとエンドポイントスライスを作成すると、
kube-proxy として知られるポッドがこれらのソースを読み取り、パケットをリダイレクトする IP テーブルの原則を組み立てます。プロバイダーからそのプロバイダーのポッドへ。、
kube-proxy
ポッドは、生成されるセージ上の すべての ノードで実行されます。 DaemonSet。 そのシステム、Kubernetes も明らかであり、すべてのノードが kube-proxy を使用してそのノードの更新を行う可能性があることも明らかです。
iptables原則.
ショーとして、プロバイダーが複数のポッドをターゲットにする場合、レプリカの巨大な代替物を使用した
展開 のポッドに匹敵します。それらの間のトラフィックを安定してロードする
iptables の原則に由来する可能性があります。 これらの
iptables の原則は、ランダムにトラフィックをポッドに割り当てることに注意を払います.
まとめて挿入Pod を作成するたびに、IP が割り当てられます 。クラスターの任意の 2 つのポッドは、それらの IP アドレスの使用率を使用して、他のすべてのポッドにアクセスできます。Pod が相互にアクセスするために IP アドレスを使用する累積 22 の状況は、Pod が削除されて再作成されると、これらの IP が交互になる可能性があるということです。ポッドが一貫して正確にお互いに対処するために、サービスに異議を唱える準備ができている可能性があります。
プロバイダーを作成する場合は、
kubectl
の利用*)、Kubernetes
apiserver はその詳細を保持し、
CoreDNS は、プロバイダー ID をプロバイダー IP に提示する図を知るために、これらのソースに異議を唱えます。 さらに、すべてのノードの kubernetes-controller として知られる別のポッド- manager
は獲得し、そのプロバイダーを 2 つのソースに分解します: Endpoints と EndpointSlices.kube-proxy
ポッドは、ノードの iptables を更新します。 原則。 これらの
iptables 原則により、プロバイダーの IP へのリクエストはプロバイダーのポッドにアドレス指定されます
。最後に、ポッドが検索情報を作成するとき、プロバイダーの IP を取得するために、CoreDNS への DNS 要求が発生する可能性があります。 次に、その IP にパケットを送信するときに、
kube-proxy は、有効な Pod の IP にアドレス指定されたパケットを取得します。
いくつかの追加メモ
読者を複雑にしないように、いくつかの詳細を意図的にスキップしました.これらの詳細の中には、 Pod に IP が割り当てられる方法 そしてどうやって iptables
原則動作.さらに、CNI プラグインには触れていません。 実装、世話をする Kindnet
.コンテナ ネットワーキング自体のツアー さらに、ほとんどの読者にとって貴重なものとなるでしょう.最後に、たまたま CoreDNS 自体についてさらに学ぶためにお金を費やした場合、このトークは非常にオープンです.チャットしたいですか?
私たちは 2 人のスタートアップであり、活気に満ちた人々との対話を大切にしています。連絡を取り合うためにお金を使うなら、私と一緒にスロットを予約する準備ができています ここに.Kubernetes、リピートライン インターフェイス、エフェメラル環境、または Ergomake で構築しているものについて、何時間もチャットしていました。または、ツイートまたは DM をお送りいただくこともできます。 @thewizardlucas または電子メール lucas.costa@getergomake.com.
𝚆𝚊𝚝𝚌𝚑 𝙽𝙾𝚆 📺