반응형
기본적으로 Kubernetes에서는 NetworkPolicy가 설정되지 않은 상태에서는 같은 클러스터 내의 모든 Pod들이 서로 통신이 가능합니다.
https://kubernetes.io/docs/concepts/cluster-administration/networking/
이는 클러스터 내의 Pod들이 동일한 가상 네트워크(Virtual Network)에 연결되어 있기 때문입니다.
Cluster Networking
Networking is a central part of Kubernetes, but it can be challenging to understand exactly how it is expected to work. There are 4 distinct networking problems to address: Highly-coupled container-to-container communications: this is solved by Pods and lo
kubernetes.io
1. NetworkPolicy란?
- Pod 간 트래픽 제어:
- Pod 간의 Ingress(들어오는 트래픽)와 Egress(나가는 트래픽)를 허용하거나 차단하는 역할.
- Namespace 범위:
- NetworkPolicy는 특정 Namespace 내에서 적용됩니다.
- CNI 플러그인 지원 필요:
- NetworkPolicy를 적용하려면 Kubernetes 클러스터에 CNI 플러그인(Calico, Cilium, Weave Net 등)이 설치되어야 합니다.
- 기본적으로 네트워크 플러그인이 NetworkPolicy를 지원하지 않으면 동작하지 않습니다.
2. NetworkPolicy의 주요 필드
- podSelector:
- 정책이 적용될 Pod을 라벨로 선택.
- 선택된 Pod만 해당 NetworkPolicy의 규칙이 적용됩니다.
- podSelector: {}는 모든 Pod을 의미.
- policyTypes:
- 정책의 타입(트래픽 방향)을 지정:
- Ingress: 들어오는 트래픽 제어.
- Egress: 나가는 트래픽 제어.
- 생략하면 Ingress만 포함.
- 정책의 타입(트래픽 방향)을 지정:
- ingress / egress:
- 허용할 트래픽의 규칙 정의.
- 주요 필드:
- from: 허용된 소스.
- 특정 IP, Namespace, 또는 Pod 라벨을 기준으로 설정 가능.
- to: 허용된 목적지 (Egress에서 사용).
- ports: 허용된 포트와 프로토콜.
- from: 허용된 소스.
- namespaceSelector:
- 특정 Namespace를 기준으로 트래픽을 허용.
3. NetworkPolicy 동작 규칙
- 정책이 없으면 기본적으로 모든 트래픽 허용:
- Pod 간 트래픽은 제한 없이 모두 허용됩니다. 위에서 언급했던 내용이죠? 이건 아셔야합니다 기본 중에 기본!
- NetworkPolicy를 적용하면 기본적으로 해당 Pod의 트래픽이 차단:
- 명시적으로 허용된 트래픽만 통과.
- Ingress와 Egress는 별도로 정의:
- 각각 독립적으로 설정 가능.
- 정책 적용 범위:
- Pod의 라벨을 기준으로 선택되며, 선택되지 않은 Pod은 정책의 영향을 받지 않습니다.
4. NetworkPolicy 예제
1) 특정 Pod으로의 Ingress 허용
파일: allow-specific-pod-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-db-access
namespace: default
spec:
podSelector:
matchLabels:
app: database
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: backend
ports:
- protocol: TCP
port: 3306
- 설명:
- app=database 라벨을 가진 Pod에 대해 NetworkPolicy 적용.
- app=backend 라벨을 가진 Pod에서 TCP 3306 포트로 들어오는 트래픽만 허용.
- 이 외의 트래픽은 차단.
2) 특정 Namespace에서 오는 트래픽 허용
파일: allow-namespace-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-namespace-access
namespace: default
spec:
podSelector:
matchLabels:
app: frontend
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
env: dev
- 설명:
- app=frontend 라벨을 가진 Pod에 대해 NetworkPolicy 적용.
- env=dev 라벨이 있는 Namespace의 Pod에서 들어오는 트래픽만 허용.
3) 모든 외부 트래픽 차단
파일: deny-all-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
namespace: default
spec:
podSelector:
matchLabels:
app: secure-app
policyTypes:
- Ingress
ingress: []
- 설명:
- app=secure-app 라벨을 가진 Pod에 대해 NetworkPolicy 적용.
- Ingress 트래픽 전부 차단.
4) 특정 Egress 트래픽 허용
파일: allow-specific-egress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-egress
namespace: default
spec:
podSelector:
matchLabels:
app: frontend
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 80
- 설명:
- app=frontend 라벨을 가진 Pod에서 나가는 트래픽에 대해 정책 적용.
- 10.0.0.0/24 네트워크의 TCP 80 포트로 나가는 트래픽만 허용.
5) 모든 트래픽 허용
파일: allow-all-traffic.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all-traffic
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
- 설명:
- 모든 Pod에 대해 모든 Ingress 및 Egress 트래픽을 허용.
5. 실습 절차
- 네임스페이스와 Pod 준비
- frontend와 backend Pod을 준비:
kubectl run frontend --image=nginx --labels="app=frontend" kubectl run backend --image=nginx --labels="app=backend" kubectl run database --image=nginx --labels="app=database"
- frontend와 backend Pod을 준비:
- Pod 간 통신 테스트
- NetworkPolicy 적용 전에는 모든 Pod 간 통신이 허용됩니다:
kubectl exec -it frontend -- curl backend:80 kubectl exec -it frontend -- curl database:80
- NetworkPolicy 적용 전에는 모든 Pod 간 통신이 허용됩니다:
- NetworkPolicy 적용
- 예제 YAML 파일을 적용한 후, 다시 통신 테스트:
kubectl apply -f allow-specific-pod-ingress.yaml kubectl exec -it frontend -- curl database:3306 # 성공 kubectl exec -it backend -- curl database:3306 # 실패
- 예제 YAML 파일을 적용한 후, 다시 통신 테스트:
- NetworkPolicy 상태 확인
- kubectl get networkpolicy kubectl describe networkpolicy allow-db-access
6. 작성 시 주의사항
- podSelector는 정책 적용 범위
- podSelector에 해당되지 않는 Pod은 정책의 영향을 받지 않습니다.
- NetworkPolicy는 허용만 정의
- NetworkPolicy는 허용할 트래픽만 정의합니다.
- 명시적으로 허용되지 않은 트래픽은 차단됩니다.
- CNI 플러그인 확인
- NetworkPolicy는 CNI 플러그인(예: Calico, Cilium 등)이 필요합니다. 플러그인이 없으면 정책이 적용되지 않습니다.
- Egress 정책은 명시적으로 설정해야 함
- 기본적으로 Pod에서 나가는 트래픽은 제한이 없지만, Egress 정책을 명시하면 해당 트래픽도 제어됩니다.
- 다중 정책 적용
- 여러 NetworkPolicy가 적용될 경우, 허용된 트래픽이 합쳐져서 동작합니다.
반응형
'Certificated 도전 > CKAD- Kubernetes' 카테고리의 다른 글
[CKAD] 리소스 요청, 제한 ( Requests, Limits) 정리 (0) | 2025.01.24 |
---|---|
[CKAD] Service Account도 한 문제는 나온다고 함! (0) | 2025.01.24 |
[CKAD]Liveness와 Readiness 프로브 완벽 정리 (0) | 2025.01.23 |
[CKAD] Blue/Green 배포와 Canary 배포 정리 (0) | 2025.01.22 |
[CKAD] 볼륨 문제는 무조건 나오는 듯! 최종 정리 (0) | 2025.01.22 |