20장. 네트워크 정책
20.1. 네트워크 정책 정의
개발자는 클러스터의 Pod로 트래픽을 제한하는 네트워크 정책을 정의할 수 있습니다.
20.1.1. 네트워크 정책 정의
Kubernetes 네트워크 정책을 지원하는 네트워크 플러그인을 사용하는 클러스터에서 네트워크 격리는 NetworkPolicy
개체에 의해 전적으로 제어됩니다. OpenShift Container Platform 4.13에서 OpenShift SDN은 기본 네트워크 격리 모드에서 네트워크 정책의 사용을 지원합니다.
네트워크 정책은 호스트 네트워크 네임스페이스에 적용되지 않습니다. 호스트 네트워킹이 활성화된 Pod는 네트워크 정책 규칙의 영향을 받지 않습니다. 그러나 호스트 네트워크 pod에 연결하는 Pod는 네트워크 정책 규칙의 영향을 받을 수 있습니다.
네트워크 정책은 localhost 또는 상주 노드의 트래픽을 차단할 수 없습니다.
기본적으로 네트워크 정책 모드에서는 다른 Pod 및 네트워크 끝점에서 프로젝트의 모든 Pod에 액세스할 수 있습니다. 프로젝트에서 하나 이상의 Pod를 분리하기 위해 해당 프로젝트에서 NetworkPolicy
오브젝트를 생성하여 수신되는 연결을 표시할 수 있습니다. 프로젝트 관리자는 자신의 프로젝트 내에서 NetworkPolicy
오브젝트를 만들고 삭제할 수 있습니다.
하나 이상의 NetworkPolicy
오브젝트에서 선택기와 Pod가 일치하면 Pod는 해당 NetworkPolicy
오브젝트 중 하나 이상에서 허용되는 연결만 허용합니다. NetworkPolicy
오브젝트가 선택하지 않은 Pod에 완전히 액세스할 수 있습니다.
네트워크 정책은 TCP, UDP, ICMP 및 SCTP 프로토콜에만 적용됩니다. 다른 프로토콜은 영향을 받지 않습니다.
다음 예제 NetworkPolicy
오브젝트는 다양한 시나리오 지원을 보여줍니다.
모든 트래픽 거부:
기본적으로 프로젝트를 거부하려면 모든 Pod와 일치하지만 트래픽을 허용하지 않는
NetworkPolicy
오브젝트를 추가합니다.kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: deny-by-default spec: podSelector: {} ingress: []
OpenShift Container Platform Ingress 컨트롤러의 연결만 허용합니다.
프로젝트에서 OpenShift Container Platform Ingress 컨트롤러의 연결만 허용하도록 하려면 다음
NetworkPolicy
개체를 추가합니다.apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-from-openshift-ingress spec: ingress: - from: - namespaceSelector: matchLabels: network.openshift.io/policy-group: ingress podSelector: {} policyTypes: - Ingress
프로젝트 내 Pod 연결만 허용:
중요동일한 네임스페이스에 있는
hostNetwork
Pod의 수신 연결을 허용하려면allow-from-hostnetwork
정책을allow-same-namespace
정책과 함께 적용해야 합니다.Pod가 동일한 프로젝트 내 다른 Pod의 연결은 수락하지만 다른 프로젝트에 속하는 Pod의 기타 모든 연결을 거부하도록 하려면 다음
NetworkPolicy
오브젝트를 추가합니다.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
네임스페이스와 Pod 선택기를 모두 사용하여 연결 수락:
네임스페이스와 Pod 선택기를 결합하여 네트워크 트래픽을 일치시키려면 다음과 유사한
NetworkPolicy
오브젝트를 사용하면 됩니다.kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-pod-and-namespace-both spec: podSelector: matchLabels: name: test-pods ingress: - from: - namespaceSelector: matchLabels: project: project_name podSelector: matchLabels: name: test-pods
NetworkPolicy
오브젝트는 추가 기능이므로 여러 NetworkPolicy
오브젝트를 결합하여 복잡한 네트워크 요구 사항을 충족할 수 있습니다.
예를 들어, 이전 샘플에서 정의된 NetworkPolicy
오브젝트의 경우 동일한 프로젝트 내에서 allow-same-namespace
정책과 allow-http-and-https
정책을 모두 정의할 수 있습니다. 따라서 레이블이 role=frontend
로 지정된 Pod는 각 정책에서 허용하는 모든 연결을 허용할 수 있습니다. 즉 동일한 네임스페이스에 있는 Pod의 모든 포트 연결과 모든 네임스페이스에 있는 Pod에서 포트 80
및 443
에 대한 연결이 허용됩니다.
20.1.1.1. allow-from-router 네트워크 정책 사용
다음 NetworkPolicy
를 사용하여 라우터 구성에 관계없이 외부 트래픽을 허용합니다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-router
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
policy-group.network.openshift.io/ingress: ""1
podSelector: {}
policyTypes:
- Ingress
- 1
policy-group.network.openshift.io/ingress:"
레이블은 OpenShift-SDN 및 OVN-Kubernetes를 모두 지원합니다.
20.1.1.2. allow-from-hostnetwork 네트워크 정책 사용
다음 allow-from-hostnetwork
NetworkPolicy
오브젝트를 추가하여 호스트 네트워크 Pod에서 트래픽을 전달합니다.
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-from-hostnetwork spec: ingress: - from: - namespaceSelector: matchLabels: policy-group.network.openshift.io/host-network: "" podSelector: {} policyTypes: - Ingress
20.1.2. OpenShift SDN을 사용한 네트워크 정책 최적화
네트워크 정책을 사용하여 네임스페이스 내의 라벨에 따라 서로 다른 포드를 분리합니다.
NetworkPolicy
오브젝트를 단일 네임스페이스에서 개별 포드의 많은 수에 적용하는 것은 비효율적입니다. 포드 라벨은 IP 주소 수준에 존재하지 않으므로 네트워크 정책은 podSelector
로 선택한 모든 포드 간에 가능한 모든 링크에 대한 별도의 OVS(Open vSwitch) 흐름 규칙을 생성합니다.
예를 들어 NetworkPolicy
오브젝트 내의 spec podSelector
및 ingress podSelector
가 각각 200개의 포드와 일치하는 경우 40,000(200*200)개의 OVS 흐름 규칙이 생성됩니다. 이 경우 노드가 느려질 수 있습니다.
네트워크 정책을 설계할 때 다음 지침을 참조하십시오.
분리해야 하는 포드 그룹을 포함하도록 네임스페이스를 사용하여 OVS 흐름 규칙의 수를 줄입니다.
namespaceSelector
또는 빈podSelector
를 사용하여 전체 네임스페이스를 선택하는NetworkPolicy
오브젝트는 네임스페이스의 VXLAN 가상 네트워크 ID(VNID)와 일치하는 단일 OVS 흐름 규칙만 생성합니다.- 원래 네임스페이스에서 분리할 필요가 없는 포드를 유지하고, 분리해야 하는 포드를 하나 이상의 네임스페이스로 이동합니다.
- 분리된 포드에서 허용하려는 특정 트래픽을 허용하도록 추가 대상의 네임스페이스 간 네트워크 정책을 생성합니다.
20.1.3. OVN-Kubernetes 네트워크 플러그인을 사용하여 네트워크 정책 최적화
네트워크 정책을 설계할 때 다음 지침을 참조하십시오.
-
동일한
spec.podSelector
사양이 있는 네트워크 정책의 경우 수신 또는 송신 규칙의 서브 세트가 있는 여러 네트워크 정책보다 여러수신
또는송신
규칙이 있는 하나의 네트워크 정책을 사용하는 것이 더 효율적입니다. podSelector
또는namespaceSelector
사양을 기반으로 하는 모든수신
또는송신
규칙은수신 또는 송신 규칙에서 선택한 네트워크 정책 + Pod 수에 비례하여 OVS 흐름 수를
생성합니다. 따라서 모든 Pod에 대해 개별 규칙을 생성하는 대신 하나의 규칙에서 필요한 만큼의 Pod를 선택할 수 있는podSelector
또는namespaceSelector
사양을 사용하는 것이 좋습니다.예를 들어 다음 정책에는 두 개의 규칙이 있습니다.
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy spec: podSelector: {} ingress: - from: - podSelector: matchLabels: role: frontend - from: - podSelector: matchLabels: role: backend
다음 정책은 다음과 같은 두 가지 규칙을 나타냅니다.
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy spec: podSelector: {} ingress: - from: - podSelector: matchExpressions: - {key: role, operator: In, values: [frontend, backend]}
spec.podSelector
사양에 동일한 지침이 적용됩니다. 다른 네트워크 정책에 대해 동일한수신
또는송신
규칙이 있는 경우 공통spec.podSelector
사양을 사용하여 하나의 네트워크 정책을 생성하는 것이 더 효과적일 수 있습니다. 예를 들어 다음 두 정책에는 다른 규칙이 있습니다.apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: policy1 spec: podSelector: matchLabels: role: db ingress: - from: - podSelector: matchLabels: role: frontend --- apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: policy2 spec: podSelector: matchLabels: role: client ingress: - from: - podSelector: matchLabels: role: frontend
다음 네트워크 정책은 다음과 같은 두 가지 규칙을 나타냅니다.
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: policy3 spec: podSelector: matchExpressions: - {key: role, operator: In, values: [db, client]} ingress: - from: - podSelector: matchLabels: role: frontend
이 최적화는 여러 개의 선택기만 하나의 선택기로 표시되는 경우에만 적용할 수 있습니다. 선택기가 다른 레이블을 기반으로 하는 경우 이 최적화를 적용하지 못할 수 있습니다. 이러한 경우 네트워크 정책 최적화에 새로운 레이블을 적용하는 것이 좋습니다.
20.1.4. 다음 단계
- 네트워크 정책 생성
- 선택 사항: 기본 네트워크 정책 정의