네트워크 폴리시 선언하기

네트워크 폴리시 선언하기

쿠버네티스에서 파드끼리 통신을 통제하고 싶다면 NetworkPolicy API를 쓰면 돼요. 이 페이지에서는 nginx 디플로이먼트를 만들고, Service로 노출한 뒤, 특정 라벨을 가진 파드만 접근할 수 있도록 네트워크 폴리시를 선언해서 통신이 어떻게 바뀌는지 직접 확인해 볼게요.

출처: Declare Network Policy — Kubernetes 공식 문서

본문

이 문서는 파드끼리 통신 방식을 정하는 NetworkPolicy API를 사용해 네트워크 폴리시를 선언하는 방법을 알려줘요.

참고 이 내용은 쿠버네티스 프로젝트가 아닌 제3자로부터 제공된 문서입니다.

사전 준비

네트워크 폴리시를 지원하는 네트워크 프로바이더를 구성해 두어야 해요. NetworkPolicy를 지원하는 프로바이더는 여러 가지가 있어요.

nginx 디플로이먼트를 만들고 Service로 노출하기

쿠버네티스 네트워크 폴리시가 어떻게 동작하는지 확인하려면, 먼저 nginx Deployment를 만들어요.

kubectl create deployment nginx --image=nginx
deployment.apps/nginx created

이 Deployment를 nginx라는 이름의 Service로 노출해요.

kubectl expose deployment nginx --port=80
service/nginx exposed

위 명령들은 nginx 파드가 있는 Deployment를 만들고, 그 Deployment를 nginx라는 Service로 노출했어요. nginx 파드와 Deployment는 default 네임스페이스에 있어요.

kubectl get svc,pod
NAME                        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
service/kubernetes          10.100.0.1    <none>        443/TCP    46m
service/nginx               10.100.0.16   <none>        80/TCP     33s

NAME                        READY         STATUS        RESTARTS   AGE
pod/nginx-701339712-e0qfq   1/1           Running       0          35s

다른 파드에서 접속해 Service 테스트하기

nginx 서비스에는 다른 파드에서 접근할 수 있어야 해요. default 네임스페이스의 다른 파드에서 nginx Service에 접속하기 위해 busybox 컨테이너를 실행해요.

kubectl run busybox --rm -ti --image=busybox -- /bin/sh

셸에서 다음 명령을 실행해요.

wget --spider --timeout=1 nginx
Connecting to nginx (10.100.0.16:80)
remote file exists

nginx 서비스에 대한 접근 제한하기

nginx 서비스에 접근할 수 있는 파드를 access: true 라벨을 가진 파드로만 제한하려면, NetworkPolicy 오브젝트를 다음과 같이 만들면 돼요.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: access-nginx
spec:
  podSelector:
    matchLabels:
      app: nginx
  ingress:
  - from:
    - podSelector:
        matchLabels:
          access: "true"

NetworkPolicy 오브젝트의 이름은 유효한 DNS 서브도메인 이름이어야 해요.

참고 NetworkPolicy에는 podSelector가 있어서 이 폴리시를 적용할 파드 묶음을 선택해요. 위 폴리시는 app=nginx 라벨을 가진 파드를 선택하고 있음을 볼 수 있어요. 이 라벨은 nginx Deployment의 파드에 자동으로 추가된 값이에요. 빈 podSelector는 네임스페이스의 모든 파드를 선택해요.

서비스에 폴리시 적용하기

nginx-policy.yaml 파일에서 kubectl로 NetworkPolicy를 만들어요.

kubectl apply -f https://k8s.io/examples/service/networking/nginx-policy.yaml
networkpolicy.networking.k8s.io/access-nginx created

접근 라벨이 없는 파드에서 Service 접근 테스트하기

올바른 라벨이 없는 파드에서 nginx Service에 접근을 시도하면 요청이 타임아웃돼요.

kubectl run busybox --rm -ti --image=busybox -- /bin/sh

셸에서 아래 명령을 실행해요.

wget --spider --timeout=1 nginx
Connecting to nginx (10.100.0.16:80)
wget: download timed out

접근 라벨을 정의하고 다시 테스트하기

올바른 라벨을 가진 파드를 만들면 요청이 허용되는 걸 확인할 수 있어요.

kubectl run busybox --rm -ti --labels="access=true" --image=busybox -- /bin/sh

셸에서 아래 명령을 실행해요.

wget --spider --timeout=1 nginx
Connecting to nginx (10.100.0.16:80)
remote file exists

더 알아보기