Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

8.10. NetworkPolicy 활성화

ovs-subnetovs-multitenant 플러그인에는 자체 레거시 네트워크 격리 모델이 있으며 Kubernetes NetworkPolicy를 지원하지 않습니다. 그러나 ovs-networkpolicy 플러그인을 사용하여 NetworkPolicy 지원을 사용할 수 있습니다.

참고

Egress 정책 유형, ipBlock 매개변수, podSelectornamespaceSelector 매개변수를 결합하는 기능은 OpenShift Container Platform에서 사용할 수 없습니다.

참고

클러스터와의 통신을 중단할 수 있으므로 기본 OpenShift Container Platform 프로젝트에 NetworkPolicy 기능을 적용하지 마십시오.

주의

NetworkPolicy 규칙은 호스트 네트워크 네임스페이스에 적용되지 않습니다. 호스트 네트워킹이 활성화된 Pod는 NetworkPolicy 규칙의 영향을 받지 않습니다.

ovs-networkpolicy 플러그인을 사용하도록 구성된 클러스터에서 네트워크 격리는 NetworkPolicy 오브젝트에 의해 완전히 제어됩니다. 기본적으로 네트워크 정책 모드에서는 다른 Pod 및 네트워크 끝점에서 프로젝트의 모든 Pod에 액세스할 수 있습니다. 프로젝트에서 하나 이상의 Pod를 분리하기 위해 해당 프로젝트에서 NetworkPolicy 오브젝트를 생성하여 수신되는 연결을 표시할 수 있습니다. 프로젝트 관리자는 자신의 프로젝트 내에서 NetworkPolicy 오브젝트를 만들고 삭제할 수 있습니다.

NetworkPolicy 오브젝트를 가리키지 않는 Pod는 완전히 액세스할 수 있지만 하나 이상의 NetworkPolicy 오브젝트가 있는 Pod는 격리됩니다. 이러한 격리된 Pod는 NetworkPolicy 오브젝트 중 하나 이상에서 허용하는 연결만 허용합니다.

다음은 다양한 시나리오를 지원하는 몇 가지 샘플 NetworkPolicy 오브젝트 정의입니다.

  • 모든 트래픽 거부

    "기본적으로 거부" 프로젝트를 만들려면 모든 Pod와 일치하지만 트래픽을 허용하지 않는 NetworkPolicy 오브젝트를 추가합니다.

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: deny-by-default
    spec:
      podSelector:
      ingress: []
  • 프로젝트 내 Pod 연결만 수락

    Pod가 동일한 프로젝트에 있는 다른 Pod의 연결은 수락하지만 다른 프로젝트의 Pod의 다른 모든 연결을 거부하도록 하려면 다음을 수행합니다.

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: allow-same-namespace
    spec:
      podSelector:
      ingress:
      - from:
        - podSelector: {}
  • Pod 레이블을 기반으로 하는 HTTP 및 HTTPS 트래픽만 허용

    특정 레이블(다음 예에서role=frontend )을 사용하여 Pod에 대한 HTTP 및 HTTPS 액세스만 활성화하려면 다음과 유사한 NetworkPolicy 오브젝트를 추가합니다.

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: allow-http-and-https
    spec:
      podSelector:
        matchLabels:
          role: frontend
      ingress:
      - ports:
        - protocol: TCP
          port: 80
        - protocol: TCP
          port: 443

NetworkPolicy 오브젝트는 추가 기능이므로 여러 NetworkPolicy 오브젝트를 결합하여 복잡한 네트워크 요구 사항을 충족할 수 있습니다.

예를 들어, 이전 샘플에서 정의된 NetworkPolicy 오브젝트의 경우 동일한 프로젝트 내에서 allow-same-namespace 정책과 allow-http-and-https 정책을 모두 정의할 수 있습니다. 따라서 레이블이 role=frontend로 지정된 Pod는 각 정책에서 허용하는 모든 연결을 허용할 수 있습니다. 즉, 동일한 네임스페이스에 있는 Pod의 모든 포트 연결 및 모든 네임스페이스의 Pod에서 포트 80443 에 대한 연결입니다.

8.10.1. NetworkPolicy를 효율적으로 사용

NetworkPolicy 오브젝트를 사용하면 네임스페이스 내에서 라벨별로 서로 다른 Pod를 격리할 수 있습니다.

NetworkPolicy 오브젝트를 단일 네임스페이스에서 개별 포드의 많은 수에 적용하는 것은 비효율적입니다. Pod 레이블은 IP 수준에 존재하지 않으므로 NetworkPolicy 오브젝트는 pod Selector 로 선택한 모든 Pod 간에 가능한 모든 링크에 대해 별도의 OVS 흐름 규칙을 생성합니다.

예를 들어 NetworkPolicy 오브젝트 내의 spec podSelectoringress podSelector가 각각 200개의 Pod와 일치하면 40000(200*200) OVS 흐름 규칙이 생성됩니다. 이로 인해 머신이 느려질 수 있습니다.

OVS 흐름 규칙을 줄이려면 네임스페이스를 사용하여 격리해야 하는 포드 그룹을 포함합니다.

namespace Selectors 또는 빈 podSelectors 를 사용하여 전체 네임스페이스 를 선택하는 NetworkPolicy 오브젝트는 네임스페이스의 VXLAN VNID와 일치하는 단일 OVS 흐름 규칙만 생성합니다.

원래 네임스페이스에서 분리할 필요가 없는 포드를 유지하고, 분리해야 하는 포드를 하나 이상의 네임스페이스로 이동합니다.

격리된 Pod에서 허용하려는 특정 트래픽을 허용하도록 추가 대상의 네임스페이스 간 정책을 생성합니다.