다중 네트워크


OpenShift Container Platform 4.17

OpenShift Container Platform에서 여러 네트워크 인터페이스 및 가상 라우팅 구성 및 관리

Red Hat OpenShift Documentation Team

초록

이 문서에서는 OpenShift Container Platform에서 가상 라우팅 및 전달을 포함하여 기본 및 보조 네트워크를 설정하고 관리하는 방법을 설명합니다.

1장. 다중 네트워크 이해하기

기본적으로 OVN-Kubernetes는 OpenShift Container Platform 클러스터의 CNI(Container Network Interface) 역할을 합니다. OVN-Kubernetes를 클러스터의 기본 CNI로 사용하면 OpenShift Container Platform 관리자 또는 사용자가 UDN(사용자 정의 네트워크) 또는 NetworkAttachmentDefinition(NAD) 을 활용하여 클러스터의 모든 일반 네트워크 트래픽을 처리하는 하나 또는 여러 기본 네트워크를 생성할 수 있습니다. 사용자 정의 네트워크 및 네트워크 연결 정의 모두 다음 네트워크 유형으로 사용될 수 있습니다.

  • primary networks: Pod의 기본 네트워크 역할을 합니다. 기본적으로 Pod 경로가 다른 네트워크를 통해 트래픽을 전송하도록 구성된 경우를 제외하고 모든 트래픽이 기본 네트워크를 통해 전달됩니다.
  • 보조 네트워크: Pod의 기본이 아닌 보조 네트워크로 작동합니다. 보조 네트워크는 특정 트래픽 유형 또는 목적을 전용으로 별도의 인터페이스를 제공합니다. 보조 네트워크를 사용하도록 명시적으로 구성된 Pod 트래픽만 인터페이스를 통해 라우팅됩니다.

그러나 클러스터 설치 중에 OpenShift Container Platform 관리자는 Multus CNI 플러그인을 활용하여 대체 기본 보조 Pod 네트워크를 구성할 수 있습니다. Multus를 사용하면 ipvlan, macvlan 또는 Network Attachment Definitions와 같은 여러 CNI 플러그인을 함께 사용하여 Pod의 보조 네트워크 역할을 할 수 있습니다.

참고

사용자 정의 네트워크는 OVN-Kubernetes가 CNI로 사용되는 경우에만 사용할 수 있습니다. 다른 CNI와 함께 사용할 수 없습니다.

사용 가능한 CNI 플러그인을 기반으로 보조 네트워크를 정의하고 이러한 네트워크 중 하나 이상을 Pod에 연결할 수 있습니다. 필요에 따라 클러스터에 대해 두 개 이상의 보조 네트워크를 정의할 수 있습니다. 따라서 스위칭 또는 라우팅과 같은 네트워크 기능을 제공하는 pod를 구성할 때 유연성이 제공됩니다.

지원되는 CNI 플러그인의 전체 목록은 "OpenShift Container Platform의 2차 네트워크" 를 참조하십시오.

사용자 정의 네트워크에 대한 자세한 내용은 UDN(사용자 정의 네트워크) 정보를 참조하십시오.

네트워크 연결 정의에 대한 자세한 내용은 NetworkAttachmentDefinition을 사용하여 기본 네트워크 생성 을 참조하십시오.

1.1. 보조 네트워크에 대한 사용 시나리오

데이터 플레인 및 컨트롤 플레인 분리를 포함하여 네트워크 분리가 필요한 경우 보조 네트워크를 사용할 수 있습니다. 네트워크 트래픽 격리는 다음과 같은 성능 및 보안상의 이유로 유용합니다.

  1. 성능

    트래픽 관리: 각 플레인의 트래픽 양을 관리하기 위해 두 개의 다른 플레인으로 트래픽을 보낼 수 있습니다.

  2. 보안

    네트워크 격리: 보안 고려 사항을 위해 특별히 관리되는 네트워크 플레인으로 중요한 트래픽을 보낼 수 있으며 테넌트 또는 고객 간에 공유되지 않아야 하는 개인 데이터를 분리할 수 있습니다.

클러스터의 모든 pod는 여전히 클러스터 전체의 기본 네트워크를 사용하여 클러스터 전체의 연결을 유지합니다. 모든 pod에는 클러스터 전체 pod 네트워크에 연결된 eth0 인터페이스가 있습니다. oc exec -it <pod_name> -- ip a 명령을 사용하여 pod의 인터페이스를 확인할 수 있습니다. Multus CNI를 사용하는 보조 네트워크 인터페이스를 추가하는 경우 이름은 net1,net2, …​, netN 입니다.

보조 네트워크 인터페이스를 Pod에 연결하려면 인터페이스 연결 방법을 정의하는 구성을 생성해야 합니다. UserDefinedNetwork CR(사용자 정의 리소스) 또는 NetworkAttachmentDefinition CR을 사용하여 각 인터페이스를 지정합니다. 각 CR 내부의 CNI 구성은 해당 인터페이스의 생성 방법을 정의합니다.

UserDefinedNetwork CR을 만드는 방법에 대한 자세한 내용은 사용자 정의 네트워크 정보를 참조하십시오.

NetworkAttachmentDefinition CR 생성에 대한 자세한 내용은 NetworkAttachmentDefinition 을 사용하여 기본 네트워크 생성을 참조하십시오.

1.2. OpenShift Container Platform의 보조 네트워크

OpenShift Container Platform은 클러스터에서 보조 네트워크를 생성하기 위해 다음 CNI 플러그인을 제공합니다.

2장. 기본 네트워크

2.1. 사용자 정의 네트워크 정보

중요

UserDefinedNetwork 는 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.

Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.

UDN(사용자 정의 네트워크)을 구현하기 전에 OpenShift Container Platform의 OVN-Kubernetes CNI 플러그인은 기본 또는 기본 네트워크에서 계층 3 토폴로지만 지원했습니다. Kubernetes 설계 원칙으로 인해 모든 Pod는 기본 네트워크에 연결되어 있으며 모든 Pod는 IP 주소를 통해 서로 통신하며 Pod 간 트래픽은 네트워크 정책에 따라 제한됩니다.

UDN은 이러한 모든 세그먼트가 기본적으로 격리되는 사용자 지정 계층 2 및 계층 3 네트워크 세그먼트를 활성화하여 Kubernetes Pod 네트워크에 대한 기본 계층 3 토폴로지의 유연성 및 분할 기능을 향상시킵니다. 이러한 세그먼트는 기본 OVN-Kubernetes CNI 플러그인을 사용하는 컨테이너 Pod 및 가상 머신의 기본 또는 보조 네트워크 역할을 합니다. UDN은 광범위한 네트워크 아키텍처 및 토폴로지를 지원하여 네트워크 유연성, 보안 및 성능을 향상시킵니다.

참고

기본 네트워크와 보조 네트워크에서 Localnet 토폴로지에 대한 지원은 향후 OpenShift Container Platform 버전에 추가됩니다.

클러스터 관리자는 UDN을 사용하여 ClusterUserDefinedNetwork CR(사용자 정의 리소스)을 활용하여 클러스터 수준에서 여러 네임스페이스에 걸쳐 있는 기본 또는 보조 네트워크를 생성하고 정의할 수 있습니다. 또한 클러스터 관리자 또는 클러스터 사용자는 UDN을 사용하여 UserDefinedNetwork CR을 사용하여 네임스페이스 수준에서 보조 네트워크를 정의할 수 있습니다.

다음 다이어그램에서는 각 네임스페이스에 하나의 할당된 사용자 정의 네트워크(UDN)가 할당되고 각 UDN에는 Pod IP 할당에 대해 사용자 지정 서브넷이 할당되는 네 가지 클러스터 네임스페이스를 보여줍니다. OVN-Kubernetes는 겹치는 UDN 서브넷을 처리합니다. Kubernetes 네트워크 정책을 사용하지 않으면 UDN에 연결된 Pod는 해당 UDN의 다른 Pod와 통신할 수 있습니다. 기본적으로 이러한 Pod는 다른 UDN에 존재하는 Pod와 통신하지 않습니다. 마이크로 세분화의 경우 UDN 내에서 네트워크 정책을 적용할 수 있습니다. 네임스페이스에 하나의 기본 UDN만 제한하고 하나 이상의 네임스페이스를 UDN에 지정하여 하나 이상의 UDN을 네임스페이스에 할당할 수 있습니다.

그림 2.1. UserDefinedNetwork CR을 사용한 네임스페이스 격리

다음 섹션에서는 사용자 정의 네트워크의 이점 및 제한 사항, UserDefinedNetwork 사용자 지정 리소스를 생성할 때 모범 사례, 사용자 지정 리소스를 생성하는 방법 및 배포와 관련된 추가 구성 세부 정보를 강조합니다.

2.1.1. 사용자 정의 네트워크의 이점

사용자 정의 네트워크는 다음과 같은 이점을 제공합니다.

  1. 보안을 위한 네트워크 격리 개선

    • 테넌트 격리: 네임스페이스는 RHOSP(Red Hat OpenStack Platform)에서 테넌트를 분리하는 방법과 유사하게 격리된 기본 네트워크를 보유할 수 있습니다. 이렇게 하면 교차 테넌트 트래픽의 위험을 줄임으로써 보안이 향상됩니다.
  2. 네트워크 유연성

    • 계층 2 및 3 계층 지원: 클러스터 관리자는 기본 네트워크를 계층 2 또는 계층 3 네트워크 유형으로 구성할 수 있습니다.
  3. 간소화된 네트워크 관리

    • 네트워크 구성 복잡성 감소: 사용자 정의 네트워크를 사용하면 서로 다른 네트워크의 워크로드를 그룹화하여 격리를 수행할 수 있으므로 복잡한 네트워크 정책의 필요성이 제거됩니다.
  4. 고급 기능

    • 일관되고 선택 가능한 IP 주소 지정: 사용자는 다른 네임스페이스 및 클러스터에서 IP 서브넷을 지정 및 재사용할 수 있으므로 일관된 네트워킹 환경을 제공할 수 있습니다.
    • 다중 네트워크 지원: 사용자 정의 네트워킹 기능을 사용하면 관리자가 여러 네임스페이스를 단일 네트워크에 연결하거나 네임스페이스 집합마다 별도의 네트워크를 만들 수 있습니다.
  5. RHOSP(Red Hat OpenStack Platform)에서 애플리케이션 마이그레이션 간소화

    • 네트워크 패리티: 사용자 정의 네트워킹을 사용하면 유사한 네트워크 격리 및 구성 옵션을 제공하여 OpenStack에서 OpenShift Container Platform으로 애플리케이션을 마이그레이션할 수 있습니다.

개발자와 관리자는 사용자 정의 리소스를 사용하여 네임스페이스 범위를 지정하는 사용자 정의 네트워크를 만들 수 있습니다. 프로세스의 개요는 다음과 같습니다.

  1. 관리자는 k8s.ovn.org/primary-user-defined-network 레이블을 사용하여 사용자 정의 네트워크의 네임스페이스를 생성합니다.
  2. UserDefinedNetwork CR은 클러스터 관리자 또는 사용자가 생성합니다.
  3. 사용자는 네임스페이스에 Pod를 생성합니다.

2.1.2. UserDefinedNetwork 사용자 정의 리소스에 대한 제한 사항

UDN(사용자 정의 네트워크)은 사용자 정의 네트워크 구성 옵션을 제공하지만 클러스터 관리자와 개발자는 이러한 네트워크를 구현하고 관리할 때 알고 있어야 하는 제한 사항이 있습니다. 사용자 정의 네트워크를 구현하기 전에 다음 제한 사항을 고려하십시오.

  • DNS 제한 사항:

    • Pod의 DNS 조회는 클러스터 기본 네트워크의 Pod IP 주소로 확인됩니다. Pod가 사용자 정의 네트워크의 일부인 경우에도 DNS 조회는 해당 사용자 정의 네트워크에서 Pod의 IP 주소로 확인되지 않습니다. 그러나 서비스 및 외부 엔티티에 대한 DNS 조회가 예상대로 작동합니다.
    • Pod가 기본 UDN에 할당되면 클러스터의 기본 네트워크의 Kubernetes API(KAPI) 및 DNS 서비스에 액세스할 수 있습니다.
  • 초기 네트워크 할당: Pod를 생성하기 전에 네임스페이스와 네트워크를 생성해야 합니다. Pod가 포함된 네임스페이스를 새 네트워크에 할당하거나 기존 네임스페이스에서 UDN을 생성하는 것은 OVN-Kubernetes에서 허용되지 않습니다.
  • 상태 점검 제한 사항: Kubelet 상태 점검은 Pod에서 기본 인터페이스의 네트워크 연결을 확인하지 않는 클러스터 기본 네트워크에서 수행됩니다. 결과적으로 기본 네트워크에서 pod가 정상으로 표시되지만 기본 인터페이스에서 연결이 끊어진 시나리오는 사용자 정의 네트워크를 사용할 수 있습니다.
  • 네트워크 정책 제한: 다른 사용자 정의 기본 네트워크에 연결된 네임스페이스 간 트래픽을 활성화하는 네트워크 정책은 적용되지 않습니다. 이러한 트래픽 정책은 격리된 네트워크 간에 연결이 없기 때문에 적용되지 않습니다.
  • 생성 및 수정 제한: ClusterUserDefinedNetwork CR과 UserDefinedNetwork CR은 생성된 후에는 수정할 수 없습니다.

2.1.3. 계층 2 및 3 계층 토폴로지

플랫 계층 2 토폴로지는 클러스터의 모든 노드에 분산된 가상 스위치를 생성합니다. 가상 머신과 Pod는 이 가상 스위치에 연결하여 이러한 모든 구성 요소가 동일한 서브넷 내에서 서로 통신할 수 있도록 합니다. 플랫 계층 2 토폴로지는 클러스터에 존재하는 노드 간에 가상 머신을 실시간 마이그레이션하는 데 유용합니다. 다음 다이어그램에서는 실시간 마이그레이션을 위해 가상 스위치를 사용하는 두 개의 노드가 있는 플랫 계층 2 토폴로지를 보여줍니다.

그림 2.2. 구성 요소 통신에 가상 스위치를 사용하는 플랫 계층 2 토폴로지

계층 2 서브넷을 지정하지 않으려면 클러스터의 각 Pod에 대해 IP 주소를 수동으로 구성해야 합니다. 계층 2 서브넷을 지정하지 않으면 포트 보안은 MAC(Media Access Control) 스푸핑만 방지하도록 제한되며 IP 스푸핑을 포함하지 않습니다. 계층 2 토폴로지는 대규모 네트워크 환경에서 어려움이 있을 수 있는 단일 브로드캐스트 도메인을 생성합니다. 여기서 토폴로지는 네트워크 성능을 저하시킬 수 있는 브로드캐스트 브랜덤을 유발할 수 있습니다.

네트워크에 대해 더 구성 가능한 옵션에 액세스하려면 계층 2 토폴로지를 UDN(사용자 정의 네트워크)과 통합할 수 있습니다. 다음 다이어그램에서는 각 노드에 존재하는 Pod를 포함하는 계층 2 토폴로지와 함께 UDN을 사용하는 두 개의 노드를 보여줍니다. 각 노드에는 두 개의 인터페이스가 포함됩니다.

  • 네트워킹 구성 요소를 노드에 연결하는 계산 노드인 노드 인터페이스입니다.
  • 포드가 서로 통신하고 리소스를 공유할 수 있도록 계층 2 OVN 스위치를 생성하는 br-ex 와 같은 OVS(Open vSwitch) 브릿지입니다.

외부 스위치는 이러한 두 인터페이스를 연결하는 반면 게이트웨이 또는 라우터는 외부 스위치와 계층 2 OVN 스위치 간의 라우팅 트래픽을 처리합니다. 노드의 VM 및 Pod는 UDN을 사용하여 서로 통신할 수 있습니다. 계층 2 OVN 스위치는 UDN을 통한 노드 트래픽을 처리하므로 한 노드에서 다른 노드로 VM을 실시간 마이그레이션할 수 있습니다.

그림 2.3. 계층 2 토폴로지를 사용하는 UDN(사용자 정의 네트워크)

계층 3 토폴로지는 클러스터의 각 노드에 대해 고유한 계층 2 세그먼트를 생성합니다. 계층 3 라우팅 메커니즘은 서로 다른 노드에서 호스팅되는 가상 머신과 pod가 서로 통신할 수 있도록 이러한 세그먼트를 상호 연결합니다. 계층 3 토폴로지는 각 도메인을 특정 노드에 할당하여 대규모 브로드캐스트 도메인을 효과적으로 관리할 수 있으므로 브로드캐스트 트래픽의 범위가 줄어듭니다. 계층 3 토폴로지를 구성하려면 cidrhostSubnet 매개변수를 구성해야 합니다.

2.1.4. UserDefinedNetwork의 모범 사례

UDN( UserDefinedNetwork ) 리소스를 설정하기 전에 사용자는 다음 정보를 고려해야 합니다.

  • OpenShift-* 네임스페이스는 UDN을 설정하는 데 사용해서는 안 됩니다.
  • 사용자 정의 네트워크에는 2개의 masquerade IP 주소가 필요합니다. 필요한 네트워크 수를 보유할 수 있을 만큼 충분히 커지도록 마스커레이드 서브넷을 재구성해야 합니다.

    중요
    • OpenShift Container Platform 4.17 이상의 경우 클러스터는 IPv4에 169.254.0.0/17 을 사용하고 IPv6의 경우 fd69::/112 를 기본 masquerade 서브넷으로 사용합니다. 이러한 범위는 사용자가 피해야 합니다. 업데이트된 클러스터의 경우 기본 masquerade 서브넷이 변경되지 않습니다.
    • 프로젝트에 대해 사용자 정의 네트워크를 구성한 후에는 클러스터의 masquerade 서브넷을 변경할 수 없습니다. UDN을 설정한 후 masquerade 서브넷을 수정하면 네트워크 연결이 중단되고 구성 문제가 발생할 수 있습니다.
  • 테넌트가 NetworkAttachmentDefinition (NAD) 리소스가 아닌 UserDefinedNetwork 리소스를 사용하고 있는지 확인합니다. 이렇게 하면 테넌트 간에 보안 위험이 발생할 수 있습니다.
  • 네트워크 분할을 생성할 때는 UDN 리소스를 사용하여 사용자 정의 네트워크 분할을 완료할 수 없는 경우에만 192.0.2.D 리소스를 사용해야 합니다.
  • UDN의 클러스터 서브넷 및 서비스 CIDR은 기본 클러스터 서브넷 CIDR과 중복될 수 없습니다. OVN-Kubernetes 네트워크 플러그인은 100.64.0.0/16 을 기본 네트워크의 조인 서브넷으로 사용하므로 해당 값을 사용하여 UDN joinSubnets 필드를 구성해서는 안 됩니다. 기본 주소 값이 클러스터의 네트워크 어디에서나 사용되는 경우 joinSubnets 필드를 설정하여 재정의해야 합니다. 자세한 내용은 "사용자 정의 네트워크 CR에 대한 추가 구성 세부 정보"를 참조하십시오.
  • UDN의 클러스터 서브넷 및 서비스 CIDR은 기본 클러스터 서브넷 CIDR과 중복될 수 없습니다. OVN-Kubernetes 네트워크 플러그인은 100.64.0.0/16 을 네트워크의 기본 조인 서브넷으로 사용하므로 해당 값을 사용하여 UDN joinSubnets 필드를 구성해서는 안 됩니다. 기본 주소 값이 클러스터의 네트워크 어디에서나 사용되는 경우 joinSubnets 필드를 설정하여 기본값을 재정의해야 합니다. 자세한 내용은 "사용자 정의 네트워크 CR에 대한 추가 구성 세부 정보"를 참조하십시오.

2.1.5. UserDefinedNetwork 사용자 정의 리소스 생성

다음 절차에서는 네임스페이스 범위가 지정된 사용자 정의 네트워크를 생성합니다. 사용 사례에 따라 Layer2 토폴로지 유형에 대한 my-layer-two-udn.yaml 예제 또는 Layer3 토폴로지 유형에 대한 my-layer-three-udn.yaml 예제를 사용하여 요청을 생성합니다.

perquisites

  • cluster-admin 권한으로 로그인했거나 RBAC(역할 기반 액세스 제어)를 보고 편집했습니다.

프로세스

  1. 선택 사항: 기본 네트워크를 사용하는 UserDefinedNetwork CR의 경우 다음 명령을 입력하여 k8s.ovn.org/primary-user-defined-network 레이블이 있는 네임스페이스를 생성합니다.

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Namespace
    metadata:
      name: <udn_namespace_name>
      labels:
        k8s.ovn.org/primary-user-defined-network: ""
    EOF
    Copy to Clipboard Toggle word wrap
  2. Layer2 또는 Layer3 토폴로지 유형 사용자 정의 네트워크에 대한 요청을 생성합니다.

    1. my-layer-two-udn.yaml 과 같은 YAML 파일을 생성하여 다음 예와 같이 Layer2 토폴로지에 대한 요청을 정의합니다.

      apiVersion: k8s.ovn.org/v1
      kind: UserDefinedNetwork
      metadata:
        name: udn-1 
      1
      
        namespace: <some_custom_namespace>
      spec:
        topology: Layer2 
      2
      
        layer2: 
      3
      
          role: Primary 
      4
      
          subnets:
            - "10.0.0.0/24"
            - "2001:db8::/60" 
      5
      Copy to Clipboard Toggle word wrap
      1
      UserDefinedNetwork 리소스의 이름입니다. 이는 기본값 이거나 CNO(Cluster Network Operator)에서 생성한 글로벌 네임스페이스를 복제해서는 안 됩니다.
      2
      topology 필드는 네트워크 구성을 설명합니다. 허용되는 값은 Layer2Layer3 입니다. Layer2 토폴로지 유형을 지정하면 모든 노드에서 공유하는 하나의 논리 스위치가 생성됩니다.
      3
      이 필드는 토폴로지 구성을 지정합니다. layer2 또는 layer3 일 수 있습니다.
      4
      기본 또는 보조 역할을 지정합니다.
      5
      Layer2 토폴로지 유형의 경우 다음은 subnet 필드에 대한 구성 세부 정보를 지정합니다.
      • subnets 필드는 선택 사항입니다.
      • subnets 필드는 문자열 유형이며 IPv4 및 IPv6 모두에 대한 표준 CIDR 형식을 허용합니다.
      • subnets 필드에는 하나 또는 두 개의 항목을 사용할 수 있습니다. 두 가지 면에서는 다른 가족이어야 합니다. 예를 들어 서브넷 값은 10.100.0.0/162001:db8::/64 입니다.
      • Layer2 서브넷은 생략할 수 있습니다. 생략하면 사용자는 Pod의 IP 주소를 구성해야 합니다. 결과적으로 포트 보안은 MAC 스푸핑만 방지합니다.
      • ipamLifecycle 필드가 지정되면 Layer2 subnets 필드는 필수입니다.
    2. my-layer-three-udn.yaml 과 같은 YAML 파일을 생성하여 다음 예와 같이 Layer3 토폴로지에 대한 요청을 정의합니다.

      apiVersion: k8s.ovn.org/v1
      kind: UserDefinedNetwork
      metadata:
        name: udn-2-primary 
      1
      
        namespace: <some_custom_namespace>
      spec:
        topology: Layer3 
      2
      
        layer3: 
      3
      
          role: Primary 
      4
      
          subnets: 
      5
      
            - cidr: 10.150.0.0/16
              hostSubnet: 24
            - cidr: 2001:db8::/60
              hostSubnet: 64
      # ...
      Copy to Clipboard Toggle word wrap
      1
      UserDefinedNetwork 리소스의 이름입니다. 이는 기본값 이거나 CNO(Cluster Network Operator)에서 생성한 글로벌 네임스페이스를 복제해서는 안 됩니다.
      2
      topology 필드는 네트워크 구성을 설명합니다. 허용되는 값은 Layer2Layer3 입니다. Layer3 토폴로지 유형을 지정하면 노드당 계층 2 세그먼트가 생성되며 각각 다른 서브넷이 있습니다. 계층 3 라우팅은 노드 서브넷을 상호 연결하는 데 사용됩니다.
      3
      이 필드는 토폴로지 구성을 지정합니다. 유효한 값은 layer2 또는 layer3 입니다.
      4
      기본 또는 보조 역할을 지정합니다.
      5
      Layer3 토폴로지 유형의 경우 다음에서는 subnet 필드에 대한 구성 세부 정보를 지정합니다.
      • subnets 필드는 필수입니다.
      • subnets 필드의 유형은 cidrhostSubnet:입니다.

        • CIDR 은 클러스터의 clusterNetwork 구성 설정과 동일합니다. CIDR의 IP 주소는 사용자 정의 네트워크의 포드에 배포됩니다. 이 매개변수는 문자열 값을 허용합니다.
        • HostSubnet 은 노드별 서브넷 접두사를 정의합니다.
        • IPv6의 경우 /64 길이만 hostSubnet 에서 지원됩니다.
  3. 다음 명령을 실행하여 요청을 적용합니다.

    $ oc apply -f <my_layer_two_udn.yaml>
    Copy to Clipboard Toggle word wrap

    여기서 <my_layer_two_udn.yaml >은 Layer2 또는 Layer3 구성 파일의 이름입니다.

  4. 다음 명령을 실행하여 요청이 성공했는지 확인합니다.

    $ oc get userdefinednetworks udn-1 -n <some_custom_namespace> -o yaml
    Copy to Clipboard Toggle word wrap

    여기서 some_custom_namespace 는 사용자 정의 네트워크에 대해 생성한 네임스페이스입니다.

    출력 예

    apiVersion: k8s.ovn.org/v1
    kind: UserDefinedNetwork
    metadata:
      creationTimestamp: "2024-08-28T17:18:47Z"
      finalizers:
      - k8s.ovn.org/user-defined-network-protection
      generation: 1
      name: udn-1
      namespace: some-custom-namespace
      resourceVersion: "53313"
      uid: f483626d-6846-48a1-b88e-6bbeb8bcde8c
    spec:
      layer2:
        role: Primary
        subnets:
        - 10.0.0.0/24
        - 2001:db8::/60
      topology: Layer2
    status:
      conditions:
      - lastTransitionTime: "2024-08-28T17:18:47Z"
        message: NetworkAttachmentDefinition has been created
        reason: NetworkAttachmentDefinitionReady
        status: "True"
        type: NetworkReady
    Copy to Clipboard Toggle word wrap

2.1.5.1. UserDefinedNetworks CR에 대한 추가 구성 세부 정보

다음 표에서는 선택 사항인 UDN의 추가 구성에 대해 설명합니다. OVN-Kubernetes 네트워크 토폴로지의 명시적 필요 및 이해 없이 이러한 필드를 설정하지 않는 것이 좋습니다.

  1. 사용자 정의 네트워크에 대한 선택적 구성
Expand

CUDN 필드

UDN 필드

유형

설명

spec.network.<topology>.joinSubnets

spec.<topology>.joinSubnets

object

생략하면 플랫폼에서는 IPv4의 경우 100.65.0.0/16, IPv6의 경우 fd99::/64joinSubnets 필드의 기본값을 설정합니다. 기본 주소 값이 클러스터의 네트워크 어디에서나 사용되는 경우 joinSubnets 필드를 설정하여 재정의해야 합니다. 이 필드를 설정하도록 선택하는 경우 클러스터 서브넷, 기본 네트워크 클러스터 서브넷 및 masquerade 서브넷과 같은 클러스터의 다른 서브넷과 충돌하지 않는지 확인합니다.

joinSubnets 필드는 사용자 정의 네트워크 내의 다양한 세그먼트 간 라우팅을 구성합니다. 듀얼 스택 클러스터는 각 IP 제품군에 대해 2개의 서브넷을 설정할 수 있습니다. 그렇지 않으면 서브넷은 1개만 허용됩니다. 이 필드는 기본 네트워크에만 허용됩니다.

spec.network.<topology>.ipam.lifecycle

spec.<topology>.ipam.lifecycle

object

spec.ipam.lifecycle 필드는 IPAM(IP 주소 관리 시스템)을 구성합니다. 가상 워크로드에 이 필드를 사용하여 영구 IP 주소를 보장할 수 있습니다. 허용되는 유일한 값은 Persistent 입니다. 이 값은 재부팅 및 마이그레이션 시 가상 워크로드에 영구 IP 주소가 있는지 확인합니다. 컨테이너 네트워크 인터페이스(CNI)에서 할당하며 OVN-Kubernetes에서 Pod IP 주소를 프로그래밍하는 데 사용됩니다. Pod 주석에는 이 값을 변경할 수 없습니다.

ipam.mode 매개변수가 Enabled 로 설정된 경우에만 Persistent 값을 설정할 수 있습니다.

spec.network.<topology>.ipam.mode

spec.network.<topology>.ipam.mode

object

mode 매개변수는 OVN-Kubernetes에서 관리하는 IP 구성의 양을 제어합니다. 다음 옵션을 사용할 수 있습니다.

enabled:
활성화하면 OVN-Kubernetes는 IP 구성을 SDN 인프라에 적용하고 선택한 서브넷의 IP 주소를 개별 Pod에 할당합니다. 이 설정은 기본 설정입니다. Enabled 로 설정하는 경우 subnets 필드를 정의해야 합니다. enabled 는 기본 구성입니다.

비활성화됨:
비활성화된 경우 OVN-Kubernetes는 MAC 주소만 할당하고 사용자가 IP 주소를 구성할 수 있는 계층 2 통신을 제공합니다. 비활성화 는 계층 2(초) 네트워크에서만 사용할 수 있습니다. IPAM을 비활성화하면 IP를 통해 Pod를 선택하는 기능(예: 네트워크 정책, 서비스 등)이 더 이상 작동하지 않습니다. 또한 이 네트워크에 연결된 인터페이스에 대해 IP 포트 보안도 비활성화됩니다. spec.ipam.modeDisabled 로 설정된 경우 subnets 필드가 비어 있어야 합니다.

spec.network.<topology>.mtu

spec.<topology>.mtu

integer

최대 전송 단위(MTU)입니다. 기본값은 1400 입니다. IPv4의 경계는 576 입니다. IPv6의 경우 1280 입니다.

다음과 같습니다.

<topology>
layer2 또는 layer3 중 하나입니다.

2.2. NetworkAttachmentDefinition을 사용하여 기본 네트워크 생성

다음 섹션에서는 NetworkAttachmentDefinition (NAD) 리소스를 사용하여 기본 네트워크를 생성하고 관리하는 방법을 설명합니다.

2.2.1. 기본 네트워크를 관리하는 방법

다음 두 가지 접근 방법 중 하나를 사용하여 controlPlaneD에서 생성한 기본 네트워크의 라이프 사이클을 관리할 수 있습니다.

  • CNO(Cluster Network Operator) 구성을 수정합니다. 이 방법을 사용하면 CNO가 NetworkAttachmentDefinition 오브젝트를 자동으로 생성하고 관리합니다. 오브젝트 라이프사이클을 관리하는 것 외에도 CNO는 DHCP 할당된 IP 주소를 사용하는 기본 네트워크에 DHCP를 사용할 수 있도록 합니다.
  • YAML 매니페스트를 적용하여 다음을 수행합니다. 이 방법을 사용하면 NetworkAttachmentDefinition 오브젝트를 생성하여 기본 네트워크를 직접 관리할 수 있습니다. 이 방법을 사용하면 Pod에 기본 네트워크 인터페이스를 연결하기 위해 여러 CNI 플러그인을 호출할 수 있습니다.

각 접근 방식은 함께 사용할 수 없으며 한 번에 기본 네트워크를 관리하기 위한 하나의 접근 방식만 사용할 수 있습니다. 두 방법 모두 기본 네트워크는 구성하는 CNI(Container Network Interface) 플러그인에 의해 관리됩니다.

참고

OVN SDN을 사용하여 RHOSP(Red Hat OpenStack Platform)에 여러 네트워크 인터페이스가 있는 OpenShift Container Platform 노드를 배포할 때 보조 인터페이스의 DNS 구성이 기본 인터페이스의 DNS 구성보다 우선할 수 있습니다. 이 경우 다음 명령을 실행하여 보조 인터페이스에 연결된 서브넷 ID의 DNS 이름 서버를 제거합니다.

$ openstack subnet set --dns-nameserver 0.0.0.0 <subnet_id>
Copy to Clipboard Toggle word wrap

2.2.2. Cluster Network Operator를 사용하여 기본 네트워크 연결 생성

CNO(Cluster Network Operator)는 추가 네트워크 정의를 관리합니다. 생성할 기본 네트워크를 지정하면 CNO가 NetworkAttachmentDefinition CRD(사용자 정의 리소스 정의)를 자동으로 생성합니다.

중요

CNO가 관리하는 NetworkAttachmentDefinition CRD를 편집하지 마십시오. 이렇게 하면 기본 네트워크의 네트워크 트래픽이 중단될 수 있습니다.

사전 요구 사항

  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 권한이 있는 사용자로 로그인합니다.

프로세스

  1. 선택 사항: 기본 네트워크의 네임스페이스를 생성합니다.

    $ oc create namespace <namespace_name>
    Copy to Clipboard Toggle word wrap
  2. CNO 구성을 편집하려면 다음 명령을 입력합니다.

    $ oc edit networks.operator.openshift.io cluster
    Copy to Clipboard Toggle word wrap
  3. 다음 예제 CR과 같이 생성 중인 기본 네트워크의 구성을 추가하여 생성 중인 CR을 수정합니다.

    apiVersion: operator.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      # ...
      additionalNetworks:
      - name: tertiary-net
        namespace: namespace2
        type: Raw
        rawCNIConfig: |-
          {
            "cniVersion": "0.3.1",
            "name": "tertiary-net",
            "type": "ipvlan",
            "master": "eth1",
            "mode": "l2",
            "ipam": {
              "type": "static",
              "addresses": [
                {
                  "address": "192.168.1.23/24"
                }
              ]
            }
          }
    Copy to Clipboard Toggle word wrap
  4. 변경 사항을 저장하고 텍스트 편집기를 종료하여 변경 사항을 커밋합니다.

검증

  • CNO가 다음 명령을 실행하여 NetworkAttachmentDefinition CRD를 생성했는지 확인합니다. CNO가 CRD를 생성하기 전에 지연이 존재할 수 있습니다. 예상되는 출력에는 CryostatD CRD의 이름과 생성 기간이 분 단위로 표시됩니다.

    $ oc get network-attachment-definitions -n <namespace>
    Copy to Clipboard Toggle word wrap

    다음과 같습니다.

    <namespace>
    CNO 구성에 추가한 네트워크 연결의 네임스페이스를 지정합니다.
2.2.2.1. 기본 네트워크 연결 구성

기본 네트워크는 k8s.cni.cncf.io API 그룹에서 NetworkAttachmentDefinition API를 사용하여 구성됩니다.

API 구성은 다음 표에 설명되어 있습니다.

Expand
표 2.1. NetworkAttachmentDefinition API 필드
필드유형설명

metadata.name

string

기본 네트워크의 이름입니다.

metadata.namespace

string

오브젝트와 연결된 네임스페이스입니다.

spec.config

string

JSON 형식의 CNI 플러그인 구성입니다.

2.2.3. YAML 매니페스트를 적용하여 기본 네트워크 연결 생성

사전 요구 사항

  • OpenShift CLI(oc)가 설치되어 있습니다.
  • cluster-admin 권한이 있는 사용자로 로그인했습니다.
  • CryostatD를 배포해야 하는 네임스페이스에서 작업하고 있습니다.

프로세스

  1. 다음 예와 같이 기본 네트워크 구성을 사용하여 YAML 파일을 생성합니다.

    apiVersion: k8s.cni.cncf.io/v1
    kind: NetworkAttachmentDefinition
    metadata:
      name: next-net
    spec:
      config: |-
        {
          "cniVersion": "0.3.1",
          "name": "work-network",
          "namespace": "namespace2", 
    1
    
          "type": "host-device",
          "device": "eth1",
          "ipam": {
            "type": "dhcp"
          }
        }
    Copy to Clipboard Toggle word wrap
    1
    선택 사항: CryostatD가 적용되는 네임스페이스를 지정할 수 있습니다. CryostatD를 배포해야 하는 네임스페이스에서 작업하는 경우 이 사양은 필요하지 않습니다.
  2. 기본 네트워크를 생성하려면 다음 명령을 입력합니다.

    $ oc apply -f <file>.yaml
    Copy to Clipboard Toggle word wrap

    다음과 같습니다.

    <file>
    YAML 매니페스트가 포함된 파일의 이름을 지정합니다.

3장. 보조 네트워크

3.1. OVN-Kubernetes에서 보조 네트워크 생성

클러스터 관리자는 NetworkAttachmentDefinition (NAD) 리소스를 사용하여 클러스터의 보조 네트워크를 구성할 수 있습니다.

참고

보조 네트워크로 사용자 정의 네트워크에 대한 지원은 향후 OpenShift Container Platform 버전에 추가됩니다.

3.1.1. OVN-Kubernetes 보조 네트워크 구성

Red Hat OpenShift Networking OVN-Kubernetes 네트워크 플러그인을 사용하면 포드에 대한 보조 네트워크 인터페이스를 구성할 수 있습니다. 보조 네트워크 인터페이스를 구성하려면 NetworkAttachmentDefinition CRD(사용자 정의 리소스 정의)에서 구성을 정의해야 합니다.

참고

노드의 OVN-Kubernetes 컨트롤 플레인 에이전트가 연결된 network-attachment-definition CRD를 처리할 때까지 Pod 및 다중 네트워크 정책 생성은 보류 중 상태로 유지될 수 있습니다.

계층 2, 계층 3 또는 localnet 토폴로지에서 OVN-Kubernetes 보조 네트워크를 구성할 수 있습니다. 이러한 토폴로지에서 지원되는 기능에 대한 자세한 내용은 "UserDefinedNetwork 및 NetworkAttachmentDefinition support matrix"를 참조하십시오.

다음 섹션에서는 현재 OVN-Kubernetes에서 보조 네트워크에서 허용하는 각 토폴로지에 대한 예제 구성을 제공합니다.

참고

네트워크 이름은 고유해야 합니다. 예를 들어 동일한 네트워크를 참조하는 다양한 구성으로 여러 NetworkAttachmentDefinition CRD를 생성하는 것은 지원되지 않습니다.

3.1.1.1. OVN-Kubernetes 보조 네트워크에서 지원되는 플랫폼

지원되는 플랫폼에서 OVN-Kubernetes 보조 네트워크를 사용할 수 있습니다.

  • 베어 메탈
  • IBM Power®
  • IBM Z®
  • IBM® LinuxONE
  • VMware vSphere
  • Red Hat OpenStack Platform (RHOSP)
3.1.1.2. OVN-Kubernetes 네트워크 플러그인 JSON 구성 테이블

다음 표에서는 OVN-Kubernetes CNI 네트워크 플러그인의 구성 매개변수를 설명합니다.

Expand
표 3.1. OVN-Kubernetes 네트워크 플러그인 JSON 구성 테이블
필드유형설명

cniVersion

string

CNI 사양 버전입니다. 필수 값은 0.3.1 입니다.

name

string

네트워크의 이름입니다. 이러한 네트워크는 네임스페이스가 지정되지 않습니다. 예를 들어 l2-network 라는 네트워크는 다른 네임스페이스에 존재하는 NetworkAttachmentDefinition CR(사용자 정의 리소스)에서 참조할 수 있습니다. 이 구성을 사용하면 다른 네임스페이스에서 NetworkAttachmentDefinition CR을 사용하는 Pod가 동일한 보조 네트워크를 통해 통신할 수 있습니다. 그러나 NetworkAttachmentDefinition CR은 토폴로지,서브넷,mtu,excludeSubnets, vlanID 와 같은 동일한 네트워크 관련 매개변수를 공유해야 합니다. vlanID 매개변수는 topology 필드가 localnet 으로 설정된 경우에만 적용됩니다.

type

string

구성할 CNI 플러그인의 이름입니다. 이 값은 ovn-k8s-cni-overlay 로 설정해야 합니다.

토폴로지

string

네트워크의 토폴로지 구성입니다. layer2 또는 localnet 중 하나여야 합니다.

subnets

string

클러스터 전체에서 네트워크에 사용할 서브넷입니다.

"topology":"layer2" 배포의 경우 IPv6 (2001:DBB::/64) 및 듀얼 스택 (192.168.100.0/24,2001:DBB::/64) 서브넷이 지원됩니다.

생략하면 네트워크를 구현하는 논리 스위치는 계층 2 통신만 제공하며 사용자는 Pod의 IP 주소를 구성해야 합니다. 포트 보안은 MAC 스푸핑만 방지합니다.

mtu

string

최대 전송 단위(MTU)입니다. 값을 설정하지 않으면 CNO(Cluster Network Operator)는 기본 네트워크 인터페이스의 오버레이 MTU, Geneve(Generic Network Virtualization Encapsulation)와 같은 Pod 네트워크의 오버레이 MTU 및 IPsec과 같은 활성화된 기능의 바이트 용량을 계산하여 기본 MTU 값을 설정합니다.

netAttachDefName

string

이 구성이 포함된 네트워크 연결 정의 CRD의 메타데이터 네임스페이스이름입니다. 예를 들어 이 구성이 l2-network 라는 네임스페이스 ns1NetworkAttachmentDefinition CRD에 정의된 경우 ns1/l2-network 로 설정해야 합니다.

excludeSubnets

string

쉼표로 구분된 CIDR 및 IP 주소 목록입니다. IP 주소는 할당 가능한 IP 주소 풀에서 제거되며 Pod에 전달되지 않습니다.

vlanID

integer

토폴로지가 localnet 으로 설정된 경우 지정된 VLAN 태그가 이 보조 네트워크의 트래픽에 할당됩니다. 기본값은 VLAN 태그를 할당하지 않는 것입니다.

3.1.1.3. 다중 네트워크 정책과의 호환성

k8s.cni.cncf.io API 그룹의 MultiNetworkPolicy CRD(사용자 정의 리소스 정의)에서 제공하는 다중 네트워크 정책 API는 OVN-Kubernetes 보조 네트워크와 호환됩니다. 네트워크 정책을 정의할 때 OVN-Kubernetes 보조 네트워크가 subnets 필드를 정의하는지 여부에 따라 사용할 수 있는 네트워크 정책 규칙입니다. 자세한 내용은 다음 표를 참조하십시오.

Expand
표 3.2. 서브넷 CNI 구성을 기반으로 지원되는 다중 네트워크 정책 선택기
subnets 필드 지정허용된 다중 네트워크 정책 선택기

제공됨

  • podSelectornamespaceSelector
  • ipBlock

없음

  • ipBlock

MultiNetworkPolicy 오브젝트에서 k8s.v1.cni.cncf.io/policy-for 주석을 사용하여 NetworkAttachmentDefinition (NAD) 사용자 정의 리소스(CR)를 가리킬 수 있습니다. CryostatD CR은 정책이 적용되는 네트워크를 정의합니다. 다음 예제 다중 네트워크 정책은 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 
1

spec:
  podSelector:
  ingress:
  - from:
    - podSelector: {}
Copy to Clipboard Toggle word wrap

다음 예제에서는 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
Copy to Clipboard Toggle word wrap

3.1.1.4. localnet 전환 토폴로지 구성

전환된 localnet 토폴로지는 클러스터 전체 논리 스위치를 물리적 네트워크에 통해 VNC(Network Attachment Definitions)로 생성된 워크로드를 상호 연결합니다.

보조 네트워크를 OVN-Kubernetes 보조 네트워크로 사용하려면 보조 네트워크를 OVN 브리지에 매핑해야 합니다. 브리지 매핑을 사용하면 네트워크 트래픽이 물리적 네트워크에 도달할 수 있습니다. 브리지 매핑은 인터페이스 레이블이라고도 하는 물리적 네트워크 이름을 OVS(Open vSwitch)로 생성된 브릿지에 연결합니다.

nmstate.io/v1 API 그룹의 일부인 NodeNetworkConfigurationPolicy (NNCP) 오브젝트를 생성하여 매핑을 선언적으로 생성할 수 있습니다. 이 API는 NMState Operator에서 제공합니다. 이 API를 사용하면 node-role.kubernetes.io/worker: '' 과 같이 지정된 nodeSelector 표현식과 일치하는 노드에 브리지 매핑을 적용할 수 있습니다. 이 선언적 접근 방식을 사용하면 NMState Operator는 노드 선택기에서 지정한 모든 노드에 보조 네트워크 구성을 자동으로 투명하게 적용합니다.

보조 네트워크를 연결할 때 기존 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
Copy to Clipboard Toggle word wrap

1 1
구성 오브젝트의 이름입니다.
2
노드 네트워크 구성 정책을 적용할 노드를 지정하는 노드 선택기입니다.
3
트래픽이 OVS 브리지로 전달되는 보조 네트워크의 이름입니다. 이 보조 네트워크는 OVN-Kubernetes 보조 네트워크를 정의하는 NetworkAttachmentDefinition CRD의 spec.config.name 필드 이름과 일치해야 합니다.
4
노드의 OVS 브리지 이름입니다. 이 값은 state: present 를 지정하는 경우에만 필요합니다.
5
매핑의 상태입니다. 브릿지를 추가하려면 이 브릿지가 존재 하거나 absent 여야 합니다. 기본값은 present 입니다.

다음 JSON 예제는 localnet1 이라는 localnet 보조 네트워크를 구성합니다. mtu 매개변수의 값은 br-ex 브릿지 인터페이스에 매핑되는 보조 네트워크 인터페이스에 설정된 MTU 값과 일치해야 합니다.

{
  "cniVersion": "0.3.1",
  "name": "localnet1",
  "type": "ovn-k8s-cni-overlay",
  "topology":"localnet",
  "physicalNetworkName": "localnet1",
  "subnets": "202.10.130.112/28",
  "vlanID": 33,
  "mtu": 1500,
  "netAttachDefName": "ns1/localnet-network",
  "excludeSubnets": "10.100.200.0/29"
}
Copy to Clipboard Toggle word wrap

다음 예에서 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
          mcast-snooping-enable: true 
4

        port:
        - name: eth1 
5

    ovn:
      bridge-mappings:
      - localnet: localnet2 
6

        bridge: ovs-br1 
7

        state: present 
8
Copy to Clipboard Toggle word wrap

1
구성 오브젝트의 이름을 지정합니다.
2
노드 네트워크 구성 정책이 적용되는 노드를 식별하는 노드 선택기를 지정합니다.
3
클러스터 트래픽에 OVN-Kubernetes에서 사용하는 기본 브리지와 별도로 작동하는 새 OVS 브리지를 지정합니다.
4
멀티 캐스트 스누핑 활성화 여부를 지정합니다. 활성화하면 멀티 캐스트 스누핑으로 네트워크 장치가 멀티캐스트 트래픽을 모든 네트워크 멤버로 플러드하는 것을 방지합니다. 기본적으로 OVS 브릿지는 멀티 캐스트 스누핑을 활성화하지 않습니다. 기본값은 false입니다.
5
새 OVS 브리지와 연결할 호스트 시스템의 네트워크 장치를 지정합니다.
6
트래픽을 OVS 브리지로 전달하는 보조 네트워크의 이름을 지정합니다. 이 이름은 OVN-Kubernetes 보조 네트워크를 정의하는 NetworkAttachmentDefinition CRD의 spec.config.name 필드 값과 일치해야 합니다.
7
노드의 OVS 브리지 이름을 지정합니다. 이 값은 state: present 가 설정된 경우에만 필요합니다.
8
매핑 상태를 지정합니다. 브릿지를 제거하기 위해 브리지 또는 absent 를 추가하는 유효한 값이 있습니다. 기본값은 present 입니다.

다음 JSON 예제는 localnet2 라는 localnet 보조 네트워크를 구성합니다. mtu 매개변수의 값은 eth1 보조 네트워크 인터페이스에 설정된 MTU 값과 일치해야 합니다.

{
  "cniVersion": "0.3.1",
  "name": "localnet2",
  "type": "ovn-k8s-cni-overlay",
  "topology":"localnet",
  "physicalNetworkName": "localnet2",
  "subnets": "202.10.130.112/28",
  "vlanID": 33,
  "mtu": 1500,
  "netAttachDefName": "ns1/localnet-network",
  "excludeSubnets": "10.100.200.0/29"
}
Copy to Clipboard Toggle word wrap
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"
}
Copy to Clipboard Toggle word wrap
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
Copy to Clipboard Toggle word wrap
3.1.1.6. 고정 IP 주소를 사용하여 Pod 구성

다음 예제에서는 고정 IP 주소를 사용하여 Pod를 프로비저닝합니다.

참고
  • 보조 네트워크 연결, 네임스페이스 범위의 오브젝트인 계층 2 또는 localnet 토폴로지를 사용하는 경우에만 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
Copy to Clipboard Toggle word wrap
1
네트워크의 이름입니다. 이 값은 모든 NetworkAttachmentDefinition CRD에서 고유해야 합니다.
2
인터페이스에 할당할 MAC 주소입니다.
3
Pod에 생성할 네트워크 인터페이스의 이름입니다.
4
네트워크 인터페이스에 할당할 IP 주소입니다.

3.2. 다른 CNI 플러그인을 사용하여 보조 네트워크 생성

보조 네트워크의 특정 구성 필드는 다음 섹션에 설명되어 있습니다.

3.2.1. 브리지 보조 네트워크 구성

다음 오브젝트는 브리지 CNI 플러그인의 구성 매개변수를 설명합니다.

Expand
표 3.3. 브릿지 CNI 플러그인 JSON 구성 오브젝트
필드유형설명

cniVersion

string

CNI 사양 버전입니다. 0.3.1 값이 필요합니다.

name

string

CNO 구성에 대해 이전에 제공한 name 매개변수의 값입니다.

type

string

구성할 CNI 플러그인의 이름: bridge.

ipam

object

IPAM CNI 플러그인의 구성 오브젝트입니다. 플러그인은 연결 정의에 대한 IP 주소 할당을 관리합니다.

Bridge

string

선택 사항: 사용할 가상 브리지의 이름을 지정합니다. 브릿지 인터페이스가 호스트에 없으면 생성됩니다. 기본값은 cni0입니다.

ipMasq

boolean

선택 사항: 가상 네트워크를 떠나는 트래픽에 대해 IP 마스커레이딩을 활성화하려면 true 로 설정합니다. 모든 트래픽의 소스 IP 주소가 브리지의 IP 주소로 다시 작성됩니다. 브리지에 IP 주소가 없으면 이 설정이 적용되지 않습니다. 기본값은 false입니다.

isGateway

boolean

선택 사항: 브릿지에 IP 주소를 할당하려면 true 로 설정합니다. 기본값은 false입니다.

isDefaultGateway

boolean

선택 사항: 브릿지를 가상 네트워크의 기본 게이트웨이로 구성하려면 true 로 설정합니다. 기본값은 false입니다. isDefaultGatewaytrue로 설정되면 isGateway도 자동으로 true로 설정됩니다.

forceAddress

boolean

선택 사항: 이전에 할당된 IP 주소를 가상 브리지에 할당할 수 있도록 true 로 설정합니다. false로 설정하면 중첩되는 하위 집합의 IPv4 주소 또는 IPv6 주소가 가상 브릿지에 지정되는 경우 오류가 발생합니다. 기본값은 false입니다.

hairpinMode

boolean

선택 사항: 가상 브리지가 수신한 가상 포트를 통해 이더넷 프레임을 다시 보낼 수 있도록 하려면 true 로 설정합니다. 이 모드를 반사 릴레이라고도 합니다. 기본값은 false입니다.

promiscMode

boolean

선택 사항: 브릿지에서 무차별 모드를 활성화하려면 true 로 설정합니다. 기본값은 false입니다.

vlan

string

선택 사항: VLAN(가상 LAN) 태그를 정수 값으로 지정합니다. 기본적으로 VLAN 태그는 할당되지 않습니다.

preserveDefaultVlan

string

선택 사항: 기본 vlan을 브리지에 연결된 veth 끝에 유지해야 하는지 여부를 나타냅니다. 기본값은 true입니다.

vlanTrunk

list

선택 사항: VLAN 트렁크 태그를 할당합니다. 기본값은 none 입니다.

mtu

integer

선택 사항: 최대 전송 단위(MTU)를 지정된 값으로 설정합니다. 기본값은 커널에 의해 자동으로 설정됩니다.

enabledad

boolean

선택 사항: 컨테이너 사이드 veth 에 대해 중복 주소 탐지를 활성화합니다. 기본값은 false입니다.

macspoofchk

boolean

선택 사항: mac 스푸핑 검사를 활성화하여 컨테이너에서 발생하는 트래픽을 인터페이스의 mac 주소로 제한합니다. 기본값은 false입니다.

참고

VLAN 매개 변수는 veth 의 호스트에서 VLAN 태그를 구성하고 브리지 인터페이스에서 vlan_filtering 기능도 활성화합니다.

참고

L2 네트워크에 대한 uplink를 구성하려면 다음 명령을 사용하여 uplink 인터페이스에서 VLAN을 허용해야 합니다.

$  bridge vlan add vid VLAN_ID dev DEV
Copy to Clipboard Toggle word wrap
3.2.1.1. 브릿지 CNI 플러그인 구성 예

다음 예제에서는 bridge-net 이라는 보조 네트워크를 구성합니다.

{
  "cniVersion": "0.3.1",
  "name": "bridge-net",
  "type": "bridge",
  "isGateway": true,
  "vlan": 2,
  "ipam": {
    "type": "dhcp"
    }
}
Copy to Clipboard Toggle word wrap

3.2.2. Bond CNI 보조 네트워크 구성

본딩 컨테이너 네트워크 인터페이스(Bond CNI)를 사용하면 여러 네트워크 인터페이스를 컨테이너 내의 단일 논리 "bonded" 인터페이스로 집계하여 네트워크 중복성 및 내결함성을 향상시킬 수 있습니다. 이 플러그인과의 본딩에는 SR-IOV VF(가상 기능)만 지원됩니다.

다음 표에서는 Bond CNI 플러그인의 구성 매개변수를 설명합니다.

Expand
표 3.4. 본딩 CNI 플러그인 JSON 구성 오브젝트
필드유형설명

name

string

이 CNI 네트워크 연결 정의에 지정된 이름을 지정합니다. 이 이름은 컨테이너 내의 인터페이스를 식별하고 참조하는 데 사용됩니다.

cniVersion

string

CNI 사양 버전입니다.

type

string

구성할 CNI 플러그인의 이름을 지정합니다. bond.

miimon

string

ARP(Address Resolution Protocol) 링크 모니터링 빈도를 밀리초 단위로 지정합니다. 이 매개 변수는 본딩 인터페이스에서 ARP 요청을 보내는 빈도를 정의하여 집계된 인터페이스의 가용성을 확인합니다.

mtu

integer

선택 사항: 본딩의 최대 전송 단위(MTU)를 지정합니다. 기본값은 1500입니다.

failOverMac

integer

선택 사항: 본딩의 failOverMac 설정을 지정합니다. 기본값은 0입니다.

mode

string

본딩 정책을 지정합니다.

linksInContainer

boolean

선택 사항: 본딩을 위해 의도한 네트워크 인터페이스를 본딩이 시작될 때 컨테이너의 네트워크 네임스페이스 내에서 직접 생성 및 사용할 수 있는지 여부를 지정합니다. 기본값인 false 인 경우 CNI 플러그인은 본딩을 생성하기 전에 먼저 호스트 시스템에서 이러한 인터페이스를 찾습니다.

links

object

본딩할 인터페이스를 지정합니다.

ipam

object

IPAM CNI 플러그인의 구성 오브젝트입니다. 플러그인은 연결 정의에 대한 IP 주소 할당을 관리합니다.

3.2.2.1. 본딩 CNI 플러그인 구성 예

다음 예제에서는 bond-net1 이라는 보조 네트워크를 구성합니다.

{
 "type": "bond",
 "cniVersion": "0.3.1",
 "name": "bond-net1",
 "mode": "active-backup",
 "failOverMac": 1,
 "linksInContainer": true,
 "miimon": "100",
 "mtu": 1500,
 "links": [
       {"name": "net1"},
       {"name": "net2"}
   ],
  "ipam": {
        "type": "host-local",
        "subnet": "10.56.217.0/24",
        "routes": [{
        "dst": "0.0.0.0/0"
        }],
        "gateway": "10.56.217.1"
    }
}
Copy to Clipboard Toggle word wrap

3.2.3. 호스트 장치 보조 네트워크 구성

참고

device ,hwaddr,kernelpath 또는 pciBusID 매개변수 중 하나만 설정하여 네트워크 장치를 지정합니다.

다음 오브젝트는 호스트 장치 CNI 플러그인의 구성 매개변수를 설명합니다.

Expand
표 3.5. 호스트 장치 CNI 플러그인 JSON 구성 오브젝트
필드유형설명

cniVersion

string

CNI 사양 버전입니다. 0.3.1 값이 필요합니다.

name

string

CNO 구성에 대해 이전에 제공한 name 매개변수의 값입니다.

type

string

구성할 CNI 플러그인의 이름: host-device.

device

string

선택사항: 장치 이름(예: eth0 )입니다.

hwaddr

string

선택사항: 장치 하드웨어 MAC 주소입니다.

kernelpath

string

선택 사항: Linux 커널 장치 경로(예: /sys/devices/pci0000:00/0000:00:1f.6 )

pciBusID

string

선택 사항: 네트워크 장치의 PCI 주소(예: 0000:00:1f.6 )

3.2.3.1. 호스트 장치 구성 예

다음 예제에서는 hostdev-net 이라는 보조 네트워크를 구성합니다.

{
  "cniVersion": "0.3.1",
  "name": "hostdev-net",
  "type": "host-device",
  "device": "eth1"
}
Copy to Clipboard Toggle word wrap

3.2.4. VLAN 보조 네트워크 구성

다음 오브젝트는 VLAN, vlan, CNI 플러그인의 구성 매개변수를 설명합니다.

Expand
표 3.6. VLAN CNI 플러그인 JSON 구성 오브젝트
필드유형설명

cniVersion

string

CNI 사양 버전입니다. 0.3.1 값이 필요합니다.

name

string

CNO 구성에 대해 이전에 제공한 name 매개변수의 값입니다.

type

string

구성할 CNI 플러그인의 이름: vlan.

master

string

네트워크 연결과 연결할 이더넷 인터페이스입니다. 마스터를 지정하지 않으면 기본 네트워크 경로에 대한 인터페이스가 사용됩니다.

vlanId

integer

vlan 의 ID를 설정합니다.

ipam

object

IPAM CNI 플러그인의 구성 오브젝트입니다. 플러그인은 연결 정의에 대한 IP 주소 할당을 관리합니다.

mtu

integer

선택 사항: 최대 전송 단위(MTU)를 지정된 값으로 설정합니다. 기본값은 커널에 의해 자동으로 설정됩니다.

dns

integer

선택 사항: 반환할 DNS 정보입니다. 예를 들어 우선순위가 지정된 DNS 이름 서버 목록입니다.

linkInContainer

boolean

선택 사항: 마스터 인터페이스가 컨테이너 네트워크 네임스페이스에 있는지 또는 기본 네트워크 네임스페이스에 있는지 여부를 지정합니다. 컨테이너 네임스페이스 마스터 인터페이스 사용을 요청하려면 값을 true 로 설정합니다.

중요

CNI 플러그인은 동일한 마스터 인터페이스에서 동일한 vlanId 를 사용하여 여러 vlan 하위 인터페이스를 생성할 수 없기 때문에 vlan 구성이 포함된 NetworkAttachmentDefinition CRD(사용자 정의 리소스 정의)는 노드의 단일 Pod에서만 사용할 수 있습니다.

3.2.4.1. VLAN 구성 예

다음 예제에서는 vlan -net 이라는 보조 네트워크가 있는 vlan 구성을 보여줍니다.

{
  "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" ]
  }
}
Copy to Clipboard Toggle word wrap

3.2.5. IPVLAN 보조 네트워크에 대한 구성

다음 오브젝트는 IPVLAN, ipvlan, CNI 플러그인의 구성 매개변수를 설명합니다.

Expand
표 3.7. IPVLAN CNI 플러그인 JSON 구성 오브젝트
필드유형설명

cniVersion

string

CNI 사양 버전입니다. 0.3.1 값이 필요합니다.

name

string

CNO 구성에 대해 이전에 제공한 name 매개변수의 값입니다.

type

string

구성할 CNI 플러그인의 이름: ipvlan.

ipam

object

IPAM CNI 플러그인의 구성 오브젝트입니다. 플러그인은 연결 정의에 대한 IP 주소 할당을 관리합니다. 플러그인이 연결되어 있지 않으면 이 작업이 필요합니다.

mode

string

선택사항: 가상 네트워크의 작동 모드입니다. 값은 l2, l3 또는 l3s여야 합니다. 기본값은 l2입니다.

master

string

선택 사항: 네트워크 연결과 연결할 이더넷 인터페이스입니다. 마스터를 지정하지 않으면 기본 네트워크 경로에 대한 인터페이스가 사용됩니다.

mtu

integer

선택 사항: 최대 전송 단위(MTU)를 지정된 값으로 설정합니다. 기본값은 커널에 의해 자동으로 설정됩니다.

linkInContainer

boolean

선택 사항: 마스터 인터페이스가 컨테이너 네트워크 네임스페이스에 있는지 또는 기본 네트워크 네임스페이스에 있는지 여부를 지정합니다. 컨테이너 네임스페이스 마스터 인터페이스 사용을 요청하려면 값을 true 로 설정합니다.

중요
  • ipvlan 오브젝트에서는 가상 인터페이스가 마스터 인터페이스와 통신할 수 없습니다. 따라서 컨테이너는 ipvlan 인터페이스를 사용하여 호스트에 연결할 수 없습니다. 컨테이너가PTP(Precision Time Protocol)를 지원하는 네트워크와 같이 호스트에 대한 연결을 제공하는 네트워크에 참여하고 있는지 확인합니다.
  • 단일 마스터 인터페이스는 macvlanipvlan 을 둘 다 사용하도록 동시에 구성할 수 없습니다.
  • 인터페이스와 무관할 수 없는 IP 할당 체계의 경우 ipvlan 플러그인은 이 논리를 처리하는 이전 플러그인과 연결할 수 있습니다. 마스터 를 생략한 경우 이전 결과에 슬레이브를 부여하려면 ipvlan 플러그인에 대한 단일 인터페이스 이름이 포함되어야 합니다. ipam 을 생략하면 이전 결과가 ipvlan 인터페이스를 구성하는 데 사용됩니다.
3.2.5.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"
       }
    ]
  }
}
Copy to Clipboard Toggle word wrap

3.2.6. MACVLAN 보조 네트워크 구성

다음 오브젝트는 MACVLAN(Container Network Interface) 플러그인의 구성 매개변수를 설명합니다.

Expand
표 3.8. MACVLAN CNI 플러그인 JSON 구성 오브젝트
필드유형설명

cniVersion

string

CNI 사양 버전입니다. 0.3.1 값이 필요합니다.

name

string

CNO 구성에 대해 이전에 제공한 name 매개변수의 값입니다.

type

string

구성할 CNI 플러그인의 이름: macvlan.

ipam

object

IPAM CNI 플러그인의 구성 오브젝트입니다. 플러그인은 연결 정의에 대한 IP 주소 할당을 관리합니다.

mode

string

선택 사항: 가상 네트워크에 대한 트래픽 가시성을 구성합니다. bridge, passthru, private 또는 vepa 중 하나여야 합니다. 값을 입력하지 않으면 기본값은 bridge입니다.

master

string

선택 사항: 새로 생성된 macvlan 인터페이스와 연결할 호스트 네트워크 인터페이스입니다. 값을 지정하지 않으면 기본 경로 인터페이스가 사용됩니다.

mtu

integer

선택 사항: 지정된 값으로 최대 전송 단위(MTU)입니다. 기본값은 커널에 의해 자동으로 설정됩니다.

linkInContainer

boolean

선택 사항: 마스터 인터페이스가 컨테이너 네트워크 네임스페이스에 있는지 또는 기본 네트워크 네임스페이스에 있는지 여부를 지정합니다. 컨테이너 네임스페이스 마스터 인터페이스 사용을 요청하려면 값을 true 로 설정합니다.

참고

플러그인 구성에 대한 마스터 키를 지정하는 경우 기본 네트워크 플러그인과 연결된 것과 다른 물리적 네트워크 인터페이스를 사용하여 가능한 충돌을 방지합니다.

3.2.6.1. MACVLAN CNI 플러그인 구성 예

다음 예제에서는 macvlan-net 이라는 보조 네트워크를 구성합니다.

{
  "cniVersion": "0.3.1",
  "name": "macvlan-net",
  "type": "macvlan",
  "master": "eth1",
  "linkInContainer": false,
  "mode": "bridge",
  "ipam": {
    "type": "dhcp"
    }
}
Copy to Clipboard Toggle word wrap

3.2.7. Cryostat 보조 네트워크에 대한 구성

다음 오브젝트는 Cryostat CNI 플러그인의 구성 매개변수를 설명합니다.

Expand
표 3.9. Buildah CNI 플러그인 JSON 구성 오브젝트
필드유형설명

cniVersion

string

CNI 사양 버전입니다. 0.3.1 값이 필요합니다.

name

string

CNO 구성에 대해 이전에 제공한 name 매개변수의 값입니다.

type

string

구성할 CNI 플러그인의 이름입니다. 탭합니다.

mac

string

선택 사항: 인터페이스에 지정된 MAC 주소를 요청합니다.

mtu

integer

선택 사항: 최대 전송 단위(MTU)를 지정된 값으로 설정합니다. 기본값은 커널에 의해 자동으로 설정됩니다.

selinuxcontext

string

선택 사항: 탭 장치와 연결할 SELinux 컨텍스트입니다.

참고

OpenShift Container Platform에는 system_u:system_r:container_t:s0 값이 필요합니다.

multiQueue

boolean

선택 사항: 다중 큐를 활성화하려면 true 로 설정합니다.

소유자

integer

선택 사항: 탭 장치를 소유한 사용자입니다.

group

integer

선택 사항: 탭 장치를 소유한 그룹입니다.

Bridge

string

선택 사항: 탭 장치를 기존 브리지의 포트로 설정합니다.

3.2.7.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"
}
Copy to Clipboard Toggle word wrap
3.2.7.2. Cryostat CNI 플러그인에 대한 SELinux 부울 설정

container_t SELinux 컨텍스트를 사용하여 탭 장치를 생성하려면 MCO(Machine Config Operator)를 사용하여 호스트에서 container_use_devices 부울을 활성화합니다.

사전 요구 사항

  • OpenShift CLI(oc)가 설치되어 있습니다.

프로세스

  1. 다음 세부 정보를 사용하여 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
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 새 MachineConfig 오브젝트를 만듭니다.

    $ oc apply -f setsebool-container-use-devices.yaml
    Copy to Clipboard Toggle word wrap
    참고

    MachineConfig 오브젝트에 변경 사항을 적용하면 변경 사항이 적용된 후 영향을 받는 모든 노드가 정상적으로 재부팅됩니다. 이 업데이트를 적용하는 데 시간이 다소 걸릴 수 있습니다.

  3. 다음 명령을 실행하여 변경 사항이 적용되었는지 확인합니다.

    $ oc get machineconfigpools
    Copy to Clipboard Toggle word wrap

    예상 출력

    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
    Copy to Clipboard Toggle word wrap

    참고

    모든 노드는 업데이트 및 준비 상태에 있어야 합니다.

3.2.8. 보조 네트워크에서 route-override 플러그인을 사용하여 경로 구성

다음 오브젝트는 route-override CNI 플러그인의 구성 매개변수를 설명합니다.

Expand
표 3.10. 경로 덮어쓰기 CNI 플러그인 JSON 구성 오브젝트
필드유형설명

type

string

구성할 CNI 플러그인의 이름: route-override.

flushroutes

boolean

선택 사항: 기존 경로를 플러시하려면 true 로 설정합니다.

flushgateway

boolean

선택 사항: 기본 경로 이름을 게이트웨이 경로로 플러시하려면 true 로 설정합니다.

delroutes

object

선택 사항: 컨테이너 네임스페이스에서 삭제할 경로 목록을 지정합니다.

addroutes

object

선택 사항: 컨테이너 네임스페이스에 추가할 경로 목록을 지정합니다. 각 경로는 dst 및 선택적 gw 필드가 있는 사전입니다. gw 를 생략하면 플러그인은 기본 게이트웨이 값을 사용합니다.

skipcheck

boolean

선택 사항: check 명령을 건너뛰려면 true 로 설정합니다. 기본적으로 CNI 플러그인은 컨테이너 라이프사이클 중에 네트워크 설정을 확인합니다. route-override 를 사용하여 경로를 동적으로 수정할 때 이 검사를 건너뛰면 최종 구성이 업데이트된 경로를 반영하는지 확인합니다.

3.2.8.1. route-override 플러그인 구성 예

route-override CNI는 상위 CNI와 연결할 때 사용하도록 설계된 CNI 유형입니다. 독립적으로 작동하지 않지만 상위 CNI를 사용하여 먼저 네트워크 인터페이스를 생성하고 라우팅 규칙을 수정할 수 있기 전에 IP 주소를 할당합니다.

다음 예제에서는 mymacvlan 이라는 보조 네트워크를 구성합니다. 상위 CNI는 eth1 에 연결된 네트워크 인터페이스를 생성하고 host-local IPAM을 사용하여 192.168.1.0/24 범위의 IP 주소를 할당합니다. 그런 다음 route-override CNI가 상위 CNI에 연결되고 기존 경로를 플러시하고, 192.168.0.0/24에 대한 경로를 삭제하고, 사용자 지정 게이트웨이를 사용하여 192.168.0.0/24 에 대한 새 경로를 추가하여 라우팅 규칙을 수정합니다.

{
    "cniVersion": "0.3.0",
    "name": "mymacvlan",
    "plugins": [
        {
            "type": "macvlan",         
1

            "master": "eth1",
            "mode": "bridge",
            "ipam": {
                "type": "host-local",
                "subnet": "192.168.1.0/24"
            }
        },
        {
            "type": "route-override",    
2

            "flushroutes": true,
            "delroutes": [
                {
                    "dst": "192.168.0.0/24"
                }
            ],
            "addroutes": [
                {
                    "dst": "192.168.0.0/24",
                    "gw": "10.1.254.254"
                }
            ]
        }
    ]
}
Copy to Clipboard Toggle word wrap
1
상위 CNI는 eth1 에 연결된 네트워크 인터페이스를 생성합니다.
2
연결된 경로 조정 CNI 는 라우팅 규칙을 수정합니다.

3.3. 보조 네트워크에 Pod 연결

클러스터 사용자는 pod를 보조 네트워크에 연결할 수 있습니다.

3.3.1. 보조 네트워크에 pod 추가

보조 네트워크에 pod를 추가할 수 있습니다. Pod는 기본 네트워크를 통해 정상적인 클러스터 관련 네트워크 트래픽을 계속 전송합니다.

Pod가 생성되면 보조 네트워크가 포드에 연결됩니다. 그러나 pod가 이미 있는 경우 보조 네트워크를 연결할 수 없습니다.

Pod는 보조 네트워크와 동일한 네임스페이스에 있어야 합니다.

사전 요구 사항

  • OpenShift CLI(oc)를 설치합니다.
  • 클러스터에 로그인합니다.

프로세스

  1. Pod 오브젝트에 주석을 추가합니다. 다음 주석 형식 중 하나만 사용할 수 있습니다.

    1. 사용자 정의 없이 보조 네트워크를 연결하려면 다음 형식으로 주석을 추가합니다. & lt;network >를 Pod와 연결할 보조 네트워크의 이름으로 바꿉니다.

      metadata:
        annotations:
          k8s.v1.cni.cncf.io/networks: <network>[,<network>,...] 
      1
      Copy to Clipboard Toggle word wrap
      1
      두 개 이상의 보조 네트워크를 지정하려면 각 네트워크를 쉼표로 구분합니다. 쉼표 사이에 공백을 포함하지 마십시오. 동일한 보조 네트워크를 여러 번 지정하면 Pod에 해당 네트워크에 여러 개의 네트워크 인터페이스가 연결됩니다.
    2. 사용자 지정으로 보조 네트워크를 연결하려면 다음 형식으로 주석을 추가합니다.

      metadata:
        annotations:
          k8s.v1.cni.cncf.io/networks: |-
            [
              {
                "name": "<network>", 
      1
      
                "namespace": "<namespace>", 
      2
      
                "default-route": ["<default_route>"] 
      3
      
              }
            ]
      Copy to Clipboard Toggle word wrap
      1
      NetworkAttachmentDefinition 오브젝트에서 정의한 보조 네트워크의 이름을 지정합니다.
      2
      NetworkAttachmentDefinition 오브젝트가 정의된 네임스페이스를 지정합니다.
      3
      선택 사항: 기본 경로에 대한 재정의를 지정합니다(예: 192.168.17.1).
  2. Pod를 생성하려면 다음 명령을 입력합니다. <name>을 Pod 이름으로 교체합니다.

    $ oc create -f <name>.yaml
    Copy to Clipboard Toggle word wrap
  3. 선택사항: Pod CR에 주석이 있는지 확인하려면 다음 명령을 입력하고 <name>을 Pod 이름으로 교체합니다.

    $ oc get pod <name> -o yaml
    Copy to Clipboard Toggle word wrap

    다음 예에서 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:
      ...
    Copy to Clipboard Toggle word wrap
    1
    k8s.v1.cni.cncf.io/network-status 매개변수는 JSON 오브젝트 배열입니다. 각 오브젝트는 Pod에 연결된 보조 네트워크의 상태를 설명합니다. 주석 값은 일반 텍스트 값으로 저장됩니다.
3.3.1.1. Pod별 주소 지정 및 라우팅 옵션 지정

보조 네트워크에 Pod를 연결할 때 특정 Pod에서 해당 네트워크에 대한 추가 속성을 지정할 수 있습니다. 이를 통해 라우팅의 일부 측면을 변경하고 고정 IP 주소 및 MAC 주소를 지정할 수 있습니다. 이를 위해 JSON 형식의 주석을 사용할 수 있습니다.

사전 요구 사항

  • Pod는 보조 네트워크와 동일한 네임스페이스에 있어야 합니다.
  • OpenShift CLI(oc)를 설치합니다.
  • 클러스터에 로그인해야 합니다.

프로세스

주소 지정 및/또는 라우팅 옵션을 지정하는 동안 보조 네트워크에 Pod를 추가하려면 다음 단계를 완료하십시오.

  1. Pod 리소스 정의를 편집합니다. 기존 Pod 리소스를 편집하는 경우 다음 명령을 실행하여 기본 편집기에서 정의를 편집합니다. <name>을 편집할 Pod 리소스의 이름으로 교체합니다.

    $ oc edit pod <name>
    Copy to Clipboard Toggle word wrap
  2. Pod 리소스 정의에서 k8s.v1.cni.cncf.io/networks 매개변수를 Pod metadata 매핑에 추가합니다. k8s.v1.cni.cncf.io/networks는 추가 특성을 지정하는 것 외에도 NetworkAttachmentDefinition Custom Resource(CR) 이름을 참조하는 오브젝트 목록의 JSON 문자열을 허용합니다.

    metadata:
      annotations:
        k8s.v1.cni.cncf.io/networks: '[<network>[,<network>,...]]'
    # ...
    Copy to Clipboard Toggle word wrap

    다음과 같습니다.

    <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
    Copy to Clipboard Toggle word wrap

    다음과 같습니다.

    name
    name 키는 Pod와 연결할 보조 네트워크의 이름입니다.
    default-route
    default-route 키는 라우팅 테이블에 다른 라우팅 항목이 없는 경우 트래픽이 라우팅될 게이트웨이 값을 지정합니다. default-route 키가 두 개 이상 지정되면 Pod가 활성화되지 않습니다.

    기본 경로는 다른 경로에 지정되지 않은 모든 트래픽이 게이트웨이로 라우팅되도록 합니다.

    중요

    OpenShift Container Platform의 기본 네트워크 인터페이스 이외의 인터페이스로 기본 경로를 설정하면 Pod 사이에서 트래픽이 라우팅될 것으로 예상되는 트래픽이 다른 인터페이스를 통해 라우팅될 수 있습니다.

    Pod의 라우팅 속성을 확인하려면 oc 명령을 사용하여 Pod에서 ip 명령을 실행하십시오.

    $ oc exec -it <pod_name> -- ip route
    Copy to Clipboard Toggle word wrap
    참고

    JSON 형식의 오브젝트 목록에 default-route 키가 있으므로 Pod의 k8s.v1.cni.cncf.io/network-status 를 참조하여 기본 경로가 할당된 보조 네트워크를 확인할 수도 있습니다.

    Pod의 고정 IP 주소 또는 MAC 주소를 설정하려면 JSON 형식의 주석을 사용하면 됩니다. 이를 위해서는 이러한 기능을 특별하게 허용하는 네트워크를 생성해야 합니다. 이는 다음과 같이 CNO의 rawCNIConfig에서 지정할 수 있습니다.

  3. 다음 명령을 실행하여 CNO CR을 편집합니다.

    $ oc edit networks.operator.openshift.io cluster
    Copy to Clipboard Toggle word wrap

    다음 YAML은 CNO의 구성 매개변수를 설명합니다.

    CNO(Cluster Network Operator) YAML 구성

    name: <name> 
    1
    
    namespace: <namespace> 
    2
    
    rawCNIConfig: '{ 
    3
    
      ...
    }'
    type: Raw
    Copy to Clipboard Toggle word wrap

    다음과 같습니다.

    name
    생성 중인 보조 네트워크 연결의 이름을 지정합니다. 이름은 지정된 namespace 내에서 고유해야 합니다.
    네임스페이스
    네트워크를 연결한 네임스페이스를 지정합니다. 값을 지정하지 않으면 default 네임스페이스가 사용됩니다.
    rawCNIConfig
    다음 템플릿을 기반으로 CNI 플러그인 구성을 JSON 형식으로 지정합니다.

    다음 오브젝트는 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"
        }]
    }
    Copy to Clipboard Toggle word wrap

    다음과 같습니다.

    name
    생성할 보조 네트워크 연결의 이름을 지정합니다. 이름은 지정된 namespace 내에서 고유해야 합니다.
    plugins
    CNI 플러그인 구성의 배열을 지정합니다. 첫 번째 오브젝트는 macvlan 플러그인 구성을 지정하고 두 번째 오브젝트는 튜닝 플러그인 구성을 지정합니다.
    ips
    CNI 플러그인 런타임 구성 기능의 고정 IP 주소 기능을 활성화하기 위한 요청이 수행되도록 지정합니다.
    master
    macvlan 플러그인에서 사용하는 인터페이스를 지정합니다.
    mac
    CNI 플러그인의 정적 MAC 주소 기능을 활성화하기 위한 요청이 수행되도록 지정합니다.

    그런 다음 위의 네트워크 연결을 키와 함께 JSON 형식 주석에서 참조하여 지정된 Pod에 할당할 고정 IP 및 MAC 주소를 지정할 수 있습니다.

    다음을 사용하여 Pod를 편집합니다.

    $ oc edit pod <name>
    Copy to Clipboard Toggle word wrap

    고정 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
    
          }
        ]'
    Copy to Clipboard Toggle word wrap

    1 1 1 1
    위의 rawCNIConfig를 구성하는 경우에는 제공되는 <name>을 사용해야 합니다.
    2 2 2 2
    서브넷 마스크를 포함하여 IP 주소를 제공합니다.
    3 3 3
    MAC 주소를 입력합니다.
    참고

    고정 IP 주소와 MAC 주소를 동시에 사용할 필요는 없으며 개별적으로 또는 함께 사용할 수 있습니다.

  4. 보조 네트워크가 있는 Pod의 IP 주소 및 MAC 속성을 확인하려면 oc 명령을 사용하여 Pod에서 ip 명령을 실행합니다.

    $ oc exec -it <pod_name> -- ip a
    Copy to Clipboard Toggle word wrap

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가 지원되지 않습니다.

3.4.1. 다중 네트워크 정책과 네트워크 정책의 차이점

MultiNetworkPolicy API는 NetworkPolicy API를 구현하지만 다음과 같은 몇 가지 중요한 차이점이 있습니다.

  • MultiNetworkPolicy API를 사용해야 합니다.

    apiVersion: k8s.cni.cncf.io/v1beta1
    kind: MultiNetworkPolicy
    Copy to Clipboard Toggle word wrap
  • CLI를 사용하여 다중 네트워크 정책과 상호 작용할 때 multi-networkpolicy 리소스 이름을 사용해야 합니다. 예를 들어 oc get multi-networkpolicy <name> 명령을 사용하여 다중 네트워크 정책 오브젝트를 볼 수 있습니다. 여기서 <name>은 다중 네트워크 정책의 이름입니다.
  • MultiNetworkPolicy 오브젝트에서 k8s.v1.cni.cncf.io/policy-for 주석을 사용하여 NetworkAttachmentDefinition (NAD) 사용자 정의 리소스(CR)를 가리킬 수 있습니다. CryostatD CR은 정책이 적용되는 네트워크를 정의합니다.

    k8s.v1.cni.cncf.io/policy-for 주석을 포함하는 다중 네트워크 정책의 예

    apiVersion: k8s.cni.cncf.io/v1beta1
    kind: MultiNetworkPolicy
    metadata:
      annotations:
        k8s.v1.cni.cncf.io/policy-for:<namespace_name>/<network_name>
    Copy to Clipboard Toggle word wrap

    다음과 같습니다.

    <namespace_name>
    네임스페이스 이름을 지정합니다.
    <network_name>
    네트워크 연결 정의의 이름을 지정합니다.

3.4.2. 클러스터의 다중 네트워크 정책 활성화

클러스터 관리자는 클러스터에서 다중 네트워크 정책 지원을 활성화할 수 있습니다.

사전 요구 사항

  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 권한이 있는 사용자로 클러스터에 로그인합니다.

프로세스

  1. 다음 YAML을 사용하여 multinetwork-enable-patch.yaml 파일을 생성합니다.

    apiVersion: operator.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      useMultiNetworkPolicy: true
    Copy to Clipboard Toggle word wrap
  2. 다중 네트워크 정책을 활성화하도록 클러스터를 구성합니다. 성공적인 출력에는 정책 오브젝트의 이름과 패치 된 상태가 나열됩니다.

    $ oc patch network.operator.openshift.io cluster --type=merge --patch-file=multinetwork-enable-patch.yaml
    Copy to Clipboard Toggle word wrap

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
Copy to Clipboard Toggle word wrap

1
이 규칙은 수신되는 ICMPv6 인접 요청 메시지(NDP)를 허용합니다. 이러한 메시지는 인접 노드의 링크 계층 주소를 결정하는 데 도움이 됩니다.
2
이 규칙은 NDP의 일부인 들어오는 ICMPv6 인접 광고 메시지를 허용하고 송신자의 링크 계층 주소에 대한 정보를 제공합니다.
3
이 규칙은 들어오는 ICMPv6 라우터 요청 메시지를 허용합니다. 호스트는 이러한 메시지를 사용하여 라우터 구성 정보를 요청합니다.
4
이 규칙은 들어오는 ICMPv6 라우터 알림 메시지를 허용하여 호스트에 구성 정보를 제공합니다.
참고

사전 정의된 규칙은 편집할 수 없습니다.

이러한 규칙은 IPv6 환경의 주소 확인 및 라우터 통신을 포함하여 올바른 네트워크 기능을 위해 필수 ICMPv6 트래픽을 집합적으로 활성화합니다. 이러한 규칙과 트래픽을 거부하는 다중 네트워크 정책에서는 애플리케이션에 연결 문제가 발생하지 않습니다.

3.4.4. 다중 네트워크 정책 작업

클러스터 관리자는 다중 네트워크 정책을 생성, 편집, 보기 및 삭제할 수 있습니다.

3.4.4.1. 사전 요구 사항
  • 클러스터에 대한 다중 네트워크 정책 지원을 활성화했습니다.
3.4.4.2. CLI를 사용하여 다중 네트워크 정책 생성

클러스터의 네임스페이스에서 허용된 수신 또는 송신 네트워크 트래픽을 설명하는 세분화된 규칙을 정의하기 위해 다중 네트워크 정책을 생성할 수 있습니다.

사전 요구 사항

  • 클러스터는 mode: NetworkPolicy 로 설정된 OVN-Kubernetes 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다.
  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 권한이 있는 사용자로 클러스터에 로그인했습니다.
  • 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.

프로세스

  1. 다음과 같이 정책 규칙을 생성합니다.

    1. <policy_name>.yaml 파일을 생성합니다.

      $ touch <policy_name>.yaml
      Copy to Clipboard Toggle word wrap

      다음과 같습니다.

      <policy_name>
      다중 네트워크 정책 파일 이름을 지정합니다.
    2. 방금 만든 파일에서 다음 예와 같이 다중 네트워크 정책을 정의합니다.

      모든 네임스페이스의 모든 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: []
      Copy to Clipboard Toggle word wrap

      다음과 같습니다.

      <network_name>
      네트워크 연결 정의의 이름을 지정합니다.

      동일한 네임 스페이스에 있는 모든 Pod의 수신 허용

      apiVersion: k8s.cni.cncf.io/v1beta1
      kind: MultiNetworkPolicy
      metadata:
        name: allow-same-namespace
        annotations:
          k8s.v1.cni.cncf.io/policy-for:<namespace_name>/<network_name>
      spec:
        podSelector:
        ingress:
        - from:
          - podSelector: {}
      Copy to Clipboard Toggle word wrap

      다음과 같습니다.

      <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:<namespace_name>/<network_name>
      spec:
        podSelector:
         matchLabels:
            pod: pod-a
        policyTypes:
        - Ingress
        ingress:
        - from:
          - namespaceSelector:
              matchLabels:
                 kubernetes.io/metadata.name: namespace-y
      Copy to Clipboard Toggle word wrap

      다음과 같습니다.

      <network_name>
      네트워크 연결 정의의 이름을 지정합니다.

      서비스로 트래픽 제한

      이 정책을 적용하면 app=bookstorerole=api 레이블이 모두 있는 모든 Pod는 app=bookstore 레이블이 있는 Pod에서만 액세스할 수 있습니다. 이 예에서 애플리케이션은 app=bookstorerole=api 레이블이 있는 REST API 서버일 수 있습니다.

      이 예제에서는 다음 사용 사례를 해결합니다.

      • 서비스에 대한 트래픽을 사용해야 하는 다른 마이크로 서비스로만 제한합니다.
      • 애플리케이션을 사용하는 애플리케이션만 허용하도록 데이터베이스에 대한 연결을 제한합니다.

        apiVersion: k8s.cni.cncf.io/v1beta1
        kind: MultiNetworkPolicy
        metadata:
          name: api-allow
          annotations:
            k8s.v1.cni.cncf.io/policy-for:<namespace_name>/<network_name>
        spec:
          podSelector:
            matchLabels:
              app: bookstore
              role: api
          ingress:
          - from:
              - podSelector:
                  matchLabels:
                    app: bookstore
        Copy to Clipboard Toggle word wrap

        다음과 같습니다.

        <network_name>
        네트워크 연결 정의의 이름을 지정합니다.
  2. 다중 네트워크 정책 오브젝트를 생성하려면 다음 명령을 입력합니다. 성공적인 출력에는 정책 오브젝트의 이름과 생성된 상태가 나열됩니다.

    $ oc apply -f <policy_name>.yaml -n <namespace>
    Copy to Clipboard Toggle word wrap

    다음과 같습니다.

    <policy_name>
    다중 네트워크 정책 파일 이름을 지정합니다.
    <namespace>
    선택적 매개변수입니다. 현재 네임스페이스와 다른 네임스페이스에 오브젝트를 정의한 경우 매개변수는 네임스페이스를 지정합니다.

    성공적인 출력에는 정책 오브젝트의 이름과 생성된 상태가 나열됩니다.

참고

cluster-admin 권한을 사용하여 웹 콘솔에 로그인하는 경우 클러스터의 모든 네임스페이스에서 직접 또는 웹 콘솔의 양식에서 네트워크 정책을 생성할 수 있습니다.

3.4.4.3. 다중 네트워크 정책 편집

네임스페이스에서 다중 네트워크 정책을 편집할 수 있습니다.

사전 요구 사항

  • 클러스터는 mode: NetworkPolicy 로 설정된 OVN-Kubernetes 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다.
  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 권한이 있는 사용자로 클러스터에 로그인합니다.
  • 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.

프로세스

  1. 선택 사항: 네임스페이스의 다중 네트워크 정책 오브젝트를 나열하려면 다음 명령을 입력합니다.

    $ oc get multi-networkpolicy
    Copy to Clipboard Toggle word wrap

    다음과 같습니다.

    <namespace>
    선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
  2. 다중 네트워크 정책 오브젝트를 편집합니다.

    • 다중 네트워크 정책 정의를 파일에 저장한 경우 파일을 편집하고 필요한 사항을 변경한 후 다음 명령을 입력합니다.

      $ oc apply -n <namespace> -f <policy_file>.yaml
      Copy to Clipboard Toggle word wrap

      다음과 같습니다.

      <namespace>
      선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
      <policy_file>
      네트워크 정책이 포함된 파일의 이름을 지정합니다.
    • 다중 네트워크 정책 오브젝트를 직접 업데이트해야 하는 경우 다음 명령을 입력합니다.

      $ oc edit multi-networkpolicy <policy_name> -n <namespace>
      Copy to Clipboard Toggle word wrap

      다음과 같습니다.

      <policy_name>
      네트워크 정책의 이름을 지정합니다.
      <namespace>
      선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
  3. 다중 네트워크 정책 오브젝트가 업데이트되었는지 확인합니다.

    $ oc describe multi-networkpolicy <policy_name> -n <namespace>
    Copy to Clipboard Toggle word wrap

    다음과 같습니다.

    <policy_name>
    다중 네트워크 정책의 이름을 지정합니다.
    <namespace>
    선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
참고

cluster-admin 권한을 사용하여 웹 콘솔에 로그인하는 경우 Actions 메뉴를 통해 클러스터의 모든 네임스페이스에서 직접 또는 웹 콘솔의 정책에서 네트워크 정책을 편집할 수 있습니다.

3.4.4.4. CLI를 사용하여 다중 네트워크 정책 보기

네임스페이스에서 다중 네트워크 정책을 검사할 수 있습니다.

사전 요구 사항

  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 권한이 있는 사용자로 클러스터에 로그인합니다.
  • 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.

프로세스

  • 네임스페이스의 다중 네트워크 정책을 나열합니다.

    • 네임스페이스에 정의된 다중 네트워크 정책 오브젝트를 보려면 다음 명령을 입력합니다.

      $ oc get multi-networkpolicy
      Copy to Clipboard Toggle word wrap
    • 선택 사항: 특정 다중 네트워크 정책을 검사하려면 다음 명령을 입력합니다.

      $ oc describe multi-networkpolicy <policy_name> -n <namespace>
      Copy to Clipboard Toggle word wrap

      다음과 같습니다.

      <policy_name>
      검사할 다중 네트워크 정책의 이름을 지정합니다.
      <namespace>
      선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
참고

cluster-admin 권한을 사용하여 웹 콘솔에 로그인하는 경우 YAML 또는 웹 콘솔의 양식에서 클러스터의 모든 네임스페이스에서 네트워크 정책을 직접 볼 수 있습니다.

3.4.4.5. CLI를 사용하여 다중 네트워크 정책 삭제

네임스페이스에서 다중 네트워크 정책을 삭제할 수 있습니다.

사전 요구 사항

  • 클러스터는 mode: NetworkPolicy 로 설정된 OVN-Kubernetes 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다.
  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 권한이 있는 사용자로 클러스터에 로그인했습니다.
  • 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.

프로세스

  • 다중 네트워크 정책 오브젝트를 삭제하려면 다음 명령을 입력합니다. 성공적인 출력에는 정책 오브젝트의 이름과 삭제된 상태가 나열됩니다.

    $ oc delete multi-networkpolicy <policy_name> -n <namespace>
    Copy to Clipboard Toggle word wrap

    다음과 같습니다.

    <policy_name>
    다중 네트워크 정책의 이름을 지정합니다.
    <namespace>
    선택적 매개변수입니다. 현재 네임스페이스와 다른 네임스페이스에 오브젝트를 정의한 경우 매개변수는 네임스페이스를 지정합니다.

    성공적인 출력에는 정책 오브젝트의 이름과 삭제된 상태가 나열됩니다.

참고

cluster-admin 권한을 사용하여 웹 콘솔에 로그인하는 경우, YAML에서 직접 또는 Actions 메뉴를 통해 웹 콘솔의 정책에서 클러스터의 모든 네임스페이스에서 네트워크 정책을 삭제할 수 있습니다.

3.4.4.6. 기본 거부 모든 다중 네트워크 정책 생성

이 정책은 다른 배포된 네트워크 정책 및 호스트 네트워크 Pod 간 트래픽에서 허용하는 네트워크 트래픽 이외의 모든 포드 간 네트워킹을 차단합니다. 이 절차에서는 my -project 네임스페이스에 기본 거부 정책을 적용하여 강력한 거부 정책을 적용합니다.

주의

트래픽 통신을 허용하는 NetworkPolicy CR(사용자 정의 리소스)을 구성하지 않으면 다음 정책으로 클러스터 전체에서 통신 문제가 발생할 수 있습니다.

사전 요구 사항

  • 클러스터는 mode: NetworkPolicy 로 설정된 OVN-Kubernetes 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다.
  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 권한이 있는 사용자로 클러스터에 로그인했습니다.
  • 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.

프로세스

  1. 모든 네임스페이스의 모든 포드의 수신을 거부하도록 기본 거부 정책을 정의하는 다음 YAML을 생성합니다. YAML을 deny-by-default.yaml 파일에 저장합니다.

    apiVersion: k8s.cni.cncf.io/v1beta1
    kind: MultiNetworkPolicy
    metadata:
      name: deny-by-default
      namespace: my-project 
    1
    
      annotations:
        k8s.v1.cni.cncf.io/policy-for:<namespace_name>/<network_name> 
    2
    
    spec:
      podSelector: {} 
    3
    
      policyTypes: 
    4
    
      - Ingress 
    5
    
      ingress: [] 
    6
    Copy to Clipboard Toggle word wrap
    1
    정책을 배포할 네임스페이스를 지정합니다. 예를 들어 my-project 네임스페이스는 다음과 같습니다.
    2
    네임스페이스 프로젝트 이름 뒤에 네트워크 연결 정의 이름을 지정합니다.
    3
    이 필드가 비어 있으면 구성이 모든 Pod와 일치합니다. 따라서 정책은 my-project 네임스페이스의 모든 pod에 적용됩니다.
    4
    NetworkPolicy 와 관련된 규칙 유형 목록을 지정합니다.
    5
    IngresspolicyTypes 만 지정합니다.
    6
    수신 규칙을 지정합니다. 지정하지 않으면 들어오는 모든 트래픽이 모든 Pod로 삭제됩니다.
  2. 다음 명령을 입력하여 정책을 적용합니다. 성공적인 출력에는 정책 오브젝트의 이름과 생성된 상태가 나열됩니다.

    $ oc apply -f deny-by-default.yaml
    Copy to Clipboard Toggle word wrap

    성공적인 출력에는 정책 오브젝트의 이름과 생성된 상태가 나열됩니다.

기본 거부 정책을 배치하면 app=web 레이블이 있는 외부 클라이언트에서 Pod로의 트래픽을 허용하는 정책을 구성할 수 있습니다.

참고

cluster-admin 역할을 가진 사용자로 로그인하면 클러스터의 모든 네임스페이스에 네트워크 정책을 생성할 수 있습니다.

다음 절차에 따라 공용 인터넷의 외부 서비스를 직접 또는 Load Balancer를 사용하여 Pod에 액세스하는 방식으로 허용하는 정책을 구성합니다. app=web 레이블이 있는 Pod에만 트래픽이 허용됩니다.

사전 요구 사항

  • 클러스터는 mode: NetworkPolicy 로 설정된 OVN-Kubernetes 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다.
  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 권한이 있는 사용자로 클러스터에 로그인했습니다.
  • 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.

프로세스

  1. 직접 또는 로드 밸런서를 사용하여 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:<namespace_name>/<network_name>
    spec:
      policyTypes:
      - Ingress
      podSelector:
        matchLabels:
          app: web
      ingress:
        - {}
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 입력하여 정책을 적용합니다. 성공적인 출력에는 정책 오브젝트의 이름과 생성된 상태가 나열됩니다.

    $ oc apply -f web-allow-external.yaml
    Copy to Clipboard Toggle word wrap

    성공적인 출력에는 정책 오브젝트의 이름과 생성된 상태가 나열됩니다. 이 정책은 다음 다이어그램에 설명된 대로 외부 트래픽을 포함하여 모든 리소스의 트래픽을 허용합니다.

참고

cluster-admin 역할을 가진 사용자로 로그인하면 클러스터의 모든 네임스페이스에 네트워크 정책을 생성할 수 있습니다.

다음 절차에 따라 모든 네임스페이스의 모든 Pod에서 특정 애플리케이션으로의 트래픽을 허용하는 정책을 구성합니다.

사전 요구 사항

  • 클러스터는 mode: NetworkPolicy 로 설정된 OVN-Kubernetes 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다.
  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 권한이 있는 사용자로 클러스터에 로그인했습니다.
  • 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.

프로세스

  1. 모든 네임스페이스의 모든 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:<namespace_name>/<network_name>
    spec:
      podSelector:
        matchLabels:
          app: web 
    1
    
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector: {} 
    2
    Copy to Clipboard Toggle word wrap
    1
    기본 네임스페이스의 app:web pod에만 정책을 적용합니다.
    2
    모든 네임스페이스의 모든 Pod를 선택합니다.
    참고

    기본적으로 정책 오브젝트에 namespaceSelector 매개변수를 지정하지 않으면 네임스페이스를 선택하지 않습니다. 즉, 정책은 네트워크 정책이 배포하는 네임스페이스의 트래픽만 허용합니다.

  2. 다음 명령을 입력하여 정책을 적용합니다. 성공적인 출력에는 정책 오브젝트의 이름과 생성된 상태가 나열됩니다.

    $ oc apply -f web-allow-all-namespaces.yaml
    Copy to Clipboard Toggle word wrap

    성공적인 출력에는 정책 오브젝트의 이름과 생성된 상태가 나열됩니다.

검증

  1. 다음 명령을 입력하여 기본 네임스페이스에서 웹 서비스를 시작합니다.

    $ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 보조 네임스페이스에 alpine 이미지를 배포하고 쉘을 시작합니다.

    $ oc run test-$RANDOM --namespace=secondary --rm -i -t --image=alpine -- sh
    Copy to Clipboard Toggle word wrap
  3. 쉘에서 다음 명령을 실행하고 서비스에서 요청을 허용하는지 확인합니다.

    # wget -qO- --timeout=2 http://web.default
    Copy to Clipboard Toggle word wrap

    예상 출력

    <!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>
    Copy to Clipboard Toggle word wrap

참고

cluster-admin 역할을 가진 사용자로 로그인하면 클러스터의 모든 네임스페이스에 네트워크 정책을 생성할 수 있습니다.

다음 절차에 따라 특정 네임스페이스의 app=web 레이블을 사용하여 Pod로의 트래픽을 허용하는 정책을 구성합니다. 다음을 위해 이 작업을 수행할 수 있습니다.

  • 프로덕션 워크로드가 배포된 네임스페이스로만 트래픽을 프로덕션 데이터베이스로 제한합니다.
  • 특정 네임스페이스에 배포된 모니터링 툴을 활성화하여 현재 네임스페이스에서 메트릭을 스크랩할 수 있습니다.

사전 요구 사항

  • 클러스터는 mode: NetworkPolicy 로 설정된 OVN-Kubernetes 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다.
  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 권한이 있는 사용자로 클러스터에 로그인했습니다.
  • 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.

프로세스

  1. 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:<namespace_name>/<network_name>
    spec:
      podSelector:
        matchLabels:
          app: web 
    1
    
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              purpose: production 
    2
    Copy to Clipboard Toggle word wrap
    1
    기본 네임스페이스의 app:web pod에만 정책을 적용합니다.
    2
    purpose=production 레이블이 있는 네임스페이스의 Pod로만 트래픽을 제한합니다.
  2. 다음 명령을 입력하여 정책을 적용합니다. 성공적인 출력에는 정책 오브젝트의 이름과 생성된 상태가 나열됩니다.

    $ oc apply -f web-allow-prod.yaml
    Copy to Clipboard Toggle word wrap

    성공적인 출력에는 정책 오브젝트의 이름과 생성된 상태가 나열됩니다.

검증

  1. 다음 명령을 입력하여 기본 네임스페이스에서 웹 서비스를 시작합니다.

    $ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 prod 네임스페이스를 생성합니다.

    $ oc create namespace prod
    Copy to Clipboard Toggle word wrap
  3. 다음 명령을 실행하여 prod 네임스페이스에 레이블을 지정합니다.

    $ oc label namespace/prod purpose=production
    Copy to Clipboard Toggle word wrap
  4. 다음 명령을 실행하여 dev 네임스페이스를 생성합니다.

    $ oc create namespace dev
    Copy to Clipboard Toggle word wrap
  5. 다음 명령을 실행하여 dev 네임스페이스에 레이블을 지정합니다.

    $ oc label namespace/dev purpose=testing
    Copy to Clipboard Toggle word wrap
  6. 다음 명령을 실행하여 dev 네임스페이스에 alpine 이미지를 배포하고 쉘을 시작합니다.

    $ oc run test-$RANDOM --namespace=dev --rm -i -t --image=alpine -- sh
    Copy to Clipboard Toggle word wrap
  7. 쉘에서 다음 명령을 실행하고 차단된 요청 이유를 확인합니다. 예를 들어 예상되는 출력 상태는 wget: download timed out 입니다.

    # wget -qO- --timeout=2 http://web.default
    Copy to Clipboard Toggle word wrap
  8. 다음 명령을 실행하여 prod 네임스페이스에 alpine 이미지를 배포하고 쉘을 시작합니다.

    $ oc run test-$RANDOM --namespace=prod --rm -i -t --image=alpine -- sh
    Copy to Clipboard Toggle word wrap
  9. 쉘에서 다음 명령을 실행하고 요청이 허용되는지 확인합니다.

    # wget -qO- --timeout=2 http://web.default
    Copy to Clipboard Toggle word wrap

    예상 출력

    <!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>
    Copy to Clipboard Toggle word wrap

3.5. 보조 네트워크에서 Pod 제거

클러스터 사용자는 보조 네트워크에서 Pod를 제거할 수 있습니다.

3.5.1. 보조 네트워크에서 Pod 제거

Pod를 삭제하여 보조 네트워크에서만 Pod를 제거할 수 있습니다.

사전 요구 사항

  • 보조 네트워크가 포드에 연결되어 있습니다.
  • OpenShift CLI(oc)를 설치합니다.
  • 클러스터에 로그인합니다.

프로세스

  • Pod를 삭제하려면 다음 명령을 입력합니다.

    $ oc delete pod <name> -n <namespace>
    Copy to Clipboard Toggle word wrap
    • <name>은 Pod의 이름입니다.
    • <namespace>는 Pod가 포함된 네임스페이스입니다.

3.6. 보조 네트워크 편집

클러스터 관리자는 기존 보조 네트워크의 구성을 수정할 수 있습니다.

3.6.1. 보조 네트워크 연결 정의 수정

클러스터 관리자는 기존 보조 네트워크를 변경할 수 있습니다. 보조 네트워크에 연결된 기존 pod는 업데이트되지 않습니다.

사전 요구 사항

  • 클러스터에 대한 보조 네트워크를 구성했습니다.
  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 권한이 있는 사용자로 로그인합니다.

프로세스

클러스터의 보조 네트워크를 편집하려면 다음 단계를 완료합니다.

  1. 기본 텍스트 편집기에서 CNO(Cluster Network Operator) CR을 편집하려면 다음 명령을 실행합니다.

    $ oc edit networks.operator.openshift.io cluster
    Copy to Clipboard Toggle word wrap
  2. additionalNetworks 컬렉션에서 변경 사항으로 보조 네트워크를 업데이트합니다.
  3. 변경 사항을 저장하고 텍스트 편집기를 종료하여 변경 사항을 커밋합니다.
  4. 선택 사항: CNO에서 다음 명령을 실행하여 NetworkAttachmentDefinition 오브젝트를 업데이트했는지 확인합니다. & lt;network-name >을 표시할 보조 네트워크의 이름으로 바꿉니다. CNO가 변경 사항을 반영하기 위해서 NetworkAttachmentDefinition 오브젝트를 업데이트하기 전에 지연이 발생할 수 있습니다.

    $ oc get network-attachment-definitions <network-name> -o yaml
    Copy to Clipboard Toggle word wrap

    예를 들어, 다음 콘솔 출력은 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"]}} }
    Copy to Clipboard Toggle word wrap

3.7. 보조 네트워크에서 IP 주소 할당 구성

다음 섹션에서는 보조 네트워크에 대한 IP 주소 할당을 구성하는 방법에 대한 지침 및 정보를 제공합니다.

3.7.1. 네트워크 연결을 위한 IP 주소 할당 구성

보조 네트워크의 경우 DHCP(Dynamic Host Configuration Protocol) 및 고정 할당을 포함하여 다양한 할당 방법을 지원하는 IPAM(IP Address Management) CNI 플러그인을 사용하여 IP 주소를 할당할 수 있습니다.

IP 주소의 동적 할당을 담당하는 DHCP IPAM CNI 플러그인은 다음 두 가지 구성 요소로 작동합니다.

  • CNI 플러그인: Kubernetes 네트워킹 스택과 통합하여 IP 주소를 요청 및 릴리스할 수 있습니다.
  • DHCP IPAM CNI Daemon: IP 주소 할당 요청을 처리하기 위해 환경의 기존 DHCP 서버와 조정하는 DHCP 이벤트의 리스너입니다. 이 데몬은 DHCP 서버 자체가 아닙니다.

type: dhcp 를 IPAM 구성에 필요한 네트워크의 경우 다음을 확인합니다.

  • DHCP 서버가 사용 가능하며 환경에서 실행됩니다.
  • DHCP 서버는 클러스터 외부에 있으며 서버가 고객을 위한 기존 네트워크 인프라의 일부를 형성할 것으로 예상합니다.
  • DHCP 서버는 노드에 IP 주소를 제공하도록 적절하게 구성됩니다.

환경에서 DHCP 서버를 사용할 수 없는 경우 대신 Whereabouts IPAM CNI 플러그인을 사용하는 것이 좋습니다. Whereabouts CNI는 외부 DHCP 서버 없이도 유사한 IP 주소 관리 기능을 제공합니다.

참고

외부 DHCP 서버가 없거나 고정 IP 주소 관리를 선호하는 경우 Whereabouts CNI 플러그인을 사용합니다. Whereabouts 플러그인에는 오래된 IP 주소 할당을 관리하기 위한 조정기 데몬이 포함되어 있습니다.

별도의 데몬인 DHCP IPAM CNI Daemon을 포함하여 컨테이너 수명 동안 DHCP 리스를 정기적으로 갱신해야 합니다. DHCP IPAM CNI 데몬을 배포하려면 CNO(Cluster Network Operator) 구성을 변경하여 이 데몬의 배포를 보조 네트워크 설정의 일부로 트리거합니다.

3.7.1.1. 고정 IP 주소 할당 구성

다음 표에서는 고정 IP 주소 할당 구성에 대해 설명합니다.

Expand
표 3.11. IPAM 고정 구성 오브젝트
필드유형설명

type

string

IPAM 주소 유형입니다. static 값이 필요합니다.

addresses

array

가상 인터페이스에 할당할 IP 주소를 지정하는 오브젝트의 배열입니다. IPv4 및 IPv6 IP 주소가 모두 지원됩니다.

routes

array

Pod 내부에서 구성할 경로를 지정하는 오브젝트의 배열입니다.

dns

array

선택 사항: DNS 구성을 지정하는 오브젝트 배열입니다.

address 배열에는 다음 필드가 있는 오브젝트가 필요합니다.

Expand
표 3.12. ipam.addresses[] array
필드유형설명

address

string

지정하는 IP 주소 및 네트워크 접두사입니다. 예를 들어 10.10.21.10/24 를 지정하면 보조 네트워크에 IP 주소 10.10.21.10255.255.255.0 의 넷마스크가 할당됩니다.

gateway

string

송신 네트워크 트래픽을 라우팅할 기본 게이트웨이입니다.

Expand
표 3.13. IPAM.routes[] 배열
필드유형설명

dst

string

CIDR 형식의 IP 주소 범위(예: 기본 경로의 경우 192.168.17.0/24 또는 0.0.0.0/0 )입니다.

gw

string

네트워크 트래픽을 라우팅하는 게이트웨이입니다.

Expand
표 3.14. IPAM.dns 오브젝트
필드유형설명

네임서버

array

DNS 쿼리가 전송되는 하나 이상의 IP 주소로 이루어진 배열입니다.

domain

array

호스트 이름에 추가할 기본 도메인입니다. 예를 들어 도메인이 example.com으로 설정되면 example-host에 대한 DNS 조회 쿼리가 example-host.example.com으로 다시 작성됩니다.

search

array

DNS 조회 쿼리 중에 규정되지 않은 호스트 이름(예: example-host)에 추가할 도메인 이름 배열입니다.

고정 IP 주소 할당 구성 예

{
  "ipam": {
    "type": "static",
      "addresses": [
        {
          "address": "191.168.1.7/24"
        }
      ]
  }
}
Copy to Clipboard Toggle word wrap

3.7.1.2. DHCP(Dynamic IP 주소) 할당 구성

pod는 생성될 때 원래 DHCP 리스를 얻습니다. 리스는 클러스터에서 실행되는 최소 DHCP 서버 배포를 통해 주기적으로 갱신되어야 합니다.

중요

이더넷 네트워크 연결의 경우 SR-IOV Network Operator는 DHCP 서버 배포를 생성하지 않습니다. Cluster Network Operator는 최소 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" 
1

        }
      }
  # ...
Copy to Clipboard Toggle word wrap

1
클러스터에 대한 DHCP(Dynamic IP 주소) 할당을 지정합니다.

다음 표에서는 DHCP를 사용한 동적 IP 주소 할당을 위한 구성 매개 변수에 대해 설명합니다.

Expand
표 3.15. IPAM DHCP 구성 오브젝트
필드유형설명

type

string

IPAM 주소 유형입니다. dhcp 값은 필수입니다.

다음 JSON 예제에서는 DHCP를 사용한 동적 IP 주소 할당을 위한 구성 p를 설명합니다.

DHCP(Dynamic IP 주소) 할당 구성 예

{
  "ipam": {
    "type": "dhcp"
  }
}
Copy to Clipboard Toggle word wrap

3.7.1.3. Whereabouts를 사용한 동적 IP 주소 할당 구성

Whereabouts CNI 플러그인을 사용하면 DHCP 서버를 사용하지 않고도 IP 주소를 보조 네트워크에 동적으로 할당할 수 있습니다.

Whereabouts CNI 플러그인은 별도의 NetworkAttachmentDefinition CRD 내에서 동일한 CIDR 범위의 중복 IP 주소 범위 및 구성을 여러 번 지원합니다. 이를 통해 멀티 테넌트 환경에서 유연성 및 관리 기능이 향상됩니다.

3.7.1.3.1. 동적 IP 주소 구성 오브젝트

다음 표에서는 Whereabouts를 사용하여 동적 IP 주소 할당을 위한 구성 오브젝트를 설명합니다.

Expand
표 3.16. IPAM 위치 설정 오브젝트
필드유형설명

type

string

IPAM 주소 유형입니다. 여기서about s 값이 필요합니다.

범위

string

CIDR 표기법의 IP 주소 및 범위입니다. IP 주소는 이 주소 범위 내에서 할당됩니다.

exclude

array

선택 사항: CIDR 표기법의 0개 이상의 IP 주소 및 범위 목록입니다. 제외된 주소 범위 내의 IP 주소는 할당되지 않습니다.

network_name

string

선택 사항: Pod의 각 그룹 또는 도메인이 동일한 IP 주소 범위를 공유하는 경우에도 자체 IP 주소 집합을 갖도록 합니다. 이 필드를 설정하는 것은 특히 다중 테넌트 환경에서 네트워크를 분리하고 정리하는 데 중요합니다.

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"
    ]
  }
}
Copy to Clipboard Toggle word wrap

다음 예제에서는 다중 테넌트 네트워크에 겹치는 IP 주소 범위를 사용하는 동적 IP 주소 할당을 보여줍니다.

NetworkAttachmentDefinition 1

{
  "ipam": {
    "type": "whereabouts",
    "range": "192.0.2.192/29",
    "network_name": "example_net_common", 
1

  }
}
Copy to Clipboard Toggle word wrap

1
선택 사항: 설정된 경우 NetworkAttachmentDefinition 2network_name 과 일치해야 합니다.

NetworkAttachmentDefinition 2

{
  "ipam": {
    "type": "whereabouts",
    "range": "192.0.2.192/24",
    "network_name": "example_net_common", 
1

  }
}
Copy to Clipboard Toggle word wrap

1
선택 사항: 설정된 경우 NetworkAttachmentDefinition 1network_name 과 일치해야 합니다.
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 데몬 세트를 배포합니다.

프로세스

  1. 다음 명령을 실행하여 Network.operator.openshift.io CR(사용자 정의 리소스)을 편집합니다.

    $ oc edit network.operator.openshift.io cluster
    Copy to Clipboard Toggle word wrap
  2. 이 예제 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
    # ...
    Copy to Clipboard Toggle word wrap
  3. 파일을 저장하고 텍스트 편집기를 종료합니다.
  4. 다음 명령을 실행하여 whereabouts-reconciler 데몬 세트가 성공적으로 배포되었는지 확인합니다.

    $ oc get all -n openshift-multus | grep whereabouts-reconciler
    Copy to Clipboard Toggle word wrap

    출력 예

    pod/whereabouts-reconciler-jnp6g 1/1 Running 0 6s
    pod/whereabouts-reconciler-k76gg 1/1 Running 0 6s
    daemonset.apps/whereabouts-reconciler 6 6 6 6 6 kubernetes.io/os=linux 6s
    Copy to Clipboard Toggle word wrap

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가 실행 중입니다.

프로세스

  1. 다음 명령을 실행하여 openshift-multus 네임스페이스에 IP 조정기에 대한 특정 cron 표현식을 사용하여 이름이 whereabouts-config 라는 ConfigMap 오브젝트를 생성합니다.

    $ oc create configmap whereabouts-config -n openshift-multus --from-literal=reconciler_cron_expression="*/15 * * * *"
    Copy to Clipboard Toggle word wrap

    이 cron 표현식은 IP 조정기가 15분마다 실행됨을 나타냅니다. 특정 요구 사항에 따라 표현식을 조정합니다.

    참고

    whereabouts-reconciler 데몬 세트는 5개의 별표를 포함하는 cron 표현식 패턴만 사용할 수 있습니다. 초를 나타내는 데 사용되는 여섯 번째 단계는 현재 지원되지 않습니다.

  2. 다음 명령을 실행하여 openshift-multus 네임스페이스 내에서 whereabouts-reconciler 데몬 세트 및 Pod와 관련된 리소스에 대한 정보를 검색합니다.

    $ oc get all -n openshift-multus | grep whereabouts-reconciler
    Copy to Clipboard Toggle word wrap

    출력 예

    pod/whereabouts-reconciler-2p7hw                   1/1     Running   0             4m14s
    pod/whereabouts-reconciler-76jk7                   1/1     Running   0             4m14s
    daemonset.apps/whereabouts-reconciler          6         6         6       6            6           kubernetes.io/os=linux   4m16s
    Copy to Clipboard Toggle word wrap

  3. 다음 명령을 실행하여 whereabouts-reconciler Pod가 구성된 간격으로 IP 조정기를 실행하는지 확인합니다.

    $ oc -n openshift-multus logs whereabouts-reconciler-2p7hw
    Copy to Clipboard Toggle word wrap

    출력 예

    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
    Copy to Clipboard Toggle word wrap

3.7.1.6. 동적으로 듀얼 스택 IP 주소 할당을 위한 구성 생성

듀얼 스택 IP 주소 할당은 다음과 같은 ipRanges 매개변수를 사용하여 구성할 수 있습니다.

  • IPv4 주소
  • IPv6 주소
  • 여러 IP 주소 할당

프로세스

  1. type 을 whereabouts로 설정합니다.
  2. 다음 예와 같이 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"}
                  ]
           }
          }
    Copy to Clipboard Toggle word wrap
  3. Pod에 네트워크를 연결합니다. 자세한 내용은 " 보조 네트워크에 Pod 추가"를 참조하십시오.
  4. 모든 IP 주소가 할당되었는지 확인합니다.
  5. 다음 명령을 실행하여 IP 주소가 메타데이터로 할당되었는지 확인합니다.

    $ oc exec -it mypod -- ip a
    Copy to Clipboard Toggle word wrap

3.8. 컨테이너 네트워크 네임스페이스에서 마스터 인터페이스 구성

다음 섹션에서는 마스터 인터페이스를 기반으로 MAC-VLAN, IP-VLAN, VLAN 하위 인터페이스를 생성하고 관리하는 방법에 대한 지침 및 정보를 제공합니다.

컨테이너 네임스페이스에 있는 마스터 인터페이스를 기반으로 하는 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 인터페이스에 대한 네트워크 연결을 정의하는 것으로 시작합니다.

다음 예제에서는 이 다이어그램에 설명된 설정을 구성하는 방법을 보여줍니다.

그림 3.1. VLAN 생성

사전 요구 사항

  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
  • SR-IOV Network Operator가 설치되어 있습니다.

프로세스

  1. 다음 명령을 사용하여 Pod를 배포하려는 전용 컨테이너 네임스페이스를 생성합니다.

    $ oc new-project test-namespace
    Copy to Clipboard Toggle word wrap
  2. SR-IOV 노드 정책을 생성합니다.

    1. 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"
      Copy to Clipboard Toggle word wrap
      참고

      deviceType: netdevice 설정을 사용하는 SR-IOV 네트워크 노드 정책 구성 예제는 Mellanox Network Interface Cards(NIC)에 맞게 조정됩니다.

      1
      SR-IOV 네트워크 장치의 벤더 16진수 코드입니다. 값 15b3 은 Mellanox NIC와 연결되어 있습니다.
      2
      SR-IOV 네트워크 장치의 장치 16진수 코드입니다.
    2. 다음 명령을 실행하여 YAML을 적용합니다.

      $ oc apply -f sriov-node-network-policy.yaml
      Copy to Clipboard Toggle word wrap
      참고

      노드를 재부팅해야 하므로 이를 적용하는 데 다소 시간이 걸릴 수 있습니다.

  3. SR-IOV 네트워크를 생성합니다.

    1. 다음 예제 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"
      Copy to Clipboard Toggle word wrap
    2. 다음 명령을 실행하여 YAML을 적용합니다.

      $ oc apply -f sriov-network-attachment.yaml
      Copy to Clipboard Toggle word wrap
  4. VLAN 보조 네트워크를 생성합니다.

    1. 다음 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"}]}
              }
            ]
          }
      Copy to Clipboard Toggle word wrap
      1
      VLAN 구성은 마스터 이름을 지정해야 합니다. Pod 네트워크 주석에서 구성할 수 있습니다.
      2
      linkInContainer 매개변수를 지정해야 합니다.
    2. 다음 명령을 실행하여 YAML 파일을 적용합니다.

      $ oc apply -f vlan100-additional-network-configuration.yaml
      Copy to Clipboard Toggle word wrap
  5. 이전 지정된 네트워크를 사용하여 포드 정의를 생성합니다.

    1. 다음 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"
      Copy to Clipboard Toggle word wrap
      1
      VLAN 인터페이스의 마스터 로 사용할 이름입니다.
    2. 다음 명령을 실행하여 YAML 파일을 적용합니다.

      $ oc apply -f pod-a.yaml
      Copy to Clipboard Toggle word wrap
  6. 다음 명령을 실행하여 test-namespace 내에서 nginx-pod 에 대한 자세한 정보를 가져옵니다.

    $ oc describe pods nginx-pod -n test-namespace
    Copy to Clipboard Toggle word wrap

    출력 예

    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
    Copy to Clipboard Toggle word wrap

컨테이너 네임스페이스에 존재하는 브리지 마스터 인터페이스를 기반으로 하위 인터페이스를 생성할 수 있습니다. 하위 인터페이스 생성은 다른 유형의 인터페이스에 적용할 수 있습니다.

사전 요구 사항

  • OpenShift CLI(oc)가 설치되어 있습니다.
  • cluster-admin 권한이 있는 사용자로 OpenShift Container Platform 클러스터에 로그인되어 있습니다.

프로세스

  1. 다음 명령을 입력하여 Pod를 배포할 전용 컨테이너 네임스페이스를 생성합니다.

    $ oc new-project test-namespace
    Copy to Clipboard Toggle word wrap
  2. 다음 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"}]
        }
      }'
    Copy to Clipboard Toggle word wrap
  3. 다음 명령을 실행하여 NetworkAttachmentDefinition CRD를 OpenShift Container Platform 클러스터에 적용합니다.

    $ oc apply -f bridge-nad.yaml
    Copy to Clipboard Toggle word wrap
  4. 다음 명령을 입력하여 NetworkAttachmentDefinition CRD를 성공적으로 생성했는지 확인합니다. 예상되는 출력에는 CryostatD CRD의 이름과 생성 기간이 분 단위로 표시됩니다.

    $ oc get network-attachment-definitions
    Copy to Clipboard Toggle word wrap
  5. 다음 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", 
    1
    
        "mode": "l3",
        "linkInContainer": true, 
    2
    
        "ipam": {"type": "whereabouts", "ipRanges": [{"range": "10.0.0.0/24"}]}
      }'
    Copy to Clipboard Toggle word wrap
    1
    네트워크 연결과 연결할 이더넷 인터페이스를 지정합니다. 나중에 Pod 네트워크 주석에 구성됩니다.
    2
    마스터 인터페이스가 컨테이너 네트워크 네임스페이스에 있음을 지정합니다.
  6. 다음 명령을 실행하여 YAML 파일을 적용합니다.

    $ oc apply -f ipvlan-additional-network-configuration.yaml
    Copy to Clipboard Toggle word wrap
  7. 다음 명령을 실행하여 NetworkAttachmentDefinition CRD가 성공적으로 생성되었는지 확인합니다. 예상되는 출력에는 CryostatD CRD의 이름과 생성 기간이 분 단위로 표시됩니다.

    $ oc get network-attachment-definitions
    Copy to Clipboard Toggle word wrap
  8. 다음 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]
    Copy to Clipboard Toggle word wrap
    1
    IPVLAN 인터페이스의 마스터 로 사용할 이름을 지정합니다.
  9. 다음 명령을 실행하여 YAML 파일을 적용합니다.

    $ oc apply -f pod-a.yaml
    Copy to Clipboard Toggle word wrap
  10. 다음 명령을 사용하여 Pod가 실행 중인지 확인합니다.

    $ oc get pod -n test-namespace
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME    READY   STATUS    RESTARTS   AGE
    pod-a   1/1     Running   0          2m36s
    Copy to Clipboard Toggle word wrap

  11. 다음 명령을 실행하여 test-namespace 내에서 pod-a 리소스에 대한 네트워크 인터페이스 정보를 표시합니다.

    $ oc exec -n test-namespace pod-a -- ip a
    Copy to Clipboard Toggle word wrap

    출력 예

    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: 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
    Copy to Clipboard Toggle word wrap

    이 출력은 네트워크 인터페이스 net2 가 물리적 인터페이스 net1 과 연결되어 있음을 보여줍니다.

3.9. 추가 네트워크 제거

클러스터 관리자는 추가 네트워크의 연결을 제거할 수 있습니다.

3.9.1. 보조 네트워크 연결 정의 제거

클러스터 관리자는 OpenShift Container Platform 클러스터에서 보조 네트워크를 제거할 수 있습니다. 보조 네트워크는 연결된 Pod에서 제거되지 않습니다.

사전 요구 사항

  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 권한이 있는 사용자로 로그인합니다.

프로세스

클러스터에서 보조 네트워크를 제거하려면 다음 단계를 완료합니다.

  1. 다음 명령을 실행하여 기본 텍스트 편집기에서 CNO(Cluster Network Operator)를 편집합니다.

    $ oc edit networks.operator.openshift.io cluster
    Copy to Clipboard Toggle word wrap
  2. 제거하려는 보조 네트워크의 additionalNetworks 컬렉션에서 CNO가 생성한 구성을 제거하여 CR을 수정합니다.

    apiVersion: operator.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      additionalNetworks: [] 
    1
    Copy to Clipboard Toggle word wrap
    1
    additionalNetworks 컬렉션에서 보조 네트워크 연결 정의에 대한 구성 매핑을 제거하는 경우 빈 컬렉션을 지정해야 합니다.
  3. 클러스터 네트워크에서 네트워크 연결 정의를 제거하려면 다음 명령을 입력합니다.

    $ oc delete net-attach-def <name_of_NAD> 
    1
    Copy to Clipboard Toggle word wrap
    1
    & lt;name_of_NAD& gt;를 네트워크 연결 정의 이름으로 바꿉니다.
  4. 변경 사항을 저장하고 텍스트 편집기를 종료하여 변경 사항을 커밋합니다.
  5. 선택 사항: 다음 명령을 실행하여 보조 네트워크 CR이 삭제되었는지 확인합니다.

    $ oc get network-attachment-definition --all-namespaces
    Copy to Clipboard Toggle word wrap

4장. 가상 라우팅 및 전달

4.1. 가상 라우팅 및 전달 정보

IP 규칙과 결합된 가상 라우팅 및 전달(VRF) 장치는 가상 라우팅 및 전달 도메인을 생성하는 기능을 제공합니다. VRF는 CNF에 필요한 권한 수를 줄이고 보조 네트워크의 네트워크 토폴로지의 가시성을 증대시킵니다. VRF는 예를 들어 각 테넌트마다 고유한 라우팅 테이블이 있고 다른 기본 게이트웨이가 필요한 멀티 테넌시 기능을 제공하는 데 사용됩니다.

프로세스는 소켓을 VRF 장치에 바인딩할 수 있습니다. 바인딩된 소켓을 통한 패킷은 VRF 장치와 연결된 라우팅 테이블을 사용합니다. VRF의 중요한 기능은 OSI 모델 레이어 3 트래픽 및 LLDP와 같은 L2 도구에만 영향을 미치지 않는다는 것입니다. 이를 통해 정책 기반 라우팅과 같은 우선순위가 높은 IP 규칙이 특정 트래픽을 지시하는 VRF 장치 규칙보다 우선합니다.

4.1.1. 통신 운영자의 포드에 대한 보조 네트워크 이점

통신사용 사례에서 각 CNF는 동일한 주소 공간을 공유하는 여러 다른 네트워크에 잠재적으로 연결할 수 있습니다. 이러한 보조 네트워크는 클러스터의 기본 네트워크 CIDR과 잠재적으로 충돌할 수 있습니다. CNI VRF 플러그인을 사용하여 네트워크 기능을 동일한 IP 주소를 사용하여 다른 고객의 인프라에 연결할 수 있으므로 서로 다른 고객을 분리할 수 있습니다. IP 주소는 OpenShift Container Platform IP 공간과 겹치게 됩니다. 또한 CNI VRF 플러그인은 CNF에 필요한 권한 수를 줄이고 보조 네트워크의 네트워크 토폴로지의 가시성을 높입니다.

5장. VRF에 보조 네트워크 할당

클러스터 관리자는 CNI VRF 플러그인을 사용하여 VRF(가상 라우팅 및 전달) 도메인에 대한 보조 네트워크를 구성할 수 있습니다. 이 플러그인이 생성하는 가상 네트워크는 사용자가 지정하는 물리적 인터페이스와 연결됩니다.

VRF 인스턴스에서 보조 네트워크를 사용하면 다음과 같은 이점이 있습니다.

워크로드 격리
보조 네트워크에 대한 VRF 인스턴스를 구성하여 워크로드 트래픽을 분리합니다.
보안 개선
VRF 도메인의 격리된 네트워크 경로를 통해 보안을 강화합니다.
멀티 테넌시 지원
각 테넌트에 대해 VRF 도메인의 고유한 라우팅 테이블을 사용하여 네트워크 분할을 통해 멀티 테넌시를 지원합니다.
참고

VRF를 사용하는 애플리케이션은 특정 장치에 바인딩해야 합니다. 일반적인 사용은 소켓에 SO_BINDTODEVICE 옵션을 사용하는 것입니다. SO_BINDTODEVICE 옵션은 소켓을 전달된 인터페이스 이름(예: eth1 )에 지정된 장치에 바인딩합니다. SO_BINDTODEVICE 옵션을 사용하려면 애플리케이션에 CAP_NET_RAW 기능이 있어야 합니다.

OpenShift Container Platform Pod에서는 ip vrf exec 명령을 통해 VRF를 사용할 수 없습니다. VRF를 사용하려면 애플리케이션을 VRF 인터페이스에 직접 바인딩합니다.

5.1. CNI VRF 플러그인으로 보조 네트워크 연결 생성

CNO(Cluster Network Operator)는 보조 네트워크 정의를 관리합니다. 생성할 보조 네트워크를 지정하면 CNO가 NetworkAttachmentDefinition CR(사용자 정의 리소스)을 자동으로 생성합니다.

참고

CNO가 관리하는 NetworkAttachmentDefinition CR을 편집하지 마십시오. 이렇게 하면 보조 네트워크의 네트워크 트래픽이 중단될 수 있습니다.

CNI VRF 플러그인으로 보조 네트워크 연결을 생성하려면 다음 절차를 수행합니다.

사전 요구 사항

  • OpenShift Container Platform CLI, oc를 설치합니다.
  • cluster-admin 권한이 있는 사용자로 OpenShift 클러스터에 로그인합니다.

프로세스

  1. 추가 네트워크 연결에 대한 네트워크 CR(사용자 정의 리소스)을 생성하고 다음 예제 CR과 같이 보조 네트워크의 rawCNIConfig 구성을 삽입합니다. YAML을 additional-network-attachment.yaml 파일로 저장합니다.

    apiVersion: operator.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      additionalNetworks:
        - name: test-network-1
          namespace: additional-network-1
          type: Raw
          rawCNIConfig: '{
            "cniVersion": "0.3.1",
            "name": "macvlan-vrf",
            "plugins": [  
    1
    
            {
              "type": "macvlan",
              "master": "eth1",
              "ipam": {
                  "type": "static",
                  "addresses": [
                  {
                      "address": "191.168.1.23/24"
                  }
                  ]
              }
            },
            {
              "type": "vrf", 
    2
    
              "vrfname": "vrf-1",  
    3
    
              "table": 1001   
    4
    
            }]
          }'
    Copy to Clipboard Toggle word wrap
    1
    plugins는 목록이어야 합니다. 목록의 첫 번째 항목은 VRF 네트워크를 기반으로 하는 보조 네트워크여야 합니다. 목록의 두 번째 항목은 VRF 플러그인 구성입니다.
    2
    typevrf로 설정해야 합니다.
    3
    vrfname은 인터페이스가 할당된 VRF의 이름입니다. 포드에 없는 경우 생성됩니다.
    4
    선택 사항: table은 라우팅 테이블 ID입니다. 기본적으로 tableid 매개변수가 사용됩니다. 지정하지 않으면 CNI에서 무료 라우팅 테이블 ID를 VRF에 할당합니다.
    참고

    VRF는 리소스의 유형이 netdevice인 경우에만 올바르게 작동합니다.

  2. Network 리소스를 생성합니다.

    $ oc create -f additional-network-attachment.yaml
    Copy to Clipboard Toggle word wrap
  3. CNO가 다음 명령을 실행하여 NetworkAttachmentDefinition CR을 생성했는지 확인합니다. <namespace>를 네트워크 연결을 구성할 때 지정한 네임스페이스(예: additional-network-1)로 바꿉니다. 예상되는 출력에는 CryostatD CR의 이름과 생성 기간이 분 단위로 표시됩니다.

    $ oc get network-attachment-definitions -n <namespace>
    Copy to Clipboard Toggle word wrap
    참고

    CNO가 CR을 생성하기 전에 지연이 발생할 수 있습니다.

검증

  1. pod를 생성하고 VRF 인스턴스로 보조 네트워크에 할당합니다.

    1. Pod 리소스를 정의하는 YAML 파일을 생성합니다.

      pod-additional-net.yaml 파일 예

      apiVersion: v1
      kind: Pod
      metadata:
       name: pod-additional-net
       annotations:
         k8s.v1.cni.cncf.io/networks: '[
             {
                     "name": "test-network-1" 
      1
      
             }
       ]'
      spec:
       containers:
       - name: example-pod-1
         command: ["/bin/bash", "-c", "sleep 9000000"]
         image: centos:8
      Copy to Clipboard Toggle word wrap

      1
      VRF 인스턴스로 보조 네트워크의 이름을 지정합니다.
    2. 다음 명령을 실행하여 Pod 리소스를 생성합니다. 예상되는 출력에는 Pod 리소스의 이름과 생성 기간이 분 단위로 표시됩니다.

      $ oc create -f pod-additional-net.yaml
      Copy to Clipboard Toggle word wrap
  2. pod 네트워크 연결이 VRF 보조 네트워크에 연결되어 있는지 확인합니다. Pod로 원격 세션을 시작하고 다음 명령을 실행합니다. 예상되는 출력에는 라우팅 테이블에 VRF 인터페이스의 이름과 고유 ID가 표시됩니다.

    $ ip vrf show
    Copy to Clipboard Toggle word wrap
  3. VRF 인터페이스가 보조 인터페이스의 컨트롤러인지 확인합니다.

    $ ip link
    Copy to Clipboard Toggle word wrap

    출력 예

    5: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master red state UP mode
    Copy to Clipboard Toggle word wrap

Legal Notice

Copyright © 2025 Red Hat

OpenShift documentation is licensed under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0).

Modified versions must remove all Red Hat trademarks.

Portions adapted from https://github.com/kubernetes-incubator/service-catalog/ with modifications by Red Hat.

Red Hat, Red Hat Enterprise Linux, the Red Hat logo, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.

Linux® is the registered trademark of Linus Torvalds in the United States and other countries.

Java® is a registered trademark of Oracle and/or its affiliates.

XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.

MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.

Node.js® is an official trademark of Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.

The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation’s permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.

All other trademarks are the property of their respective owners.

맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat