Kubernetes の Contrail との統合
Contrail Networkingは、ContrailとKubernetes自動化プラットフォームを統合するためのCNI(コンテナネットワークインターフェイス)をサポートしています。
Kubernetesとは?
Kubernetesは、K8sとも呼ばれ、ホストのクラスター全体にまたがるアプリケーションコンテナのデプロイ、スケーリング、運用を自動化するためのオープンソースプラットフォームであり、コンテナ中心のインフラストラクチャを提供します。パブリッククラウドとプライベートクラウドにまたがるポータブルプラットフォームを提供します。Kubernetesは、アプリケーションのデプロイ、スケーリング、および自動修復をサポートします。
Kubernetesは、コンテナポッドのアドレス指定、ネットワーク分離、ポリシーベースのセキュリティ、ゲートウェイ、SNAT、ロードバランサー、Kubernetesオーケストレーション用のサービスチェイニング機能など、基本的なネットワーク接続のほとんどについて、コンテナネットワークインターフェイス(CNI)と呼ばれるプラガブルフレームワークをサポートしています。Contrail リリース 4.0 は Kubernetes 向け CNI のサポートを提供します。
Kubernetesは、すべてのコンテナポッドが相互に通信できるフラットなネットワークモデルを提供します。ネットワーク ポリシーは、ポッド間のセキュリティを提供するために追加されます。ContrailとKubernetesを統合すると、マルチテナント機能、ネットワーク分離、ネットワークポリシーによるマイクロセグメンテーション、ロードバランシングなど、ネットワーク機能が追加されます。
表 1 は、Kubernetes の概念と OpenContrail リソース間のマッピングを示しています。
Kubernetesの | OpenContrail のリソース |
Namespace |
共有プロジェクトまたは単一プロジェクト |
莢 |
仮想マシン、インターフェイス、インスタンス IP |
サービス |
ECMP ベースのネイティブ ロードバランサー |
イングレス |
URL ルーティング用の HAProxy ベースの L7 ロードバランサー |
ネットワークポリシー |
名前空間とポッド セレクターに基づくセキュリティ グループ |
Kubernetes Podとは?
Kubernetes ポッドは、1 つ以上のコンテナー (Docker コンテナーなど)、それらのコンテナーの共有ストレージ、およびコンテナーの実行方法に関するオプションのグループです。ポッドは常に同じ場所に配置され、共同スケジュールされ、共有コンテキストで実行されます。ポッドの共有コンテキストは、Linux 名前空間、cgroup、およびその他の分離ファセットのセットです。ポッドのコンテキスト内では、個々のアプリケーションにさらにサブ分離が適用される場合があります。
Kubernetesの詳細については、 http://kubernetes.io/docs/whatisk8s/ を参照してください。
Kubernetes と統合された Contrail の設定モード
Contrailは、Kubernetesのいくつかの異なるモードで設定できます。このセクションでは、さまざまな設定モードについて説明します。
デフォルト モード
Kubernetes では、すべてのポッドがネットワーク アドレス変換 (NAT) を使用せずに他のすべてのポッドと通信できます。これは、Contrail Kubernetes クラスタのデフォルト モードです。デフォルト モードでは、Contrail によってすべてのネームスペースで共有される仮想ネットワークが作成され、そこからサービスとポッドの IP アドレスが割り当てられます。
Kubernetes クラスターで生成されたすべての名前空間のすべてのポッドは、相互に通信できます。すべてのポッドの IP アドレスは、Contrail Kubernetes Manager で設定されたポッド サブネットから割り当てられます。
kube-system 名前空間で生成されたシステム ポッドは、Kubernetes クラスターでは実行されません。これらはアンダーレイで実行され、これらのポッドのネットワークは Contrail によって処理されません。
名前空間分離モード
Kubernetesで義務付けられているデフォルトのネットワークモデルに加えて、Contrailは追加のカスタムネットワークモデルもサポートしており、KubernetesクラスタのユーザーがContrailの豊富な機能を利用できるようにします。そのような機能の1つが、Kubernetes名前空間のネットワーク分離です。
名前空間分離モードの場合、クラスター管理者は名前空間アノテーションを構成して分離をオンにすることができます。その結果、アクセスを許可するようにセキュリティ グループまたはネットワーク ポリシーが明示的に定義されていない限り、その名前空間内のサービスには他の名前空間からアクセスできません。
Kubernetes名前空間は、Kubernetes名前空間のメタデータに注釈を付けることで、分離型として構成できます。
opencontrail.org/isolation : true
名前空間の分離は、分離された名前空間内のポッドがクラスター内の他の名前空間のポッドに到達できないため、ポッドへのネットワーク分離を提供します。
名前空間の分離は、ポッドへのサービスの分離も提供します。Kubernetesサービスが分離された名前空間のポッドによって実装されている場合、それらのポッドは、Kubernetes service-ipを介して同じ名前空間内のポッドにのみアクセスできます。
サービスが他の名前空間に到達可能な状態を維持するには、名前空間に次の追加アノテーションを付けることで、サービスの分離を無効にします。
opencontrail.org/isolation.service : false
サービスの分離を無効にすると、サービスは他の名前空間のポッドに到達できるようになりますが、分離された名前空間のポッドは他の名前空間のポッドには到達できないままです。
ポッドとサービスの両方の分離に対して "分離" と注釈が付けられた名前空間は、次のネットワーク動作をします。
分離された名前空間で作成されたすべてのポッドは、相互にネットワークに到達できます。
Kubernetes クラスター内の他の名前空間のポッドは、分離された名前空間のポッドにアクセスでき ません 。
分離された名前空間で作成されたポッド は、 分離されていない名前空間のポッドにアクセスできます。
分離された名前空間内のポッド は、 Kubernetes クラスター内の任意の名前空間内の分離されていないサービスに到達できます。
他の名前空間のポッドは、分離された名前空間のサービスには到達 できません 。
"isolated" という注釈が付けられ、service-isolation が無効で、Pod Isolation のみが有効な名前空間は、次のネットワーク動作になります。
分離された名前空間で作成されたすべてのポッドは、相互にネットワークに到達できます。
Kubernetes クラスター内の他の名前空間のポッドは、分離された名前空間のポッドにアクセスでき ません 。
分離された名前空間で作成されたポッドは 、 他の名前空間のポッドにアクセスできます。
分離された名前空間内のポッド は、 Kubernetes クラスター内の任意の名前空間内の分離されていないサービスに到達できます。
他の名前空間のポッド は、 分離された名前空間のサービスにアクセスできます。
カスタム分離モード
管理者およびアプリケーション開発者は、注釈を追加して、名前空間内のポッドまたはすべてのポッドをプロビジョニングする仮想ネットワークを指定できます。このカスタム仮想ネットワークを指定するアノテーションは次のとおりです。
"opencontrail.org/network: <fq_network_name>"
このアノテーションがポッド仕様で設定されている場合、ポッドはそのネットワークで起動されます。アノテーションが名前空間仕様で構成されている場合、名前空間内のすべてのポッドが指定されたネットワークで起動されます。
仮想ネットワークは、ポッドまたは名前空間の仕様で構成する前に、Contrail VNC API または Contrail-UI を使用して作成する必要があります。
ネスト モード
Contrail は、OpenStack クラスタ内での Kubernetes クラスタのプロビジョニングをサポートします。このクラスタのネスト化自体は一意ではありませんが、Contrail は、単一の Contrail コントロールプレーンと単一のネットワークスタックが OpenStack と Kubernetes の両方のクラスタを管理し、サービスを提供する、 集約型の コントロールプレーンとデータプレーンを提供します。コントロールプレーンとデータプレーンが統合されているため、これらのクラスターの相互作用と設定はシームレスであり、レプリケーションと重複がないため、これは非常に効率的なオプションです。
ネストモードでは、Kubernetes クラスターは OpenStack クラスターの仮想マシンにプロビジョニングされます。KubernetesクラスタのCNIプラグインとContrail-kubernetesマネージャは、OpenStackクラスタを管理するContrailコンポーネントと直接連携します。
ネストモードのデプロイでは、Kubernetesのすべての機能、機能、仕様がそのままサポートされます。ネストデプロイメントは、基盤となるOpenStackクラスターと同じプレーンで運用できるようにすることで、Kubernetesの境界と制限を拡張します。
詳細については、「 Kubernetes クラスターのプロビジョニング」を参照してください。
Kubernetesサービス
Kubernetes サービスは、ポッドの論理セットと、ポッドへのアクセスに使用されるポリシーを定義する抽象化です。サービスを実装するポッドのセットは、サービス定義の LabelSelector フィールドに基づいて選択されます。Contrailでは、KubernetesサービスはECMPネイティブのロードバランサーとして実装されます。
Contrail Kubernetes インテグレーションは、次の サービス タイプをサポートしています。
'clusterIP': これは既定のモードです。この ServiceType を選択すると、クラスタ ネットワーク経由でサービスに到達できるようになります。
'LoadBalancer': ServiceType を 'LoadBalancer' として指定すると、外部からサービスにアクセスできるようになります。 'LoadBalancer' _Service_ には、CluserIP アドレスと ExternalIP アドレスの両方が割り当てられます。この ServiceType は、ユーザーが Floating-IP プールを使用してパブリックネットワークを構成していることを前提としています。
Contrail Kubernetes サービス統合は、プロトコルの TCP と UDP をサポートします。また、サービスは、port と targetPort が異なる複数のポートを公開できます。例えば:
kind: Service apiVersion: v1 metadata: name: my-service spec: selector: app: MyApp ports: - name: http protocol: TCP port: 80 targetPort: 9376 - name: https protocol: TCP port: 443 targetPort: 9377
Kubernetes ユーザーは、 LoadBalancer と clusterIP の両方の ServiceTypeに spec.clusterIP と spec.externalIPs を指定できます。
ServiceType が LoadBalancer で、ユーザーが spec.externalIP を指定していない場合、contrail-kube-manager はパブリック プールから floating-ip を割り当て、それを ExternalIP アドレスに関連付けます。
イングレス
Kubernetesサービスは、さまざまな方法で外部に公開することも、クラスタの外部に公開することもできます。Kubernetesサービスを外部に公開するすべての方法のリストについては、 https://kubernetes.io/docs/concepts/services-networking/ingress/#alternatives を参照してください。Ingressはそのような方法の1つです。Ingressはレイヤー7のロードバランシングを提供し、他の方法はレイヤー4のロードバランシングを提供します。Contrailは、HTTPベースのシングルサービスイングレス、シンプルなファンアウトイングレス、名前ベースの仮想ホスティングイングレスをサポートしています。
Contrail Kubernetesソリューション
Contrail Kubernetes ソリューションには、次の要素が含まれています。
- Contrail Kubernetes マネージャー
- Kubernetesサービス向けECMPロードバランサー
- Kubernetes Ingress向けHAProxyロードバランサー
- Kubernetesネットワークポリシーのセキュリティグループ
- セキュリティポリシーに対するKubernetesのサポート
- ドメイン ネーム サーバー (DNS)
- サポートされている Kubernetes アノテーション
Contrail Kubernetes マネージャー
Contrail Kubernetes を実装するには、Kubernetes API メッセージをリスンし、対応するリソースを Contrail API データベースに作成する必要があります。
新しいモジュールcontrail-kube-managerは、Dockerコンテナで実行され、Kubernetes APIサーバーからのメッセージをリッスンします。
Kubernetesサービス向けECMPロードバランサー
Kubernetes の各サービスは、ロード バランサー オブジェクトによって表されます。Kubernetes によって割り当てられたサービス IP は、ロード バランサーの VIP として使用されます。リスナーは、サービスがリッスンしているポートに対して作成されます。各ポッドは、リスナー プールのメンバーとして追加されます。contrail-kube-manager は、サービス ラベルまたはポッド ラベルに基づいて変更をリッスンし、追加、更新、または削除されたポッドでメンバー プール リストを更新します。
サービスのロードバランシングは、ECMPに基づくレイヤー4ネイティブの非プロキシロードバランシングです。instance-ip (service-ip) は、サービス内の各ポッドのポートにリンクされています。これにより、Contrail に ECMP ネクストホップが作成され、トラフィックはソース ポッドから直接ロード バランシングされます。
Kubernetes Ingress向けHAProxyロードバランサー
Kubernetes Ingress は、Contrail の HAProxy ロードバランサー機能によって実装されます。Kubernetes でイングレスが設定されるたびに、contrail-kube-manager は contrail-controller にロードバランサオブジェクトを作成します。Contrail サービス モニターは、ロード バランサー オブジェクトをリッスンし、アクティブ/スタンバイ モードのイングレス仕様ルールに基づいて、適切な設定で HAProxy を起動します。
ロード バランサーの詳細については、「 Contrail でのロード バランサーの使用 」を参照してください。
Kubernetesネットワークポリシーのセキュリティグループ
Kubernetes ネットワーク ポリシーは、ポッドのグループが相互に通信する方法や他のネットワーク エンドポイントとの通信を許可する方法の仕様です。 NetworkPolicy リソースは、ラベルを使用してポッドを選択し、特定の名前空間の分離ポリシーで許可されているものに加えて、選択したポッドへのトラフィックを許可するホワイト リスト ルールを定義します。
Kubernetes ネットワーク ポリシーの詳細については、「 https://kubernetes.io/docs/concepts/services-networking/networkpolicies/」を参照してください。
contrail-kube-manager は、作成、更新、削除に関する Kubernetes ネットワーク ポリシー イベントをリッスンし、Kubernetes ネットワーク ポリシーを VMI(仮想マシン インターフェイス)に適用される Contrail セキュリティ グループ オブジェクトに変換します。VMI は、ポッドとラベルが追加および削除されると動的に更新されます。
セキュリティポリシーに対するKubernetesのサポート
Kubernetes 環境で作成されたネットワーク ポリシーは、Contrail Security Policy フレームワークを使用して実装されます。Kubernetes 環境のラベルは、Contrail でタグとして表示されます。Contrail リリース 5.0 以降では、Kubernetes 環境のタグを定義できます。Contrail セキュリティ ポリシーは、これらのタグを使用して指定された Kubernetes ポリシーを実装します。UIでタグを定義するか、JSON形式で設定をアップロードできます。新しく定義されたタグは、Contrail Security でポリシーを作成および適用するために使用できます。
ドメイン ネーム サーバー (DNS)
Kubernetesは、ポッドからのサービス名解決のためのDNS要求に応答する小さなDNSアプリケーションであるSkyDNSを使用してDNSを実装します。SkyDNSはKubernetesのポッドとして実行されます。
サポートされている Kubernetes アノテーション
現在、Contrail Networking は次の Kubernetes アノテーションをサポートしています。
'opencontrail.org/network': '{"domain":"default-domain", "project": "k8s-contrail", "name":"deu"}' 'opencontrail.org/isolation': 'true' 'opencontrail.org/fip-pool': '{"domain": "default-domain", "project": "k8s-default", "network": "k8s-default-svc-public", "name": "default"}'
詳細については、 https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ を参照してください。