웹사이트 검색

Kubernetes의 네트워크 정책


기본적으로 포드는 모든 소스의 트래픽을 허용합니다. 네트워크 정책은 포드 그룹이 서로 및 다른 네트워크 엔드포인트와 통신할 수 있는 방법을 지정하는 데 도움이 됩니다. NetworkPolicy는 라벨을 사용하여 포드를 선택하고 규칙을 정의하여 선택한 포드에 허용되는 트래픽을 지정합니다. 특정 포드에 NetworkPolicy가 적용되면 해당 포드는 NetworkPolicy에서 허용되지 않는 연결을 거부합니다. NetworkPolicy에서 선택하지 않은 포드는 계속해서 모든 트래픽을 수락합니다.

NetworkPolicy에 대해 자세히 알아보려면 여기에서 Kubernetes 공식 페이지를 방문하세요.

이 기사에서는 인그레스가 포드로 들어오는 트래픽이고 이그레스가 포드에서 나가는 트래픽인 인그레스 및 이그레스 NetworkPolicy의 사용법을 볼 것입니다.

전제 조건

  1. 워커 노드가 1개 이상 있는 Kubernetes 클러스터.
    Kubernetes 클러스터를 만드는 방법을 알아보려면 여기를 클릭하세요. 이 안내서는 AWS Ubuntu 18.04 EC2 인스턴스에서 1개의 마스터와 2개의 노드가 있는 Kubernetes 클러스터를 생성하는 데 도움이 됩니다.

우리는 무엇을 할 것인가?

  1. 네트워크 정책 만들기

네트워크 정책 생성

인그레스 네트워크 정책

\app-destination-pod\ 레이블이 있는 hello-web 포드와 포트 8080에서 들어오는 트래픽을 허용할 서비스를 만듭니다.

kubectl run hello-web --labels app=destination-pod --image=gcr.io/google-samples/hello-app:1.0 --port 8080 --
kubectl get pod | grep hello-web

kubectl get service | grep hello-web

\app=source-pod\ 레이블과 일치하는 포드에서 포트 8080의 \app=destination-pod\ 레이블이 있는 \hello-web\ 포드에서 트래픽을 허용하는 다음 콘텐츠를 사용하여 인그레스 정의 파일을 만듭니다. .

vim ingress.yml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: destination-pod-allow-from-source-pod
spec:
  policyTypes:
  - Ingress
  podSelector:
    matchLabels:
      app: destination-pod
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: source-pod

인그레스 정책을 만들기 전에 정책 규칙과 일치하지 않는 라벨이 \app=unknown\인 포드를 만듭니다.

kubectl run -l app=unknown --image=alpine --restart=Never --rm -i -t test-1

이제 이 포드에서 포트 8080의 \hello-web\ 포드에 액세스하려고 하면 포드에 액세스할 수 있습니다.

wget -qO- --timeout=2 http://hello-web:8080

이제 레이블이 \app=source-pod\인 포드에서 레이블이 \app=destination-pod\인 포드에 대한 연결을 허용하는 정책을 생성하고 이에 대한 세부 정보를 가져옵니다.

kubectl apply -f ingress.yml
kubectl get networkpolicy destination-pod-allow-from-source-pod

이제 정책에 정의된 규칙과 일치하지 않는 라벨로 pod를 다시 만듭니다.

kubectl run -l app=unknown --image=alpine --restart=Never --rm -i -t test-1

이 포드에서 \hello-web\ 포드에 다시 액세스하려고 하면 \hello-web\ 포드에 연결할 수 없습니다.

wget -qO- --timeout=2 http://hello-web:8080

이번에는 네트워크 정책 규칙과 일치하는 포드, 즉 \app=source-app\ 레이블이 있는 포드를 만들어 보겠습니다.

kubectl run -l app=source-pod --image=alpine --restart=Never --rm -i -t test-1

이제 라벨이 \app=source-pod\인 포드에서 \hello-web\ 포드에 액세스하려고 하면 \hello-web\에 액세스할 수 있습니다.

wget -qO- --timeout=2 http://hello-web:8080

위의 스크린샷에서 \app=source-pod\ 레이블이 있는 포드에서 \hello-web\ 포드에 액세스할 수 있음을 알 수 있습니다. 즉, \hello-web\에서 연결을 제한했으며 라벨이 \app=source-pod\인 포드만 연결할 수 있습니다.

송신 네트워크 정책

다음 콘텐츠로 송신 네트워크 정책에 대한 새 파일을 만듭니다.

vim egress.yml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: source-pod-allow-to-destination-pod
spec:
  policyTypes:
  - Egress
  podSelector:
    matchLabels:
      app: source-pod
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: destination-pod
  - ports:
    - port: 53
      protocol: TCP
    - port: 53
      protocol: UDP

위의 정책은 레이블이 \app=source-pod\인 포드에서 라벨이 \app=destination-pod\인 포드로 나가는 연결을 허용하고 DNS 확인을 위한 포트 53에서도 허용합니다.

클러스터에 이그레스 정책을 적용하기 전에 정책과 일치하지 않는 포드 \hello-web-2\ 및 서비스를 만드세요.

kubectl run hello-web-2 --labels app=hello-2 --image=gcr.io/google-samples/hello-app:1.0 --port 8080 --expose
kubectl get pod | grep hello-web-2
kubectl get service | grep hello-web-2

이제 라벨이 \app=source-pod\인 포드를 만듭니다.

kubectl run -l app=source-pod --image=alpine --restart=Never --rm -i -t test-2

이그레스 정책을 적용하기 전에 \hello-web\ 및 \hello-web-2\ 앱 모두 \app=source-pod\ 레이블이 있는 포드에서 액세스할 수 있습니다.

wget -qO- --timeout=2 http://hello-web:8080
wget -qO- --timeout=2 http://hello-web-2:8080

이제 이그레스 규칙으로 네트워크 정책을 생성합니다.

kubectl create -f egress.yml
kubectl get networkpolicy | grep source-pod-allow-to-destination-pod

레이블이 \app=source-pod\인 포드를 생성하고 \app=source-pod\ 포드 모두에 액세스해 봅니다.

kubectl run -l app=source-pod --image=alpine --restart=Never --rm -i -t test-3

wget -qO- --timeout=2 http://hello-web:8080

wget -qO- --timeout=2 http://hello-web-2:8080

위의 스크린샷에서 이번에는 \hello-web-2\ 포드가 레이블이 \app=source-pod\인 포드로부터의 연결을 허용하는 이그레스 정책과 일치하지 않기 때문에 연결할 수 없음을 관찰할 수 있습니다. 레이블이 \app=destination-pod\인 포드에.

결론

이 기사에서는 인그레스 및 이그레스 네트워크 정책을 만드는 단계를 살펴보았습니다. 또한 수신 및 발신 연결을 각각 수신 및 송신을 사용하여 제한할 수 있는 방법을 확인했으며 이를 더 잘 이해하기 위해 간단한 웹 앱을 사용하여 구현하는 것을 확인했습니다.