이 페이지의 내용
클라우드 네이티브 Contrail Networking에 VirtualNetworkRouter 구축
요약 클라우드 네이티브 Contrail® Networking™ 은 VirtualNetworkRouter
(VNR) 구조를 지원합니다. 이 구문 VirtualNetworks
은 .
VirtualNetworkRouter 개요
VirtualNetwork
일반적으로 트래픽은 테넌트 분리를 유지하기 위해 격리됩니다. 클라우드 네이티브 Contrail Networking VirtualNetworkRouter
(VNR)에서는 경로 유출을 수행합니다. 경로 누출은 라우팅 인스턴스(RI)와 이러한 인스턴스와 연관된 라우팅 테이블을 가져와서 간의 VirtualNetworks
연결을 설정합니다. 그 결과, 한 라우팅 테이블의 디바이스는 다른 라우팅 테이블에 있는 디바이스의 리소스에 액세스할 수 있습니다.
VNR은 다음과 같은 두 가지 공통 네트워크 모델에 대한 연결을 제공합니다.
-
메시: 연결된
VirtualNetworks
모든 포드가 서로 통신합니다. -
허브 스포크:
VirtualNetworks
두 가지 다른 VNR 유형(스포크, 허브)에 연결합니다. 스포크 유형 VNR에 연결됨 허브 유형 VNR에 연결되거나 그 반대의 경우도 마찬가지입니다. 스포크 VNR에 연결된 VNR은 스포크 VNR에VirtualNetworks
연결된 다른VirtualNetworks
VNR과 통신할 수 없습니다.VirtualNetworks
VirtualNetworks
VNR은 클라우드 네이티브 Contrail Networking 내에 구축된 Kubernetes 구조입니다.
VirtualNetworkRouter 사용 사례
다음 예는 클라우드 네이티브 Contrail Networking에서 VNR의 기능을 보여주는 일반적인 사용 사례입니다.
메시 사용 사례
동일한 네임스페이스에 있는 두 개 이상의 가상 네트워크를 연결하는 메시 VNR
- 그림-1: 사용자가 네임스페이스-1에 VN1 및 VN2를 생성합니다. VN1의 포드는 VN2의 포드에 연결할 수 없습니다. 이는 클라우드 네이티브 Contrail Networking의
VirtualNetworks
기본 동작입니다. - 그림-2: 사용자는 VN1 및 VN2를 선택하는 메시 유형의 VNR을 정의합니다. 이 VNR을 통해 VN1의 Pod는 VN2의 Pod와 통신할 수 있으며 그 반대의 경우도 마찬가지입니다.
- 그림-3: VN1의 포드는 VN2의 포드에 연결됩니다. VNR의 경로 대상은
importExported
둘 다VirtualNetworks
입니다.
동일한 네임스페이스 내의 새 가상 네트워크를 기존 메시형 VNR에 추가
- 그림-1: 두 개
VirtualNetworks
(VN1, VN2)가 네임스페이스-1의 VNR에 연결됩니다. - 그림-2: 사용자가 두 개의 신규
VirtualNetworks
(VN3, VN4)를 생성합니다. - 그림-3: VN3 및 VN4는 VNR에 연결됩니다. 그 결과, VNR에 연결된 모든
VirtualNetworks
서버가 연결을 수신합니다.
동일한 네임스페이스에 있는 두 개의 메시 VNR
- 그림-1: 메시 유형의 VNR-web 및 VNR-db가 이미 네임스페이스-1에 있습니다. 각 VNR에 연결된 VNR만 서로 통신합니다.
- 그림-2: VNR-web 및 VNR-db는 서로 통신합니다.
- 그림 -3 : VNR-web과 VNR-db에 연결된 모든 것이
VirtualNetworks
서로 통신합니다.
네임스페이스가 다른 두 개의 메시 VNR
- 그림-1: VNR-web은 VN1 및 VN2를 선택합니다. VN1 및 VN2의 포드는 서로 통신합니다. VN1 및 VN2는 VN3 및 VN4와 통신할 수 없습니다.
- 그림-2: VNR-db는 VN3 및 VN4를 선택합니다. VN3 및 VN4의 포드는 서로 통신합니다. VN3 및 VN4는 VN1 및 VN2와 통신할 수 없습니다.
- 그림-3: 사용자가 VNR-web을 업데이트하여 VNR-db를 선택합니다.
- 그림 -3 : 사용자가 VNR-db를 업데이트하여 VNR-web을 선택합니다.
- 그림-3: 두 개의 VNR이 서로를 선택하므로 VNR-web의 RT(route target)가 VN3 및 VN4에 추가됩니다. VNR-db의 RT가 VN1 및 VN2에 추가되었습니다. VN1, VN2, VN3 및 VN4의 포드는 서로 통신합니다.
동일한 네임스페이스의 허브 및 스포크 VNR
- 그림-1: VN1의 포드는 VN2의 포드와 통신할 수 없습니다. VN1 및 VN2는 VN3과 통신할 수 없습니다.
- 그림-2: 사용자가 '스포크' 및 '허브' 유형의 VNR을 생성합니다. VNR-spoke 및 VNR-hub는 서로의 RT를 가져옵니다.
- 그림-3: VNR-spoke 및 VNR-hub의 RT는 서로의 RT를 가져오기 때문에 VN1, VN2 및 VN3에 추가됩니다. 결과적으로 VN1 및 VN2의 포드는 VN3와 통신합니다. VN1 및 VN2의 포드는 통신할 수 없습니다.
서로 다른 네임스페이스의 허브 및 스포크 VNR
- 그림 1-그림 3은 VNR-spoke와 VNR-hub가 서로 다른 네임스페이스에서 작동한다는 점을 제외하면 동일한 네임스페이스의 허브 및 스포크 VNR과 동일합니다.
여러 VNR에서 동일한 가상 네트워크
- 그림-1: VN1 및 VN2의 포드는 서로 통신할 수 없습니다. 하지만 VN3, VN4. 또한 VN3, VN4의 리소스는 서로 통신할 수 있습니다
- 그림-2: VN1, VN2, VN3, VN4를 선택하는 VNR-허브, VN3, VN4를 선택하는 VNR-mesh 생성
- 그림-3: VNR-스포크는 VN1, VN2가 서로 통신할 수 없도록 하고, VNR-허브를 통해 VN1, VN2가 VN3, VN4에 도달할 수 있도록 하고 VNR-메시는 VN3, VN4 간의 통신을 가능하게 합니다.
사용 사례 설명
이 섹션은 각 사용 사례에 대한 엔드 투 엔드 설명과 함께 다음 두 가지 VNR 사용 사례로 구성됩니다.
표준 사용 사례: 두 개의 가상 네트워크를 연결하는 단일 VNR
apiVersion: v1 kind: Namespace metadata: name: ns-single-mesh labels: ns: ns-single-mesh spec: finalizers: - kubernetes --- apiVersion: core.contrail.juniper.net/v1alpha1 kind: Subnet metadata: namespace: ns-single-mesh name: subnet-1 annotations: core.juniper.net/display-name: subnet_vn_1 spec: cidr: "10.10.1.0/24" defaultGateway: 10.10.1.254 --- apiVersion: core.contrail.juniper.net/v1alpha1 kind: Subnet metadata: namespace: ns-single-mesh name: subnet-2 annotations: core.juniper.net/display-name: subnet_vn_2 spec: cidr: "10.10.2.0/24" defaultGateway: 10.10.2.254 --- apiVersion: core.contrail.juniper.net/v1alpha1 kind: VirtualNetwork metadata: namespace: ns-single-mesh name: vn-1 annotations: core.juniper.net/display-name: vn-1 labels: vn: web spec: v4SubnetReference: apiVersion: core.contrail.juniper.net/v1alpha1 kind: Subnet namespace: ns-single-mesh name: subnet-1 --- apiVersion: core.contrail.juniper.net/v1alpha1 kind: VirtualNetwork metadata: namespace: ns-single-mesh name: vn-2 annotations: core.juniper.net/display-name: vn-2 labels: vn: web spec: v4SubnetReference: apiVersion: core.contrail.juniper.net/v1alpha1 kind: Subnet namespace: ns-single-mesh name: subnet-2 --- apiVersion: core.contrail.juniper.net/v1alpha1 kind: VirtualNetworkRouter metadata: namespace: ns-single-mesh name: vnr-1 annotations: core.juniper.net/display-name: vnr-1 labels: vnr: web spec: type: mesh virtualNetworkSelector: matchExpressions: - key: vn operator: In values: - web --- apiVersion: v1 kind: Pod metadata: name: pod-vn-1 namespace: ns-single-mesh annotations: k8s.v1.cni.cncf.io/networks: vn-1 spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: agent-mode operator: NotIn values: - dpdk containers: - name: pod-vn-1 image: svl-artifactory.juniper.net/atom-docker/cn2/bazel-build/dev/google-containers/toolbox command: ["bash","-c","while true; do sleep 60s; done"] securityContext: privileged: true imagePullPolicy: IfNotPresent restartPolicy: OnFailure --- apiVersion: v1 kind: Pod metadata: name: pod-vn-2 namespace: ns-single-mesh annotations: k8s.v1.cni.cncf.io/networks: vn-2 spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: agent-mode operator: NotIn values: - dpdk containers: - name: pod-vn-2 image: svl-artifactory.juniper.net/atom-docker/cn2/bazel-build/dev/google-containers/toolbox command: ["bash","-c","while true; do sleep 60s; done"] securityContext: privileged: true imagePullPolicy: IfNotPresent restartPolicy: OnFailure
이 사용 사례는 네임스페이스ns-single-mesh
에 두 개 VirtualNetworks
(vn-1
, vn-2
)로 구성됩니다. 두 가상 네트워크 label
vn: web
모두 . 각각 VirtualNetwork
에는 단일 포드가 포함되어 있습니다. 에는 VirtualNetwork
vn-1
pod-vn-1
. 에는 VirtualNetwork
vn-2
pod-vn-2
. 이름이 vnr-1
인 VNR은 type: mesh
를 사용하여 vn: web
matchExpressions
둘 VirtualNetworks
사이의 연결을 설정합니다. VNR은 의 RI 및 라우팅 테이블을 vn-1
로 가져오거나 그 vn-2
반대로 가져옵니다. 는 메시형 VNR이기 때문에 vnr-1
연결된 VirtualNetworks
모든 파드가 서로 통신한다.
업데이트 사용 사례: 두 개의 추가 가상 네트워크를 연결하는 단일 VNR
apiVersion: v1 kind: Namespace metadata: name: ns-single-mesh labels: ns: ns-single-mesh spec: finalizers: - kubernetes --- apiVersion: core.contrail.juniper.net/v1alpha1 kind: Subnet metadata: namespace: ns-single-mesh name: subnet-2 annotations: core.juniper.net/display-name: subnet_vn_1 spec: cidr: "10.10.3.0/24" defaultGateway: 10.10.3.254 --- apiVersion: core.contrail.juniper.net/v1alpha1 kind: Subnet metadata: namespace: ns-single-mesh name: subnet-4 annotations: core.juniper.net/display-name: subnet_vn_2 spec: cidr: "10.10.4.0/24" defaultGateway: 10.10.4.254 --- apiVersion: core.contrail.juniper.net/v1alpha1 kind: VirtualNetwork metadata: namespace: ns-single-mesh name: vn-3 annotations: core.juniper.net/display-name: vn-1 labels: vn: db spec: v4SubnetReference: apiVersion: core.contrail.juniper.net/v1alpha1 kind: Subnet namespace: ns-single-mesh name: subnet-3 --- apiVersion: core.contrail.juniper.net/v1alpha1 kind: VirtualNetwork metadata: namespace: ns-single-mesh name: vn-4 annotations: core.juniper.net/display-name: vn-2 labels: vn: middleware spec: v4SubnetReference: apiVersion: core.contrail.juniper.net/v1alpha1 kind: Subnet namespace: ns-single-mesh name: subnet-4 --- apiVersion: core.contrail.juniper.net/v1alpha1 kind: VirtualNetworkRouter metadata: namespace: ns-single-mesh name: vnr-2 annotations: core.juniper.net/display-name: vnr-1 labels: vnr: db vnr: middleware spec: type: mesh virtualNetworkSelector: matchExpressions: - key: vn operator: In values: - db, middlware --- apiVersion: v1 kind: Pod metadata: name: pod-vn-3 namespace: ns-single-mesh annotations: k8s.v1.cni.cncf.io/networks: vn-1 spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: agent-mode operator: NotIn values: - dpdk containers: - name: pod-vn-3 image: svl-artifactory.juniper.net/atom-docker/cn2/bazel-build/dev/google-containers/toolbox command: ["bash","-c","while true; do sleep 60s; done"] securityContext: privileged: true imagePullPolicy: IfNotPresent restartPolicy: OnFailure --- apiVersion: v1 kind: Pod metadata: name: pod-vn-4 namespace: ns-single-mesh annotations: k8s.v1.cni.cncf.io/networks: vn-2 spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: agent-mode operator: NotIn values: - dpdk containers: - name: pod-vn-4 image: svl-artifactory.juniper.net/atom-docker/cn2/bazel-build/dev/google-containers/toolbox command: ["bash","-c","while true; do sleep 60s; done"] securityContext: privileged: true imagePullPolicy: IfNotPresent restartPolicy: OnFailure
이 사용 사례는 표준 사용 사례와 유사하지만, 이 사용 사례에서 사용자가 네임스페이스ns-single-mesh
에 있는 두 개의 새로 VirtualNetworks
운(vn-3
, vn-4
)을 연결하기 위해 추가 type: mesh
VNR로 YAML을 업데이트한다는 점을 제외하면 이 사용 사례와 유사합니다. 표시된 VNR의 이름은 네임스페이스 ns-single-mesh
에 와 함께 matchExpressions: db, middlware
있습니다vnr-2
. 에는 레이블이 있고 에는 VirtualNetwork
vn-3
레이블 vn: db
vn: middleware
이 vn-4
있습니다. 그 결과, vnr-2
은(는) 의 RI 및 라우팅 테이블을 vn-3
받는 사람으로 가져오거나 그 vn-4
반대로 가져옵니다.
API 유형(스키마)
type VirtualNetworkRouterSpec struct { // Common spec fields CommonSpec `json:",inline" protobuf:"bytes,1,opt,name=commonSpec"` // Type of VirtualNetworkRouter. valid types - mesh, spoke, hub Type VirtualNetworkRouterType `json:"type,omitempty" protobuf:"bytes,2,opt,name=type"` // Select VirtualNetworks to which this VNR's RT be shared VirtualNetworkSelector *metav1.LabelSelector `json:"virtualNetworkSelector,omitempty" protobuf:"bytes,3,opt,name=virtualNetworkSelector"` // Import Router targets from other virtualnetworkrouters Import ImportVirtualNetworkRouter `json:"import,omitempty" protobuf:"bytes,4,opt,name=import"` } type ImportVirtualNetworkRouter struct { VirtualNetworkRouters []VirtualNetworkRouterEntry `json:"virtualNetworkRouters,omitempty" protobuf:"bytes,1,opt,name=virtualNetworkRouters"` } type VirtualNetworkRouterEntry struct { VirtualNetworkRouterSelector *metav1.LabelSelector `json:"virtualNetworkRouterSelector,omitempty" protobuf:"bytes,1,opt,name=virtualNetworkRouterSelector"` NamespaceSelector *metav1.LabelSelector `json:"namespaceSelector,omitempty" protobuf:"bytes,2,opt,name=namespaceSelector"` }
메시 VNR
apiVersion: core.contrail.juniper.net/v1alpha1 kind: VirtualNetworkRouter metadata: namespace: frontend name: vnr-1 annotations: core.juniper.net/display-name: vnr-1 labels: vnr: web ns: frontend spec: type: mesh virtualNetworkSelector: matchLabels: vn: web import: virtualNetworkRouters: - virtualNetworkRouterSelector: matchLabels: vnr: db namespaceSelector: matchLabels: ns: backend
이 YAML은 네임스페이스에 이름이 vnr-1
있고 및 와 ns: frontend
함께 메시 VNR의 labels
vnr: web
예입니다.frontend
이 VNR은 를 사용하여 matchLabel
vnr: db
네임스페이스 backend
의 모든 VNR로 경로 대상을 가져옵니다.
스포크 VNR
kind: VirtualNetworkRouter metadata: namespace: frontend name: vnr-1 annotations: core.juniper.net/display-name: vnr-1 labels: vnrgroup: spokes ns: frontend spec: type: spoke virtualNetworkSelector: matchLabels: vngroup: spokes import: virtualNetworkRouters: - virtualNetworkRouterSelector: matchLabels: vnrgroup: hubs namespaceSelector: matchLabels: ns: backend
이 YAML은 네임스페이스에 및 ns: frontend
가 있는 이름이 frontend
vnr-1
있는 스포크 VNR의 labels
vnrgroup: spokes
예입니다. 이 VNR은 를 사용하여 matchLabel
vnrgroup: hubs
네임스페이스 backend
의 모든 VNR로 경로 대상을 가져옵니다.
허브 VNR
apiVersion: core.contrail.juniper.net/v1alpha1 kind: VirtualNetworkRouter metadata: namespace: backend name: vnr-2 annotations: core.juniper.net/display-name: vnr-2 labels: vnrgroup: hubs ns: backend spec: type: hub virtualNetworkSelector: matchLabels: vngroup: hubs import: virtualNetworkRouters: - virtualNetworkRouterSelector: matchLabels: vnrgroup: spokes namespaceSelector: matchLabels: ns: frontend
이 YAML은 네임스페이스 backend
에 및 가 ns: backend
있는 vnrgroup: hubs
labels
이름을 vnr-2
가진 허브 VNR의 예입니다. 이 VNR은 를 사용하여 matchLabels
vnrgroup: spokes
네임스페이스 frontend
의 모든 VNR로 경로 대상을 가져옵니다.