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는 규칙이 적용될 파드를 지정한다.
Ingress와 Egress는 네트워크 트래픽 흐름을 정의하는 중요한 개념이다.
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 |