クラウドネイティブの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-apiserver
Kubernetes サービスをリッスンします。サービスが作成されると、型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リソースVirtualNetwork
RoutingInstance
の間のインターフェイスです。このコントローラサービスは、リソースエンドポイントを通過するイベントを監視します。エンドポイントは、そのサービスに関連する変更に関するイベントを受信します。エンドポイントは、サービスセレクターと一致する作成および削除されたポッドのイベントも受信します。コントローラ サービスは、必要な Contrail リソースの作成を処理します。図 2 を参照してください。
InstanceIP
に関連するリソースServiceNetwork
FloatingIP
リソースと関連するVirtualMachineInterfaces
ユーザーがサービスを作成すると、Kubernetes によって関連付けられたエンドポイントが自動的に作成され、コントローラ サービスは新しいリクエストを受信できるようになります。

NodePortサービス作成ワークフロー
図 3 と以下の手順では、NodePort サービスが作成されたときのワークフローについて詳しく説明します。

- NodePort サービスが作成されると、
InstanceIP
(IIP)が作成されます。リソースはInstanceIP
、固定 IP アドレスと、参照される仮想ネットワークのサブネットに属するその特性を指定します。 - エンドポイントが NodePort サービスに接続されると、 が
FloatingIP
作成されます。kube-manager
サービスに接続されたエンドポイントの作成を監視します。 - 新しいエンドポイントが作成されたら、
kube-manager
サブネット内に をInstanceIP
ServiceVirtualNetwork
作成します。次に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
サービスまたはポッドで変更することで実現できます。