IP주소 또는 포트 수준(L3, L4)에서 트래픽 흐름을 제어하기 위해 사용한다. 네트워크 정책은 클러스터 내부의 트래픽 흐름 뿐 아니라 파드와 외부 간의 규칙을 정의할 수 있도록 함.

네트워크 정책은 파드가 네트워크 상 다양한 네트워크 엔티티(엔드포인트, 서비스 등...)와 통신할 수 있도록 허용하는 방법을 지정함. 통신의 어느 한쪽이 파드인 연결만이 k8s 네트워크 정책의 대상이다.

파드가 통신할 수 있는 네트워크 엔티티는 다음의 3개 식별자 조합을 통해 식별된다.

  1. 허용되는 다른 파드
  2. 허용되는 네임스페이스
  3. IP 블록

1과 2의 방식으로 네트워크 정책을 정의하면 셀렉터를 이용해 셀렉터와 일치하는 파드와의 네트워크 통신이 정책의 대상이 된다.

네트워크 정책은 네트워크 플러그인으로 구현된다. 네트워크 플러그인이 컨트롤러 역할을 하기 때문에, 네트워크 플러그인 없이 네트워크 정책 오브젝트를 생성하면 아무런 효과가 없다.

네트워크 플러그인은 보통 클러스터 구축 시기에 하나 정해서 모든 노드에 적용하는게 일반적이다. 따라서 이미 클러스터가 구축되어있다면 네트워크 플러그인도 있다.

파드 격리의 두 가지 종류

여기서 말하는 격리(isolation)은 완전히 격리하는게 아니라 통신에 일정한 제약이 있음을 의미한다. 반대로 비격리적(non-isolated)는 아무런 제약이 없음을 의미한다.

egress에 대한 격리

기본적으로 파드는 egress에 비격리적이다. 모든 아웃바운드 연결이 허용되어있다. 만약 policyTypes에 Egress 가 있는 네트워크 정책이 적용된다면 파드가 이그레스에 대해 격리된다. 이후엔 파드에서 나가는 연결 중에서 파드의 이그레스에 적용된 네트워크 정책의 egress 리스트에 허용된 이그레스로의 연결만 허용된다.

ingress에 대한 격리

마찬가지로 파드는 모든 ingress에 대해 비격리적이다. 모든 인바운드 연결이 허용되어있다. 해당 파드에 적용되면서 policyTypesIngress가 있는 네트워크 정책이 적용되면 파드가 인그레스에 대해 격리되고, 파드로 들어오는 연결 중에서 파드의 인그레스에 적용된 NetworkPolicy의 ingress리스트에 허용된 연결만이 허용된다.

모든 네트워크정책은 덮어씌워지는 방식으로 적용되므로 충돌하는 경우는 없다. 해당 파드의 특정 방향에 대해 허용된 연결은 적용된 모든 네트워크 정책의 합집합이 적용된다.

네트워크 정책 리소스의 예시 매니페스트는 다음과 같다.

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

앞서도 말했지만 사용하고 잇는 네트워크 솔루션이 network policy리소스를 지원하지 않으면 위 설정을 클러스터에 적용해도 효과가 없다.

spec