728x90
✅ 목표: Cilium의 L3/L4 NetworkPolicy를 사용하여 MinIO 서비스에 접근할 수 있는 Pod를 제한하고,
네트워크 정책이 실제로 작동하는지 검증하는 실습을 진행합니다.
🔎 이번 글에서 수행할 작업 요약
- MinIO에 자유롭게 접근할 수 있는 테스트 클라이언트 파드 생성
- Cilium L3/L4 네트워크 정책을 적용하여 접근 제어 구성
- 접근 가능/불가능한 사례 비교 테스트
- 네트워크 정책 동작 여부 검증
🧱 1단계: 테스트 클라이언트 파드 생성
이 단계의 목적: MinIO에 curl 등을 통해 접근할 수 있는 일반적인 테스트 파드를 생성하고,
네트워크 정책 적용 전의 기본 동작을 확인합니다.
# test-client.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-client
namespace: etl # 테스트를 위한 별도 네임스페이스
labels:
role: client # 이후 네트워크 정책에서 활용할 라벨
spec:
containers:
- name: curl
image: curlimages/curl # 가볍게 테스트 가능한 curl 전용 이미지
command: ["sleep", "3600"] # 파드를 1시간 동안 유지
kubectl apply -f test-client.yaml
# MinIO 접근 테스트
kubectl exec -it test-client -n etl -- \
curl -s -o /dev/null -w "%{http_code}" http://minio.minio.svc.cluster.local:9000
✅ 기본적으로 모든 파드는 네트워크 제한 없이 MinIO에 접근 가능함
🔒 2단계: Cilium L3/L4 네트워크 정책 작성 및 적용
이 단계의 목적: 특정 네임스페이스와 라벨을 기반으로
MinIO 서비스로의 접근을 제한하는 정책을 정의하고 적용합니다.
# minio-deny-all.yaml
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: deny-all
namespace: minio
spec:
endpointSelector: {} # MinIO 전체 Pod 대상으로 설정
ingress: [] # ingress 비워서 모든 수신 차단
# minio-allow-etl-client.yaml
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: allow-etl-client
namespace: minio
spec:
endpointSelector:
matchLabels:
app.kubernetes.io/name: minio # MinIO 서비스 대상
ingress:
- fromEndpoints:
- matchLabels:
role: client # etl 네임스페이스 test-client의 라벨 기반 허용
matchExpressions:
- key: "k8s:io.kubernetes.pod.namespace"
operator: In
values:
- etl # etl 네임스페이스에서만 허용
toPorts:
- ports:
- port: "9000"
protocol: TCP
# 네트워크 정책 적용
kubectl apply -f minio-deny-all.yaml
kubectl apply -f minio-allow-etl-client.yaml
🔍 3단계: 접근 테스트 및 검증
이 단계의 목적: 정책 적용 후 접근이 정상적으로 제한되는지, 허용된 Pod만 접근 가능한지를 테스트합니다.
# 허용된 etl 네임스페이스의 test-client → 접근 가능
kubectl exec -it test-client -n etl -- \
curl -s -o /dev/null -w "%{http_code}" http://minio.minio.svc.cluster.local:9000
예상 결과:
403
🔍 MinIO 자체 인증이 걸려 있으므로 403이 뜨는 건 접근에는 성공한 것
# 다른 네임스페이스에서 테스트 (예: default)
kubectl run other-client -n default --rm -it --image=curlimages/curl -- \
curl -s -o /dev/null -w "%{http_code}" http://minio.minio.svc.cluster.local:9000
예상 결과:
Connection timed out 또는 000
✅ 접근이 완전히 차단되었음을 의미
📎 요약 및 핵심 정리
- Cilium의 L3/L4 정책을 사용하여 네트워크 레이어에서 MinIO에 대한 접근을 세분화해 제어할 수 있음
- 기본적으로 모든 Pod가 MinIO에 접근 가능한 상태에서 시작하여, deny-all 정책으로 모든 요청을 차단
- 이후 특정 네임스페이스 및 라벨을 가진 Pod만 포트 9000으로 접근 가능하도록 허용
- 실질적인 네트워크 보안을 서비스 단위로 구성할 수 있는 구조를 학습함
728x90