본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

Kubernetes 네트워크 정책 시작하기

원문 보기 위키 갱신

이 문서는 Calico 오픈 소스 정책 엔진과 함께 사용할 때의 Kubernetes NetworkPolicy 문법, 규칙, 기능에 대한 안내입니다. Kubernetes 네트워크 정책이 어떻게 동작하는지, 그리고 인그레스·이그레스 정책을 어떻게 작성하는지 차근차근 살펴봅니다. 네트워크 정책을 처음 접한다면 이 문서부터 읽어보세요.

출처: 문서

본문

큰 그림

Kubernetes 네트워크 정책을 사용하면 관리자와 개발자가 규칙을 사용해 어떤 네트워크 트래픽이 허용되는지 강제할 수 있습니다.

가치

Kubernetes 네트워크 정책은 개발자가 애플리케이션을 배포할 때 쓰는 것과 같은 간단한 언어로 애플리케이션에 들어오고 나가는 접근을 보호할 수 있게 해 줍니다. 개발자는 저수준 네트워킹 개념을 이해할 필요 없이 애플리케이션에 집중할 수 있습니다. 네트워크 정책으로 애플리케이션을 쉽게 보호하게 하는 것은 shift left DevOps 환경을 지원합니다.

개념

Kubernetes Network Policy API는 네트워크 트래픽을 제어하는 네트워크 정책을 사용자가 정의하는 표준 방법을 제공합니다. 하지만 Kubernetes에는 네트워크 정책을 강제하는 내장 기능이 없습니다. 네트워크 정책을 강제하려면 Calico 같은 네트워크 플러그인을 사용해야 합니다.

인그레스와 이그레스

네트워크 트래픽을 보호하는 일은 대체로 이그레스(egress)와 인그레스(ingress) 규칙을 정의하는 것을 중심으로 이루어집니다. Kubernetes 파드의 관점에서 인그레스는 파드로 들어오는 트래픽이고, 이그레스는 파드에서 나가는 트래픽입니다. Kubernetes 네트워크 정책에서는 인그레스와 이그레스 "허용" 규칙을 독립적으로 만듭니다(egress, ingress, 또는 둘 다).

기본 거부/허용 동작

**기본 허용(default allow)**은 별도로 지정하지 않는 한 모든 트래픽이 기본적으로 허용된다는 뜻입니다. **기본 거부(default deny)**는 명시적으로 허용하지 않는 한 모든 트래픽이 기본적으로 거부된다는 뜻입니다.

방법

첫 Kubernetes 네트워크 정책을 만들기 전에 네트워크 정책의 기본 동작을 이해해야 합니다. Kubernetes 네트워크 정책이 파드에 적용되어 있지 않으면 파드로/파드에서 오가는 모든 트래픽이 허용됩니다(default-allow). 그 결과, 네트워크 정책을 하나도 만들지 않으면 모든 파드가 다른 모든 파드와 자유롭게 통신할 수 있습니다. 하나 이상의 Kubernetes 네트워크 정책이 파드에 적용되면 해당 네트워크 정책에 명시적으로 정의된 트래픽만 허용됩니다(default-deny).

이제 허용할 트래픽을 세밀하게 조정할 준비가 되었습니다.

인그레스 정책 만들기

인그레스 네트워크 정책을 만들어 다른 파드에서 들어오는 트래픽을 허용하세요.

네트워크 정책은 특정 네임스페이스 내의 파드에 적용됩니다. 정책에는 인그레스 규칙을 하나 이상 포함할 수 있습니다. 네트워크 정책이 적용될 네임스페이스의 파드를 지정하려면 pod selector를 사용합니다. 인그레스 규칙 안에서는 또 다른 파드 셀렉터로 어떤 파드에서 들어오는 트래픽을 허용할지 정의하고, ports 필드로 어떤 포트의 트래픽을 허용할지 정의합니다.

같은 네임스페이스의 파드로부터 인그레스 트래픽 허용

다음 예에서 color=blue 레이블이 있는 파드로 들어오는 트래픽은 color=red 파드에서 포트 80으로 오는 경우에만 허용됩니다.

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-same-namespace
  namespace: default
spec:
  podSelector:
    matchLabels:
      color: blue
  ingress:
    - from:
        - podSelector:
            matchLabels:
              color: red
      ports:
        - port: 80

다른 네임스페이스의 파드로부터 인그레스 트래픽 허용

다른 네임스페이스의 파드에서 오는 트래픽을 허용하려면 인그레스 정책 규칙에 네임스페이스 셀렉터를 사용합니다. 다음 정책에서 네임스페이스 셀렉터는 하나 이상의 Kubernetes 네임스페이스와 매칭되고, 그 네임스페이스 안의 파드를 선택하는 파드 셀렉터와 결합됩니다.

보조 설명: 네임스페이스 셀렉터는 정책 규칙에서만 사용할 수 있습니다. spec.podSelector는 정책과 같은 네임스페이스의 파드에만 적용됩니다.

다음 예에서는 shape=square 레이블이 있는 네임스페이스 안에서 color=red 레이블이 있는 파드에서 포트 80으로 오는 경우에만 들어오는 트래픽이 허용됩니다.

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-different-namespace
  namespace: default
spec:
  podSelector:
    matchLabels:
      color: blue
  ingress:
    - from:
        - podSelector:
            matchLabels:
              color: red
          namespaceSelector:
            matchLabels:
              shape: square
      ports:
        - port: 80

이그레스 정책 만들기

이그레스 네트워크 정책을 만들어 파드에서 나가는 트래픽을 허용하세요.

같은 네임스페이스의 파드로부터 이그레스 트래픽 허용

다음 정책은 파드 선택 조건에 맞는, 같은 네임스페이스의 다른 파드로 파드가 나가는 트래픽을 허용합니다. 다음 예에서는 color=red 파드로 포트 80을 향해 나가는 경우에만 아웃바운드 트래픽이 허용됩니다.

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-egress-same-namespace
  namespace: default
spec:
  podSelector:
    matchLabels:
      color: blue
  egress:
    - to:
        - podSelector:
            matchLabels:
              color: red
      ports:
        - port: 80

IP 주소 또는 CIDR 범위로의 이그레스 트래픽 허용

이그레스 정책은 특정 IP 주소와 CIDR 범위로의 트래픽을 허용하는 데에도 사용할 수 있습니다. 일반적으로 IP 주소/범위는 정적 리소스나 서브넷처럼 클러스터 외부의 트래픽을 처리하는 데 사용됩니다.

다음 정책은 CIDR 172.18.0.0/24의 파드로 나가는 이그레스 트래픽을 허용합니다.

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-egress-external
  namespace: default
spec:
  podSelector:
    matchLabels:
      color: red
  egress:
    - to:
        - ipBlock:
            cidr: 172.18.0.0/24

모범 사례: deny-all 기본 네트워크 정책 만들기

네임스페이스의 모든 파드를 안전하게 유지하려면 기본 네트워크 정책을 만드는 것이 모범 사례입니다. 이를 통해 정책이 정의되지 않은 애플리케이션이나 버전이 실수로 노출되는 일을 막을 수 있습니다.

deny-all 기본 인그레스·이그레스 네트워크 정책 만들기

다음 네트워크 정책은 기본 deny-all 인그레스·이그레스 정책을 구현합니다. policy-demo 네임스페이스의 파드로/파드에서 오가는 모든 트래픽을 막습니다. 이 정책은 policy-demo 네임스페이스의 모든 파드에 적용되지만 어떤 트래픽도 명시적으로 허용하지 않는다는 점에 주의하세요. 모든 파드가 선택되는데, 네트워크 정책이 파드를 선택하면 기본 동작이 바뀌므로 결과는 모든 인그레스·이그레스 트래픽 거부가 됩니다. (다른 네트워크 정책이 허용하는 트래픽은 예외입니다.)

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: default-deny
  namespace: policy-demo
spec:
  podSelector:
    matchLabels: {}
  policyTypes:
    - Ingress
    - Egress

추가 리소스

더 알아보기 (Learn more)

네트워크 정책에 익숙해지면 Calico만의 확장 정책(GlobalNetworkPolicy 등)도 살펴볼 만합니다. deny-all 기본 정책은 새 네임스페이스를 만들 때마다 먼저 적용해 두는 습관이 도움이 됩니다. 더 자세한 정책 문법은 Kubernetes 공식 문서를 참고하세요.