4.10.2. route-override CNI 플러그인으로 플러그인 연결 구성
플러그인 체인을 사용하면 동일한 네트워크 인터페이스에 순차적으로 여러 CNI 플러그인을 구성할 수 있으며 체인의 각 플러그인은 인터페이스를 순서대로 처리합니다.
플러그인 배열을 사용하여 은 인터페이스를 생성할 수 있으며, 두 번째 플러그인은 라우팅 구성을 수정할 수 있습니다.
NetworkAttachmentDefinition (NAD)을 정의할 때 첫 번째 플러그인
route-override CNI 플러그인은 일반적으로 첫 번째 플러그인에서 생성한 인터페이스의 라우팅 구성을 수정하기 위해 체인에서 두 번째 플러그인으로 사용됩니다. 다음 작업을 지원합니다.
-
addroutes:정적 경로를 추가하여 인터페이스를 통해 특정 대상 네트워크의 트래픽을 보냅니다. -
delroutes:인터페이스에서 특정 경로를 제거합니다. -
flushroutes:인터페이스에서 모든 경로를 제거합니다. -
flushgateway:인터페이스에서 기본 게이트웨이 경로를 제거합니다.
다음 예제에서는 각각 사용자 지정 라우팅을 사용하여 별도의 VLAN에서 두 개의 추가 네트워크 인터페이스를 사용하여 pod를 구성하여 플러그인 체인을 보여줍니다.
-
192.168.100.0/24네트워크(VLAN 100)의eth1과 이 인터페이스를 통해10.0.0.0/8트래픽을 지시하는 정적 경로가 있습니다. -
이 인터페이스를 통해
172.16.0.0/12트래픽을 지시하는 정적 경로가 있는192.168.200.0/24네트워크(VLAN 200)의eth2입니다.
각 인터페이스는 두 개의 플러그인 체인을 사용합니다. macvlan 를 사용하여 VLAN에서 인터페이스를 생성하고 route-override 를 사용하여 해당 인터페이스를 통해 특정 트래픽을 전달하는 정적 경로를 추가합니다.
사전 요구 사항
-
OpenShift CLI(
oc)를 설치합니다. -
cluster-admin권한이 있는 계정.
프로세스
다음 명령을 실행하여 예제의 네임스페이스를 생성합니다.
$ oc create namespace chain-example연결된 플러그인 구성을 사용하여 첫 번째 NetworkAttachmentDefinition(NAD)을 생성합니다.
management.yaml과 같은 YAML 파일을 생성하여 다음 구성을 사용하여 VLAN 100에서 새 인터페이스eth1을 구성하는 CryostatD를 정의합니다.apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: name: management-net namespace: chain-example spec: config: '{ "cniVersion": "1.0.0", "name": "management-net", "plugins": [ { "type": "macvlan", "master": "br-ex", "vlan": 100, "mode": "bridge", "ipam": { "type": "static", "addresses": [ { "address": "192.168.100.10/24", "gateway": "192.168.100.1" } ] } }, { "type": "route-override", "addroutes": [ { "dst": "10.0.0.0/8", "gw": "192.168.100.1" } ] } ] }'
다음 명령을 실행하여 CryostatD를 생성합니다.
$ oc apply -f management.yaml체인된 플러그인 구성을 사용하여 두 번째 CryostatD를 생성합니다.
sip.yaml과 같은 YAML 파일을 생성하여 다음 구성을 사용하여 VLAN 200에서 새 인터페이스eth2를 구성하는 CryostatD를 정의합니다.apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: name: sip-net namespace: chain-example spec: config: '{ "cniVersion": "1.0.0", "name": "sip-net", "plugins": [ { "type": "macvlan", "master": "br-ex", "vlan": 200, "mode": "bridge", "ipam": { "type": "static", "addresses": [ { "address": "192.168.200.10/24", "gateway": "192.168.200.1" } ] } }, { "type": "route-override", "addroutes": [ { "dst": "172.16.0.0/12", "gw": "192.168.200.1" } ] } ] }'
다음 명령을 실행하여 CryostatD를 생성합니다.
$ oc apply -f sip.yaml다음 구성으로 pod 정의 파일(예:
pod.yaml)을 생성하여NetworkAttachmentDefinition리소스를 Pod에 연결합니다.apiVersion: v1 kind: Pod metadata: name: chain-test-pod namespace: chain-example labels: app: chain-test annotations: k8s.v1.cni.cncf.io/networks: '[ { "name": "management-net", "interface": "eth1" }, { "name": "sip-net", "interface": "eth2" } ]' spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: test-container image: registry.access.redhat.com/ubi9/ubi:latest command: ["sleep", "infinity"] securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"]다음 명령을 실행하여 Pod를 생성합니다.
$ oc apply -f pod.yaml다음 명령을 사용하여 Pod가 실행 중인지 확인합니다.
$ oc wait --for=condition=Ready pod/chain-test-pod -n chain-example --timeout=120s출력 예:
pod/chain-test-pod condition met
검증
다음 명령을 실행하여 포드 내부의 모든 네트워크 인터페이스와 할당된 IP 주소를 나열합니다. 이렇게 하면 Pod에 플러그인 체인으로 구성된 추가 인터페이스가 있는지 확인합니다.
$ oc exec chain-test-pod -n chain-example -- ip a출력 예:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0@if31: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8901 qdisc noqueue state UP link/ether 0a:58:0a:83:02:19 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.131.2.25/23 brd 10.131.3.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::858:aff:fe83:219/64 scope link valid_lft forever preferred_lft forever 3: eth1@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc noqueue state UP qlen 1000 link/ether aa:25:73:ff:a7:00 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 192.168.100.10/24 brd 192.168.100.255 scope global eth1 valid_lft forever preferred_lft forever inet6 fe80::a825:73ff:feff:a700/64 scope link valid_lft forever preferred_lft forever 4: eth2@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc noqueue state UP qlen 1000 link/ether aa:a4:6c:4e:e8:97 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 192.168.200.10/24 brd 192.168.200.255 scope global eth2 valid_lft forever preferred_lft forever inet6 fe80::a8a4:6cff:fe4e:e897/64 scope link valid_lft forever preferred_lft forever이 출력에서는 Pod에 세 개의 네트워크 인터페이스가 있음을 보여줍니다.
-
eth0:클러스터 네트워크에 연결된 기본 인터페이스입니다. -
eth1:management-net의 첫 번째 추가 인터페이스 IP192.168.100.10. -
eth2:sip-net의 두 번째 추가 인터페이스가 IP192.168.200.10인 .
-
다음 명령을 실행하여
route-override플러그인이 예상 정적 경로를 추가했는지 확인합니다.$ oc exec chain-test-pod -n chain-example -- ip route출력 예:
default via 10.132.0.1 dev eth0 10.0.0.0/8 via 192.168.100.1 dev eth1 10.132.0.0/23 dev eth0 proto kernel scope link src 10.132.1.97 10.132.0.0/14 via 10.132.0.1 dev eth0 100.64.0.0/16 via 10.132.0.1 dev eth0 169.254.0.5 via 10.132.0.1 dev eth0 172.16.0.0/12 via 192.168.200.1 dev eth2 172.30.0.0/16 via 10.132.0.1 dev eth0 192.168.100.0/24 dev eth1 proto kernel scope link src 192.168.100.10 192.168.200.0/24 dev eth2 proto kernel scope link src 192.168.200.10이 출력은 각 체인의
route-override플러그인이 예상되는 정적 경로를 추가했음을 확인합니다.-
10.0.0.0/8에서 192.168.100.1 dev eth1의 경우10.0.0.0/8로 향하는 트래픽은management-net게이트웨이를 통해eth1을 통해 라우팅됩니다. 이 경로는management-net체인의route-override플러그인에 의해 추가되었습니다. -
172.16.0.0/12 - 192.168.200.1 dev eth2의 경우172.16.0.0/12로 향하는 트래픽은sip-net게이트웨이를 통해eth2를 통해 라우팅됩니다. 이 경로는sip-net체인의route-override플러그인에 의해 추가되었습니다. -
연결된 서브넷 경로(
192.168.100.0/24및192.168.200.0/24)는macvlan플러그인에 의해 생성되었으며 기본 경로는 클러스터 네트워크 인터페이스인eth0을 사용합니다.
-