애플리케이션에 대한 네트워크 정책 구성

이 가이드에서는 클러스터 네트워크 정책을 사용해서 들어오는 네트워크 트래픽을 수신할 포드 및 나가는 트래픽을 전송할 포드를 제어하는 방법을 보여줍니다.

네트워크 정책을 사용하면 포드 간 연결을 제한할 수 있습니다. 따라서 네트워크 정책을 사용하면 손상 반경을 줄임으로써 더 나은 보안을 제공합니다.

이 페이지에서는 GKE에서 네트워크 정책을 구성하는 방법을 설명합니다.

네트워크 정책은 연결을 허용할지 여부를 제어하며, 승인 또는 보안 전송(예: SSL/TLS)과 같은 고급 기능을 제공하지 않습니다.

목표

이 가이드에서는 다음을 배웁니다.

  • 네트워크 정책 적용으로 클러스터를 만드는 방법
  • 라벨을 사용해서 포드에 들어오는 트래픽을 제한하는 방법
  • 라벨을 사용해서 포드에서 나가는 트래픽을 제한하는 방법

시작하기 전에

다음 단계에 따라 Kubernetes Engine API를 사용 설정합니다.
  1. Google Cloud Platform Console에서 Kubernetes Engine 페이지로 이동합니다.
  2. 프로젝트를 만들거나 선택합니다.
  3. API 및 관련 서비스가 사용 설정될 때까지 기다립니다. 몇 분 정도 걸릴 수 있습니다.
  4. 프로젝트에 결제가 사용 설정되어 있는지 확인하세요.

    결제 사용 설정 방법 알아보기

이 가이드에 사용된 다음 명령줄 도구를 설치합니다.

  • gcloud는 Kubernetes Engine 클러스터를 만들고 삭제하는 데 사용됩니다. gcloudGoogle Cloud SDK에 포함되어 있습니다.
  • kubectl은 Kubernetes Engine에서 사용되는 클러스터 조정 시스템인 Kubernetes를 관리하기 위해 사용됩니다. gcloud를 사용하여 kubectl을 설치할 수 있습니다.
    gcloud components install kubectl

gcloud 명령줄 도구의 기본값 설정

gcloud 명령줄 도구에서 프로젝트 IDCompute Engine 영역 옵션을 입력하는 시간을 절약하기 위해 기본값을 설정할 수 있습니다.
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

1단계: GKE 만들기

네트워크 정책 적용으로 컨테이너 클러스터를 만들려면 다음 명령어를 실행합니다.

gcloud container clusters create test --enable-network-policy

2단계: 포드에 들어오는 트래픽 제한

Kubernetes NetworkPolicy 리소스를 사용하면 포드에 대한 네트워크 액세스 정책을 구성할 수 있습니다. NetworkPolicy 객체에는 다음 정보가 포함됩니다.

  • 일반적으로 라벨 선택기로 지정되는 네트워크 정책이 적용되는 포드

  • 네트워크 정책이 영향을 주는 인터넷 트래픽 유형: 들어오는 트래픽을 나타내는 Ingress, 나가는 트래픽을 나타내는 Egress 또는 둘 다

  • 수신 정책의 경우 지정된 포드에 연결할 수 있는 포드

  • 송신 정책의 경우 지정된 포드가 연결할 수 있는 대상 포드

먼저 app=hello 라벨을 사용해서 간단한 웹 서버 애플리케이션을 실행하고 이를 클러스터에서 내부적으로 노출합니다.

kubectl run hello-web --labels app=hello \
  --image=gcr.io/google-samples/hello-app:1.0 --port 8080 --expose

그런 후 app=foo 포드의 트래픽만 hello-web 포드에 허용하도록 NetworkPolicy를 구성해야 합니다. 이 라벨이 없는 포드에서 들어오는 다른 트래픽, 외부 트래픽, 다른 네임스페이스에 포함된 포드의 트래픽은 모두 차단됩니다.

다음 구성을 hello-allow-from-foo.yaml에 저장합니다.

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: hello-allow-from-foo
spec:
  policyTypes:
  - Ingress
  podSelector:
    matchLabels:
      app: hello
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: foo

이 정책은 라벨이 app=hello인 포드를 선택하고 라벨이 app=foo인 포드의 트래픽만 허용하도록 수신 정책을 지정합니다.

이 정책을 클러스터에 적용하려면 다음 명령어를 실행합니다.

kubectl apply -f hello-allow-from-foo.yaml

수신 정책 검증

먼저 라벨이 app=foo인 임시 포드를 실행하고 포드에서 셸을 시작합니다.

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

hello-web:8080 엔드포인트에 요청을 수행해서 들어오는 트래픽이 허용되는지 확인합니다.

/ # wget -qO- --timeout=2 http://hello-web:8080
Hello, world!
Version: 1.0.0
Hostname: hello-web-2258067535-vbx6z
/ # exit

app=foo 포드에서 app=hello 포드로의 트래픽이 사용 설정됩니다.

그런 후 다른 라벨(app=other)의 임시 포드를 실행하고 포드에서 셸을 시작합니다.

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

동일한 요청을 수행해서 트래픽이 허용되지 않고 요청이 시간 초과되는지 확인한 후 포드 셸을 종료합니다.

/ # wget -qO- --timeout=2 http://hello-web:8080
wget: download timed out
/ # exit

3단계: 포드에서 나가는 트래픽 제한

들어오는 트래픽과 같은 방식으로 나가는(송신) 트래픽을 제한할 수 있습니다.

하지만 hello-web과 같은 내부 호스트 이름 또는 www.example.com과 같은 외부 호스트 이름을 쿼리할 수 있으려면 송신 네트워크 정책에서 DNS(도메인 이름 시스템) 확인을 허용해야 합니다. DNS 트래픽은 TCP 및 UDP 프로토콜을 사용해서 포트 53에서 발생합니다.

송신 네트워크 정책을 적용하기 위해, DNS 트래픽은 물론 라벨이 app=hello인 포드에 대한 트래픽만 허용하면서 라벨이 app=foo인 포드에서 나가는 트래픽을 제어하는 NetworkPolicy를 배포합니다.

다음 구성을 foo-allow-to-hello.yaml에 저장하고 이를 클러스터에 적용합니다.

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: foo-allow-to-hello
spec:
  policyTypes:
  - Egress
  podSelector:
    matchLabels:
      app: foo
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: hello
  - ports:
    - port: 53
      protocol: TCP
    - port: 53
      protocol: UDP
kubectl apply -f foo-allow-to-hello.yaml

이 매니페스트는 허용 대상 2개를 사용해서 라벨이 app=foo인 포드의 송신 트래픽을 제어하는 네트워크 정책을 지정합니다.

  1. 라벨이 app=hello인 동일 네임스페이스에 있는 포드
  2. 클러스터 포드 또는 포트 53의 외부 엔드포인트(UDP 및 TCP)

송신 정책 검증

먼저 hello-web-2라는 새 웹 애플리케이션을 배포하고 이를 클러스터에서 내부적으로 노출합니다.

kubectl run hello-web-2 --labels app=hello-2 \
  --image=gcr.io/google-samples/hello-app:1.0 --port 8080 --expose

그런 후 app=foo 라벨의 임시 포드를 실행하고 컨테이너 내에서 셸 프롬프트를 시작합니다.

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

포드가 hello-web:8080에 연결을 설정할 수 있는지 확인합니다.

/ # wget -qO- --timeout=2 http://hello-web:8080
Hello, world!
Version: 1.0.0
Hostname: hello-web-2258067535-vbx6z

포드가 hello-web-2:8080에 연결을 설정할 수 없는지 확인합니다.

/ # wget -qO- --timeout=2 http://hello-web-2:8080
wget: download timed out

포드가 www.example.com과 같은 외부 웹 사이트에 연결을 설정할 수 없는지 확인하고 포드 셸을 종료합니다.

/ # wget -qO- --timeout=2 http://www.example.com
wget: download timed out
/ # exit

삭제

이 가이드에서 사용한 리소스 비용이 Google Cloud Platform 계정에 청구되지 않도록 하는 방법은 다음과 같습니다.

  1. 컨테이너 클러스터 삭제: 이 단계에서는 컴퓨팅 인스턴스, 디스크, 네트워크 리소스와 같이 컨테이너 클러스터를 구성하는 리소스를 삭제합니다.

    gcloud container clusters delete test

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Kubernetes Engine 가이드