애플리케이션의 네트워크 정책 구성


이 튜토리얼에서는 클러스터 네트워크 정책을 사용해서 들어오는 네트워크 트래픽을 수신할 포드 및 나가는 트래픽을 전송할 포드를 제어하는 방법을 보여줍니다. 자세한 내용은 클러스터 네트워크 정책 만들기를 참조하세요.

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

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

목표

이 튜토리얼에서는 다음을 배웁니다.

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

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

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

이 튜토리얼에 사용된 다음 명령줄 도구를 설치합니다.

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

GitHub에서 샘플 코드를 클론합니다.

git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
cd kubernetes-engine-samples/networking/network-policies

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

gcloud 명령줄 도구에 프로젝트 IDCompute Engine 영역 옵션을 입력하는 시간을 절약하려면 기본값을 설정하면 됩니다.
gcloud config set project project-id
gcloud config set compute/zone compute-zone

네트워크 정책 적용으로 GKE 클러스터 만들기

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

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

포드로 들어오는 트래픽 제한

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

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

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

  • 인그레스 정책의 경우 지정된 포드에 연결할 수 있는 포드

  • 이그레스 정책의 경우 지정된 포드가 연결할 수 있는 대상 포드

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

kubectl run hello-web --labels app=hello \
  --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080 --expose

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

다음 매니페스트는 app=hello 라벨이 있는 포드를 선택하고 라벨이 app=foo인 포드의 트래픽만 허용하도록 인그레스 정책을 지정합니다.

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

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

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

포드에서 나가는 트래픽 제한

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

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

이그레스 네트워크 정책을 적용하기 위해 DNS 트래픽은 물론 라벨이 app=hello인 포드에 대한 트래픽만 허용하면서 라벨이 app=foo인 포드에서 아웃바운드 트래픽을 제어하는 NetworkPolicy를 배포합니다.

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

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

이그레스 정책 검증

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

kubectl run hello-web-2 --labels app=hello-2 \
  --image=us-docker.pkg.dev/google-samples/containers/gke/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 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

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

    gcloud container clusters delete test

다음 단계