본문 바로가기

Container/Kubernetes

[K8S] Network Policy

NetworkPolicy는 네트워크 트래픽을 제어하고 관리하는 데 사용되는 리소스이다. 이를 통해 파드 간의 통신을 허용하거나 차단함으로써 클러스터 내의 네트워크 보안을 강화할 수 있다. 기본적으로 쿠버네티스는 모든 Pod 간 네트워크 연결을 허용하지만, NetworkPolicy를 사용하면 특정 트래픽만 허용하고 나머지는 차단할 수 있는 것이다.

  • NetworkPolicy는 Pod에만 적용 가능하다.
  • 기본적으로 NetworkPolicy가 없으면 모든 네트워크 트래픽이 허용된다.

NetworkPolicy를 지원하는 솔루션(Plugin)

  • Kube-router
  • Calico
  • Romana
  • Weave-net

NetworkPolicy를 지원하지 않는 솔루션 : Flannel

  • NetworkPolicy 조회
controlplane ~ ➜  kubectl get networkpolicies
NAME             POD-SELECTOR   AGE
payroll-policy   name=payroll   18m

controlplane ~ ➜  kubectl get netpol
NAME             POD-SELECTOR   AGE
payroll-policy   name=payroll   18m
# name=payroll이라는 레이블을 가진 파드에 대한 인그레스(Ingress) 트래픽만 허용하는 정책 설정
  • POD-SELECTOR: 네트워크 정책(NetworkPolicy)이나 서비스(Service) 등에서 특정 파드를 선택하기 위해 사용하는 메커니즘
    • 네트워크 정책에서 PodSelector 규칙이 적용될 파드를 지정한다.

IngressEgress네트워크 트래픽 흐름을 정의하는 중요한 개념이다.

Ingress 클러스터 외부 → 내부로 들어오는 트래픽을 제어
Egress 클러스터 내부 → 외부로 나가는 트래픽을 제어

 

controlplane ~ ➜  kubectl describe netpol payroll-policy 
Name:         payroll-policy
Namespace:    default
Created on:   2025-02-04 05:42:30 +0000 UTC
Labels:       <none>
Annotations:  <none>
Spec:
  PodSelector:     name=payroll
  Allowing ingress traffic:  # Ingress traffic만 허용된다.
    To Port: 8080/TCP
    From:
      PodSelector: name=internal
  Not affecting egress traffic
  Policy Types: Ingress

Ingress

기본적으로 Kubernetes에서는 Service의 NodePort 또는 LoadBalancer를 사용해야 외부에서 접근 가능하지만, Ingress를 활용하면 보다 정교한 라우팅을 설정할 수있다. (보안 강화를 위해 외부로 나가는 트래픽을 제한)

클라이언트 → Ingress Controller → Kubernetes 서비스 → Pod

# app=backend 라벨이 있는 Pod에 대해 app=frontend인 Pod에서만 접근 허용

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: backend  # 적용 대상 Pod
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend  # frontend만 backend에 접근 가능
    ports:
    - protocol: TCP
      port: 80  # 80 포트 허용

 

Egress

클러스터 내부에서 외부(인터넷 등)로 나가는 트래픽을 제어하는 네트워크 정책리소스이다.

  • 클러스터 내부 Pod가 외부 인터넷에 접근할 수 있도록 제한
  • 기본적으로 쿠버네티스는 모든 외부 트래픽을 허용하지만 NetworkPolicy를 설정해서 Egress 제어가 가능하다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: restrict-egress
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: backend  # backend Pod에 적용
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.10/32  # 특정 DB 서버만 허용(10.0.0.10/32 IP로만 Egress 허용)
    ports:
    - protocol: TCP
      port: 3306  # MySQL 포트 허용

 

모든 Ingress 및 Egress 차단

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
  namespace: default
spec:
  podSelector: {}  # 네임스페이스 내 모든 Pod에 적용
  policyTypes:
  - Ingress
  - Egress

 

실습]

controlplane ~ ➜ vi internal-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: internal-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      name: internal
  policyTypes:
    - Egress
  egress:
    - to:
      - podSelector:
          matchLabels:
            name: payroll
      ports:
      - protocol: TCP
        port: 8080
    - to:
      - podSelector:
          matchLabels:
            name: mysql
      ports:
        - protocol: TCP
          port: 3306
          
controlplane ~ ➜  kubectl create -f internal-policy.yaml 
networkpolicy.networking.k8s.io/internal-policy created

controlplane ~ ➜  kubectl get netpol
NAME              POD-SELECTOR    AGE
internal-policy   name=internal   5m17s
payroll-policy    name=payroll    16m

controlplane ~ ➜  kubectl describe netpol internal-policy
Name:         internal-policy
Namespace:    default
Created on:   2025-02-04 06:53:35 +0000 UTC
Labels:       <none>
Annotations:  <none>
Spec:
  PodSelector:     name=internal
  Not affecting ingress traffic
  Allowing egress traffic:
    To Port: 8080/TCP
    To:
      PodSelector: name=payroll
    ----------
    To Port: 3306/TCP
    To:
      PodSelector: name=mysql
  Policy Types: Egress

 

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

 

  NetworkPolicy Ingress Egress
목적 Pod 간 네트워크 트래픽 제어 외부 → 클러스터 내부로 들어오는 트래픽 제어 클러스터 내부 → 외부로 나가는 트래픽 제어
적용 대상 Pod 간 통신 (Ingress & Egress) HTTP/HTTPS 요청 Pod에서 외부 네트워크로 나가는 요청
설정 방식 NetworkPolicy 리소스 Ingress 리소스 NetworkPolicy의 Egress
보안 기능 내부 트래픽 제한 가능 외부에서 들어오는 트래픽 보호 외부 접속 제한 가능
예제 특정 네임스페이스에서만 접근 허용 /api 경로를 특정 서비스로 라우팅 특정 IP(예: DB)만 허용

 

반응형

'Container > Kubernetes' 카테고리의 다른 글

[K8S] Network & CNI  (0) 2025.02.06
[K8S] Deploy a Kubernetes Cluster using Kubeadm  (0) 2025.02.06
[K8S] Security Context  (0) 2025.02.03
[K8S] Image Security  (0) 2025.02.03
[K8S] Service Account(SA)  (0) 2025.02.03