
IP주소나 포트 수준(OSI 3,4 계층)에서 트래픽 흐름을 제어하기 위한 보안 메커니즘이다.
이를 통해 클러스터 내부 뿐만 아니라 Pod와 외부 간 트래픽 흐름 규칙을 지정할 수 있다.
TCP, UDP, SCTP 등의 프로토콜에 대해 IP 주소 및 포트 단위로 접근을 허용하거나 차단할 수 있으며,
클러스터 내 특정 애플리케이션에 대해 어떤 엔티티(파드, 네임스페이스, IP 블록)가 통신할 수 있는지를 정의할 수 있다.
네트워크 정책은 (양쪽 종단인) 파드연결에만 적용되며 다른 연결에는 관여하지 않는다.
파드가 통신할 수 있는 엔티티는 세 개의 식별자 조합을 통해 식별이 된다.
다른 파드(Pod)
네임스페이스(Namespace)
IP 블록(IPBlock)
네트워크 정책은 네트워크 플러그인으로 구현되어 네트워크정책을 지원하는 네트워킹 솔루션을 사용해야하며,
이를 구현하는 컨트롤러 없이 네트워크 정책을 생성할 경우 아무런 효과가 없다.
파드 격리는 두 가지 종류가 있다. 여기서 말하는 "격리"란 절대적인 것이 아니라, "일부 제한이 된다"이라는 의미이다.
->하지만 네트워크 정책(NetworkPolicy) 을 적용하면,
파드가 외부로 나가거나 외부에서 들어오는 통신에 제한을 둘 수 있다.
(기본적으로 파드는 출구에 대해 비격리되어있으며, 모든 아웃바운드 연결이 허용된다.
또한 기본적으로 입구에 대해서도 비격리되어있어, 모든 인바운드 연결에도 허용이 된다.)
이그레스 격리(파드가 밖으로 나갈 때)의 격리를 의미한다.
기본적으로 파드는 비격리 상태라서
모든 외부로의 통신(아웃바운드 트래픽)이 허용된다.
하지만 Egress 타입의 네트워크 정책이 적용되면,
그때부터는 정해진 규칙에 맞는 트래픽만 나갈 수 있다.
인그레스 격리는(다른 파드나 외부에서 이 파드로 들어오는 트래픽)의 격리를 의미한다.
기본적으로 파드는 비격리 상태라서
모든 인바운드 요청이 허용된다.
하지만 Ingress 타입의 네트워크 정책이 설정되면,
지정된 파드나 IP만 이 파드로 접근할 수 있다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
spec: 네트워크폴리시 사양, 지정된 네임스페이스에서 특정 네트워크 정책을 정의하는데 필요한 모든 정보.
podSelector: 각 네트워크폴리시에는 정책이 적용되는 파드 그룹을 선택하는 podSelector 가 포함된다. 예시 정책은 "role=db" 레이블이 있는 파드를 선택한다. 비어있는 podSelector 는 네임스페이스의 모든 파드를 선택한다.
policyTypes: 각 네트워크폴리시에는 Ingress, Egress 또는 두 가지 모두를 포함할 수 있는 policyTypes 목록이 포함된다. policyTypes 필드는 선택한 파드에 대한 인그레스 트래픽 정책, 선택한 파드에 대한 이그레스 트래픽 정책 또는 두 가지 모두에 지정된 정책의 적용 여부를 나타낸다. 만약 네트워크폴리시에 policyTypes 가 지정되어 있지 않으면 기본적으로 Ingress 가 항상 설정되고, 네트워크폴리시에 Egress 가 있으면 이그레스 규칙이 설정된다.
ingress: 각 네트워크폴리시에는 화이트리스트 ingress 규칙 목록이 포함될 수 있다. 각 규칙은 from 과 ports 부분과 모두 일치하는 트래픽을 허용한다. 예시 정책에는 단일 규칙이 포함되어 있는데 첫 번째 포트는 ipBlock 을 통해 지정되고, 두 번째는 namespaceSelector 를 통해 그리고 세 번째는 podSelector 를 통해 세 가지 소스 중 하나의 단일 포트에서 발생하는 트래픽과 일치 시킨다.
egress: 각 네트워크폴리시에는 화이트리스트 egress 규칙이 포함될 수 있다. 각 규칙은 to 와 ports 부분과 모두 일치하는 트래픽을 허용한다. 예시 정책에는 단일 포트의 트래픽을 10.0.0.0/24 의 모든 대상과 일치시키는 단일 규칙을 포함하고 있다.
참고자료
[쿠버네티스 공식 홈페이지 - Network Policies]
https://kubernetes.io/docs/concepts/services-networking/network-policies/
[wikidocs - 03. 네트워크 정책(Network Policy): 제로 트러스트를 향한 첫걸음]
https://wikidocs.net/303581