Kubernetes 정책, 기본 튜토리얼
Kubernetes NetworkPolicy를 Calico와 함께 처음 사용해 보는 기본 튜토리얼이에요. 네임스페이스 격리부터 access-nginx 허용 정책까지 단계별로 따라 하며 정책 동작을 몸으로 익혀요. 파드로 들어오고 나가는 ingress/egress 트래픽을 어떻게 제한하는지 직접 확인할 수 있어요.
출처: 문서
본문
이 가이드는 Calico와 함께 Kubernetes NetworkPolicy를 간단히 사용해 보는 방법을 제공해요. Calico 네트워킹으로 구성된 Kubernetes 클러스터가 필요하고, kubectl이 클러스터와 상호작용하도록 설정되어 있다고 가정해요.
설치 가이드 중 하나를 따르면 이런 클러스터를 빠르고 쉽게 배포할 수 있어요.
네임스페이스 구성하기
이 가이드는 Kubernetes 네임스페이스에 파드를 배포해요. 가이드용으로 Namespace 오브젝트를 만들어 봐요.
kubectl create ns policy-demo
데모 파드 만들기
Kubernetes Deployment 오브젝트를 사용하면 네임스페이스 안에 파드를 쉽게 만들 수 있어요.
-
policy-demo네임스페이스에 nginx 파드를 몇 개 만들어요.kubectl create deployment --namespace=policy-demo nginx --image=nginx -
서비스로 노출해요.
kubectl expose --namespace=policy-demo deployment nginx --port=80 -
nginx 서비스에 접근 가능한지 확인해요.
kubectl run --namespace=policy-demo access --rm -ti --image busybox /bin/sh아래처럼
access파드 안에 셸 세션이 열려야 해요.Waiting for pod policy-demo/access-472357175-y0m47 to be running, status is Pending, pod ready: false If you don't see a command prompt, try pressing enter. / # -
access파드 안에서nginx서비스에 접근해 봐요.wget -q nginx -O -nginx의 응답이 보일 거예요. 잘 되네요! 서비스에 접근할 수 있어요. 이제 파드에서 나와도 돼요.
격리 켜기
policy-demo 네임스페이스에 격리를 켜 봐요. 그러면 Calico가 이 네임스페이스의 파드로 가는 연결을 막아요.
다음 명령을 실행하면 policy-demo 네임스페이스의 모든 파드에 기본 거부(default deny) 동작을 구현하는 NetworkPolicy가 만들어져요.
kubectl create -f - <<EOF
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: default-deny
namespace: policy-demo
spec:
podSelector:
matchLabels: {}
EOF
격리 테스트하기
이제 nginx 서비스에 대한 모든 접근이 차단돼요. 다시 서비스에 접근을 시도해 효과를 확인할 수 있어요.
kubectl run --namespace=policy-demo access --rm -ti --image busybox /bin/sh
아래처럼 access 파드 안에 셸 세션이 열려야 해요.
Waiting for pod policy-demo/access-472357175-y0m47 to be running, status is Pending, pod ready: false
If you don't see a command prompt, try pressing enter.
/ #
이제 busybox access 파드 안에서 다음 명령을 실행해 nginx 서비스 접근을 테스트해요.
wget -q --timeout=5 nginx -O -
요청은 5초 후 타임아웃될 거예요.
wget: download timed out
/ #
네임스페이스에 격리를 켜면서 서비스 접근을 막았어요.
네트워크 정책으로 접근 허용하기
이번에는 NetworkPolicy로 nginx 서비스 접근을 허용해 봐요. access 파드에서 오는 연결은 허용하지만, 다른 곳에서 오는 연결은 허용하지 않아요.
다음 내용으로 네트워크 정책 access-nginx를 만들어요.
kubectl create -f - <<EOF
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: access-nginx
namespace: policy-demo
spec:
podSelector:
matchLabels:
app: nginx
ingress:
- from:
- podSelector:
matchLabels:
run: access
EOF
SECONDARY: 이 NetworkPolicy는
run: access레이블을 가진 파드에서app: nginx레이블을 가진 파드로 가는 트래픽을 허용해요. 레이블은 kubectl이 자동으로 추가하며 리소스 이름에 기반해요.
이제 access 파드에서 서비스에 접근할 수 있을 거예요.
kubectl run --namespace=policy-demo access --rm -ti --image busybox /bin/sh
아래처럼 access 파드 안에 셸 세션이 열려야 해요.
Waiting for pod policy-demo/access-472357175-y0m47 to be running, status is Pending, pod ready: false
If you don't see a command prompt, try pressing enter.
/ #
이제 busybox access 파드 안에서 다음 명령을 실행해 nginx 서비스 접근을 테스트해요.
wget -q --timeout=5 nginx -O -
반면 run: access 레이블이 없는 파드에서는 여전히 서비스에 접근할 수 없어요. 다음처럼 확인할 수 있어요.
kubectl run --namespace=policy-demo cant-access --rm -ti --image busybox /bin/sh
아래처럼 cant-access 파드 안에 셸 세션이 열려야 해요.
Waiting for pod policy-demo/cant-access-472357175-y0m47 to be running, status is Pending, pod ready: false
If you don't see a command prompt, try pressing enter.
/ #
이제 busybox cant-access 파드 안에서 다음 명령을 실행해 nginx 서비스 접근을 테스트해요.
wget -q --timeout=5 nginx -O -
요청은 타임아웃될 거예요.
wget: download timed out
/ #
데모 네임스페이스를 삭제하면 데모를 정리할 수 있어요.
kubectl delete ns policy-demo
이것은 Kubernetes NetworkPolicy API와 Calico가 어떻게 Kubernetes 클러스터를 보호하는지에 대한 간단한 예시였어요. Kubernetes 네트워크 정책에 대한 자세한 내용은 Kubernetes 사용자 가이드를 참고하세요.
정책을 조금 더 자세히 살펴보고 싶다면 Kubernetes 정책 데모를 확인해 보세요.
더 알아보기 (Learn more)
네임스페이스 단위의 기본 차단 정책은 Kubernetes NetworkPolicy의 기본기예요. default-deny를 먼저 걸고 필요한 연결만 셀렉터로 열어 주는 흐름이 실전에서도 그대로 쓰여요. 레이블 셀렉터(run: access)가 정책의 대상과 출처를 가르는 핵심 장치라는 점도 기억하세요.