18.3. 보조 네트워크
18.3.1. OVN-Kubernetes에서 보조 네트워크 생성
클러스터 관리자는 NetworkAttachmentDefinition
(NAD) 리소스를 사용하여 클러스터에 대한 추가 보조 네트워크를 구성할 수 있습니다.
보조 네트워크로 사용자 정의 네트워크에 대한 지원은 향후 OpenShift Container Platform 버전에 추가됩니다.
18.3.1.1. OVN-Kubernetes 추가 네트워크 구성
Red Hat OpenShift Networking OVN-Kubernetes 네트워크 플러그인을 사용하면 포드에 대한 보조 네트워크 인터페이스를 구성할 수 있습니다. 보조 네트워크 인터페이스를 구성하려면 NetworkAttachmentDefinition
CRD(사용자 정의 리소스 정의)에서 구성을 정의해야 합니다.
노드의 OVN-Kubernetes 컨트롤 플레인 에이전트가 연결된 network-attachment-definition
CRD를 처리할 때까지 Pod 및 다중 네트워크 정책 생성은 보류 중 상태로 유지될 수 있습니다.
계층 2 또는 localnet 토폴로지에서 OVN-Kubernetes 추가 네트워크를 구성할 수 있습니다.
- 계층 2 토폴로지는 east-west 클러스터 트래픽을 지원하지만 기본 물리적 네트워크에 대한 액세스를 허용하지는 않습니다.
- 로컬 네트워크 토폴로지는 물리적 네트워크에 연결할 수 있지만 클러스터 노드에서 기본 OVS(Open vSwitch) 브릿지를 추가로 구성해야 합니다.
다음 섹션에서는 현재 OVN-Kubernetes에서 보조 네트워크에서 허용하는 각 토폴로지에 대한 예제 구성을 제공합니다.
네트워크 이름은 고유해야 합니다. 예를 들어 동일한 네트워크를 참조하는 다양한 구성으로 여러 NetworkAttachmentDefinition
CRD를 생성하는 것은 지원되지 않습니다.
18.3.1.1.1. OVN-Kubernetes 추가 네트워크에서 지원되는 플랫폼
지원되는 플랫폼에서 OVN-Kubernetes 추가 네트워크를 사용할 수 있습니다.
- 베어 메탈
- IBM Power®
- IBM Z®
- IBM® LinuxONE
- VMware vSphere
- Red Hat OpenStack Platform (RHOSP)
18.3.1.1.2. OVN-Kubernetes 네트워크 플러그인 JSON 구성 테이블
다음 표에서는 OVN-Kubernetes CNI 네트워크 플러그인의 구성 매개변수를 설명합니다.
필드 | 유형 | 설명 |
---|---|---|
|
|
CNI 사양 버전입니다. 필수 값은 |
|
|
네트워크의 이름입니다. 이러한 네트워크는 네임스페이스가 지정되지 않습니다. 예를 들어 두 개의 다른 네임스페이스에 존재하는 두 개의 다른 |
|
|
구성할 CNI 플러그인의 이름입니다. 이 값은 |
|
|
네트워크의 토폴로지 구성입니다. |
|
| 클러스터 전체에서 네트워크에 사용할 서브넷입니다.
생략하면 네트워크를 구현하는 논리 스위치는 계층 2 통신만 제공하며 사용자는 Pod의 IP 주소를 구성해야 합니다. 포트 보안은 MAC 스푸핑만 방지합니다. |
|
|
최대 전송 단위(MTU)입니다. 기본값인 |
|
|
이 구성이 포함된 네트워크 연결 정의 CRD의 메타데이터 |
|
| 쉼표로 구분된 CIDR 및 IP 주소 목록입니다. IP 주소는 할당 가능한 IP 주소 풀에서 제거되며 Pod에 전달되지 않습니다. |
|
|
토폴로지가 |
18.3.1.1.3. 다중 네트워크 정책과의 호환성
k8s.cni.cncf.io
API 그룹의 MultiNetworkPolicy
CRD(사용자 정의 리소스 정의)에서 제공하는 다중 네트워크 정책 API는 OVN-Kubernetes 보조 네트워크와 호환됩니다. 네트워크 정책을 정의할 때 OVN-Kubernetes 보조 네트워크가 subnets
필드를 정의하는지 여부에 따라 사용할 수 있는 네트워크 정책 규칙입니다. 자세한 내용은 다음 표를 참조하십시오.
subnets 필드 지정 | 허용된 다중 네트워크 정책 선택기 |
---|---|
제공됨 |
|
없음 |
|
예를 들어 다음 다중 네트워크 정책은 subnets
필드가 blue2
라는 추가 네트워크의 추가 네트워크 CNI 구성에 정의된 경우에만 유효합니다.
Pod 선택기를 사용하는 다중 네트워크 정책의 예
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: allow-same-namespace annotations: k8s.v1.cni.cncf.io/policy-for: blue2 spec: podSelector: ingress: - from: - podSelector: {}
다음 예제에서는 OVN-Kubernetes 추가 네트워크에 항상 유효한 ipBlock
네트워크 정책 선택기를 사용합니다.
IP 블록 선택기를 사용하는 다중 네트워크 정책의 예
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: ingress-ipblock annotations: k8s.v1.cni.cncf.io/policy-for: default/flatl2net spec: podSelector: matchLabels: name: access-control policyTypes: - Ingress ingress: - from: - ipBlock: cidr: 10.200.0.0/30
18.3.1.1.4. localnet 전환 토폴로지 구성
전환된 localnet
토폴로지는 클러스터 전체 논리 스위치를 물리적 네트워크에 통해 VNC(Network Attachment Definitions)로 생성된 워크로드를 상호 연결합니다.
추가 네트워크를 OVN-Kubernetes 추가 네트워크로 사용하려면 추가 네트워크를 OVN 브리지에 매핑해야 합니다. 브리지 매핑을 사용하면 네트워크 트래픽이 물리적 네트워크에 도달할 수 있습니다. 브리지 매핑은 인터페이스 레이블이라고도 하는 물리적 네트워크 이름을 OVS(Open vSwitch)로 생성된 브릿지에 연결합니다.
nmstate.io/v1
API 그룹의 일부인 NodeNetworkConfigurationPolicy
오브젝트를 생성하여 매핑을 선언적으로 생성할 수 있습니다. 이 API는 NMState Operator에서 제공합니다. 이 API를 사용하면 node-role.kubernetes.io/worker: ''
과 같이 지정된 nodeSelector
표현식과 일치하는 노드에 브리지 매핑을 적용할 수 있습니다.
추가 네트워크를 연결할 때 기존 br-ex
브리지를 사용하거나 새 브리지를 만들 수 있습니다. 사용할 방법은 특정 네트워크 인프라에 따라 다릅니다.
-
노드에 단일 네트워크 인터페이스만 포함된 경우 기존 브릿지를 사용해야 합니다. 이 네트워크 인터페이스는 OVN-Kubernetes에서 소유하고 관리하며
br-ex
브리지에서 제거하거나 인터페이스 구성을 변경할 수 없습니다. 네트워크 인터페이스를 제거하거나 변경하면 클러스터 네트워크가 제대로 작동하지 않습니다. - 노드에 여러 네트워크 인터페이스가 포함된 경우 다른 네트워크 인터페이스를 새 브리지에 연결하고 추가 네트워크에 이를 사용할 수 있습니다. 이 방법을 사용하면 기본 클러스터 네트워크와 트래픽을 격리할 수 있습니다.
localnet1
네트워크는 다음 예제에서 br-ex
브릿지에 매핑됩니다.
브리지 공유를 위한 매핑 예
apiVersion: nmstate.io/v1 kind: NodeNetworkConfigurationPolicy metadata: name: mapping 1 spec: nodeSelector: node-role.kubernetes.io/worker: '' 2 desiredState: ovn: bridge-mappings: - localnet: localnet1 3 bridge: br-ex 4 state: present 5
- 1
- 구성 오브젝트의 이름입니다.
- 2
- 노드 네트워크 구성 정책을 적용할 노드를 지정하는 노드 선택기입니다.
- 3
- 트래픽이 OVS 브리지로 전달되는 추가 네트워크의 이름입니다. 이 추가 네트워크는 OVN-Kubernetes 추가 네트워크를 정의하는
NetworkAttachmentDefinition
CRD의spec.config.name
필드 이름과 일치해야 합니다. - 4
- 노드의 OVS 브리지 이름입니다. 이 값은
state: present
를 지정하는 경우에만 필요합니다. - 5
- 매핑의 상태입니다. 브릿지를 추가하려면 이 브릿지가
존재
하거나absent
여야 합니다. 기본값은present
입니다.
다음 예에서 localnet2
네트워크 인터페이스는 ovs-br1
브리지에 연결됩니다. 이 연결을 통해 OVN-Kubernetes 네트워크 플러그인에서 추가 네트워크로 네트워크 인터페이스를 사용할 수 있습니다.
여러 인터페이스가 있는 노드의 매핑 예
apiVersion: nmstate.io/v1 kind: NodeNetworkConfigurationPolicy metadata: name: ovs-br1-multiple-networks 1 spec: nodeSelector: node-role.kubernetes.io/worker: '' 2 desiredState: interfaces: - name: ovs-br1 3 description: |- A dedicated OVS bridge with eth1 as a port allowing all VLANs and untagged traffic type: ovs-bridge state: up bridge: allow-extra-patch-ports: true options: stp: false port: - name: eth1 4 ovn: bridge-mappings: - localnet: localnet2 5 bridge: ovs-br1 6 state: present 7
- 1
- 구성 오브젝트의 이름입니다.
- 2
- 노드 네트워크 구성 정책을 적용할 노드를 지정하는 노드 선택기입니다.
- 3
- 모든 클러스터 트래픽에 OVN-Kubernetes에서 사용하는 기본 브릿지와 별도의 새 OVS 브리지입니다.
- 4
- 이 새 OVS 브리지와 연결할 호스트 시스템의 네트워크 장치입니다.
- 5
- 트래픽이 OVS 브리지로 전달되는 추가 네트워크의 이름입니다. 이 추가 네트워크는 OVN-Kubernetes 추가 네트워크를 정의하는
NetworkAttachmentDefinition
CRD의spec.config.name
필드 이름과 일치해야 합니다. - 6
- 노드의 OVS 브리지 이름입니다. 이 값은
state: present
를 지정하는 경우에만 필요합니다. - 7
- 매핑의 상태입니다. 브릿지를 추가하려면 이 브릿지가
존재
하거나absent
여야 합니다. 기본값은present
입니다.
NMState Operator는 노드 선택기에서 지정한 모든 노드에 및 투명하게 추가 네트워크 구성을 적용하기 때문에 이 선언적 접근 방식을 사용하는 것이 좋습니다.
다음 JSON 예제에서는 localnet 보조 네트워크를 구성합니다.
{ "cniVersion": "0.3.1", "name": "ns1-localnet-network", "type": "ovn-k8s-cni-overlay", "topology":"localnet", "subnets": "202.10.130.112/28", "vlanID": 33, "mtu": 1500, "netAttachDefName": "ns1/localnet-network" "excludeSubnets": "10.100.200.0/29" }
18.3.1.1.4.1. 계층 2 전환 토폴로지 구성
전환(계층 2) 토폴로지 네트워크는 클러스터 전체 논리 스위치를 통해 워크로드를 상호 연결합니다. 이 구성은 IPv6 및 듀얼 스택 배포에 사용할 수 있습니다.
계층 2 전환 토폴로지 네트워크는 클러스터 내의 Pod 간 데이터 패킷 전송만 허용합니다.
다음 JSON 예제에서는 전환된 보조 네트워크를 구성합니다.
{ "cniVersion": "0.3.1", "name": "l2-network", "type": "ovn-k8s-cni-overlay", "topology":"layer2", "subnets": "10.100.200.0/24", "mtu": 1300, "netAttachDefName": "ns1/l2-network", "excludeSubnets": "10.100.200.0/29" }
18.3.1.1.5. 추가 네트워크에 대한 Pod 구성
k8s.v1.cni.cncf.io/networks
주석을 통해 보조 네트워크 연결을 지정해야 합니다.
다음 예제에서는 이 가이드에 표시된 각 연결 구성에 대해 하나씩 두 개의 보조 첨부 파일로 Pod를 프로비저닝합니다.
apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: l2-network name: tinypod namespace: ns1 spec: containers: - args: - pause image: k8s.gcr.io/e2e-test-images/agnhost:2.36 imagePullPolicy: IfNotPresent name: agnhost-container
18.3.1.1.6. 고정 IP 주소를 사용하여 Pod 구성
다음 예제에서는 고정 IP 주소를 사용하여 Pod를 프로비저닝합니다.
- 계층 2 연결에 대한 Pod의 보조 네트워크 연결의 IP 주소만 지정할 수 있습니다.
- pod의 고정 IP 주소를 지정하는 것은 연결 구성에 서브넷이 적용되지 않는 경우에만 가능합니다.
apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: '[ { "name": "l2-network", 1 "mac": "02:03:04:05:06:07", 2 "interface": "myiface1", 3 "ips": [ "192.0.2.20/24" ] 4 } ]' name: tinypod namespace: ns1 spec: containers: - args: - pause image: k8s.gcr.io/e2e-test-images/agnhost:2.36 imagePullPolicy: IfNotPresent name: agnhost-container
18.3.2. 다른 CNI 플러그인을 사용하여 보조 네트워크 생성
추가 네트워크의 특정 구성 필드는 다음 섹션에 설명되어 있습니다.
18.3.2.1. 브릿지 추가 네트워크에 대한 구성
다음 오브젝트는 브리지 CNI 플러그인의 구성 매개변수를 설명합니다.
필드 | 유형 | 설명 |
---|---|---|
|
|
CNI 사양 버전입니다. |
|
|
CNO 구성에 대해 이전에 제공한 |
|
|
구성할 CNI 플러그인의 이름: |
|
| IPAM CNI 플러그인의 구성 오브젝트입니다. 플러그인은 연결 정의에 대한 IP 주소 할당을 관리합니다. |
|
|
선택 사항: 사용할 가상 브리지의 이름을 지정합니다. 브릿지 인터페이스가 호스트에 없으면 생성됩니다. 기본값은 |
|
|
선택 사항: 가상 네트워크를 떠나는 트래픽에 대해 IP 마스커레이딩을 활성화하려면 |
|
|
선택 사항: 브릿지에 IP 주소를 할당하려면 |
|
|
선택 사항: 브릿지를 가상 네트워크의 기본 게이트웨이로 구성하려면 |
|
|
선택 사항: 이전에 할당된 IP 주소를 가상 브리지에 할당할 수 있도록 |
|
|
선택 사항: 가상 브리지가 수신한 가상 포트를 통해 이더넷 프레임을 다시 보낼 수 있도록 하려면 |
|
|
선택 사항: 브릿지에서 무차별 모드를 활성화하려면 |
|
| 선택 사항: VLAN(가상 LAN) 태그를 정수 값으로 지정합니다. 기본적으로 VLAN 태그는 할당되지 않습니다. |
|
|
선택 사항: 기본 vlan을 브리지에 연결된 |
|
|
선택 사항: VLAN 트렁크 태그를 할당합니다. 기본값은 |
|
| 선택 사항: 최대 전송 단위(MTU)를 지정된 값으로 설정합니다. 기본값은 커널에 의해 자동으로 설정됩니다. |
|
|
선택 사항: 컨테이너 사이드 |
|
|
선택 사항: mac 스푸핑 검사를 활성화하여 컨테이너에서 발생하는 트래픽을 인터페이스의 mac 주소로 제한합니다. 기본값은 |
VLAN 매개 변수는 veth
의 호스트에서 VLAN 태그를 구성하고 브리지 인터페이스에서 vlan_filtering
기능도 활성화합니다.
L2 네트워크에 대한 uplink를 구성하려면 다음 명령을 사용하여 uplink 인터페이스에서 VLAN을 허용해야 합니다.
$ bridge vlan add vid VLAN_ID dev DEV
18.3.2.1.1. 브릿지 CNI 플러그인 구성 예
다음 예제는 이름이 bridge-net
인 추가 네트워크를 구성합니다.
{ "cniVersion": "0.3.1", "name": "bridge-net", "type": "bridge", "isGateway": true, "vlan": 2, "ipam": { "type": "dhcp" } }
18.3.2.2. 호스트 장치 추가 네트워크에 대한 구성
device ,hwaddr
,kernelpath
또는 pciBusID
매개변수 중 하나만 설정하여 네트워크 장치를
지정합니다.
다음 오브젝트는 호스트 장치 CNI 플러그인의 구성 매개변수를 설명합니다.
필드 | 유형 | 설명 |
---|---|---|
|
|
CNI 사양 버전입니다. |
|
|
CNO 구성에 대해 이전에 제공한 |
|
|
구성할 CNI 플러그인의 이름: |
|
|
선택사항: 장치 이름(예: |
|
| 선택사항: 장치 하드웨어 MAC 주소입니다. |
|
|
선택 사항: Linux 커널 장치 경로(예: |
|
|
선택 사항: 네트워크 장치의 PCI 주소(예: |
18.3.2.2.1. 호스트 장치 구성 예
다음 예제는 이름이 hostdev-net
인 추가 네트워크를 구성합니다.
{ "cniVersion": "0.3.1", "name": "hostdev-net", "type": "host-device", "device": "eth1" }
18.3.2.3. VLAN 추가 네트워크의 구성
다음 오브젝트는 VLAN, vlan
, CNI 플러그인의 구성 매개변수를 설명합니다.
필드 | 유형 | 설명 |
---|---|---|
|
|
CNI 사양 버전입니다. |
|
|
CNO 구성에 대해 이전에 제공한 |
|
|
구성할 CNI 플러그인의 이름: |
|
|
네트워크 연결과 연결할 이더넷 인터페이스입니다. |
|
|
|
|
| IPAM CNI 플러그인의 구성 오브젝트입니다. 플러그인은 연결 정의에 대한 IP 주소 할당을 관리합니다. |
|
| 선택 사항: 최대 전송 단위(MTU)를 지정된 값으로 설정합니다. 기본값은 커널에 의해 자동으로 설정됩니다. |
|
| 선택 사항: 반환할 DNS 정보입니다. 예를 들어 우선순위가 지정된 DNS 이름 서버 목록입니다. |
|
|
선택 사항: |
CNI 플러그인은 동일한 마스터
인터페이스에서 동일한 vlanId
를 사용하여 여러 vlan
하위 인터페이스를 생성할 수 없기 때문에 vlan
구성이 포함된 NetworkAttachmentDefinition
CRD(사용자 정의 리소스 정의)는 노드의 단일 Pod에서만 사용할 수 있습니다.
18.3.2.3.1. VLAN 구성 예
다음 예제에서는
이라는 추가 네트워크가 포함된 vlan 구성을 보여줍니다.
vlan
-net
{ "name": "vlan-net", "cniVersion": "0.3.1", "type": "vlan", "master": "eth0", "mtu": 1500, "vlanId": 5, "linkInContainer": false, "ipam": { "type": "host-local", "subnet": "10.1.1.0/24" }, "dns": { "nameservers": [ "10.1.1.1", "8.8.8.8" ] } }
18.3.2.4. IPVLAN 추가 네트워크에 대한 구성
다음 오브젝트는 IPVLAN, ipvlan
, CNI 플러그인의 구성 매개변수를 설명합니다.
필드 | 유형 | 설명 |
---|---|---|
|
|
CNI 사양 버전입니다. |
|
|
CNO 구성에 대해 이전에 제공한 |
|
|
구성할 CNI 플러그인의 이름: |
|
| IPAM CNI 플러그인의 구성 오브젝트입니다. 플러그인은 연결 정의에 대한 IP 주소 할당을 관리합니다. 플러그인이 연결되어 있지 않으면 이 작업이 필요합니다. |
|
|
선택사항: 가상 네트워크의 작동 모드입니다. 값은 |
|
|
선택 사항: 네트워크 연결과 연결할 이더넷 인터페이스입니다. |
|
| 선택 사항: 최대 전송 단위(MTU)를 지정된 값으로 설정합니다. 기본값은 커널에 의해 자동으로 설정됩니다. |
|
|
선택 사항: |
-
ipvlan
오브젝트에서는 가상 인터페이스가마스터
인터페이스와 통신할 수 없습니다. 따라서 컨테이너는ipvlan
인터페이스를 사용하여 호스트에 연결할 수 없습니다. 컨테이너가PTP
(Precision Time Protocol)를 지원하는 네트워크와 같이 호스트에 대한 연결을 제공하는 네트워크에 참여하고 있는지 확인합니다. -
단일
마스터
인터페이스는macvlan
및ipvlan
을 둘 다 사용하도록 동시에 구성할 수 없습니다. -
인터페이스와 무관할 수 없는 IP 할당 체계의 경우
ipvlan
플러그인은 이 논리를 처리하는 이전 플러그인과 연결할 수 있습니다.마스터
를 생략한 경우 이전 결과에 슬레이브를 부여하려면ipvlan
플러그인에 대한 단일 인터페이스 이름이 포함되어야 합니다.ipam
을 생략하면 이전 결과가ipvlan
인터페이스를 구성하는 데 사용됩니다.
18.3.2.4.1. IPVLAN CNI 플러그인 구성 예
다음 예제는 이름이 ipvlan-net
인 추가 네트워크를 구성합니다.
{ "cniVersion": "0.3.1", "name": "ipvlan-net", "type": "ipvlan", "master": "eth1", "linkInContainer": false, "mode": "l3", "ipam": { "type": "static", "addresses": [ { "address": "192.168.10.10/24" } ] } }
18.3.2.5. macvlan 추가 네트워크에 대한 구성
다음 오브젝트는 MACVLAN CNI 플러그인의 구성 매개변수를 설명합니다.
필드 | 유형 | 설명 |
---|---|---|
|
|
CNI 사양 버전입니다. |
|
|
CNO 구성에 대해 이전에 제공한 |
|
|
구성할 CNI 플러그인의 이름: |
|
| IPAM CNI 플러그인의 구성 오브젝트입니다. 플러그인은 연결 정의에 대한 IP 주소 할당을 관리합니다. |
|
|
선택 사항: 가상 네트워크에 대한 트래픽 가시성을 구성합니다. |
|
| 선택 사항: 새로 생성된 macvlan 인터페이스와 연결할 호스트 네트워크 인터페이스입니다. 값을 지정하지 않으면 기본 경로 인터페이스가 사용됩니다. |
|
| 선택 사항: 지정된 값으로 최대 전송 단위(MTU)입니다. 기본값은 커널에 의해 자동으로 설정됩니다. |
|
|
선택 사항: |
플러그인 구성에 대한 마스터
키를 지정하는 경우 기본 네트워크 플러그인과 연결된 것과 다른 물리적 네트워크 인터페이스를 사용하여 가능한 충돌을 방지합니다.
18.3.2.5.1. MACVLAN CNI 플러그인 구성 예
다음 예제는 이름이 macvlan-net
인 추가 네트워크를 구성합니다.
{ "cniVersion": "0.3.1", "name": "macvlan-net", "type": "macvlan", "master": "eth1", "linkInContainer": false, "mode": "bridge", "ipam": { "type": "dhcp" } }
18.3.2.6. Cryostat 추가 네트워크에 대한 구성
다음 오브젝트는 Cryostat CNI 플러그인의 구성 매개변수를 설명합니다.
필드 | 유형 | 설명 |
---|---|---|
|
|
CNI 사양 버전입니다. |
|
|
CNO 구성에 대해 이전에 제공한 |
|
|
구성할 CNI 플러그인의 이름입니다. |
|
| 선택 사항: 인터페이스에 지정된 MAC 주소를 요청합니다. |
|
| 선택 사항: 최대 전송 단위(MTU)를 지정된 값으로 설정합니다. 기본값은 커널에 의해 자동으로 설정됩니다. |
|
| 선택 사항: 탭 장치와 연결할 SELinux 컨텍스트입니다. 참고
OpenShift Container Platform에는 |
|
|
선택 사항: 다중 큐를 활성화하려면 |
|
| 선택 사항: 탭 장치를 소유한 사용자입니다. |
|
| 선택 사항: 탭 장치를 소유한 그룹입니다. |
|
| 선택 사항: 탭 장치를 기존 브리지의 포트로 설정합니다. |
18.3.2.6.1. 탭 구성 예
다음 예제는 이름이 mynet
인 추가 네트워크를 구성합니다.
{ "name": "mynet", "cniVersion": "0.3.1", "type": "tap", "mac": "00:11:22:33:44:55", "mtu": 1500, "selinuxcontext": "system_u:system_r:container_t:s0", "multiQueue": true, "owner": 0, "group": 0 "bridge": "br1" }
18.3.2.6.2. Cryostat CNI 플러그인에 대한 SELinux 부울 설정
container_t
SELinux 컨텍스트를 사용하여 탭 장치를 생성하려면 MCO(Machine Config Operator)를 사용하여 호스트에서 container_use_devices
부울을 활성화합니다.
사전 요구 사항
-
OpenShift CLI(
oc
)가 설치되어 있습니다.
프로세스
다음 세부 정보를 사용하여
setsebool-container-use-devices.yaml
과 같은 새 YAML 파일을 생성합니다.apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker name: 99-worker-setsebool spec: config: ignition: version: 3.2.0 systemd: units: - enabled: true name: setsebool.service contents: | [Unit] Description=Set SELinux boolean for the TAP CNI plugin Before=kubelet.service [Service] Type=oneshot ExecStart=/usr/sbin/setsebool container_use_devices=on RemainAfterExit=true [Install] WantedBy=multi-user.target graphical.target
다음 명령을 실행하여 새
MachineConfig
오브젝트를 만듭니다.$ oc apply -f setsebool-container-use-devices.yaml
참고MachineConfig
오브젝트에 변경 사항을 적용하면 변경 사항이 적용된 후 영향을 받는 모든 노드가 정상적으로 재부팅됩니다. 이 업데이트를 적용하는 데 시간이 다소 걸릴 수 있습니다.다음 명령을 실행하여 변경 사항이 적용되었는지 확인합니다.
$ oc get machineconfigpools
예상 출력
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE master rendered-master-e5e0c8e8be9194e7c5a882e047379cfa True False False 3 3 3 0 7d2h worker rendered-worker-d6c9ca107fba6cd76cdcbfcedcafa0f2 True False False 3 3 3 0 7d
참고모든 노드는 업데이트 및 준비 상태에 있어야 합니다.
추가 리소스
- 노드에서 SELinux 부울 활성화에 대한 자세한 내용은 SELinux 부울 설정을 참조하십시오.
18.3.3. 추가 네트워크에 pod 연결
클러스터 사용자는 pod를 추가 네트워크에 연결할 수 있습니다.
18.3.3.1. 추가 네트워크에 Pod 추가
추가 네트워크에 Pod를 추가할 수 있습니다. Pod는 기본 네트워크를 통해 정상적인 클러스터 관련 네트워크 트래픽을 계속 전송합니다.
Pod가 생성되면 추가 네트워크가 연결됩니다. 그러나 Pod가 이미 있는 경우에는 추가 네트워크를 연결할 수 없습니다.
Pod는 추가 네트워크와 동일한 네임스페이스에 있어야 합니다.
사전 요구 사항
-
OpenShift CLI(
oc
)를 설치합니다. - 클러스터에 로그인합니다.
프로세스
Pod
오브젝트에 주석을 추가합니다. 다음 주석 형식 중 하나만 사용할 수 있습니다.사용자 정의 없이 추가 네트워크를 연결하려면 다음 형식으로 주석을 추가합니다.
<network>
를 Pod와 연결할 추가 네트워크의 이름으로 변경합니다.metadata: annotations: k8s.v1.cni.cncf.io/networks: <network>[,<network>,...] 1
- 1
- 둘 이상의 추가 네트워크를 지정하려면 각 네트워크를 쉼표로 구분합니다. 쉼표 사이에 공백을 포함하지 마십시오. 동일한 추가 네트워크를 여러 번 지정하면 Pod에 해당 네트워크에 대한 인터페이스가 여러 개 연결됩니다.
사용자 정의된 추가 네트워크를 연결하려면 다음 형식으로 주석을 추가합니다.
metadata: annotations: k8s.v1.cni.cncf.io/networks: |- [ { "name": "<network>", 1 "namespace": "<namespace>", 2 "default-route": ["<default-route>"] 3 } ]
Pod를 생성하려면 다음 명령을 입력합니다.
<name>
을 Pod 이름으로 교체합니다.$ oc create -f <name>.yaml
선택사항:
Pod
CR에 주석이 있는지 확인하려면 다음 명령을 입력하고<name>
을 Pod 이름으로 교체합니다.$ oc get pod <name> -o yaml
다음 예에서
example-pod
Pod는net1
추가 네트워크에 연결되어 있습니다.$ oc get pod example-pod -o yaml apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: macvlan-bridge k8s.v1.cni.cncf.io/network-status: |- 1 [{ "name": "ovn-kubernetes", "interface": "eth0", "ips": [ "10.128.2.14" ], "default": true, "dns": {} },{ "name": "macvlan-bridge", "interface": "net1", "ips": [ "20.2.2.100" ], "mac": "22:2f:60:a5:f8:00", "dns": {} }] name: example-pod namespace: default spec: ... status: ...
- 1
k8s.v1.cni.cncf.io/network-status
매개변수는 JSON 오브젝트 배열입니다. 각 오브젝트는 Pod에 연결된 추가 네트워크의 상태를 설명합니다. 주석 값은 일반 텍스트 값으로 저장됩니다.
18.3.3.1.1. Pod별 주소 지정 및 라우팅 옵션 지정
추가 네트워크에 Pod를 연결할 때 특정 Pod에서 해당 네트워크에 대한 추가 속성을 지정할 수 있습니다. 이를 통해 라우팅의 일부 측면을 변경하고 고정 IP 주소 및 MAC 주소를 지정할 수 있습니다. 이를 위해 JSON 형식의 주석을 사용할 수 있습니다.
사전 요구 사항
- Pod는 추가 네트워크와 동일한 네임스페이스에 있어야 합니다.
-
OpenShift CLI(
oc
)를 설치합니다. - 클러스터에 로그인해야 합니다.
프로세스
주소 지정 및/또는 라우팅 옵션을 지정하는 동안 추가 네트워크에 Pod를 추가하려면 다음 단계를 완료하십시오.
Pod
리소스 정의를 편집합니다. 기존Pod
리소스를 편집하는 경우 다음 명령을 실행하여 기본 편집기에서 정의를 편집합니다.<name>
을 편집할Pod
리소스의 이름으로 교체합니다.$ oc edit pod <name>
Pod
리소스 정의에서k8s.v1.cni.cncf.io/networks
매개변수를 Podmetadata
매핑에 추가합니다.k8s.v1.cni.cncf.io/networks
는 추가 특성을 지정하는 것 외에도NetworkAttachmentDefinition
Custom Resource(CR) 이름을 참조하는 오브젝트 목록의 JSON 문자열을 허용합니다.metadata: annotations: k8s.v1.cni.cncf.io/networks: '[<network>[,<network>,...]]' 1
- 1
- 다음 예제와 같이
<network>
를 JSON 오브젝트로 변경합니다. 작은 따옴표를 사용해야 합니다.
다음 예에서 주석은
default-route
매개변수를 사용하여 기본 경로로 지정될 네트워크 연결을 지정합니다.apiVersion: v1 kind: Pod metadata: name: example-pod annotations: k8s.v1.cni.cncf.io/networks: '[ { "name": "net1" }, { "name": "net2", 1 "default-route": ["192.0.2.1"] 2 }]' spec: containers: - name: example-pod command: ["/bin/bash", "-c", "sleep 2000000000000"] image: centos/tools
기본 경로는 다른 경로에 지정되지 않은 모든 트래픽이 게이트웨이로 라우팅되도록 합니다.
OpenShift Container Platform의 기본 네트워크 인터페이스 이외의 인터페이스로 기본 경로를 설정하면 Pod 사이에서 트래픽이 라우팅될 것으로 예상되는 트래픽이 다른 인터페이스를 통해 라우팅될 수 있습니다.
Pod의 라우팅 속성을 확인하려면 oc
명령을 사용하여 Pod에서 ip
명령을 실행하십시오.
$ oc exec -it <pod_name> -- ip route
JSON 형식의 오브젝트 목록에 default-route
키가 있는 경우 Pod의 k8s.v1.cni.cncf.io/network-status
를 참조하여 어떤 추가 네트워크가 기본 경로를 할당했는지 확인할 수도 있습니다.
Pod의 고정 IP 주소 또는 MAC 주소를 설정하려면 JSON 형식의 주석을 사용하면 됩니다. 이를 위해서는 이러한 기능을 특별하게 허용하는 네트워크를 생성해야 합니다. 이는 다음과 같이 CNO의 rawCNIConfig에서 지정할 수 있습니다.
다음 명령을 실행하여 CNO CR을 편집합니다.
$ oc edit networks.operator.openshift.io cluster
다음 YAML은 CNO의 구성 매개변수를 설명합니다.
CNO(Cluster Network Operator) YAML 구성
name: <name> 1 namespace: <namespace> 2 rawCNIConfig: '{ 3 ... }' type: Raw
다음 오브젝트는 macvlan CNI 플러그인을 사용하여 고정 MAC 주소 및 IP 주소를 사용하기 위한 구성 매개변수를 설명합니다.
고정 IP 및 MAC 주소를 사용하는 macvlan CNI 플러그인 JSON 구성 오브젝트
{ "cniVersion": "0.3.1", "name": "<name>", 1 "plugins": [{ 2 "type": "macvlan", "capabilities": { "ips": true }, 3 "master": "eth0", 4 "mode": "bridge", "ipam": { "type": "static" } }, { "capabilities": { "mac": true }, 5 "type": "tuning" }] }
그런 다음 위의 네트워크 연결을 키와 함께 JSON 형식 주석에서 참조하여 지정된 Pod에 할당할 고정 IP 및 MAC 주소를 지정할 수 있습니다.
다음을 사용하여 Pod를 편집합니다.
$ oc edit pod <name>
고정 IP 및 MAC 주소를 사용하는 macvlan CNI 플러그인 JSON 구성 오브젝트
apiVersion: v1 kind: Pod metadata: name: example-pod annotations: k8s.v1.cni.cncf.io/networks: '[ { "name": "<name>", 1 "ips": [ "192.0.2.205/24" ], 2 "mac": "CA:FE:C0:FF:EE:00" 3 } ]'
고정 IP 주소와 MAC 주소를 동시에 사용할 필요는 없으며 개별적으로 또는 함께 사용할 수 있습니다.
추가 네트워크가 있는 Pod의 IP 주소 및 MAC 속성을 확인하려면 oc
명령을 사용하여 Pod에서 ip 명령을 실행합니다.
$ oc exec -it <pod_name> -- ip a
18.3.4. 다중 네트워크 정책 구성
관리자는 MultiNetworkPolicy
API를 사용하여 보조 네트워크에 연결된 Pod의 트래픽을 관리하는 여러 네트워크 정책을 생성할 수 있습니다. 예를 들어 특정 포트, IP/범위 또는 라벨에 따라 트래픽을 허용하거나 거부하는 정책을 생성할 수 있습니다.
다중 네트워크 정책을 사용하여 클러스터의 보조 네트워크에서 트래픽을 관리할 수 있습니다. 클러스터의 기본 네트워크 또는 사용자 정의 네트워크의 기본 네트워크를 관리할 수 없습니다.
클러스터 관리자는 다음 네트워크 유형 중 하나에 대해 다중 네트워크 정책을 구성할 수 있습니다.
- SR-IOV(Single-Root I/O Virtualization)
- MAC 가상 로컬 영역 네트워크(MacVLAN)
- IP 가상 로컬 영역 네트워크(IPVLAN)
- SR-IOV를 통한 본딩 컨테이너 네트워크 인터페이스(CNI)
- OVN-Kubernetes 추가 네트워크
SR-IOV 추가 네트워크에 대한 다중 네트워크 정책 구성 지원은 커널 NIC(네트워크 인터페이스 컨트롤러)에서만 지원됩니다. DPDK(Data Plane Development Kit) 애플리케이션에는 SR-IOV가 지원되지 않습니다.
18.3.4.1. 다중 네트워크 정책과 네트워크 정책의 차이점
MultiNetworkPolicy
API는 NetworkPolicy
API를 구현하지만 다음과 같은 몇 가지 중요한 차이점이 있습니다.
MultiNetworkPolicy
API를 사용해야 합니다.apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy
-
CLI를 사용하여 다중 네트워크 정책과 상호 작용할 때
multi-networkpolicy
리소스 이름을 사용해야 합니다. 예를 들어oc get multi-networkpolicy <name>
명령을 사용하여 다중 네트워크 정책 오브젝트를 볼 수 있습니다. 여기서<name>
은 다중 네트워크 정책의 이름입니다. macvlan 또는 SR-IOV 추가 네트워크를 정의하는 네트워크 연결 정의의 이름으로 주석을 지정해야 합니다.
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: annotations: k8s.v1.cni.cncf.io/policy-for: <network_name>
다음과 같습니다.
<network_name>
- 네트워크 연결 정의의 이름을 지정합니다.
18.3.4.2. 클러스터의 다중 네트워크 정책 활성화
클러스터 관리자는 클러스터에서 다중 네트워크 정책 지원을 활성화할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다.
프로세스
다음 YAML을 사용하여
multinetwork-enable-patch.yaml
파일을 생성합니다.apiVersion: operator.openshift.io/v1 kind: Network metadata: name: cluster spec: useMultiNetworkPolicy: true
다중 네트워크 정책을 활성화하도록 클러스터를 구성합니다.
$ oc patch network.operator.openshift.io cluster --type=merge --patch-file=multinetwork-enable-patch.yaml
출력 예
network.operator.openshift.io/cluster patched
18.3.4.3. IPv6 네트워크에서 다중 네트워크 정책 지원
ICMPv6 NDP( Neighbor Discovery Protocol)는 장치가 주변 노드에 대한 정보를 검색하고 유지할 수 있도록 하는 메시지 및 프로세스 집합입니다. NDP는 IPv6 네트워크에서 중요한 역할을 하며 동일한 링크의 장치 간 상호 작용을 지원합니다.
CNO(Cluster Network Operator)는 useMultiNetworkPolicy
매개변수가 true
로 설정된 경우 다중 네트워크 정책의 iptables 구현을 배포합니다.
IPv6 네트워크에서 다중 네트워크 정책을 지원하기 위해 Cluster Network Operator는 다중 네트워크 정책의 영향을 받는 모든 Pod에 다음 규칙 세트를 배포합니다.
다중 네트워크 정책 사용자 정의 규칙
kind: ConfigMap apiVersion: v1 metadata: name: multi-networkpolicy-custom-rules namespace: openshift-multus data: custom-v6-rules.txt: | # accept NDP -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT 1 -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT 2 # accept RA/RS -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT 3 -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT 4
사전 정의된 규칙은 편집할 수 없습니다.
이러한 규칙은 IPv6 환경의 주소 확인 및 라우터 통신을 포함하여 올바른 네트워크 기능을 위해 필수 ICMPv6 트래픽을 집합적으로 활성화합니다. 이러한 규칙과 트래픽을 거부하는 다중 네트워크 정책에서는 애플리케이션에 연결 문제가 발생하지 않습니다.
18.3.4.4. 다중 네트워크 정책 작업
클러스터 관리자는 다중 네트워크 정책을 생성, 편집, 보기 및 삭제할 수 있습니다.
18.3.4.4.1. 사전 요구 사항
- 클러스터에 대한 다중 네트워크 정책 지원을 활성화했습니다.
18.3.4.4.2. CLI를 사용하여 다중 네트워크 정책 생성
클러스터의 네임스페이스에서 허용된 수신 또는 송신 네트워크 트래픽을 설명하는 세분화된 규칙을 정의하기 위해 다중 네트워크 정책을 생성할 수 있습니다.
사전 요구 사항
-
클러스터는
mode:
로 설정된 OVN-Kubernetes 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다.NetworkPolicy
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.
프로세스
다음과 같이 정책 규칙을 생성합니다.
<policy_name>.yaml
파일을 생성합니다.$ touch <policy_name>.yaml
다음과 같습니다.
<policy_name>
- 다중 네트워크 정책 파일 이름을 지정합니다.
방금 만든 파일에서 다음 예와 같이 다중 네트워크 정책을 정의합니다.
모든 네임스페이스의 모든 Pod에서 수신 거부
이는 다른 네트워크 정책 구성에서 허용하는 포드 간 트래픽 이외의 모든 교차 포드 네트워킹을 차단하는 기본 정책입니다.
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: deny-by-default annotations: k8s.v1.cni.cncf.io/policy-for:<namespace_name>/<network_name> spec: podSelector: {} policyTypes: - Ingress ingress: []
다음과 같습니다.
<network_name>
- 네트워크 연결 정의의 이름을 지정합니다.
동일한 네임 스페이스에 있는 모든 Pod의 수신 허용
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: allow-same-namespace annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: ingress: - from: - podSelector: {}
다음과 같습니다.
<network_name>
- 네트워크 연결 정의의 이름을 지정합니다.
특정 네임스페이스에서 하나의 Pod로 수신 트래픽 허용
이 정책을 사용하면
namespace-y
에서 실행되는 Pod에서pod-a
레이블이 지정된 Pod로의 트래픽을 허용합니다.apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: allow-traffic-pod annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: matchLabels: pod: pod-a policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: namespace-y
다음과 같습니다.
<network_name>
- 네트워크 연결 정의의 이름을 지정합니다.
서비스로 트래픽 제한
이 정책을 적용하면
app=bookstore
및role=api
레이블이 모두 있는 모든 Pod는app=bookstore
레이블이 있는 Pod에서만 액세스할 수 있습니다. 이 예에서 애플리케이션은app=bookstore
및role=api
레이블이 있는 REST API 서버일 수 있습니다.이 예제에서는 다음 사용 사례를 해결합니다.
- 서비스에 대한 트래픽을 사용해야 하는 다른 마이크로 서비스로만 제한합니다.
애플리케이션을 사용하는 애플리케이션만 허용하도록 데이터베이스에 대한 연결을 제한합니다.
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: api-allow annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: matchLabels: app: bookstore role: api ingress: - from: - podSelector: matchLabels: app: bookstore
다음과 같습니다.
<network_name>
- 네트워크 연결 정의의 이름을 지정합니다.
다음 명령을 실행하여 다중 네트워크 정책 오브젝트를 생성합니다.
$ oc apply -f <policy_name>.yaml -n <namespace>
다음과 같습니다.
<policy_name>
- 다중 네트워크 정책 파일 이름을 지정합니다.
<namespace>
- 선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
출력 예
multinetworkpolicy.k8s.cni.cncf.io/deny-by-default created
cluster-admin
권한을 사용하여 웹 콘솔에 로그인하는 경우 클러스터의 모든 네임스페이스에서 직접 또는 웹 콘솔의 양식에서 네트워크 정책을 생성할 수 있습니다.
18.3.4.4.3. 다중 네트워크 정책 편집
네임스페이스에서 다중 네트워크 정책을 편집할 수 있습니다.
사전 요구 사항
-
클러스터는
mode:
로 설정된 OVN-Kubernetes 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다.NetworkPolicy
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.
프로세스
선택 사항: 네임스페이스의 다중 네트워크 정책 오브젝트를 나열하려면 다음 명령을 입력합니다.
$ oc get multi-networkpolicy
다음과 같습니다.
<namespace>
- 선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
다중 네트워크 정책 오브젝트를 편집합니다.
다중 네트워크 정책 정의를 파일에 저장한 경우 파일을 편집하고 필요한 사항을 변경한 후 다음 명령을 입력합니다.
$ oc apply -n <namespace> -f <policy_file>.yaml
다음과 같습니다.
<namespace>
- 선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
<policy_file>
- 네트워크 정책이 포함된 파일의 이름을 지정합니다.
다중 네트워크 정책 오브젝트를 직접 업데이트해야 하는 경우 다음 명령을 입력합니다.
$ oc edit multi-networkpolicy <policy_name> -n <namespace>
다음과 같습니다.
<policy_name>
- 네트워크 정책의 이름을 지정합니다.
<namespace>
- 선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
다중 네트워크 정책 오브젝트가 업데이트되었는지 확인합니다.
$ oc describe multi-networkpolicy <policy_name> -n <namespace>
다음과 같습니다.
<policy_name>
- 다중 네트워크 정책의 이름을 지정합니다.
<namespace>
- 선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
cluster-admin
권한을 사용하여 웹 콘솔에 로그인하는 경우 Actions 메뉴를 통해 클러스터의 모든 네임스페이스에서 직접 또는 웹 콘솔의 정책에서 네트워크 정책을 편집할 수 있습니다.
18.3.4.4.4. CLI를 사용하여 다중 네트워크 정책 보기
네임스페이스에서 다중 네트워크 정책을 검사할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.
프로세스
네임스페이스의 다중 네트워크 정책을 나열합니다.
네임스페이스에 정의된 다중 네트워크 정책 오브젝트를 보려면 다음 명령을 입력합니다.
$ oc get multi-networkpolicy
선택 사항: 특정 다중 네트워크 정책을 검사하려면 다음 명령을 입력합니다.
$ oc describe multi-networkpolicy <policy_name> -n <namespace>
다음과 같습니다.
<policy_name>
- 검사할 다중 네트워크 정책의 이름을 지정합니다.
<namespace>
- 선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
cluster-admin
권한을 사용하여 웹 콘솔에 로그인하는 경우 YAML 또는 웹 콘솔의 양식에서 클러스터의 모든 네임스페이스에서 네트워크 정책을 직접 볼 수 있습니다.
18.3.4.4.5. CLI를 사용하여 다중 네트워크 정책 삭제
네임스페이스에서 다중 네트워크 정책을 삭제할 수 있습니다.
사전 요구 사항
-
클러스터는
mode:
로 설정된 OVN-Kubernetes 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다.NetworkPolicy
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.
프로세스
다중 네트워크 정책 오브젝트를 삭제하려면 다음 명령을 입력합니다.
$ oc delete multi-networkpolicy <policy_name> -n <namespace>
다음과 같습니다.
<policy_name>
- 다중 네트워크 정책의 이름을 지정합니다.
<namespace>
- 선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
출력 예
multinetworkpolicy.k8s.cni.cncf.io/default-deny deleted
cluster-admin
권한을 사용하여 웹 콘솔에 로그인하는 경우, YAML에서 직접 또는 Actions 메뉴를 통해 웹 콘솔의 정책에서 클러스터의 모든 네임스페이스에서 네트워크 정책을 삭제할 수 있습니다.
18.3.4.4.6. 기본 거부 모든 다중 네트워크 정책 생성
이 정책은 배포된 다른 네트워크 정책의 구성에서 허용하는 네트워크 트래픽 이외의 모든 포드 간 네트워킹을 차단하는 기본 정책입니다. 이 절차에서는 기본 거부
정책을 적용합니다.
cluster-admin
역할을 가진 사용자로 로그인하면 클러스터의 모든 네임스페이스에 네트워크 정책을 생성할 수 있습니다.
사전 요구 사항
-
클러스터는
mode:
로 설정된 OVN-Kubernetes 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다.NetworkPolicy
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.
프로세스
모든 네임스페이스의 모든 포드의 수신을
거부하도록 기본
거부 정책을 정의하는 다음 YAML을 생성합니다. YAML을deny-by-default.yaml
파일에 저장합니다.apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: deny-by-default namespace: default 1 annotations: k8s.v1.cni.cncf.io/policy-for: <namespace_name>/<network_name> 2 spec: podSelector: {} 3 policyTypes: 4 - Ingress 5 ingress: [] 6
- 1
namespace: default
는 이 정책을기본
네임스페이스에 배포합니다.- 2
network_name
: 네트워크 연결 정의의 이름을 지정합니다.- 3
podSelector:
가 비어 있습니다. 즉, 모든 Pod와 일치합니다. 따라서 정책은 default 네임스페이스의 모든 Pod에 적용됩니다.- 4
policyTypes:
NetworkPolicy
와 관련된 규칙 유형 목록입니다.- 5
Ingress
로만policyType
으로 지정합니다.- 6
- 지정된
수신
규칙이 없습니다. 이로 인해 들어오는 트래픽이 모든 Pod로 삭제됩니다.
다음 명령을 입력하여 정책을 적용합니다.
$ oc apply -f deny-by-default.yaml
출력 예
multinetworkpolicy.k8s.cni.cncf.io/deny-by-default created
18.3.4.4.7. 외부 클라이언트의 트래픽을 허용하는 다중 네트워크 정책 생성
기본 거부
정책을 배치하면 app=web
레이블이 있는 외부 클라이언트에서 Pod로의 트래픽을 허용하는 정책을 구성할 수 있습니다.
cluster-admin
역할을 가진 사용자로 로그인하면 클러스터의 모든 네임스페이스에 네트워크 정책을 생성할 수 있습니다.
다음 절차에 따라 공용 인터넷의 외부 서비스를 직접 또는 Load Balancer를 사용하여 Pod에 액세스하는 방식으로 허용하는 정책을 구성합니다. app=web
레이블이 있는 Pod에만 트래픽이 허용됩니다.
사전 요구 사항
-
클러스터는
mode:
로 설정된 OVN-Kubernetes 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다.NetworkPolicy
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.
프로세스
직접 또는 로드 밸런서를 사용하여 pod에 액세스하여 공용 인터넷의 트래픽을 허용하는 정책을 생성합니다. YAML을
web-allow-external.yaml
파일에 저장합니다.apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: web-allow-external namespace: default annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: policyTypes: - Ingress podSelector: matchLabels: app: web ingress: - {}
다음 명령을 입력하여 정책을 적용합니다.
$ oc apply -f web-allow-external.yaml
출력 예
multinetworkpolicy.k8s.cni.cncf.io/web-allow-external created
이 정책은 다음 다이어그램에 설명된 대로 외부 트래픽을 포함하여 모든 리소스의 트래픽을 허용합니다.
18.3.4.4.8. 모든 네임스페이스에서 애플리케이션으로의 트래픽을 허용하는 다중 네트워크 정책 생성
cluster-admin
역할을 가진 사용자로 로그인하면 클러스터의 모든 네임스페이스에 네트워크 정책을 생성할 수 있습니다.
다음 절차에 따라 모든 네임스페이스의 모든 Pod에서 특정 애플리케이션으로의 트래픽을 허용하는 정책을 구성합니다.
사전 요구 사항
-
클러스터는
mode:
로 설정된 OVN-Kubernetes 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다.NetworkPolicy
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.
프로세스
모든 네임스페이스의 모든 Pod에서 특정 애플리케이션으로의 트래픽을 허용하는 정책을 생성합니다. YAML을
web-allow-all-namespaces.yaml
파일에 저장합니다.apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: web-allow-all-namespaces namespace: default annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: matchLabels: app: web 1 policyTypes: - Ingress ingress: - from: - namespaceSelector: {} 2
참고기본적으로
namespaceSelector
를 지정하는 것을 생략하면 네임스페이스를 선택하지 않으므로 정책에서 네트워크 정책이 배포된 네임스페이스의 트래픽만 허용합니다.다음 명령을 입력하여 정책을 적용합니다.
$ oc apply -f web-allow-all-namespaces.yaml
출력 예
multinetworkpolicy.k8s.cni.cncf.io/web-allow-all-namespaces created
검증
다음 명령을 입력하여
기본
네임스페이스에서 웹 서비스를 시작합니다.$ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
다음 명령을 실행하여
보조
네임스페이스에alpine
이미지를 배포하고 쉘을 시작합니다.$ oc run test-$RANDOM --namespace=secondary --rm -i -t --image=alpine -- sh
쉘에서 다음 명령을 실행하고 요청이 허용되는지 확인합니다.
# wget -qO- --timeout=2 http://web.default
예상 출력
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
18.3.4.4.9. 네임스페이스에서 애플리케이션으로의 트래픽을 허용하는 다중 네트워크 정책 생성
cluster-admin
역할을 가진 사용자로 로그인하면 클러스터의 모든 네임스페이스에 네트워크 정책을 생성할 수 있습니다.
다음 절차에 따라 특정 네임스페이스의 app=web
레이블을 사용하여 Pod로의 트래픽을 허용하는 정책을 구성합니다. 다음을 위해 이 작업을 수행할 수 있습니다.
- 프로덕션 데이터베이스가 프로덕션 워크로드가 배포된 네임스페이스로만 트래픽을 제한합니다.
- 특정 네임스페이스에 배포된 모니터링 툴을 활성화하여 현재 네임스페이스에서 메트릭을 스크랩할 수 있습니다.
사전 요구 사항
-
클러스터는
mode:
로 설정된 OVN-Kubernetes 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다.NetworkPolicy
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.
프로세스
purpose=production
레이블이 있는 특정 네임스페이스의 모든 Pod의 트래픽을 허용하는 정책을 생성합니다. YAML을web-allow-prod.yaml
파일에 저장합니다.apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: web-allow-prod namespace: default annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: matchLabels: app: web 1 policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: purpose: production 2
다음 명령을 입력하여 정책을 적용합니다.
$ oc apply -f web-allow-prod.yaml
출력 예
multinetworkpolicy.k8s.cni.cncf.io/web-allow-prod created
검증
다음 명령을 입력하여
기본
네임스페이스에서 웹 서비스를 시작합니다.$ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
다음 명령을 실행하여
prod
네임스페이스를 생성합니다.$ oc create namespace prod
다음 명령을 실행하여
prod
네임스페이스에 레이블을 지정합니다.$ oc label namespace/prod purpose=production
다음 명령을 실행하여
dev
네임스페이스를 생성합니다.$ oc create namespace dev
다음 명령을 실행하여
dev
네임스페이스에 레이블을 지정합니다.$ oc label namespace/dev purpose=testing
다음 명령을 실행하여
dev
네임스페이스에alpine
이미지를 배포하고 쉘을 시작합니다.$ oc run test-$RANDOM --namespace=dev --rm -i -t --image=alpine -- sh
쉘에서 다음 명령을 실행하고 요청이 차단되었는지 확인합니다.
# wget -qO- --timeout=2 http://web.default
예상 출력
wget: download timed out
다음 명령을 실행하여
prod
네임스페이스에alpine
이미지를 배포하고 쉘을 시작합니다.$ oc run test-$RANDOM --namespace=prod --rm -i -t --image=alpine -- sh
쉘에서 다음 명령을 실행하고 요청이 허용되는지 확인합니다.
# wget -qO- --timeout=2 http://web.default
예상 출력
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
18.3.4.5. 추가 리소스
18.3.5. 추가 네트워크에서 Pod 제거
클러스터 사용자는 추가 네트워크에서 Pod를 제거할 수 있습니다.
18.3.5.1. 추가 네트워크에서 Pod 제거
Pod를 삭제해야만 추가 네트워크에서 Pod를 제거할 수 있습니다.
사전 요구 사항
- Pod에 추가 네트워크가 연결되어 있어야 합니다.
-
OpenShift CLI(
oc
)를 설치합니다. - 클러스터에 로그인합니다.
프로세스
Pod를 삭제하려면 다음 명령을 입력합니다.
$ oc delete pod <name> -n <namespace>
-
<name>
은 Pod의 이름입니다. -
<namespace>
는 Pod가 포함된 네임스페이스입니다.
-
18.3.6. 추가 네트워크 편집
클러스터 관리자는 기존 추가 네트워크의 구성을 수정할 수 있습니다.
18.3.6.1. 추가 네트워크 연결 정의 수정
클러스터 관리자는 기존 추가 네트워크를 변경할 수 있습니다. 추가 네트워크에 연결된 기존 Pod는 업데이트되지 않습니다.
사전 요구 사항
- 클러스터에 추가 네트워크가 구성되어야 합니다.
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 로그인합니다.
프로세스
클러스터의 추가 네트워크를 편집하려면 다음 단계를 완료하십시오.
기본 텍스트 편집기에서 CNO(Cluster Network Operator) CR을 편집하려면 다음 명령을 실행합니다.
$ oc edit networks.operator.openshift.io cluster
-
additionalNetworks
컬렉션에서 변경 내용으로 추가 네트워크를 업데이트합니다. - 변경 사항을 저장하고 텍스트 편집기를 종료하여 변경 사항을 커밋합니다.
선택 사항: CNO에서 다음 명령을 실행하여
NetworkAttachmentDefinition
오브젝트를 업데이트했는지 확인합니다.<network-name>
을 표시할 추가 네트워크의 이름으로 변경합니다. CNO가 변경 사항을 반영하기 위해서NetworkAttachmentDefinition
오브젝트를 업데이트하기 전에 지연이 발생할 수 있습니다.$ oc get network-attachment-definitions <network-name> -o yaml
예를 들어, 다음 콘솔 출력은
net1
이라는NetworkAttachmentDefinition
오브젝트를 표시합니다.$ oc get network-attachment-definitions net1 -o go-template='{{printf "%s\n" .spec.config}}' { "cniVersion": "0.3.1", "type": "macvlan", "master": "ens5", "mode": "bridge", "ipam": {"type":"static","routes":[{"dst":"0.0.0.0/0","gw":"10.128.2.1"}],"addresses":[{"address":"10.128.2.100/23","gateway":"10.128.2.1"}],"dns":{"nameservers":["172.30.0.10"],"domain":"us-west-2.compute.internal","search":["us-west-2.compute.internal"]}} }
18.3.7. 보조 네트워크에서 IP 주소 할당 구성
다음 섹션에서는 보조 네트워크에 대한 IP 주소 할당을 구성하는 방법에 대한 지침 및 정보를 제공합니다.
18.3.7.1. 추가 네트워크에 대한 IP 주소 할당 구성
IP 주소 관리(IPAM) CNI(Container Network Interface) 플러그인은 다른 CNI 플러그인의 IP 주소를 제공합니다.
다음 IP 주소 할당 유형을 사용할 수 있습니다.
- 정적 할당
- DHCP 서버를 통한 동적 할당. 지정한 DHCP 서버는 추가 네트워크에서 연결할 수 있어야 합니다.
- Whereabouts IPAM CNI 플러그인을 통한 동적 할당
18.3.7.1.1. 고정 IP 주소 할당 구성
다음 표에서는 고정 IP 주소 할당 구성에 대해 설명합니다.
필드 | 유형 | 설명 |
---|---|---|
|
|
IPAM 주소 유형입니다. |
|
| 가상 인터페이스에 할당할 IP 주소를 지정하는 오브젝트의 배열입니다. IPv4 및 IPv6 IP 주소가 모두 지원됩니다. |
|
| Pod 내부에서 구성할 경로를 지정하는 오브젝트의 배열입니다. |
|
| 선택 사항: DNS 구성을 지정하는 오브젝트 배열입니다. |
address
배열에는 다음 필드가 있는 오브젝트가 필요합니다.
필드 | 유형 | 설명 |
---|---|---|
|
|
지정하는 IP 주소 및 네트워크 접두사입니다. 예를 들어 |
|
| 송신 네트워크 트래픽을 라우팅할 기본 게이트웨이입니다. |
필드 | 유형 | 설명 |
---|---|---|
|
|
CIDR 형식의 IP 주소 범위(예: 기본 경로의 경우 |
|
| 네트워크 트래픽이 라우팅되는 게이트웨이입니다. |
필드 | 유형 | 설명 |
---|---|---|
|
| DNS 쿼리를 보낼 하나 이상의 IP 주소로 이루어진 배열입니다. |
|
|
호스트 이름에 추가할 기본 도메인입니다. 예를 들어 도메인이 |
|
|
DNS 조회 쿼리 중에 규정되지 않은 호스트 이름(예: |
고정 IP 주소 할당 구성 예
{ "ipam": { "type": "static", "addresses": [ { "address": "191.168.1.7/24" } ] } }
18.3.7.1.2. DHCP(Dynamic IP 주소) 할당 구성
다음 JSON은 DHCP를 사용한 동적 IP 주소 할당 구성을 설명합니다.
pod는 생성될 때 원래 DHCP 리스를 얻습니다. 리스는 클러스터에서 실행되는 최소 DHCP 서버 배포를 통해 주기적으로 갱신되어야 합니다.
DHCP 서버 배포를 트리거하려면 다음 예와 같이 Cluster Network Operator 구성을 편집하여 shim 네트워크 연결을 만들어야 합니다.
shim 네트워크 연결 정의 예
apiVersion: operator.openshift.io/v1 kind: Network metadata: name: cluster spec: additionalNetworks: - name: dhcp-shim namespace: default type: Raw rawCNIConfig: |- { "name": "dhcp-shim", "cniVersion": "0.3.1", "type": "bridge", "ipam": { "type": "dhcp" } } # ...
필드 | 유형 | 설명 |
---|---|---|
|
|
IPAM 주소 유형입니다. |
DHCP(Dynamic IP 주소) 할당 구성 예
{ "ipam": { "type": "dhcp" } }
18.3.7.1.3. Whereabouts를 사용한 동적 IP 주소 할당 구성
Whereabouts CNI 플러그인을 사용하면 DHCP 서버를 사용하지 않고도 IP 주소를 추가 네트워크에 동적으로 할당할 수 있습니다.
Whereabouts CNI 플러그인은 별도의 NetworkAttachmentDefinition
CRD 내에서 동일한 CIDR 범위의 중복 IP 주소 범위 및 구성을 여러 번 지원합니다. 이를 통해 멀티 테넌트 환경에서 유연성 및 관리 기능이 향상됩니다.
18.3.7.1.3.1. 동적 IP 주소 구성 오브젝트
다음 표에서는 Whereabouts를 사용하여 동적 IP 주소 할당을 위한 구성 오브젝트를 설명합니다.
필드 | 유형 | 설명 |
---|---|---|
|
|
IPAM 주소 유형입니다. 여기서about |
|
| CIDR 표기법의 IP 주소 및 범위입니다. IP 주소는 이 주소 범위 내에서 할당됩니다. |
|
| 선택 사항: CIDR 표기법의 0개 이상의 IP 주소 및 범위 목록입니다. 제외된 주소 범위 내의 IP 주소는 할당되지 않습니다. |
|
| 선택 사항: Pod의 각 그룹 또는 도메인이 동일한 IP 주소 범위를 공유하는 경우에도 자체 IP 주소 집합을 갖도록 합니다. 이 필드를 설정하는 것은 특히 다중 테넌트 환경에서 네트워크를 분리하고 정리하는 데 중요합니다. |
18.3.7.1.3.2. Whereabouts를 사용하는 동적 IP 주소 할당 구성
다음 예제에서는 Whereabouts를 사용하는 동적 주소 할당 구성을 보여줍니다.
Whereabouts dynamic IP address assignment
{ "ipam": { "type": "whereabouts", "range": "192.0.2.192/27", "exclude": [ "192.0.2.192/30", "192.0.2.196/32" ] } }
18.3.7.1.3.3. IP 주소 범위가 겹치는 Whereabouts를 사용하는 동적 IP 주소 할당
다음 예제에서는 다중 테넌트 네트워크에 겹치는 IP 주소 범위를 사용하는 동적 IP 주소 할당을 보여줍니다.
NetworkAttachmentDefinition 1
{
"ipam": {
"type": "whereabouts",
"range": "192.0.2.192/29",
"network_name": "example_net_common", 1
}
}
- 1
- 선택 사항: 설정된 경우
NetworkAttachmentDefinition 2
의network_name
과 일치해야 합니다.
NetworkAttachmentDefinition 2
{
"ipam": {
"type": "whereabouts",
"range": "192.0.2.192/24",
"network_name": "example_net_common", 1
}
}
- 1
- 선택 사항: 설정된 경우
NetworkAttachmentDefinition 1
의network_name
과 일치해야 합니다.
18.3.7.1.4. Whereabouts-reconciler 데몬 세트 생성
Whereabouts 조정기는 Whereabouts IP Address Management(IPAM) 솔루션을 사용하여 클러스터 내에서 Pod의 동적 IP 주소 할당을 관리합니다. 이렇게 하면 각 pod가 지정된 IP 주소 범위에서 고유한 IP 주소를 가져옵니다. Pod가 삭제되거나 축소될 때 IP 주소 릴리스도 처리합니다.
동적 IP 주소 할당에 NetworkAttachmentDefinition
CRD(사용자 정의 리소스 정의)를 사용할 수도 있습니다.
Cluster Network Operator를 통해 추가 네트워크를 구성할 때 whereabouts-reconciler
데몬 세트가 자동으로 생성됩니다. YAML 매니페스트에서 추가 네트워크를 구성할 때 자동으로 생성되지 않습니다.
whereabouts-reconciler
데몬 세트의 배포를 트리거하려면 Cluster Network Operator CR(사용자 정의 리소스) 파일을 편집하여 whereabouts-shim
네트워크 연결을 수동으로 생성해야 합니다.
다음 절차에 따라 whereabouts-reconciler
데몬 세트를 배포합니다.
프로세스
다음 명령을 실행하여
Network.operator.openshift.io
CR(사용자 정의 리소스)을 편집합니다.$ oc edit network.operator.openshift.io cluster
이 예제 YAML 추출에 표시된
additionalNetworks
섹션을 CR(사용자 정의 리소스)의사양
정의 내에 포함합니다.apiVersion: operator.openshift.io/v1 kind: Network metadata: name: cluster # ... spec: additionalNetworks: - name: whereabouts-shim namespace: default rawCNIConfig: |- { "name": "whereabouts-shim", "cniVersion": "0.3.1", "type": "bridge", "ipam": { "type": "whereabouts" } } type: Raw # ...
- 파일을 저장하고 텍스트 편집기를 종료합니다.
다음 명령을 실행하여
whereabouts-reconciler
데몬 세트가 성공적으로 배포되었는지 확인합니다.$ oc get all -n openshift-multus | grep whereabouts-reconciler
출력 예
pod/whereabouts-reconciler-jnp6g 1/1 Running 0 6s pod/whereabouts-reconciler-k76gg 1/1 Running 0 6s pod/whereabouts-reconciler-k86t9 1/1 Running 0 6s pod/whereabouts-reconciler-p4sxw 1/1 Running 0 6s pod/whereabouts-reconciler-rvfdv 1/1 Running 0 6s pod/whereabouts-reconciler-svzw9 1/1 Running 0 6s daemonset.apps/whereabouts-reconciler 6 6 6 6 6 kubernetes.io/os=linux 6s
18.3.7.1.5. Whereabouts IP 조정기 일정 구성
Whereabouts IPAM CNI 플러그인은 IP 조정기를 매일 실행합니다. 이 프로세스에서는 IP가 소진될 수 있는 모든 진행 중인 IP 할당을 정리하므로 새 Pod가 IP를 할당하지 못하도록 합니다.
IP 조정기가 실행되는 빈도를 변경하려면 다음 절차를 사용하십시오.
사전 요구 사항
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. -
whereabouts-reconciler
데몬 세트를 배포하고whereabouts-reconciler
Pod가 실행 중입니다.
프로세스
다음 명령을 실행하여
openshift-multus
네임스페이스에 IP 조정기에 대한 특정 cron 표현식을 사용하여 이름이whereabouts-config
라는ConfigMap
오브젝트를 생성합니다.$ oc create configmap whereabouts-config -n openshift-multus --from-literal=reconciler_cron_expression="*/15 * * * *"
이 cron 표현식은 IP 조정기가 15분마다 실행됨을 나타냅니다. 특정 요구 사항에 따라 표현식을 조정합니다.
참고whereabouts-reconciler
데몬 세트는 5개의 별표를 포함하는 cron 표현식 패턴만 사용할 수 있습니다. 초를 나타내는 데 사용되는 여섯 번째 단계는 현재 지원되지 않습니다.다음 명령을 실행하여
openshift-multus
네임스페이스 내에서whereabouts-reconciler
데몬 세트 및 Pod와 관련된 리소스에 대한 정보를 검색합니다.$ oc get all -n openshift-multus | grep whereabouts-reconciler
출력 예
pod/whereabouts-reconciler-2p7hw 1/1 Running 0 4m14s pod/whereabouts-reconciler-76jk7 1/1 Running 0 4m14s pod/whereabouts-reconciler-94zw6 1/1 Running 0 4m14s pod/whereabouts-reconciler-mfh68 1/1 Running 0 4m14s pod/whereabouts-reconciler-pgshz 1/1 Running 0 4m14s pod/whereabouts-reconciler-xn5xz 1/1 Running 0 4m14s daemonset.apps/whereabouts-reconciler 6 6 6 6 6 kubernetes.io/os=linux 4m16s
다음 명령을 실행하여
whereabouts-reconciler
Pod가 구성된 간격으로 IP 조정기를 실행하는지 확인합니다.$ oc -n openshift-multus logs whereabouts-reconciler-2p7hw
출력 예
2024-02-02T16:33:54Z [debug] event not relevant: "/cron-schedule/..2024_02_02_16_33_54.1375928161": CREATE 2024-02-02T16:33:54Z [debug] event not relevant: "/cron-schedule/..2024_02_02_16_33_54.1375928161": CHMOD 2024-02-02T16:33:54Z [debug] event not relevant: "/cron-schedule/..data_tmp": RENAME 2024-02-02T16:33:54Z [verbose] using expression: */15 * * * * 2024-02-02T16:33:54Z [verbose] configuration updated to file "/cron-schedule/..data". New cron expression: */15 * * * * 2024-02-02T16:33:54Z [verbose] successfully updated CRON configuration id "00c2d1c9-631d-403f-bb86-73ad104a6817" - new cron expression: */15 * * * * 2024-02-02T16:33:54Z [debug] event not relevant: "/cron-schedule/config": CREATE 2024-02-02T16:33:54Z [debug] event not relevant: "/cron-schedule/..2024_02_02_16_26_17.3874177937": REMOVE 2024-02-02T16:45:00Z [verbose] starting reconciler run 2024-02-02T16:45:00Z [debug] NewReconcileLooper - inferred connection data 2024-02-02T16:45:00Z [debug] listing IP pools 2024-02-02T16:45:00Z [debug] no IP addresses to cleanup 2024-02-02T16:45:00Z [verbose] reconciler success
18.3.7.1.6. 동적으로 듀얼 스택 IP 주소 할당을 위한 구성 생성
듀얼 스택 IP 주소 할당은 다음과 같은 ipRanges
매개변수를 사용하여 구성할 수 있습니다.
- IPv4 주소
- IPv6 주소
- 여러 IP 주소 할당
프로세스
-
type
을 whereabouts로설정합니다
. 다음 예와 같이
ipRanges
를 사용하여 IP 주소를 할당합니다.cniVersion: operator.openshift.io/v1 kind: Network =metadata: name: cluster spec: additionalNetworks: - name: whereabouts-shim namespace: default type: Raw rawCNIConfig: |- { "name": "whereabouts-dual-stack", "cniVersion": "0.3.1, "type": "bridge", "ipam": { "type": "whereabouts", "ipRanges": [ {"range": "192.168.10.0/24"}, {"range": "2001:db8::/64"} ] } }
- Pod에 네트워크를 연결합니다. 자세한 내용은 "추가 네트워크에 Pod 추가"를 참조하십시오.
- 모든 IP 주소가 할당되었는지 확인합니다.
다음 명령을 실행하여 IP 주소가 메타데이터로 할당되었는지 확인합니다.
$ oc exec -it mypod -- ip a
18.3.8. 컨테이너 네트워크 네임스페이스에서 마스터 인터페이스 구성
다음 섹션에서는 마스터 인터페이스를 기반으로 MAC-VLAN, IP-VLAN, VLAN 하위 인터페이스를 생성하고 관리하는 방법에 대한 지침 및 정보를 제공합니다.
18.3.8.1. 컨테이너 네트워크 네임스페이스에서 마스터 인터페이스 구성 정보
컨테이너 네임스페이스에 있는 마스터
인터페이스를 기반으로 하는 MAC-VLAN, IP-VLAN 또는 VLAN 하위 인터페이스를 생성할 수 있습니다. 별도의 네트워크 연결 정의 CRD에서 Pod 네트워크 구성의 일부로 마스터
인터페이스를 생성할 수도 있습니다.
컨테이너 네임스페이스 마스터
인터페이스를 사용하려면 NetworkAttachmentDefinition
CRD의 하위 인터페이스에 존재하는 linkInContainer
매개변수에 대해 true
를 지정해야 합니다.
18.3.8.1.1. SR-IOV VF에서 여러 VLAN 생성
이 기능을 사용하는 예제 사용 사례는 SR-IOV VF를 기반으로 여러 VLAN을 생성하는 것입니다. 이렇게 하려면 SR-IOV 네트워크를 생성한 다음 VLAN 인터페이스에 대한 네트워크 연결을 정의하는 것으로 시작합니다.
다음 예제에서는 이 다이어그램에 설명된 설정을 구성하는 방법을 보여줍니다.
그림 18.1. VLAN 생성
사전 요구 사항
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. - SR-IOV Network Operator가 설치되어 있습니다.
프로세스
다음 명령을 사용하여 Pod를 배포하려는 전용 컨테이너 네임스페이스를 생성합니다.
$ oc new-project test-namespace
SR-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" 1 deviceID: "101b" 2 rootDevices: ["00:05.0"] numVfs: 10 priority: 99 resourceName: sriovnic nodeSelector: feature.node.kubernetes.io/network-sriov.capable: "true"
참고deviceType: netdevice
설정을 사용하는 SR-IOV 네트워크 노드 정책 구성 예제는 Mellanox Network Interface Cards(NIC)에 맞게 조정됩니다.다음 명령을 실행하여 YAML을 적용합니다.
$ oc apply -f sriov-node-network-policy.yaml
참고노드를 재부팅해야 하므로 이를 적용하는 데 다소 시간이 걸릴 수 있습니다.
SR-IOV 네트워크를 생성합니다.
다음 예제 CR과 같이 추가 SR-IOV 네트워크 연결에 대한
SriovNetwork
CR(사용자 정의 리소스)을 생성합니다. 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", 1 "mtu": 1500, "vlanId": 100, "linkInContainer": true, 2 "ipam": {"type": "whereabouts", "ipRanges": [{"range": "1.1.1.0/24"}]} } ] }
다음 명령을 실행하여 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" 1 }, { "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"
- 1
- VLAN 인터페이스의
마스터
로 사용할 이름입니다.
다음 명령을 실행하여 YAML 파일을 적용합니다.
$ oc apply -f pod-a.yaml
다음 명령을 실행하여
test-namespace
내에서nginx-pod
에 대한 자세한 정보를 가져옵니다.$ oc describe pods nginx-pod -n test-namespace
출력 예
Name: 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
18.3.8.1.2. 컨테이너 네임스페이스에서 브릿지 마스터 인터페이스를 기반으로 하위 인터페이스 생성
컨테이너 네임스페이스에 존재하는 브리지 마스터
인터페이스를 기반으로 하위 인터페이스를 생성할 수 있습니다. 하위 인터페이스 생성은 다른 유형의 인터페이스에 적용할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc
)가 설치되어 있습니다. -
cluster-admin
권한이 있는 사용자로 OpenShift Container Platform 클러스터에 로그인되어 있습니다.
프로세스
다음 명령을 입력하여 Pod를 배포할 전용 컨테이너 네임스페이스를 생성합니다.
$ oc new-project test-namespace
다음 YAML 예제를 사용하여
bridge-nad.yaml
이라는 브릿지NetworkAttachmentDefinition
CRD(사용자 정의 리소스 정의) 파일을 생성합니다.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"}] } }'
다음 명령을 실행하여
NetworkAttachmentDefinition
CRD를 OpenShift Container Platform 클러스터에 적용합니다.$ oc apply -f bridge-nad.yaml
다음 명령을 입력하여
NetworkAttachmentDefinition
CRD를 성공적으로 생성했는지 확인합니다.$ oc get network-attachment-definitions
출력 예
NAME AGE bridge-network 15s
다음 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": "ext0", 1 "mode": "l3", "linkInContainer": true, 2 "ipam": {"type": "whereabouts", "ipRanges": [{"range": "10.0.0.0/24"}]} }'
다음 명령을 실행하여 YAML 파일을 적용합니다.
$ oc apply -f ipvlan-additional-network-configuration.yaml
다음 명령을 실행하여
NetworkAttachmentDefinition
CRD가 성공적으로 생성되었는지 확인합니다.$ oc get network-attachment-definitions
출력 예
NAME AGE bridge-network 87s ipvlan-net 9s
다음 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": "ext0" 1 }, { "name": "ipvlan-net", "interface": "ext1" } ]' 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]
- 1
- IPVLAN 인터페이스의
마스터
로 사용할 이름을 지정합니다.
다음 명령을 실행하여 YAML 파일을 적용합니다.
$ oc apply -f pod-a.yaml
다음 명령을 사용하여 Pod가 실행 중인지 확인합니다.
$ oc get pod -n test-namespace
출력 예
NAME READY STATUS RESTARTS AGE pod-a 1/1 Running 0 2m36s
다음 명령을 실행하여
test-namespace
내에서pod-a
리소스에 대한 네트워크 인터페이스 정보를 표시합니다.$ oc exec -n test-namespace pod-a -- ip a
출력 예
1: 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: ext0@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 ext0 valid_lft forever preferred_lft forever inet6 fe80::bcda:bdff:fe7e:f437/64 scope link valid_lft forever preferred_lft forever 5: ext1@ext0: <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 ext1 valid_lft forever preferred_lft forever inet6 fe80::beda:bd00:17e:f437/64 scope link valid_lft forever preferred_lft forever
이 출력은 네트워크 인터페이스
ext1
이 물리적 인터페이스ext0
과 연결되어 있음을 보여줍니다.
18.3.9. 추가 네트워크 제거
클러스터 관리자는 추가 네트워크의 연결을 제거할 수 있습니다.
18.3.9.1. 추가 네트워크 연결 정의 제거
클러스터 관리자는 OpenShift Container Platform 클러스터에서 추가 네트워크를 제거할 수 있습니다. 추가 네트워크는 연결된 Pod에서 제거되지 않습니다.
사전 요구 사항
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 로그인합니다.
프로세스
클러스터에서 추가 네트워크를 제거하려면 다음 단계를 완료하십시오.
다음 명령을 실행하여 기본 텍스트 편집기에서 CNO(Cluster Network Operator)를 편집합니다.
$ oc edit networks.operator.openshift.io cluster
제거할 네트워크 연결 정의에 대한
additionalNetworks
컬렉션에서 구성을 제거하여 CR을 수정합니다.apiVersion: operator.openshift.io/v1 kind: Network metadata: name: cluster spec: additionalNetworks: [] 1
- 1
additionalNetworks
컬렉션에서 유일한 추가 네트워크 첨부 파일 정의에 대한 구성 매핑을 제거하는 경우 빈 컬렉션을 지정해야 합니다.
- 변경 사항을 저장하고 텍스트 편집기를 종료하여 변경 사항을 커밋합니다.
선택 사항: 추가 네트워크 CR이 삭제되었는지 확인하려면 다음 명령을 실행합니다.
$ oc get network-attachment-definition --all-namespaces