본문 바로가기
IT 기술/k8s

[cka] NetworkPolicy

by Geunny 2024. 9. 17.
반응형

https://kubernetes.io/docs/concepts/services-networking/network-policies/

 

Network Policies

If you want to control traffic flow at the IP address or port level (OSI layer 3 or 4), NetworkPolicies allow you to specify rules for traffic flow within your cluster, and also between Pods and the outside world. Your cluster must use a network plugin tha

kubernetes.io

 

NetworkPolicy 란?

 

NetworkPolicy는 Kubernetes에서 네트워크 트래픽을 제어하기 위한 리소스입니다. 네트워크 정책(NetworkPolicy)은 클러스터 내에서 포드 간의 통신과 외부로부터의 트래픽 흐름을 제어할 수 있도록 정의한 규칙을 말합니다. 이를 통해 보안 및 네트워크 트래픽 제어를 세밀하게 설정할 수 있습니다.

 

주요 개념

 

1. 목적:

기본적으로 Kubernetes 클러스터 내의 모든 포드 간 통신은 허용됩니다. NetworkPolicy를 사용하면 특정 포드 간 통신을 허용하거나 차단하는 규칙을 만들 수 있습니다.

Ingress(들어오는 트래픽)와 Egress(나가는 트래픽)를 각각 제어할 수 있습니다.

2. 작동 방식:

NetworkPolicy는 레이블을 기반으로 어떤 포드들이 네트워크 정책의 대상이 될지를 결정합니다.

정책을 정의할 때, 어떤 포드가 외부 트래픽을 허용할지, 어떤 포드 간의 통신을 허용할지 등 세부적인 규칙을 지정할 수 있습니다.

3. 기본 네트워크 정책:

NetworkPolicy가 설정되지 않으면 Kubernetes는 포드 간의 모든 트래픽(Ingress와 Egress)을 기본적으로 허용합니다.

하지만 NetworkPolicy가 적용되면, 그 정책에 명시된 트래픽만 허용되고 나머지 트래픽은 차단됩니다.

 

NetworkPolicy의 주요 필드

 

1. podSelector:

정책이 적용될 포드를 선택합니다. 이 필드는 해당 포드를 식별하기 위해 레이블을 사용하며, matchLabels 또는 matchExpressions를 사용하여 레이블을 기반으로 포드를 선택할 수 있습니다.

2. policyTypes:

Ingress (들어오는 트래픽)와 Egress (나가는 트래픽)를 지정합니다.

Ingress: 포드로 들어오는 트래픽을 제어합니다.

Egress: 포드에서 나가는 트래픽을 제어합니다.

3. ingressegress 규칙:

각각 포드로 들어오거나 나가는 트래픽에 대해 구체적인 규칙을 설정합니다. 예를 들어, 특정 IP 범위, 네임스페이스, 포트 등을 지정할 수 있습니다.

 

예시: NetworkPolicy 설정

 

1. Ingress 규칙:

특정 포드에 대해 들어오는 트래픽만 허용하는 정책입니다.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-http
  namespace: prod
spec:
  podSelector:
    matchLabels:
      role: web
  policyTypes:
  - Ingress
  ingress:
  - from:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 80

 

위의 예시는 prod 네임스페이스에 있는 role=web 레이블을 가진 포드에 대해, 10.0.0.0/24 네트워크에서 오는 TCP 80번 포트의 트래픽을 허용합니다.

 

2. Egress 규칙:

특정 포드에서 나가는 트래픽만 허용하는 정책입니다.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-db-connection
  namespace: prod
spec:
  podSelector:
    matchLabels:
      role: backend
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/8
    ports:
    - protocol: TCP
      port: 3306

 

이 정책은 prod 네임스페이스에 있는 role=backend 레이블을 가진 포드가 10.0.0.0/24 네트워크로 나가는 TCP 3306번 포트 연결을 허용합니다.

 

egress 는 ingress 와 달리 ipBlock 조건만 사용할 수 있습니다.

 

NetworkPolicy의 장점

 

1. 보안 강화:

클러스터 내의 포드 간 통신을 제한하여 보안을 강화할 수 있습니다. 기본적으로 모든 포드가 서로 통신할 수 있지만, NetworkPolicy를 적용함으로써 의도하지 않은 통신을 막고 필요한 경우에만 통신을 허용할 수 있습니다.

2. 트래픽 제어:

특정 포드가 어떤 IP 대역이나 네임스페이스와 통신할 수 있는지를 세밀하게 제어할 수 있어, 네트워크 트래픽을 효과적으로 관리할 수 있습니다.

3. 세분화된 규칙:

여러 규칙을 정의하여 다양한 네트워크 상황에 맞춰 네트워크 정책을 유연하게 구성할 수 있습니다.

 

결론

 

NetworkPolicy는 Kubernetes 클러스터 내에서 포드 간 및 외부로부터의 트래픽을 제어하고, 이를 통해 보안을 강화하는 중요한 리소스입니다. 레이블 기반으로 포드를 선택하고, Ingress와 Egress 트래픽을 각각 정의함으로써 원하는 네트워크 규칙을 설정할 수 있습니다.

 

 

추가

 

만약 NetworkPolicy 를 네임스페이스 단위로 지정하려면 어떻게 해야 할까?

 

특정 네임스페이스의 모든 포드에 대해 정책을 적용하고 싶다면, podSelector를 빈 값으로 설정할 수 있습니다. 이 방법은 해당 네임스페이스 내의 모든 포드에 대해 적용되는 정책을 정의하는 방식입니다.

 

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all
  namespace: prod
spec:
  podSelector: {}  # 모든 포드를 선택
  policyTypes:
    - Ingress
  ingress:
    - from:
        - ipBlock:
            cidr: 10.0.0.0/8

 

위의 예시는 prod 네임스페이스에 있는 모든 포드에 대해 10.0.0.0/8 범위의 IP에서 오는 트래픽을 허용하는 정책입니다.

 

또한 기본적인 트래픽을 차단하고 싶다면?

네임스페이스에 대해 기본적으로 모든 트래픽을 차단하는 정책을 설정하고, 필요한 경우 특정 트래픽만 허용하는 방식으로 설정할 수 있습니다.

 

1. 모든 네임스페이스의 모든 트래픽을 기본적으로 차단하는 default-deny NetworkPolicy

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

 

2. 그런 다음 필요한 트래픽을 허용하는 예외 규칙을 추가할 수 있습니다. 예를 들어, 특정 IP나 포트를 기준으로 트래픽을 허용할 수 있습니다.

 

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-some
  namespace: prod
spec:
  podSelector: {}
  policyTypes:
    - Ingress
  ingress:
    - from:
        - ipBlock:
            cidr: 10.0.0.0/8

 

 

 

댓글