1.4. Pod の通信方法
Pod は、IP アドレスを使用して通信し、Dynamic Name System (DNS) を使用して Pod またはサービスの IP アドレスを検出します。クラスターは、どの通信を許可するかを制御するさまざまなポリシータイプを使用します。Pod は、Pod 間およびサービスと Pod 間の 2 つの方法で通信します。
1.4.1. Pod 間通信 リンクのコピーリンクがクリップボードにコピーされました!
Pod 間通信とは、クラスター内で Pod が相互に通信する機能です。これは、マイクロサービスと分散アプリケーションが動作するために不可欠な機能です。
クラスター内の各 Pod には、他の Pod と直接通信するために使用する一意の IP アドレスが割り当てられます。Pod 間通信は、Pod がデータを交換したり、共同でタスクを実行したりする必要があるクラスター内通信に役立ちます。たとえば、Pod A は Pod B の IP アドレスを使用して Pod B に要求を直接送信できます。Pod は、ネットワークアドレス変換 (NAT) なしでフラットネットワーク経由で通信できます。これにより、ノードをまたいだ Pod 間のシームレスな通信が可能になります。
1.4.1.1. 例: Pod 間通信の制御 リンクのコピーリンクがクリップボードにコピーされました!
複数の Pod を持つマイクロサービスベースのアプリケーションでは、フロントエンド Pod はバックエンド Pod と通信してデータを取得する必要があります。直接またはサービスを介して Pod 間通信を使用することで、これらの Pod は効率的に情報を交換できます。
Pod 間の通信を制御し、保護するために、ネットワーク制御を定義できます。そのような制御は、Pod が相互に対話する方法をラベルおよびセレクターに基づき指定することで、セキュリティーとコンプライアンスの要件を適用します。
1.4.2. サービスと Pod 間の通信 リンクのコピーリンクがクリップボードにコピーされました!
サービスと Pod 間の通信により、サービスがトラフィックを適切な Pod に確実にルーティングできるようになります。サービスは、Pod の論理セットを定義し、IP アドレスや DNS 名などの安定したエンドポイントを提供するオブジェクトです。Pod の IP アドレスは変更される可能性があります。サービスは Pod の IP アドレスを抽象化して、IP アドレスが変更された場合でもアプリケーションコンポーネントに一貫してアクセスできるようにします。
サービスと Pod 間の通信の主な概念は次のとおりです。
- エンドポイント: エンドポイントは、サービスに関連付けられている Pod の IP アドレスとポートを定義します。
- セレクター: セレクターは、キーと値のペアなどのラベルを使用して、サービスがターゲットとするオブジェクトセットを選択するための条件を定義します。
- サービス: サービスは、Pod セットに対して安定した IP アドレスと DNS 名を提供します。この抽象化により、他のコンポーネントは個々の Pod ではなくサービスと通信できるようになります。
- サービスディスカバリー: DNS によりサービスが検出可能になります。サービスが作成されると、DNS 名が割り当てられます。他の Pod はこの DNS 名を検出し、それを使用してサービスと通信します。
サービスタイプ: サービスタイプは、クラスター内外でサービスがどのように公開されるかを制御します。
- ClusterIP は、内部クラスター IP 上でサービスを公開します。これはデフォルトのサービスタイプであり、クラスター内からのみサービスにアクセスできるようになります。
- NodePort は、各ノードの IP のサービスを静的ポートで公開することにより、外部トラフィックがサービスにアクセスできるようにします。
- LoadBalancer は、クラウドプロバイダーのロードバランサーを使用してサービスを外部に公開します。
サービスはセレクターを使用して、トラフィックを受信する Pod を識別します。セレクターは Pod のラベルを照合して、どの Pod がサービスの一部であるかを決定します。例: セレクター app: myapp を持つサービスは、ラベル app: myapp を持つすべての Pod にトラフィックをルーティングします。
エンドポイントは、サービスセレクターに一致する Pod の現在の IP アドレスを反映するように動的に更新されます。OpenShift Container Platform はこれらのエンドポイントを維持し、サービスがトラフィックを正しい Pod にルーティングするようにします。
通信フローとは、Kubernetes のサービスがトラフィックを適切な Pod にルーティングするときに発生する一連の手順とインタラクションを指します。サービスと Pod 間の通信の一般的な通信フローは次のとおりです。
サービスの作成: サービスの作成時に、サービスタイプ、サービスがリッスンするポート、およびセレクターラベルを定義します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
DNS 解決: 各 Pod には、他の Pod がサービスと通信するために使用できる DNS 名があります。たとえば、
my-appnamespace 内のmy-serviceという名前のサービスの DNS 名はmy-service.my-app.svc.cluster.localになります。 - トラフィックルーティング: Pod がサービスの DNS 名に要求を送信すると、OpenShift Container Platform はその名前をサービスの ClusterIP に解決します。次に、サービスはエンドポイントを使用して、セレクターに一致する Pod の 1 つにトラフィックをルーティングします。
- 負荷分散: サービスは基本的な負荷分散も提供します。着信トラフィックを、セレクターに一致するすべての Pod に分散します。これにより、1 つの Pod にトラフィックが過剰に集中して負荷がかかることがなくなります。
1.4.2.1. 例: サービスと Pod 間の通信を制御する リンクのコピーリンクがクリップボードにコピーされました!
クラスターは、フロントエンドおよびバックエンドの 2 つのコンポーネントを持つマイクロサービスベースのアプリケーションを実行しています。フロントエンドは、データを取得するためにバックエンドと通信する必要があります。
手順
バックエンドサービスを作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow バックエンド Pod を設定します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow フロントエンド通信を確立します。
これでフロントエンド Pod は、DNS 名
backend.default.svc.cluster.localを使用してバックエンドサービスと通信できるようになりました。このサービスは、トラフィックが確実にバックエンド Pod の 1 つにルーティングされるようにします。
サービスと Pod 間の通信により、Pod IP の管理の複雑さが抽象化され、クラスター内で信頼性が高く効率的な通信が確保されます。