3.8. 컨테이너 네트워크 네임스페이스에서 마스터 인터페이스 구성
마스터 인터페이스를 기반으로 MAC-VLAN, IP-VLAN 및 VLAN 하위 인터페이스를 생성하고 관리할 수 있습니다.
3.8.1. 컨테이너 네트워크 네임스페이스에서 마스터 인터페이스 구성 정보 링크 복사링크가 클립보드에 복사되었습니다!
컨테이너 네임스페이스에 있는 마스터 인터페이스를 기반으로 하는 MAC-VLAN, IP-VLAN 또는 VLAN 하위 인터페이스를 생성할 수 있습니다. 별도의 네트워크 연결 정의 CRD에서 Pod 네트워크 구성의 일부로 마스터 인터페이스를 생성할 수도 있습니다.
컨테이너 네임스페이스 마스터 인터페이스를 사용하려면 NetworkAttachmentDefinition CRD의 하위 인터페이스에 존재하는 linkInContainer 매개변수에 대해 true 를 지정해야 합니다.
3.8.1.1. SR-IOV VF에서 여러 VLAN 생성 링크 복사링크가 클립보드에 복사되었습니다!
SR-IOV VF를 기반으로 여러 VLAN을 생성할 수 있습니다. 이 구성의 경우 SR-IOV 네트워크를 생성한 다음 VLAN 인터페이스의 네트워크 연결을 정의합니다.
다음 다이어그램에서는 SR-IOV VF에서 여러 VLAN을 생성하는 설정 프로세스를 보여줍니다.
사전 요구 사항
-
OpenShift CLI(
oc)를 설치합니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. - SR-IOV Network Operator가 설치되어 있습니다.
프로세스
다음 명령을 사용하여 Pod를 배포하려는 전용 컨테이너 네임스페이스를 생성합니다.
$ oc new-project test-namespaceSR-IOV 노드 정책을 생성합니다.
SriovNetworkNodePolicy오브젝트를 생성한 다음 YAML을sriov-node-network-policy.yaml파일에 저장합니다.apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: sriovnic namespace: openshift-sriov-network-operator spec: deviceType: netdevice isRdma: false needVhostNet: true nicSelector: vendor: "15b3" deviceID: "101b" rootDevices: ["00:05.0"] numVfs: 10 priority: 99 resourceName: sriovnic nodeSelector: feature.node.kubernetes.io/network-sriov.capable: "true"다음과 같습니다.
vendor-
SR-IOV 네트워크 장치의 벤더 16진수 코드입니다. 값
15b3은 Mellanox NIC와 연결됩니다. deviceIDSR-IOV 네트워크 장치의 장치 16진수 코드입니다.
참고deviceType: netdevice설정을 사용하는 SR-IOV 네트워크 노드 정책 구성 예제는 Mellanox Network Interface Cards(NIC)에 맞게 조정됩니다.
다음 명령을 실행하여 YAML 구성을 적용합니다.
$ oc apply -f sriov-node-network-policy.yaml참고노드 재부팅 작업으로 인해 YAML 구성을 적용하는 데 시간이 걸릴 수 있습니다.
SR-IOV 네트워크를 생성합니다.
다음 예제 CR에 설명된 대로 추가 보조 SR-IOV 네트워크 연결에 대한
SriovNetworkCR(사용자 정의 리소스)을 생성합니다. YAML을sriov-network-attachment.yaml파일로 저장합니다.apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetwork metadata: name: sriov-network namespace: openshift-sriov-network-operator spec: networkNamespace: test-namespace resourceName: sriovnic spoofChk: "off" trust: "on"다음 명령을 실행하여 YAML을 적용합니다.
$ oc apply -f sriov-network-attachment.yaml
VLAN 보조 네트워크를 만듭니다.
다음 YAML 예제를 사용하여
vlan100-additional-network-configuration.yaml이라는 파일을 만듭니다.apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: name: vlan-100 namespace: test-namespace spec: config: | { "cniVersion": "0.4.0", "name": "vlan-100", "plugins": [ { "type": "vlan", "master": "ext0", "mtu": 1500, "vlanId": 100, "linkInContainer": true, "ipam": {"type": "whereabouts", "ipRanges": [{"range": "1.1.1.0/24"}]} } ] }다음과 같습니다.
master-
VLAN 구성은
마스터이름을 지정해야 합니다. Pod의 네트워크 주석에 이름을 지정할 수 있습니다. linkInContainer-
linkInContainer매개변수를 지정해야 합니다.
다음 명령을 실행하여 YAML 파일을 적용합니다.
$ oc apply -f vlan100-additional-network-configuration.yaml
이전 지정된 네트워크를 사용하여 포드 정의를 생성합니다.
다음 YAML 구성 예제를 사용하여
pod-a.yaml파일이라는 파일을 생성합니다.참고매니페스트 예제에는 다음 리소스가 포함됩니다.
- 보안 레이블이 있는 네임스페이스
- 적절한 네트워크 주석이 있는 Pod 정의
apiVersion: v1 kind: Namespace metadata: name: test-namespace labels: pod-security.kubernetes.io/enforce: privileged pod-security.kubernetes.io/audit: privileged pod-security.kubernetes.io/warn: privileged security.openshift.io/scc.podSecurityLabelSync: "false" --- apiVersion: v1 kind: Pod metadata: name: nginx-pod namespace: test-namespace annotations: k8s.v1.cni.cncf.io/networks: '[ { "name": "sriov-network", "namespace": "test-namespace", "interface": "ext0" }, { "name": "vlan-100", "namespace": "test-namespace", "interface": "ext0.100" } ]' spec: securityContext: runAsNonRoot: true containers: - name: nginx-container image: nginxinc/nginx-unprivileged:latest securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"] ports: - containerPort: 80 seccompProfile: type: "RuntimeDefault"다음과 같습니다.
interface-
VLAN 인터페이스의
마스터인터페이스로 사용할 이름입니다.
다음 명령을 실행하여 YAML 파일을 적용합니다.
$ oc apply -f pod-a.yaml
다음 명령을 실행하여
test-namespace내에서nginx-pod에 대한 자세한 정보를 가져옵니다.$ oc describe pods nginx-pod -n test-namespaceName: nginx-pod Namespace: test-namespace Priority: 0 Node: worker-1/10.46.186.105 Start Time: Mon, 14 Aug 2023 16:23:13 -0400 Labels: <none> Annotations: k8s.ovn.org/pod-networks: {"default":{"ip_addresses":["10.131.0.26/23"],"mac_address":"0a:58:0a:83:00:1a","gateway_ips":["10.131.0.1"],"routes":[{"dest":"10.128.0.0... k8s.v1.cni.cncf.io/network-status: [{ "name": "ovn-kubernetes", "interface": "eth0", "ips": [ "10.131.0.26" ], "mac": "0a:58:0a:83:00:1a", "default": true, "dns": {} },{ "name": "test-namespace/sriov-network", "interface": "ext0", "mac": "6e:a7:5e:3f:49:1b", "dns": {}, "device-info": { "type": "pci", "version": "1.0.0", "pci": { "pci-address": "0000:d8:00.2" } } },{ "name": "test-namespace/vlan-100", "interface": "ext0.100", "ips": [ "1.1.1.1" ], "mac": "6e:a7:5e:3f:49:1b", "dns": {} }] k8s.v1.cni.cncf.io/networks: [ { "name": "sriov-network", "namespace": "test-namespace", "interface": "ext0" }, { "name": "vlan-100", "namespace": "test-namespace", "i... openshift.io/scc: privileged Status: Running IP: 10.131.0.26 IPs: IP: 10.131.0.26
3.8.1.2. 컨테이너 네임스페이스에서 브릿지 마스터 인터페이스를 기반으로 하위 인터페이스 생성 링크 복사링크가 클립보드에 복사되었습니다!
컨테이너 네임스페이스에 존재하는 브리지 마스터 인터페이스를 기반으로 하위 인터페이스를 생성할 수 있습니다. 하위 인터페이스 생성은 다른 유형의 인터페이스에 적용할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin권한이 있는 사용자로 OpenShift Container Platform 클러스터에 로그인되어 있습니다.
프로세스
다음 명령을 입력하여 Pod를 배포할 전용 컨테이너 네임스페이스를 생성합니다.
$ oc new-project test-namespace다음 YAML 구성 예제를 사용하여
bridge-nad.yaml이라는 브릿지NetworkAttachmentDefinitionCRD(사용자 정의 리소스 정의) 파일을 생성합니다.apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: bridge-network spec: config: '{ "cniVersion": "0.4.0", "name": "bridge-network", "type": "bridge", "bridge": "br-001", "isGateway": true, "ipMasq": true, "hairpinMode": true, "ipam": { "type": "host-local", "subnet": "10.0.0.0/24", "routes": [{"dst": "0.0.0.0/0"}] } }'다음 명령을 실행하여
NetworkAttachmentDefinitionCRD를 OpenShift Container Platform 클러스터에 적용합니다.$ oc apply -f bridge-nad.yaml다음 명령을 입력하여
NetworkAttachmentDefinitionCRD를 성공적으로 생성했는지 확인합니다. 예상되는 출력에는 CryostatD CRD의 이름과 생성 기간이 분 단위로 표시됩니다.$ oc get network-attachment-definitions다음 YAML 예제를 사용하여 IPVLAN 보조 네트워크 구성에 사용할
ipvlan-additional-network-configuration.yaml이라는 파일을 생성합니다.apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: name: ipvlan-net namespace: test-namespace spec: config: '{ "cniVersion": "0.3.1", "name": "ipvlan-net", "type": "ipvlan", "master": "net1", "mode": "l3", "linkInContainer": true, "ipam": {"type": "whereabouts", "ipRanges": [{"range": "10.0.0.0/24"}]} }'다음과 같습니다.
master- 네트워크 연결과 연결할 이더넷 인터페이스를 지정합니다. 이후 이더넷 인터페이스는 Pod 네트워크 주석에 구성됩니다.
linkInContainer-
마스터인터페이스가 컨테이너 네트워크 네임스페이스에 있음을 지정합니다.
다음 명령을 실행하여 YAML 파일을 적용합니다.
$ oc apply -f ipvlan-additional-network-configuration.yaml다음 명령을 실행하여
NetworkAttachmentDefinitionCRD가 성공적으로 생성되었는지 확인합니다. 예상되는 출력에는 CryostatD CRD의 이름과 생성 기간이 분 단위로 표시됩니다.$ oc get network-attachment-definitions다음 YAML 구성 예제를 사용하여 Pod 정의에 사용할
pod-a.yaml이라는 파일을 생성합니다.apiVersion: v1 kind: Pod metadata: name: pod-a namespace: test-namespace annotations: k8s.v1.cni.cncf.io/networks: '[ { "name": "bridge-network", "interface": "net1"1 }, { "name": "ipvlan-net", "interface": "net2" } ]' spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: test-pod image: quay.io/openshifttest/hello-sdn@sha256:c89445416459e7adea9a5a416b3365ed3d74f2491beb904d61dc8d1eb89a72a4 securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL]다음과 같습니다.
k8s.v1.cni.cncf.io/networks,interface-
IPVLAN 인터페이스의
마스터로 사용할 이름을 지정합니다.
다음 명령을 실행하여 YAML 파일을 적용합니다.
$ oc apply -f pod-a.yaml
검증
다음 명령을 사용하여 Pod가 실행 중인지 확인합니다.
$ oc get pod -n test-namespaceNAME READY STATUS RESTARTS AGE pod-a 1/1 Running 0 2m36s다음 명령을 실행하여
test-namespace내에서pod-a리소스에 대한 네트워크 인터페이스 정보를 표시합니다.$ oc exec -n test-namespace pod-a -- ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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 3: eth0@if105: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue state UP group default link/ether 0a:58:0a:d9:00:5d brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.217.0.93/23 brd 10.217.1.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::488b:91ff:fe84:a94b/64 scope link valid_lft forever preferred_lft forever 4: net1@if107: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether be:da:bd:7e:f4:37 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.0.0.2/24 brd 10.0.0.255 scope global net1 valid_lft forever preferred_lft forever inet6 fe80::bcda:bdff:fe7e:f437/64 scope link valid_lft forever preferred_lft forever 5: net2@net1: <BROADCAST,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default link/ether be:da:bd:7e:f4:37 brd ff:ff:ff:ff:ff:ff inet 10.0.0.1/24 brd 10.0.0.255 scope global net2 valid_lft forever preferred_lft forever inet6 fe80::beda:bd00:17e:f437/64 scope link valid_lft forever preferred_lft forever이 출력은 네트워크 인터페이스
net2가 물리적 인터페이스net1과 연결되어 있음을 보여줍니다.