티스토리 뷰
1. 문제#1 Pod간 통신 제한
1) 문제 시나리오
(1) Deployment 생성
- frontend와 backend Deployment를 생성
- fronend 2개의 레플리카, backend 1개의 레플리카를 실행
(2) NetworkPolicy생성
- frontend Pod만 backend Pod와 통신할 수 있도록 NetworkPolicy를 구성
- 다른 Pod는 backend와 통신할 수 없어야 한다.
(3) 결과확인
- frontend Pod에서 backend Pod로 요청이 성공적으로 전달되는지 확인
- 다른 Pod(별도의 테스트용 Pod)에서 backend로 요청이 차단되는지 확인
2) 해결과정
(1) Deployment YAML 작성
- frontend deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
spec:
replicas: 2
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app: frontend
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
- backend deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
spec:
replicas: 1
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
(2) Deployment 생성
kubectl apply -f frontend-deployment.yaml
kubectl apply -f backend-deployment.yaml
(3) NetworkPolicy YAML 작성
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
spec:
podSelector:
matchLabels:
app: backend # backend Pod에 대한 정책 적용
ingress:
- from:
- podSelector:
matchLabels:
app: frontend #frontend Pod에만 ingree 허용
ports:
- protocol: TCP
port: 80
(4) NetPol 생성
kubectl apply -f allow-frontend-to-backend.yaml
(5) frontend->backend요청 테스트
kubectl exec <frontend-pod-name> -- curl http://<backend-service-name>
<!DOCTYPE html>
<html>
<head><title>Welcome to nginx!</title></head>
...
</html>
(6) 다른 Pod-> backend요청테스트
kubectl run test-pod --image=busybox --restart=Never -- sh -c "sleep 3600"
kubectl exec test-pod -- curl http://<backend-service-name>
#요청 실패
curl: (7) Failed to connect to <backend-service-name> port 80 after X ms.
2. 문제#2 외부트래픽 허용
1) 문제시나리오
(1) NetPol 생성
- 특정 CIDR범위(192.168.0.0/16)에서 오는 트래픽만 허용하도록 NetPol 구성
- 이 정책은 모든 Pod에 적용
(2) 결과 확인
- CIDR 범위내에서 요청이 성공적으로 전달되는지, CIDR범위 외부에서 요청이 차단되는지 확인
2) 해결과정
(1) YAML 작성
#allow-external-cidr.yaml
apiVersion: networking.k8s.io/v1
kind:NetworkPolicy
metadata:
name: allow-external-cidr
spec:
podSelector: {} #네임스페이스 내 모든 Pod에 적용
ingress:
- from:
- ipBlock:
cidr: 192.168.0.0/16 # 특정 CIDR범위만 허용
ports:
- protocol: TCP
port: 80
(2) NetPol 생성
kubectl apply -f allow-external-cidr.yaml
(3) CIDR 범위내 요청 테스트
curl http://<pod-ip>:80 --interface <192.168.x.x>
(4) CIDR 범위 외 요청 테스트
curl http://<pod-ip>:80 --interface <10.x.x.x>
#출력 예시 curl: (7) Failed to connect to <pod-ip> port 80 after X ms.
3. 문제#3 기본 Deny 정책
1) 문제시나리오
(1) NetPol 생성
- 네임스페이스 내 모든 Pod 간 통신을 차단하는 기본 Deny 정책을 생성
- 특정 레이블('app=allowed')을 가진 Pod간의 통신만 허용하는 추가 NetPol을 생성
(2) 결과확인
- 모든 Pod간 통신이 차단되었는지 확인, 레이블이 일치하는 Pod간 통신이 허용되는지 확인
2) 해결과정
1) 기본 Deny 정책 YAML 작성
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
spec:
podSelector: {} # 네임스페이스 내 모든 Pod에 적용 (기본 Deny)
policyTypes:
- Ingress # 들어오는 트래픽 차단
- Egress # 나가는 트래픽 차단
2) 기본 Deny 정책 생성
kubectl apply -f default-deny.yaml
3) 특정 Pod 간 통신 허용 정책 작성
#allow-speicific-pods.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-specific-pods
spec:
podSelector:
matchLabels:
app: allowed # 특정 레이블을 가진 Pod에만 적용
ingress:
- from:
- podSelector:
matchLabels:
app: allowed #동일한레이블d을 가진 Pod끼리 트래픽 허용
ports:
- protocol: TCP
port: 80
4)허용정책 생성
kubectl apply -f allow-specific-pods.yaml
5) 모든 통신 차단 확인
kubectl run test-pod --image=busybox --restart=Never -- sh -c "sleep 3600"
kubectl exec test-pod -- curl http://<allowed-pod-ip>
6) 특정 레이블을 가진 Pod 간 통신 확인
kubectl run test-pod2 --labels app=allowed --image nginx --restart=Never -- sh -c "sleep 3600"
kubectl exec test-pod2 -- curl http://<allowed-pod-ip>
<!DOCTYPE html>
<html>
<head><title>Welcome to nginx!</title></head>
...
</html>
'쿠버네티스' 카테고리의 다른 글
CKA 기출문제 정리 CoreDNS 및 DNS 확인 (0) | 2025.01.02 |
---|---|
CKA 기출문제 정리 external name (0) | 2025.01.02 |
CKA 기출문제 LoadBalancer (0) | 2025.01.01 |
CKA 기출 문제 데몬셋 (0) | 2025.01.01 |
CKA 기출문제 정리 HPA (0) | 2025.01.01 |