メモ:
このトピックでは、Contrail Networkingリリース21ベースのリリースを使用している、Kubernetesでオーケストレーションされた環境におけるContrail Networkingについて説明します。
リリース 22.1 以降、Contrail Networking はクラウドネイティブの Contrail Networking に進化しました。クラウドネイティブのContrail Networkingは、Kubernetesオーケストレーションされた環境でネットワークパフォーマンスを最適化するための大幅な機能強化を提供します。Kubernetesでオーケストレーションされたほとんどの環境のネットワーキングには、クラウドネイティブのContrailの使用をお勧めします。
クラウドネイティブContrailの一般的な情報については、 クラウドネイティブContrail Networking テクニカルライブラリのホームページを参照してください。
リリース 4.0 以降、Contrail は Kubernetes オーケストレーションを使用してコンテナのネットワーク サポートを提供します。標準のコンテナネットワーキングインターフェイス(CNIプラグイン)を使用して作成するすべてのコンテナにネットワークインターフェイスを割り当てることができます。Contrailコンテナネットワーキングの詳細については、 ContrailとKubernetesの統合を参照してください。
Contrail リリース 5.1 以降、コンテナに複数のネットワークインターフェイス(マルチネット)を割り当てて、コンテナを複数のネットワークに接続できるようになりました。コンテナーが接続できるネットワークを指定できます。ネットワークインターフェイスは、物理インターフェイスまたは仮想インターフェイスのいずれかであり、Linux ネットワーク名前空間に接続されています。ネットワーク名前空間は、Linux カーネルのネットワーク スタックです。複数のコンテナーが同じネットワーク名前空間を共有できます。
The following limitations and caveats apply when you create multi-net interfaces:
ポッドの実行中にサイドカー ネットワークを追加または削除することはできません。
管理者は、Kubernetes API サーバーからネットワーク接続定義を削除する前に、対応する Contrail ポッドを削除する責任があります。
Contrail では、カスタム ネットワークに加えてデフォルト cluster-wide-network
が作成されます。
Contrail CNIプラグインは委任プラグインではありません。Kubernetes ネットワークのカスタムリソース定義デファクト標準バージョン 1 で提供されているプラグインを委任するための仕様はサポートされていません。詳細については、https://github.com/K8sNetworkPlumbingWG/multi-net-spec ページの [v1] Kubernetes ネットワーク カスタム リソース定義デファクト Standard.md を参照してください。
Contrail マルチネットのサポートは、Kubernetes マルチネット モデルに基づいています。Kubernetesマルチネットモデルは、特定の設計と構造を持ち、Contrailマルチネットなどの非Kubernetesモデルにも拡張できます。Contrailマルチネットモデルでは、Kubernetes APIおよびKubernetes CNIドライバを変更する必要はありません。Contrailマルチネットモデルは、Kubernetesマルチネットモデルの場合と同様に、既存のクラスタ全体のネットワーク動作を変更しません。
Creating Multi-Net Interfaces
次の手順に従って、マルチネットインターフェイスを作成します。
- ネットワーク オブジェクト モデルを作成します。
ネットワーク オブジェクト モデルは、クラスターがモデルをサポートしていない場合に作成します。
コンテナー オーケストレーション プラットフォームのオブジェクト モデルは、ネットワークを表し、ネットワークをコンテナーに接続します。モデルがデフォルトでネットワーク オブジェクトをサポートしていない場合は、エクステンションを使用してネットワークを表すことができます。
Kubernetes を使用したネットワーク オブジェクト モデルの作成 ネットワーク接続定義 CRD オブジェクト
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
# name must match the spec fields below, and be in the form: <plural>.<group>
name: network-attachment-definitions.k8s.cni.cncf.io
spec:
# group name to use for REST API: /apis/<group>/<version>
group: k8s.cni.cncf.io
# version name to use for REST API: /apis/<group>/<version>
version: v1
# either Namespaced or Cluster
scope: Namespaced
names:
# plural name to be used in the URL: /apis/<group>/<version>/<plural>
plural: network-attachment-definitions
# singular name to be used as an alias on the CLI and for display
singular: network-attachment-definition
# kind is normally the CamelCased singular type. Your resource manifests use this.
kind: NetworkAttachmentDefinition
# shortNames allow shorter string to match your resource on the CLI
shortNames:
- net-attach-def
validation:
openAPIV3Schema:
properties:
spec:
properties:
config:
type: string
Kubernetes は、カスタム拡張機能を使用して、オブジェクト モデルでネットワークを表します。KubernetesのCustomResourceDefinition(CRD)機能は、カスタム拡張機能のサポートに役立ちます。
メモ:
CRD は、Contrail のインストール時に自動的に作成されます。CRD によって指定されたネットワークは、Kubernetes によって認識されないサイドカーです。追加のポッド ネットワーク添付ファイルと Kubernetes API およびそのオブジェクト (サービス、エンドポイント、プロキシなど) との相互作用は指定されていません。Kubernetes は、これらのオブジェクトとポッドとの関連付けを認識しません。
- ネットワークを作成します。
クラスタ内にネットワークを作成します。
コマンドでネットワークを作成します。
kubectl apply -f right-network.yaml
- ポッドにネットワークを割り当てます。
手順 2 で作成したネットワークをポッドに割り当てます。各ポッドには、デフォルトのネットワークも割り当てられています。したがって、各ポッドには次のネットワークが割り当てられます。
k8sセマンティクスを使用したポッドへのネットワークの割り当て:
Option 1
apiVersion: v1
kind: Pod
metadata:
name: multiNetworkPod
annotations:
k8s.v1.cni.cncf.io/networks: '[
{ "name": "network-a" },
{ "name": "network-b" }
]'
spec:
containers:
- image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
stdin: true
tty: true
restartPolicy: Always
Option 2
apiVersion: v1
kind: Pod
metadata:
name: ubuntu-pod-3
annotations:
k8s.v1.cni.cncf.io/networks: left-network,blue-network,right-network,extns/data-network
spec:
containers:
- name: ubuntuapp
image: ubuntu-upstart
securityContext:
capabilities:
add:
- NET_ADMIN