クラウドネイティブのContrail NetworkingにおけるNodePortサービスサポート
ジュニパーネットワークスは、Kubernetes オーケストレーション環境で Cloud-Native Contrail® Networking リリース 22.1 以降を™使用して、環境で Kubernetes NodePort サービスをサポートします。
Kubernetesでは、サービスは、ポッドの論理セットとポリシーを定義する抽象化であり、そのポッドにアクセスできます。サービスを実装するポッドのセットは、サービス定義内の LabelSelector オブジェクトに基づいて選択されます。NodePortサービスは、各ノードのIP上のサービスを静的ポートで公開します。各ノードの静的ポートを、ポッド上のアプリケーションのポートにマッピングします。
Contrail Networking では、Kubernetes NodePort サービスはリソースとリソースを InstanceIP 使用して実装され、どちらもサービスと FloatingIP 同様 ClusterIP です。
Kubernetesは、すべてのポッドが相互に会話できるフラットなネットワークモデルを提供します。ポッド間のセキュリティを提供するために、ネットワークポリシーが追加されます。Contrail NetworkingとKubernetesを統合すると、マルチテナンシー、ネットワーク分離、ネットワークポリシーによるマイクロセグメンテーション、ロードバランシングなど、ネットワーク機能が追加されます。
次の表は、Kubernetes の概念と Contrail Networking リソース間のマッピングを示しています。
| Kubernetes の概念 | Contrail Networking リソース |
|---|---|
| 名前 空間 | 共有プロジェクトまたは単一プロジェクト |
| ポッド | 仮想マシン |
| サービス | ECMP(等価コスト マルチパス)ロードバランス |
| イングレス | URL の HAProxy ロードバランス |
| ネットワーク ポリシー | Contrail Security |
Contrail Networking ロード バランサー オブジェクト
図 1 と以下のリストは、Contrail Networking のロード バランサー オブジェクトについて説明しています。
- Contrail Networking の各サービスは、ロード バランサー オブジェクトで表されます。
- サービス ポートごとに、同じサービス ロード バランサーに対してリスナー オブジェクトが作成されます。
- リスナーごとにプール・オブジェクトがあります。
- プールにはメンバーが含まれています。バックエンドポッドの数によっては、1つのプールに複数のメンバーが含まれている場合があります。
- プール内の各メンバーオブジェクトは、バックエンドポッドの1つにマッピングされます。
- は
contrail-kube-manager、kube-apiserverKubernetes サービスをリッスンします。サービスが作成されると、型nativeを持つloadbalancer_providerロード バランサー オブジェクトが作成されます。 - ロードバランサーには、サービスIPアドレスと同じ仮想IPアドレス(VIP)があります。
- サービスIP/VIPアドレスは、各バックエンドポッドのインターフェイスにリンクされています。ECMP ロード バランサー ドライバーを使用してこれを実現します。
- サービスIPアドレスから複数のバックエンドポッドのインターフェイスへのリンクは、Contrail NetworkingでECMPネクストホップを作成します。トラフィックは、ソースポッドからバックエンドポッドの1つに直接負荷分散されます。
- は
contrail-kube-manager、変更を受け取りkube-apiserver続けます。エンドポイントのポッドリストに基づいて、contrail-kube-manager最新のバックエンドポッドを把握し、プール内のメンバーを更新します。
Contrail Networking の NodePort サービス
コントローラサービスは、 でkube-manager実装されます。はkube-manager、サービスなどのKubernetesコアリソースと、 などの拡張ContrailリソースVirtualNetworkRoutingInstanceの間のインターフェイスです。このコントローラサービスは、リソースエンドポイントを通過するイベントを監視します。エンドポイントは、そのサービスに関連する変更に関するイベントを受信します。エンドポイントは、サービスセレクターと一致する作成および削除されたポッドのイベントも受信します。コントローラ サービスは、必要な Contrail リソースの作成を処理します。図 2 を参照してください。
InstanceIPに関連するリソースServiceNetworkFloatingIPリソースと関連するVirtualMachineInterfaces
ユーザーがサービスを作成すると、Kubernetes によって関連付けられたエンドポイントが自動的に作成され、コントローラ サービスは新しいリクエストを受信できるようになります。
を作成する
NodePortサービス作成ワークフロー
図 3 と以下の手順では、NodePort サービスが作成されたときのワークフローについて詳しく説明します。
の作成
- NodePort サービスが作成されると、
InstanceIP(IIP)が作成されます。リソースはInstanceIP、固定 IP アドレスと、参照される仮想ネットワークのサブネットに属するその特性を指定します。 - エンドポイントが NodePort サービスに接続されると、 が
FloatingIP作成されます。kube-managerサービスに接続されたエンドポイントの作成を監視します。 - 新しいエンドポイントが作成されたら、
kube-managerサブネット内に をInstanceIPServiceVirtualNetwork作成します。次にkube-manager、 をFloatingIP親として使用してInstanceIPを作成します。 - リソースは
FloatingIP、特定VirtualMachineInterface(VMI)に属さない特別な種類の IP アドレスを指定します。はFloatingIP、別VirtualNetworkのサブネットから割り当てられ、複数の VMI に関連付けることができます。複数の VMI に関連付けられている場合、 宛FloatingIPてのトラフィックは、すべての VMI に ECMP を使用して分散されます。
VVIに関する注意:
- VMIは、ポッドやラベルの追加や削除に応じて動的に更新されます。
- VMI は仮想ネットワークへのインターフェイス(ポート)を表し、対応する仮想マシンが存在する場合とそうでない場合があります。
- VMI には、最低でも MAC アドレスと IP アドレスがあります。
VMに関する注意:
- VM リソースは、コンピューティング コンテナーを表します。例えば、VM、ベアメタル、ポッド、コンテナなどです。
- 各 VM は、ポリシーの制限を受けて、同じテナント ネットワーク上の他の VM と通信できます。
- テナントネットワークが分離されると、1つのテナント内のVMは、特にポリシーで許可されていない限り、別のテナントのVMと通信できません。
KubernetesプローブとKubernetes NodePortサービス
各ノード上で動作するエージェントである この エージェントは kubelet、ライブ性と準備状況プローブのためにポッドへの到達可能性を必要とします。Contrailネットワークポリシーは、ノードとポッド間の到達可能性を提供するために、IPファブリックネットワークとポッドネットワークの間で作成されます。ポッドネットワークが作成されるたびに、ネットワークポリシーがポッドネットワークにアタッチされ、ノードとポッドの間の到達可能性を提供します。その結果、ノード内のすべてのプロセスがポッドに到達できます。
Kubernetes NodePortサービスは、ポッドへのノード到達可能性に基づいています。Contrail Networkingは、Contrailネットワークポリシーを通じてノードとポッド間の接続を提供するため、NodePortがサポートされています。
NodePortサービスは、2種類のトラフィックをサポートしています。
- East-West
- ファブリックからポッドへ
NodePort サービス ポート マッピング
Kubernetes NodePort サービスのポート マッピングは、YAML ファイル内の FloatingIp リソース内にあります。では FloatingIp、 でポートが追加 "floatingIpPortMappings"されます。
サービスで、 targetPort が言及されていない場合、 port 値はデフォルトとして指定されます。
ポートの詳細を含む NodePort サービスの YAML ファイルの例 spec :
spec:
clusterIP: 10.100.13.106
clusterIPs:
- 10.100.13.106
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: my-nginx
sessionAffinity: None
上記の YAML 例 spec では、 "floatingIpPortMappings" リソースで FloatingIp 作成されます。
YAMLの例 "floatingIpPortMappings" :
"floatingIpPortMappings": {
"portMappings": [
{
"srcPort": 80,
"dstPort": 80,
"protocol": "TCP"
}
]
}
例:NodePortサービスリクエストの移行
リクエストがノードポートに到達した時点から、サービスリクエストがバックエンドポッドに到達するまで、NodePortサービスリクエストの過程をたどりましょう。
Nodeportサービスは kubeproxy.Kubernetesネットワークプロキシ(kube-proxy)は、各ノードで実行されているデーモンです。クラスターで定義されたサービスを反映し、サービスのバックエンドポッドにリクエストをロードバランスするためのルールを管理します。
次の例では、NodePort サービス apple-service が作成され、そのエンドポイントが関連付けられています。
user@domain ~ % kubectl describe svc apple-service Name: apple-service Namespace: default Labels: <none> Annotations: <none> Selector: app=apple Type: NodePort IP Families: <none> IP: 10.105.135.144 IPs: 10.105.135.144 Port: <unset> 5678/TCP TargetPort: 5678/TCP NodePort: <unset> 31050/TCP Endpoints: 10.244.0.4:5678 Session Affinity: None External Traffic Policy: Cluster Events: <none> user@domain ~ % kubectl get endpoints apple-service NAME ENDPOINTS AGE apple-service 10.244.0.4:5678 2d18h
サービスが作成、削除、またはエンドポイントが変更されるたびに、 kube-proxy クラスターの iptables 各ノードのルールを更新します。チェーンを表示して、 iptables リクエストの過程を把握し、追跡します。
まず、KUBE-NODEPORTSチェーンは、タイプ NodePortのサービスに入ってくるパケットを考慮します。
$ sudo iptables -L KUBE-NODEPORTS -t nat
Chain KUBE-NODEPORTS (1 references)
target prot opt source destination
KUBE-MARK-MASQ tcp -- anywhere anywhere /* default/apple-service */ tcp dpt:31050
KUBE-SVC-Y4TE457BRBWMNDKG tcp -- anywhere anywhere /* default/apple-service */ tcp dpt:31050
ポート 31050 に入ってくる各パケットは、まず KUBE-MARK-MASQ によって処理されます。このパケットに値を 0x4000 タグ付けします。
次に、パケットは KUBE-SVC-Y4TE457BRBWMNDKG チェーン(上記の KUBE-NODEPORTS チェーンで参照)によって処理されます。その点を詳しく見ると、追加のiptablesチェーンが表示されます。
$ sudo iptables -L KUBE-SVC-Y4TE457BRBWMNDKG -t nat
Chain KUBE-SVC-Y4TE457BRBWMNDKG (2 references)
target prot opt source destination
KUBE-SEP-LCGKUEHRD52LOEFX all -- anywhere anywhere /* default/apple-service */
KUBE-SEP-LCGKUEHRD52LOEFX チェーンを検査して、アプリケーションを実行しているバックエンド ポッドの 1 つへのルーティングを apple-service 定義していることを確認します。
$ sudo iptables -L KUBE-SEP-LCGKUEHRD52LOEFX -t nat Chain KUBE-SEP-LCGKUEHRD52LOEFX (1 references) target prot opt source destination KUBE-MARK-MASQ all -- 10.244.0.4 anywhere /* default/apple-service */ DNAT tcp -- anywhere anywhere /* default/apple-service */ tcp to:10.244.0.4:5678
これにより、リクエストがノードポートに到達したときから、サービスリクエストがバックエンドポッドに到達するまで、NodePortサービスリクエストの移行が完了します。
外部トラフィック ポリシーにおけるローカル オプションの制限
として設定Localされた NodePort サービスexternalTrafficPolicyは、Contrail Networking リリース 22.1 ではサポートされていません。
このサービスが externalTrafficPolicy 外部トラフィックをノードローカルまたはクラスタ全体のエンドポイントにルーティングすることを望む場合を示します。
Localはクライアントの送信元 IP アドレスを保持し、NodePort タイプ サービスのセカンド ホップを回避します。Clusterはクライアントの送信元IPアドレスを曖昧にし、別のノードにセカンドホップが発生する可能性があります。
Cluster は のデフォルトです externalTrafficPolicy。
サービスの更新または削除、またはサービスからポッドを削除する
- サービスの更新 - 変更可能なフィールドは、 と
Namespaceを除いてName変更できます。たとえば、Nodeport サービスは、サービス YAML 定義のフィールドをType変更することでに変更ClusterIpできます。 - サービスの削除 —サービスは、に関係なく
Type、 コマンドで削除できます。kubectl delete -n <name_space> <service_name> - ポッドをサービスから削除する — これは、 および
SelectorをLabelsサービスまたはポッドで変更することで実現できます。