Kubernetes と Contrail の統合
この章では、Kubernetes における’Contrail の役割について詳しく説明します。まず Contrail Ku netes 統合アーキテクチャに関するセクションから始めます。ここでは、NS、ポッド、サービス、受信、ネットワークポリシーなどの Kubernetes オブジェクトが Contrail でどのように処理されるかについて説明します。その後、各オブジェクトの実装について詳しく説明します。
この章では、Contrail オブジェクトを導入することが必要な場合があります。Kubernetes のネットワークとして、CNI の複数のアウトオブラインポッドは’、他の実装と比べてメリット Contrail があります。この章ではそのようなメリットについて説明します。
この章の最後に、Juniper’s cSRX コンテナを使用したサービス連鎖のデモを紹介します。統合’アーキテクチャの導入を始めましょう。
Contrail Kubernetes アーキテクチャ
Witnessing では、第2章の Kubernetes の主要な概念を理解した後、標準の Kubernetes 導入環境に Contrail を追加するメリットがあるでしょうか。
また、 www.juniper.netの製品ページでは、最新のサービスをご紹介しています。 Contrail では、複数の環境 (Openstack、Kubernetes など) および enriches Kuber netes’ネットワークおよびセキュリティ機能に共通の導入を提供し Contrail ています。
複数の環境への導入に関しては、コンテナは、アプリケーションの構築における現在の傾向です (コンテナが VM でホストされるようなネストアプローチについては触れません)。’しかし、すべての人が vm から迅速なコンテナへの移行を期待しているわけではありません。パブリッククラウドで完全にまたは部分的に実行されるワークロードを追加すると、Kubernetes が管理する必要があるのは、ネットワークおよびセキュリティ管理者の misery を見ることができます。
多くの組織の管理者は、各環境に対して個別のオーケストレーション管理マネージャーを担当しています。OpenStack または、コンテナの VM、Kubernetes、または Os 向けの VMware NSX は、AWS console を対象としています。WContrail al-leviates この misery は、あらゆるクラウド、ワークロード、あらゆる導入環境に対して、動的なエンドツーエンドのネットワークポリシーと制御を提供することによって実現されています。
1つのユーザーインターフェイス Contrail から、抽象ワークフローが特定のポリシーに変換され、すべての環境で仮想オーバーレイ接続のオーケストレーションが簡素化されます。これを実現するために、プライベートまたはパブリッククラウドに配置された BMS、VM、コンテナを接続する仮想ネットワークを構築して保護します。
Kubernetes を導入して、OpenStack によってオーケストレーションされた Vm で pod を起動することもできますが、この chap は Kubernetes のみに焦点を当てています。ここで説明されている多くの機能を他の環境に拡張することもできますが、Contrail 標準の Kubernetes 導入にも enriches です。
Kubernetes はネットワークを提供していませんが、ネットワーク実装の基本要件を定めており、すべての CNI (コンテナネットワークインターフェイス) プロバイダによって処理されるようになっています。Juni per Contrail は、CNI プロバイダの1つです。以下を参照してください。詳細については、https://kubernetes.io/docs/concepts/cluster-administra/ネットワーキングをご覧ください。
Kubernetes は、ネットワークの実装に関して明確に定義された要件を満たしています。
ノードのポッドは NAT なしですべてのノードのすべてのポッドと通信できます。
ノード上のエージェント (システムデーモン、kubelet など) は、そのノード上のすべてのポッドと通信できます。
ノードのホストネットワーク内のポッドは、NAT なしにすべてのノードのすべてのポッドと通信できます。
Kubernetes は、クラスターに限定されたいくつかのセキュリティー機能とフラットなネットワーク接続を提供しますが、その上に、Contrail が提供することができます。
Segmentations およびマルチテナント用にカスタマイズされた名前空間とサービス isolations
分散型のロードバランシングとファイアウォールにより、一元的なフローとログのインサイトを提供します。
他の環境に拡張できるタグ (オープンスタック、VMWare、BMS、AWS など) を使用した豊富なセキュリティーポリシー
サービス連鎖
この章では、これらの機能のいくつか’について説明しますが、まず Contrail アーキテクチャとオブジェクトマッピングについて説明します。
Contrail Kube マネージャー
Contrail の新しいモジュールが追加されました。 contrail-kube-manager
、KM として短縮されます。Kuber-netes API サーバーを調査して Kubernetes のリソースを監視し、それらを Contrail コントローラオブジェクトに変換します。Figure 1は、基本的なワークフローを示しています。
Kubernetes の Contrail オブジェクトマッピング
これは、当社が把握している通常の Contrail からの変化ではありませ’んが、その背後に多くの問題が発生しています。Kubernetes/Contrail を扱うことは、オブジェクトのマッピングに関するものであることに注意してください。その’Contrail 原因は、複数の環境を管理する単一のインターフェイスであり、各環境に独自の頭字語や用語があるため、そのようなマッピングはプラグインによって実行されるためです。Kubernetes では、 contrail- kube-manager
これが可能です。
Juniper Contrail には、環境/オーケストレータごとに固有のプラグインがあります。詳細について知り、最新のリリース情報を入手するには、 https://www.juniper.net/us/en/products のサービス/sdn/Contrail/という Contrail Juniper を参照してください。
たとえば、Kubernetes の名前空間は、仮想クラスターを作成する場合と同じように、複数のチームまたは proj-ect 間のセグメント化を目的としています。Contrail 同様の概念がprojectという名前になっているため、Kubernetes で名前空間を作成すると、Contrail に同等のプロジェクトが自動的に作成されます。後ほど紹介しますが、Figure 2に示すオブジェクトのリストをよく理解しておくと、アーキテクチャのスタンドを防ぐのに役に立つでしょう。
Contrail 名前空間と分離
第3章の詳細はこちら namespace
または NS for Kubernetes では、この章の最初に、Kubernetes と Contrail のオブジェクトマッピングについて説明しました。このセクション’では、名前空間が Contrail 環境でどのように機能するか、さらにはどのように拡張する Contrail かについて説明します。
を導入すると、1つの比喩をご紹介します。 namespace
概念は OpenStack project
、または tenant
。それがまさに Contrail の考え方であるということです。新しい namespace
オブジェクトが作成され、 contrail-kube-manager
(KM) は、オブジェクト作成イベントに関する tice を取得し、それに対応するプロジェクトを Contrail に作成します。
Contrail 内の複数の Kubernetes クラスターを区別するために、Kubernetes のクラスター名が Kubernetes 名前空間またはプロジェクト名に追加されます。デフォルトの Kubernetes クラスター名は k8s
。そのため、Kubernetes の名前空間を作成すると ns-user-1
、 k8s-ns-user-1
Contrail の GUI を示すFigure 3のように Contrail にプロジェクトを作成します。
Kubernetes cluster name
設定は可能ですが、導入プロセス時にのみ実行されます。構成し’ていない場合 k8s
がデフォルトになります。クラスターが作成されたら、名前を変更することはできません。を表示し cluster
name
するには、 contrail-kube-manager
(KM) docker、その設定ファイルを確認してください。
KM docker コンテナの場所を確認するには、次のようにします。
$ docker ps -a | grep kubemanager 2260c7845964 ...snipped... ago Up 2 minutes kubemanager_kubemanager_1
KM コンテナーにログインするには、次のようにします。
$ docker exec -it kubemanager_kubemanager_1 bash
を検索するには cluster_name
ボタン
$ grep cluster /etc/contrail/contrail-kubernetes.conf cluster_name=k8s #<--- cluster_project={} cluster_network={}
このガイドの残りの部分では、これらの用語をすべて参照しています。 namespace, NS, tenant,
および project
インターチェンジとしてのことではありません。
非分離型名前空間
Kubernetes の基本的なネットワーク要件の1つは、フラット型/NAT レスネットワーク–を対象としており、すべての pod が任意–の名前空間の任意の pod と通信できること、CNI のすべてのプロバイダがそのことを保証する必要があることを認識しておく必要があります。そのため、Kuber では、デフォルトですべての名前空間が分離されていません。
「分離」と「非分離」という用語は、(Contrail) のネットワークのみのコンテキストで機能します。
k8s-default-pod-network and k8s-default-service-network
非分離型のすべての名前空間にネットワークを提供するには、共通の VRF (仮想ルーティングおよび転送) テーブルまたはルーティングインスタンスが必要です。Contrail Kubernetes 環境では、pod とサービスのそれぞれについて、k8s’のデフォルト名前空間で2つのデフォルト仮想 net-works が事前設定されています。同様に、それぞれに対応する仮想ネットワークと同じ名前を持つ2つの VRF テーブルがあります。
2つの仮想ネットワーク/VRF テーブルの名前は、次のような形式になっています。
<k8s-cluster-name>-<namespace name>-[pod|service]-network
既定の名前空間にデフォルトのクラスター名を使用するには、 k8s
、2つの仮想ネットワーク/VRF テーブル名は以下のとおりです。
k8s-default-pod-network
: デフォルトのサブネットを使用した、pod 仮想ネットワーク/VRF テーブル10.32.0.0/12
k8s-default-service-network
: デフォルトのサブネットを持つサービス仮想ネットワーク/VRF 表10.96.0.0/12
ポッドまたはサービスのデフォルトサブネットは設定可能です。
この2つのデフォルトの仮想ネットワークは、非分離型のすべての名前空間で共有されることを理解しておくことが重要です。つまり、暗黙的に作成した非分離型名前空間のすべてに対して使用できるようになります。その’理由は、すべての非分離型名前空間 (デフォルトの名前空間を含む) からのポッドが互いに通信できるからです。
一方で、作成した仮想ネットワークは他の仮想ネットワークと分離されます。これは、同一または異なる名前空間が小さいという点を考慮しています。2つの異なる仮想ネットワークのポッド間の通信には Contrail ネットワークポリシーが必要です。
その後、Kubernetes サービスについてお読みになったときに、サービス仮想ネットワーク/VRF テーブル宛てのパケットが、ポッドバーチャルネットワーク/VRF テーブルのバックエンドのポッドに到達できる理由について疑問に思うかもしれません。ここでも、優れたニュースは Contrail ネットワークポリシーによるものです。デフォルトでは、サービスとポッドネットワークの間で Contrail ネットワークポリシーが有効になっています。これにより、サービス仮想ネットワーク/VRF テーブルに着信するパケットをポッドに到達させることができます。またその逆も可能です。
孤立した名前空間
対照的に、分離型名前空間には独自のデフォルトポッドとサービスネットワークがあり、したがって、孤立した名前空間ごとに2つの新しい VRF テーブルも作成されます。同一のフラットサブネット 10.32.0.0/12
および 10.96.0.0/12
分離された名前空間のポッドとサービスのネットワークで共有します。しかし、ネットは異なる VRF テーブルとして機能しているため、デフォルトでは別の名前空間と分離されています。独立した名前空間で起動されたポッドは、同じ名前空間のサービスとポッドにのみ通信できます。その他の設定 (ポリシーなど) は、pod が現在の名前空間の外部にあるネットワークにアクセスできるようにするために必要です。
この概念を説明するため’に、例を使用してみましょう。次の3つの名前空間があるとします。、 default
名前空間と2つのユーザー名前空間: ns-non-isolated
および ns-isolated
。各名前空間では、1つのユーザー仮想ネットワークを作成できます。 vn-left-1
。Contrail では、次の仮想ネットワーク/VRF テーブルを作成します。
default-domain:k8s-default:k8s-default-pod-network
default-domain:k8s-default:k8s-default-service-network
default-domain:k8s-default:k8s-vn-left-1-pod-network
default-domain:k8s-ns-non-isolated:k8s-vn-left-1-pod-network
default-domain:k8s-ns-isolated:k8s-ns-isolated-pod-network
default-domain:k8s-ns-isolated:k8s-ns-isolated-service-network
default-domain:k8s-ns-isolated:k8s-vn-left-1-pod-network
上記の名前は FQDN 形式で記載されています。Contrail では、domain はトップレベルのオブジェクトであり、その後に project/テナントが続き、その後、仮想ネットワークが続きます。
Figure 4 expertly はこれをすべて示しています。
次に、YAML ファイルで孤立した名前空間を作成します。
$ cat ns-isolated.yaml apiVersion: v1 kind: Namespace metadata: annotations: "opencontrail.org/isolation" : "true" name: ns-isolated
そして、次のような NS を生み出します。
kubectl create -f ns-isolated.yaml $ kubectl get ns NAME STATUS AGE contrail Active 8d default Active 8d ns-isolated Active 1d #<--- kube-public Active 8d kube- system Active 8d
メタデータの下にある注釈は、標準 (非分離) k8s 名前空間を比較する追加の方法です。True の値は、これが孤立した名前空間であることを示します。
annotations: "opencontrail.org/isolation" : "true"
定義のこの部分が Juniper’の拡張であることがわかります。こちらの contrail-kube-manager (KM)
名前空間を読み取ります。 metadata
kube から取得した情報を解析します。 annotations
そのオブジェクトがあることを確認します。 isolation
フラグが true に設定されています。その後、分離された名前空間に対してデフォルトの名前空間ルーティングインスタンスを使用する代わりに、対応するルーティングインスタンス (pod 用とサービス用に1つ) でテナントを作成します。Damentally は、分離を実装する方法を示しています。
以下のセクションでは、ルーティングの分離が機能していることを確認します。
NS での接続のポッド
非分離型名前空間と孤立した名前空間を作成します。
$ cat ns-non-isolated.yaml apiVersion: v1 kind: Namespace metadata: name: ns-non-isolated $ cat ns-isolated.yaml apiVersion: v1 kind: Namespace metadata: annotations: "opencontrail.org/isolation": "true" name: ns-isolated $ kubectl apply -f ns-non-isolated.yaml namespace/ns-non-isolated created $ kubectl apply -f ns-isolated.yaml namespace/ns-isolated created $ kubectl get ns | grep isolate ns-isolated Active 79s ns-non-isolated Active 73s
名前空間とデフォルトの名前空間の両方で、web サーバポッドを起動するための配備を作成します。
#deploy-webserver-do.yaml apiVersion: apps/v1 - {key: app, operator: In, values: [webserver]} $ kubectl apply -f deploy-webserver-do.yaml -n default deployment.extensions/webserver created $ kubectl apply -f deploy-webserver-do.yaml -n ns-non-isolated deployment.extensions/webserver created $ kubectl apply -f deploy-webserver-do.yaml -n ns-isolated deployment.extensions/webserver created $ kubectl get pod -o wide -n default NAME READY STATUS ... IP NODE ... webserver-85fc7dd848-tjfn6 1/1 Running ... 10.47.255.242 cent333 ... $ kubectl get pod -o wide -n ns-non-isolated... NAME READY STATUS ... IP NODE ... webserver-85fc7dd848-nrxq6 1/1 Running ... 10.47.255.248 cent222 ... $ kubectl get pod -o wide -n ns-isolated NAME READY STATUS ... IP NODE ... webserver-85fc7dd848-6l7j2 1/1 Running ... 10.47.255.239 cent222 ...
3つの名前空間のすべてのポッド間で Ping を実行します。
#default ns to non-isolated new ns: succeed $ kubectl -n default exec -it webserver-85fc7dd848-tjfn6 -- ping 10.47.255.248 PING 10.47.255.248 (10.47.255.248): 56 data bytes 64 bytes from 10.47.255.248: seq=0 ttl=63 time=1.600 ms ^C --- 10.47.255.248 ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 1.600/1.600/1.600 ms #default ns to isolated new ns: fail $ kubectl -n default exec -it webserver-85fc7dd848-tjfn6 -- ping 10.47.255.239 PING 10.47.255.239 (10.47.255.239): 56 data bytes ^C --- 10.47.255.239 ping statistics --- 3 packets transmitted, 0 packets received, 100% packet loss
このテスト結果は、非分離型の2つの名前空間 (名前空間 ns-non-isolated
および default
(この場合) は機能しますが、非分離型名前空間からのトラフィックは可能です (default
ns) は、孤立した名前空間への到達を通過しません。同じ孤立した名前空間内のトラフィックはどうでしょうか。
の力を持つ deployment
すぐにテストできます。孤立した名前空間で ns-isolated
、導入の規模を拡張することで、1つ目のポッドを複製します。 replicas=2
2つのポッド間で ping を実行します。
$ kubectl scale deployment webserver --replicas=2 $ kubectl get pod -o wide -n ns-isolated NAME READY STATUS RESTARTS AGE IP NODE webserver-85fc7dd848-6l7j2 1/1 Running 0 8s 10.47.255.239 cent222 webserver-85fc7dd848-215k8 1/1 Running 0 8s 10.47.255.238 cent333 $ kubectl -n ns-isolated exec -it webserver-85fc7dd848-6l7j2 -- ping 10.47.255.238 PING 10.47.255.238 (10.47.255.238): 56 data bytes 64 bytes from 10.47.255.238: seq=0 ttl=63 time=1.470 ms ^C --- 10.47.255.238 ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 1.470/1.470/1.470 ms
Ping パケットはすぐに通過します。テスト結果を要約するには、次のようにします。
トラフィックは非分離型名前空間の間で分離されていません。
孤立した名前空間とクラスター内の他のすべてのテナントの間でトラフィックが分離されています。
トラフィックは同一の名前空間で分離されていません。
Kubernetes のネットワークポリシーを使用して、またはセキュリティグループによって、ポッドレベルの分離を実現することができます。 Contrail では、この章の後半で説明します。
Contrail Floating IP
同一または異なる名前空間のポッド間で通信を議論し、テストしてき’ましたが、これまでは同じクラスター内に存在しています。クラスター外のデバイスとの通信についてはどうでしょうか。
従来の (OpenStack) Contrail 環境では、オーバーレイエンティティ (一般的には VM) でインターネットにアクセスするためのさまざまな方法があることをすでに知っているかもしれません。最も頻繁に実行される3つの方法は次のとおりです。
フローティング IP
Fabric SNAT
論理ルーター
Kubernetes の推奨ソリューションでは、 service
および Ingress
オブジェクトについて’は第3章でご確認いただけます。Contrail Kubernetes
環境では、サービスとインプリメンテーションで floating IP を使用して、’それらをクラスターの外側に公開しています。この章では、この2つの各オブジェクトについて説明します。しかし、まず、’Kubernetes
を使用して、floating IP ベースを確認し、それがどのように機能するかを見てみましょう。
こちらの fabric SNAT
および logical router
オーバーレイワークロード (VM とポッド) がインターネットにアクセスするために使用しますが、逆方向からの通信を初期化することはできません。しかし floating
IP は、受信トラフィック、送信–トラフィック、またはその両方をサポートするように構成できるように、双方向から初期化されたトラフィックをサポートし、デフォルトは双方向です。本書では、 floating
IP. ファブリック SNAT および論理ルーターの詳細については、Contrail
マニュアルを参照してください。https://www.juniper.net/ documentation/en_US/contrail5.0/information-products/pathway-pages/contrail-feature-guide-pwp.html.
Floating IP および Floating IP プール
こちらの floating
FIP は、非常に初期のリリース以降にサポートされてい
Contrail た従来の概念です。基本的には’、VM IP (通常はプライベート ip アドレス) をパブリック ip
(このコンテキストでは floating ip) にマッピングして、クラスター外から到達できるようにするのが、openstack の概念です。内部的には、1対1のマッピングが
NAT によって実装されています。VRouter は、クラスター外から floating IP に送信されたパケットを受信するたびに、それを
VM’のプライベート ip に変換し、パケットを vm に転送します。Larly では、逆方向への変換が行われます。最終的には、VM
とインターネットホストの両方が相互に通信できるようになり、どちらもコミュニケーションを開始できるようになります。
VRouter は、各コンピューティングノードにワークロードトラフィックを処理する Contrail 転送プレーンです。
Figure 5は、floating IP の基本的なワークフローを示しています。
ここでは、フローティング IP に関して以下の点に注目しています。
フローティング IP は VM’s に関連付けられています
port
、VMI (バーチャルマシンインターフェイス) があります。浮動 IP が割り当てられているのは
FIP pool
。仮想ネットワークに基づいて、floating IP プールが作成されます (
FIP-VN
)。FIP-VN は、クラスター外で使用できるようになります。
route-target (RT)
ゲートウェイルーター’s VRF テーブルの属性。また、ゲートウェイルーターは、RT 内のルートインポートポリシーと一致することを確認すると、そのルートを VRF テーブルに読み込みます。VRF のテーブルに接続されたすべてのリモートクライアントは、フローティング IP と通信できます。
Floating IP の概念と役割については、Contrail Kubernetes 環境に新たなものはありません。しかし、Kubernetes
では浮動 IP の使用が拡張されています。 service
および ingress
オブジェクトの実装、Kubernetes へのアクセスにおける重要な役割を果たしています。 service
および ingress
公開. 詳細については、この章の後のセクションを確認してください。
FIP プールの作成
次’の3段階のプロセスで floating IP プールを作成してみましょう。
パブリック浮動 IP-VN を作成します。
仮想ネットワークの RT (VRF) を設定し、ゲートウェイルーター’s のテーブルに通知してインポートできます。
パブリックな floating IP 仮想ネットワークに基づいて、floating IP プールを作成します。
繰り返しになりますが、ここでは何も新しいものではありません。Kubernetes を使用せずに、他の Contrail 環境でも同じ手順を実行する必要があります。しかし、これまで’のセクションで学習したように、Contrail Kubernetes による IP 仮想ネットワークの統合を Kubernetes スタイルで作成できるようになりました。
Vn という名前のパブリックフローティング IP 仮想ネットワークを作成します。デフォルトは
# vn-ns-default.yaml apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: annotations: "opencontrail.org/cidr": "101.101.101.0/24" name: vn-ns-default spec: config: '{ "cniVersion": "0.3.0", "type": "contrail-k8s-cni" }' $ kubectl apply -f vn-ns-default.yaml networkattachmentdefinition.k8s.cni.cncf.io/vn-ns-default created $ kubectl get network-attachment-definitions.k8s.cni.cncf.io NAME AGE vn-ns-default 22d
ここで、ルーティングターゲットを設定します。
インターネットからゲートウェイルーターを介して floating IP にアクセスできるようにする必要がある’場合は、ゲートウェイルーター’の VRF テーブルにインポートする仮想ネットワークプレフィックスのルートターゲットを設定する必要があります (Figure 6を参照)。このステップは、インターネットへのアクセスが必要な場合に必要です。
RT を設定するための UI ナビゲーションパスは、以下のとおりです。Contrail コマンド > メインメニュー > オーバーレイ > 仮想ネットワーク > k8s-vn-ns-既定のポッド-> ルーティング、ブリッジ、ポリシーを編集します。
では’、パブリックバーチャルネットワークに基づいて、floating IP プールを作成してみましょう。
これは最後のステップです。Contrail コマンド UI から、パブリックな仮想ネットワークに基づいて、floating IP プールを作成します。Figure 7に示すこの設定の UI ナビゲーションパスは次のとおりです。Contrail コマンド > メインメニュー > オーバーレイ > フローティング IP > 作成。
また、Contrail UI では、virtual network の詳細オプションで外部フラグを設定して、 publicという名前の floating IP プールを自動的に作成できます。
Floating IP プールスコープ
Contrail Kubernetes 環境でフローティング IP プールを参照するには、さまざまな方法がありますが、それに応じてプールの範囲も異なります。降順 pri では、次の3つのレベルを ority できます。
オブジェクト固有
名前空間レベル
グローバルレベル
オブジェクト固有
これは最も限定的なスコープのレベルです。オブジェクト専用のフローティング IP プール自体は、指定したオブジェクトにのみバインドされますが、同じ名前空間やクラスター内の他のオブジェクトには影響を与えません。たとえば、サービスオブジェクトを指定できます。 web
floating ip プールから floating IP を取得するには pool1
、サービスオブジェクト dns
別の floating
IP プールからの IP アドレスを取得するには pool2
付記. これにより、オブジェクト–のためにフローティング
IP がどこから割り当てられるかを最もきめ細かく制御できます。コストとは、各オブジェクトの yaml ファイルに明示的に指定する必要があるということです。
名前空間レベル
マルチテナント環境では、各名前空間がテナントに関連付けられ、各テナントは専用の浮動 IP プールを持ちます。その場合は、NS
レベルでフローティング IP プールを定義するオプションを用意して、その名前空間で作成されたすべてのオブジェクトがそのプールから floating
IP の割り当てを得られるようにしておくことをお勧めします。名前空間レベルプールが定義されている場合 (たとえば、 pool-ns-default
)、各オブジェクト’の s yaml ファイルでフローティング
IP プール名を指定する必要はありません。別のプール名を指定することもできます。たとえば、 my-webservice-pool
オブジェクトで webservice
。その場合、オブジェクトの webservice
は IP アドレスから my-webservice-pool
名前空間レベルプールではなく pool-ns-default
これにより、前者の方がより具体的になります。
グローバルレベル
グローバルレベルプールの範囲は、クラスター全体を対象にしています。任意の名前空間のオブジェクトは、glob 浮動小数点 IP プールを使用できます。
3つの方法すべてを組み合わせて、その組み合わせの柔軟性を活用できます。’具体的な例を示します。
グローバルプールを定義する
pool-global-default
ため、名前空間レベルまたは ob-リソースレベルのプールが定義されていない名前空間内のオブジェクトは、このプールから floating IP を取得します。Ns の
dev
、floating IP プールを定義します。pool-dev
ため、ns で作成されたすべてのオブジェクトがdev
デフォルトでフローティング IP を取得するpool-dev
。Ns の
sales
、floating IP プールを定義します。pool-sales
ため、ns で作成されたすべてのオブジェクトがsales
デフォルトでフローティング IP を取得するpool-sales
。Ns の
test-only
は、名前空間レベルのプールを定義せずに、デフォルトのオブジェクトが、そのファイル内で作成されたその他の IP アドレスからpool-global-default
。サービス
dev-webservice
ns dev には浮動 IP が必要ですpool-sales
代わりにpool-dev
を指定するpool- sales
チェックインdev-webservice
オブジェクト YAML ファイルは、この目標を達成します。
経験則–では、最も具体的なスコープが常に適用されることを念頭に置いてください。
オブジェクトのフローティング IP プール
まず’、オブジェクト固有の floating IP プールを見てみましょう。
#service-web-lb-pool-public-1.yaml apiVersion: v1 kind: Service metadata: name: service-web-lb-pool-public-1 annotations: "opencontrail.org/fip-pool": "{'domain': 'default-domain', 'project': 'k8s-ns-user-1', 'network': 'vn-public-1', 'name': 'pool-public-1'}" spec: ports: - port: 8888 targetPort: 80 selector: app: webserver type: LoadBalancer
この例では、サービス service-web-lb-pool-public-1
プールから浮動 IP を取得します。 pool-public-1
、仮想ネットワークに基づいて作成されます。 vn-public-1
現在のプロジェクトの下 k8s-ns-user-1
。対応する Kubernetes 名前空間は ns-user-1
。オブジェクトレベルの浮動
IP プールは、この特定のオブジェクトにのみ割り当てられるため、この方法では、新しいオブジェクトごとにフローティング IP プールを明示的に割り当てる必要があります。
NS Floating IP プール
次の浮動 IP プールスコープは、名前空間レベルにあります。それぞれの名前空間は、独自の浮動 IP プールを定義できます。Kubernetes annotations オブジェクトを使用してサブネットを仮想ネットワークに提供するのと同じように、floating IP プールの指定にも使用されます。YAML ファイルは次のようになります。
#ns-user-1-default-pool.yaml apiVersion: v1 kind: Namespace metadata: annotations: opencontrail.org/isolation: "true" opencontrail.org/fip-pool: "{'domain': 'default-domain', 'project': 'k8s-ns-user-1', 'network': 'vn-ns-default', 'name': 'pool-ns-default'}" name: ns-user-1
ここは ns-user-1
名前空間レベルの floating IP
プールが指定されます。 pool-ns-default
、対応する仮想ネットワークが vn-ns-default
。すると、 ns-user-1
この YAML ファイルを使用して作成された場合、floating IP を必要とする新しいサービスでは、YAML ファイルでオブジェクト固有のプール名を指定せずに作成しなければ、このプールからフローティング
IP が割り当てられます。実際には、ほとんどの名前空間 (特に分離された名前空間) には独自の名前空間のデフォルトプールが必要になるため、このような設定がフィールドに頻繁に見られるようになります。
グローバルな浮動 IP プール
グローバルレベルの浮動 IP プールを指定するには、完全修飾プール名を付与する必要があります (domain > project > net- work > name
) で contrail-kube-manager (KM)
Docker’s 設定ファイル (/etc/contrail/contrail-kubernetes.conf
)。このファイルは、その
ENV パラメーターに基づいた起動中に Docker によって自動的に生成されます。 /etc/contrail/common_kubemanage
r env ファイルをマスターノードで実行します。
$ cat /etc/contrail/common_kubemanager.env VROUTER_GATEWAY=10.169.25.1 CONTROLLER_NODES=10.85.188.19 KUBERNETES_API_NODES=10.85.188.19 RABBITMQ_NODE_PORT=5673 CLOUD_ORCHESTRATOR=kubernetes KUBEMANAGER_NODES=10.85.188.19 CONTRAIL_VERSION=master-latest KUBERNETES_API_SERVER=10.85.188.19 TTY=True ANALYTICS_SNMP_ENABLE=True STDIN_OPEN=True ANALYTICS_ALARM_ENABLE=True ANALYTICSDB_ENABLE=True CONTROL_NODES=10.169.25.19
ご覧のように、この .env
ファイルには、セットアップに関する重要な環境パラメーターが含まれています。を指定するには global FIP pool
、以下の行を追加します。
KUBERNETES_PUBLIC_FIP_POOL={'domain': 'default-domain','name':
'pool-global-default','network': 'vn-global-default','project': 'k8s-ns-user-1'}
次のようになります。グローバルな浮動 IP プールが呼び出されます。 pool-global-default
仮想ネットワークに基づいて定義されています。 vn- global-default
プロジェクトの下 k8s-ns-user-1
。これは、対応する Kubernetes
名前空間が ns-user-1
。
この設定が完了したので、 contrail-kube-manager
Docker コンテナを使用して変更を有効にすることができます。基本的には、それを破棄してからバックアップする必要があります。
$ cd /etc/contrail/kubemanager/ $ docker-compose down;docker-compose up -d Stopping kubemanager_kubemanager_1 ... done Removing kubemanager_kubemanager_1 ... done Removing kubemanager_node-init_1 ... done Creating kubemanager_node-init_1 ... done Creating kubemanager_kubemanager_1 ... done
これで、グローバルな浮動 IP プールがクラスターに指定されました。
3つのスコープすべてにおいて、浮動 IP は自動的に割り当てられ、サービスおよび受信オブジェクトにのみ関連付けされるようになっています。フローティング IP が pod に関連付けられている必要がある場合は、手動で実行する必要があります。’これについては、次のセクションで説明します。
ポッドのフローティング IP
Floating ip プールが作成されて利用可能になると、浮動 ip pool を必要とするポッドに対応するために、floating ip プールからの割り当てを行うことができます。このためには、浮動 ip プールから VMI (VM、または pod) に floating ip を関連付けることで、Figure 8と4.9 のように Contrail UI を使用して floating vmi にフローティング ip を関連付けることができFigure 9
Floating ip プールが、浮動 IP が作成されるプロジェクトに対して共有されていることを確認します。
浮動 IP のアドバタイズ
浮動 IP が pod インターフェイスに関連付けられると、その非管理 BGP のピアに通知されます。これは、typ ゲートウェイルーターとして機能します。次の図、 Figure 10、 Figure 11、 Figure 12は、BGP ピアを追加および編集する方法を示しています。
BGP ピア情報をすべて入力し、’コントローラーを関連付けることを忘れないでください (Figure 13を参照)。
のドロップダウンから peer
下で Associated
Peers
追加しようとしているこの新しい BGP ルーターから、ピアリングするコントローラーを選択します。] save
完了したら、ルータータイプがルーターの新しい BGP ピアがポップアップで表示されます。
’ここで、タイプルーターとしてピア BGP ルーターを追加しました。タイプコントロールノードを使用しているローカル BGP スピーカーでは、[編集] ボタンをクリックしてパラメーターをダブルチェックするだけで済みます。このテストでは Contrail コントローラとゲートウェイルーター間で MP-IBGP neighborship を構築して、ASN および Address 族の両方のフィールドが一致していることを確認してください。両方の端については、Figure 15を参照してください。
これで、ゲートウェイルーターの neighborship の状態を BGP 確認できます。
labroot@camaro> show bgp summary | match 10.169.25.19 10.169.25.19 60100 2235 2390 0 39 18:19:34 Establ
Neighborship を確立すると BGP、2つのスピーカー間でルートが交換されます。これ’は、Kubernetes オブジェクトに割り当てられている floating IP がマスターノード (10.169.25.19) によってアドバタイズされ、ゲートウェイルーターでは学習していることを確認すると、次のようになります。
labroot@camaro> show route table k8s-test.inet.0 101.101.101.2 Jul 11 01:18:31 k8s-test.inet.0: 8 destinations, 8 routes (8 active, 0 holddown, 0 hidden) @ = Routing Use Only, # = Forwarding Use Only + = Active Route, - = Last Active, * = Both 101.101.101.2/32 *[BGP/170] 00:01:42, MED 200, localpref 100, from 10.169.25.19 AS path: ? validation-state: unverified, > via gr-2/3/0.32771, Push 47
こちらの detail
同じコマンドのバージョンにより、次のようなことがわかります。floating
IP ルートは Contrail の Con ローラーから反映されていますが、 Protocol next
hop
計算ノードである (10.169.25.20
) は、フローティング IP が compute ノードに割り当てられていることを示します。その計算ノードで現在実行されている1つのエンティティは、フローティング
IP を所有しています。
labroot@camaro> show route table k8s-test.inet.0 101.101.101.2 detail | match "next hop" Jul 11 01:19:18 Next hop type: Indirect, Next hop index: 0 Next hop type: Router, Next hop index: 1453 Next hop: via gr-2/3/0.32771, selected Protocol next hop: 10.169.25.20 Indirect next hop: 0x900e640 1048601 INH Session ID: 0x70f
ダイナミックソフト GRE 構成により、ゲートウェイルーターはソフト GRE トンネルインターフェイスを自動的に作成します。
labroot@camaro> show interfaces gr-2/3/0.32771 Jul 11 01:19:53 Logical interface gr-2/3/0.32771 (Index 432) (SNMP ifIndex 1703) Flags: Up Point-To-Point SNMP-Traps 0x4000 IP-Header 10.169.25.20:192.168.0.204:47:df:64:0000000800000000 Encapsulation: GRE-NULL Copy-tos-to-outer-ip-header: Off, Copy-tos-to-outer-ip-header-transit: Off Gre keepalives configured: Off, Gre keepalives adjacency state: down Input packets : 0 Output packets: 0 Protocol inet, MTU: 9142 Max nh cache: 0, New hold nh limit: 0, Curr nh cnt: 0, Curr new hold cnt: 0, NH drop cnt: 0 Flags: None Protocol mpls, MTU: 9130, Maximum labels: 3 Flags: None
こちらの IP-Header
GRE 外部 IP ヘッダーを示すため、BGP
のローカルアドレスを持つ現在のゲートウェイルーターからトンネルが構築されます。 192.168.0.204
をリモートノード 10.169.25.20
(この場合’は、Contrail
の計算ノードの1つです)。Figure 16は、浮動 IP アドバタイズメントプロセスを示しています。
サマリー
この章では、以下のオブジェクトを作成しました。
Ecn ns-user-1
FIP VN: vn-ns-デフォルト
FIP pool: pool-ns-デフォルト
こちらの ns-user-1
ns プロジェクトは、名前空間レベルのプールを参照しています。 pool-ns-default
これは手動で作成されるもので、すべてのテストオブジェクトが保持されます。名前空間レベルのプールは、仮想ネットワークに基づいています。 vn-ns-default
101.101.101/24 サブネットではありません。名前空間 ns で作成されたオブジェクトの floating IP は、このサブネットから割り当てられます。
名前空間および浮動 virtu-al ネットワークに対して事前に設定された YAML ファイルを準備したら、以下のオブジェクトを作成できます。
浮動 IP プールは Contrail’s UI で個別に作成する必要があります。詳細については、 Contrail の浮動 IP アドレスを参照してください。
これらのオブジェクトを使用すると、floating IP プールに関連付けられた名前空間が存在することになります。この名前空間の中から、サービスなど、その他の Kubernetes オブジェクトの作成と研究に進むことができます。
本書に記載されているサービスと受信のデモは、この ns-user-1 名前空間の下で作成します。