上の前のブログで 、Kubernetesについて理解している必要があります。 Kubernetesネットワーキングに関するこのブログでは、主にKubernetesに関連するネットワーキングの概念に焦点を当てます。
Kubernetes Networkingに関するこのブログでは、次のトピックを理解します。
Kubernetesとは何ですか?
Kubernetesは、コンテナ化されたアプリケーションのデプロイを自動化するためのポータブルプラットフォームを提供するオープンソースのコンテナオーケストレーションツールとして定義できます。
これで、Kubernetesを使用する人は誰でも、Kubernetes Clusterを明確に理解している必要があります。これは、Kubernetesネットワーキングを理解するのに役立ちます。
Kubernetesクラスター
Kubernetesプラットフォームは、必要な状態管理を提供します。これにより、クラスターサービスの実行、インフラストラクチャ内のフィード構成が可能になります。例を挙げて説明しましょう。
クラスターサービスに提供する必要のあるすべての構成情報を含むYAMLファイルについて考えてみます。したがって、このファイルはクラスターサービスのAPIに送られ、環境内でポッドをスケジュールする方法を理解するのはクラスターサービス次第です。したがって、3つのレプリカを持つポッド1の2つのコンテナーイメージと、2つのレプリカを持つポッド2の1つのコンテナーイメージがあるとすると、これらのポッドとレプリカのペアをワーカーに割り当てるのはクラスターサービス次第です。
上の図を参照してください。これで、クラスターサービスが、最初のワーカーに2つのポッドレプリカペア、2番目のワーカーに1つのポッドレプリカペア、3番目のワーカーに2つのポッドレプリカペアを割り当てたことがわかります。現在、クラスターサービスをワーカーと通信するのはKubeletプロセスです。
したがって、このクラスターサービスのセットアップ全体とワーカー自体がこれを構成します Kubernetesクラスター !!
これらの個別に割り当てられたポッドはどのように相互に通信すると思いますか?
答えはKubernetesネットワーキングにあります!
新しいアップデートを入手するには、YouTubeチャンネルに登録してください。
ネットワークの概念で解決すべき主に4つの問題があります。
- コンテナ間の通信
- ポッド間通信
- ポッドからサービスへの通信
- サービスコミュニケーションの外部
ここで、上記の問題がKubernetesNetworkingでどのように解決されるかを説明します。
Kubernetesネットワーキング
ポッド、サービス、外部サービス間のクラスター内の通信は、Kubernetesネットワーキングの概念をもたらします。
それで、あなたのより良い理解のために、私は概念を以下に分けさせてください。
- ポッドとコンテナの通信
- サービス
- 入力ネットワークを介したサービスへの外部接続
ポッドとコンテナの通信
ポッドがどのように通信するかを説明する前に、ポッドとは何かを紹介します。
ポッド
ポッドはKubernetesアプリケーションの基本単位であり、ネットワークスタックやその他のリソースを共有するために同じホストに割り当てられた1つ以上のコンテナで構成されます。したがって、これは、ポッド内のすべてのコンテナがローカルホスト上の他のコンテナに到達できることを意味します。
では、これらのポッドがどのように通信するかについて簡単に説明しましょう。
通信には2種類あります。ザ・ ノード間通信 そしてその ノード内通信。
それでは、ノード内通信から始めましょう。その前に、ポッドネットワークのコンポーネントを紹介します。
ネットワーク下のノード内
ノード内ポッドネットワークは、基本的に、同じポッド上の2つの異なるノード間の通信です。例を挙げて説明しましょう。
def __init __(self)
パケットがpod1からpod2に送信されていると仮定します。
- パケットは、ポッド1のネットワークをeth0で出て、ルートネットワークにveth0で入ります。
- 次に、パケットはLinuxブリッジ(cbr0)に渡され、ARP要求を使用して宛先を検出します。
- したがって、veth1にIPがある場合、ブリッジはパケットの転送先を認識します。
さて、同様にノード間ポッド通信についてお話ししましょう。
Kubernetesの学習に興味がありますか?ネットワーク下のノード間
さまざまなネットワーク名前空間、ネットワークインターフェイス、およびLinuxブリッジを持つ2つのノードについて考えてみます。
ここで、パケットがpod1から別のノードにあるpod4に移動するとします。
- パケットはポッド1ネットワークを出て、veth0でルートネットワークに入ります。
- 次に、パケットはLinuxブリッジ(cbr0)に渡されます。このブリッジは、宛先を見つけるためにARP要求を行う責任があります。
- ブリッジがこのポッドに宛先アドレスがないことを認識した後、パケットはメインネットワークインターフェースeth0に戻ります。
- パケットはノード1を出て、他のノードで宛先を見つけ、ルートテーブルに入ります。ルートテーブルは、CIDRブロックにpod4が含まれているノードにパケットをルーティングします。
- したがって、パケットはnode2に到達し、ブリッジはARP要求を行うパケットを受け取り、veth0に属するIPを見つけます。
- 最後に、パケットはパイプペアを通過してpod4に到達します。
これが、ポッドが相互に通信する方法です。それでは、次に進んで、サービスがポッドの通信にどのように役立つかを見てみましょう。
それで、あなたはサービスが何であると思いますか?
サービス
基本的に、サービスは、トラフィックを受信し、セレクターによって決定されるポッドのセットに要求を転送するようにプロキシーを構成するタイプのリソースです。サービスが作成されると、ポートでの要求を受け入れるIPアドレスが割り当てられます。
現在、クラスターIPアドレスの外部にサービスを公開するためのオプションを提供するさまざまなサービスタイプがあります。
サービスの種類
サービスには主に4種類あります。
ClusterIP: これは、サービスをクラスター内でのみ到達可能にすることにより、クラスター内部IPでサービスを公開するデフォルトのサービスタイプです。
NodePort: これにより、静的ポートで各ノードのIP上のサービスが公開されます。以来、 ClusterIP NodePortサービスがルーティングするサービスが自動的に作成されます。クラスタの外部でNodePortサービスに接続できます。
LoadBalancer: これは、クラウドプロバイダーのロードバランサーを使用してサービスを外部に公開するサービスタイプです。そのため、外部ロードバランサーがルーティングするNodePortサービスとClusterIPサービスが自動的に作成されます。
ExternalName :このサービスタイプは、サービスをのコンテンツにマップします externalName フィールドを返すことによって CNAME その値で記録します。
だから、サービスがすべてだった人たち。さて、外部サービスがこれらのネットワークにどのように接続するのか疑問に思われるかもしれません。
まあ、それは他ならぬ 入力ネットワーク 。
入力ネットワーク
Ingressネットワークは、到達可能なURLを介して外部にサービスを提供するように構成できる、インバウンド接続を許可するルールのコレクションであるため、サービスを公開する最も強力な方法です。したがって、基本的には、クラスター内のサービスへの外部アクセスを管理するKubernetesクラスターへのエントリポイントとして機能します。
それでは、例を挙げてIngressNetworkの動作について説明しましょう。
Linuxブリッジを備えたポッドとルートのネットワーク名前空間を持つ2つのノードがあります。これに加えて、flannel0(ネットワークプラグイン)と呼ばれる新しい仮想イーサネットデバイスがルートネットワークに追加されています。
ここで、パケットがpod1からpod4に流れるようにします。
- したがって、パケットはeth0でpod1のネットワークを離れ、veth0でルートネットワークに入ります。
- 次に、cbr0に渡されます。cbr0は宛先を見つけるためにARP要求を行い、その後、このノード上の誰も宛先IPアドレスを持っていないことを検出します。
- したがって、ノードのルートテーブルがflannel0で構成されているため、ブリッジはパケットをflannel0に送信します。
- これで、フランネルデーモンはKubernetesのAPIサーバーと通信して、すべてのポッドIPとそれぞれのノードを認識し、ポッドIPからノードIPへのマッピングを作成します。
- ネットワークプラグインは、このパケットをUDPパケットにラップし、追加のヘッダーを使用して送信元IPと宛先IPをそれぞれのノードに変更し、このパケットをeth0経由で送信します。
- これで、ルートテーブルはノード間でトラフィックをルーティングする方法をすでに知っているため、パケットを宛先ノード2に送信します。
- パケットはnode2のeth0に到着し、flannel0に戻ってカプセル化を解除し、ルートネットワーク名前空間に送り返します。
- この場合も、パケットはLinuxブリッジに転送され、veth1に属するIPを見つけるためのARP要求が行われます。
- パケットは最終的にルートネットワークを通過し、宛先Pod4に到達します。
つまり、これが外部サービスが入力ネットワークの助けを借りて接続される方法です。さて、私がネットワークプラグインについて話していたので、利用可能な人気のあるネットワークプラグインのリストを紹介しましょう。
さて、Kubernetes Networkingについて多くのことをお話ししたので、実際のケーススタディをお見せしましょう。
ケーススタディ:Kubernetesネットワーキングを使用したウェルスウィザード
Wealth Wizardsは、ファイナンシャルプランニングとスマートソフトウェアテクノロジーを組み合わせて、手頃なコストで専門家のアドバイスを提供するオンラインファイナンシャルプランニングプラットフォームです。
課題
現在、同社にとって、クラウド環境を完全に可視化してコードの脆弱性を迅速に発見して排除することは非常に重要でしたが、アクセス制限を通じてトラフィックを制御したいと考えていました。
そこで、Kubernetesインフラストラクチャを使用して、Kubeクラスター全体のマイクロサービスのデプロイと構成を管理するツールを使用して、クラスターのプロビジョニングとロールアウトを管理しました。
また、Kubernetesのネットワークポリシー機能を使用して、アクセス制限を通じてトラフィックを制御できるようにしました。
問題は、これらのポリシーはアプリケーション指向であり、アプリケーションとともに進化することしかできないということでしたが、これらのポリシーを実施するためのコンポーネントはありませんでした。
したがって、会社がこれに対して見つけることができた唯一の解決策は、ネットワークプラグインを使用することでした。そのため、WeaveNetを使い始めました。
解決
このネットワークプラグインは、Kubernetesのルールを管理および適用するためのネットワークポリシーコントローラーを備えた仮想ネットワークを作成します。これだけでなく、複数のホスト間でDockerコンテナーを接続し、それらの自動検出を可能にします。
したがって、クラスター内にワークロードがあり、クラスター内の他のワークロードと通信するのを停止したいとします。これは、アクセスを制限し、特定のポートの入力コントローラーを介した入力のみを許可するネットワークポリシーを作成することで実現できます。
現在、各Kubernetesノードにデプロイすると、プラグインはポッド間のルーティングを管理し、IPtablesルールを操作するためのアクセス権を持ちます。簡単に言うと、各ポリシーはIPtablesルールのコレクションに変換され、Kubernetesタグを変換するために各マシン間で調整および構成されます。
さて、Kubernetes Networkingについて多くの理論を経験したので、実際にどのように行われるかをお見せしましょう。
ハンズオン
したがって、すべてのユーザーがシステムにKubernetesをインストールしていることを前提として、紹介するシナリオがあります。
製品名と製品IDを保存するとします。そのためには、Webアプリケーションが必要になります。基本的に、Webアプリケーション用に1つのコンテナーが必要であり、バックエンド用にMySQLとしてもう1つのコンテナーが必要であり、そのMySQLコンテナーはWebアプリケーションコンテナーにリンクされている必要があります。
上記の例を実際に実行してみませんか。
始めましょう!
ステップ1: 目的のディレクトリにフォルダを作成し、作業ディレクトリのパスをそのフォルダに変更します。
mkdir HandsOn cd HandsOn /
ステップ2: 次に、WebアプリケーションとMySQLデータベース用のデプロイメントYAMLファイルを作成します。
ステップ3: デプロイメントファイルを作成したら、両方のアプリケーションをデプロイします。
kubectl apply -f webapp.yml kubectl apply -f mysql.yml
ステップ3.1: 両方の展開を確認してください。
kubectl getdeployment
ステップ4: 次に、両方のアプリケーションのサービスを作成する必要があります。
kubectl apply -f webservice.yml kubectl apply -f sqlservice.yml
ステップ4.1: サービスが作成されたら、サービスをデプロイします。
ステップ4.2: サービスが作成されているかどうかを確認してください。
kubectl get service
ステップ5: 次に、実行中のポッドの構成を確認します。
kubectl getpods
ステップ6: webappポッド内のコンテナに移動します。
kubectl exec -it container_id bash nano var / www / html / index.php
ステップ6.1 :今、変更します $ servername ローカルホストからSQLサービス名への「 webapp-sql1 この場合は」、および $ password からの ' edureka 」。また、必要なすべてのデータベースの詳細を入力し、キーボードショートカットを使用してindex.phpファイルを保存します Ctrl + x その後、プレス Y 保存して押す 入る 。
ステップ7: 次に、ポッドにあるMySQLコンテナに移動します。
kubectl exec it container_id bash
ステップ7.1: MySQLコンテナを使用するためのアクセス権を取得します。
mysql -u root -p edureka
ここで、-uはユーザーを表し、-pはマシンのパスワードです。
ステップ7.2: Webアプリケーションからデータを取得するために使用されるデータベースをMySQLで作成します。
CREATE DATABASE ProductDetails
ステップ7.3: 作成したデータベースを使用します。
USE製品詳細
ステップ7.4: Webappからデータを取得するために使用されるMySQLのこのデータベースにテーブルを作成します。
CREATE TABLE products(product_name VARCHAR(10)、product_id VARCHAR(11))
ステップ7.5: ここで、コマンドを使用してMySQLコンテナも終了します 出口 。
ステップ8: Webアプリケーションが動作しているポート番号を確認してください。
kubectl get services
ステップ8.1: 次に、割り当てられたポート番号でWebアプリケーションを開きます。
ステップ9: クリックしたら クエリを送信 、MySQLサービスが実行されているノードに移動してから、コンテナ内に移動します。
これにより、詳細を入力したすべてのリスト製品の出力が表示されます。
Kubernetesの学習に興味がありますか?このKubernetesNetworkingブログに関連性があると思われる場合は、 25万人以上の満足した学習者のネットワークを持つ信頼できるオンライン学習会社であるEdurekaが世界中に広がっています。