GKE에서 Public NAT 사용

이 페이지에서는 Google Kubernetes Engine(GKE)을 사용하여 샘플 Public NAT 설정을 구성하는 방법을 보여줍니다. Public NAT를 설정하기 전에 Public NAT 개요를 읽어보세요.

기본 요건

Public NAT를 설정하기 전에 다음을 수행해야 합니다.

IAM 권한 가져오기

roles/compute.networkAdmin 역할은 Cloud Router에서 NAT 게이트웨이를 만들고, NAT IP 주소를 예약 및 할당하고, 트래픽이 NAT 게이트웨이의 네트워크 주소 변환을 사용해야 하는 서브네트워크(서브넷)를 지정할 수 있는 권한을 부여합니다.

Google Cloud 설정

시작하기 전에 Google Cloud에서 다음 항목을 설정합니다.

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. Install the Google Cloud CLI.
  5. To initialize the gcloud CLI, run the following command:

    gcloud init
  6. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  7. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  8. Install the Google Cloud CLI.
  9. To initialize the gcloud CLI, run the following command:

    gcloud init

GKE 예시 설정

GKE에서 작동하는 간단한 Public NAT 구성을 보려면 이 예시를 사용합니다.

1단계: VPC 네트워크 및 서브넷 만들기

네트워크와 서브넷이 이미 있으면 이 단계를 건너뛸 수 있습니다.

콘솔

  1. Google Cloud 콘솔에서 VPC 네트워크 페이지로 이동합니다.

    VPC 네트워크 페이지로 이동

  2. VPC 네트워크 만들기를 클릭합니다.

  3. custom-network1이름을 입력합니다.

  4. 서브넷에서 서브넷 생성 모드커스텀으로 설정합니다.

  5. 새 서브넷subnet-us-east-192이름을 입력합니다.

  6. 리전에서 us-east4를 선택합니다.

  7. IP 주소 범위192.168.1.0/24로 입력합니다.

  8. 완료를 클릭한 후 만들기를 클릭합니다.

gcloud

  1. 프로젝트에서 새 커스텀 모드 가상 프라이빗 클라우드(VPC) 네트워크를 만듭니다.

    gcloud compute networks create custom-network1 \
        --subnet-mode custom

    출력:

    NAME             MODE     IPV4_RANGE   GATEWAY_IPV4
    custom-network1  custom

  2. 첫 번째 지역의 서브넷 프리픽스를 지정합니다. 이 예시에서는 192.168.1.0/24를 리전 us-east4에 할당합니다.

    gcloud compute networks subnets create subnet-us-east-192 \
       --network custom-network1 \
       --region us-east4 \
       --range 192.168.1.0/24

    출력:

    NAME                REGION    NETWORK          RANGE
    subnet-us-east-192  us-east4  custom-network1  192.168.1.0/24

Terraform

Terraform 모듈을 사용하여 커스텀 가상 프라이빗 클라우드(VPC) 네트워크 및 서브넷을 만들 수 있습니다.

module "test-vpc-module" {
  source       = "terraform-google-modules/network/google"
  version      = "~> 9.0"
  project_id   = var.project_id # Replace this with your project ID in quotes
  network_name = "custom-network1"
  mtu          = 1460

  subnets = [
    {
      subnet_name   = "subnet-us-east-192"
      subnet_ip     = "192.168.1.0/24"
      subnet_region = "us-east4"
    }
  ]
}

2단계: 비공개 클러스터 만들기

콘솔

  1. Google Cloud 콘솔에서 Kubernetes 클러스터 페이지로 이동합니다.

    Kubernetes 클러스터 페이지로 이동

  2. 클러스터 만들기를 클릭합니다.

  3. 이름nat-test-cluster를 입력합니다.

  4. 위치 유형영역으로 설정합니다.

  5. 영역us-east4-c로 설정합니다.

  6. 탐색창에서 네트워킹을 클릭합니다.

  7. 비공개 클러스터를 선택합니다.

  8. 외부 IP 주소를 사용한 액세스 제어 영역 체크박스를 선택 취소합니다.

  9. 컨트롤 플레인 IP 범위172.16.0.0/28로 입력합니다.

  10. 네트워크custom-network1로 설정합니다.

  11. 만들기를 클릭하여 클러스터를 만들고 시작합니다.

gcloud

gcloud container clusters create "nat-test-cluster" \
    --zone "us-east4-c" \
    --username "admin" \
    --cluster-version "latest" \
    --machine-type "e2-medium" \
    --disk-type "pd-standard" \
    --disk-size "100" \
    --scopes "https://www.googleapis.com/auth/compute","https://www.googleapis.com/auth/devstorage.read_only","https://www.googleapis.com/auth/logging.write","https://www.googleapis.com/auth/monitoring","https://www.googleapis.com/auth/servicecontrol","https://www.googleapis.com/auth/service.management.readonly","https://www.googleapis.com/auth/trace.append" \
    --num-nodes "3" \
    --enable-private-nodes \
    --enable-private-endpoint \
    --master-ipv4-cidr "172.16.0.0/28" \
    --enable-ip-alias \
    --network "projects/PROJECT_ID/global/networks/custom-network1" \
    --subnetwork "projects/PROJECT_ID/regions/us-east4/subnetworks/subnet-us-east-192" \
    --max-nodes-per-pool "110" \
    --enable-master-authorized-networks \
    --addons HorizontalPodAutoscaling,HttpLoadBalancing \
    --enable-autoupgrade \
    --enable-autorepair

Terraform

Terraform 리소스를 사용하여 비공개 클러스터를 만들 수 있습니다.

resource "google_container_cluster" "primary" {
  project            = var.project_id
  name               = "nat-test-cluster"
  location           = "us-east4-c"
  initial_node_count = 3
  network            = var.network # Replace with a reference or self link to your network, in quotes
  subnetwork         = var.subnet  # Replace with a reference or self link to your subnet, in quotes
  private_cluster_config {
    master_ipv4_cidr_block  = "172.16.0.0/28"
    enable_private_endpoint = true
    enable_private_nodes    = true
  }
  ip_allocation_policy {
  }
  master_authorized_networks_config {
  }
}

3단계: SSH 연결을 허용하는 방화벽 규칙 만들기

콘솔

  1. Google Cloud 콘솔에서 방화벽 정책 페이지로 이동합니다.

    방화벽 정책 페이지로 이동

  2. 방화벽 규칙 만들기를 클릭합니다.

  3. allow-ssh이름을 입력합니다.

  4. 네트워크custom-network1로 지정합니다.

  5. 트래픽 방향인그레스로 설정합니다.

  6. 일치 시 작업허용으로 설정합니다.

  7. 대상네트워크의 모든 인스턴스로 설정합니다.

  8. 소스 필터IPv4 범위로 설정합니다.

  9. 소스 IP 범위35.235.240.0/20으로 설정합니다.

  10. 프로토콜 및 포트지정된 프로토콜 및 포트로 설정합니다.

  11. tcp 체크박스를 선택하고 포트 22를 입력합니다.

  12. 만들기를 클릭합니다.

gcloud

gcloud compute firewall-rules create allow-ssh \
    --network custom-network1 \
    --source-ranges 35.235.240.0/20 \
    --allow tcp:22

Terraform

Terraform 리소스를 사용하여 방화벽 규칙을 만들 수 있습니다.

resource "google_compute_firewall" "rules" {
  project = var.project_id
  name    = "allow-ssh"
  network = var.network
  allow {
    protocol = "tcp"
    ports    = ["22"]
  }
  source_ranges = ["35.235.240.0/20"]
}

4단계: 노드 중 하나에 IAP SSH 권한 만들기

이후 단계에서는 IAP를 사용하여 노드에 연결합니다.

콘솔

  1. Google Cloud 콘솔에서 IAP(Identity-Aware Proxy) 페이지로 이동합니다.

    Identity-Aware Proxy 페이지로 이동

  2. SSH 및 TCP 리소스 탭을 선택합니다.

  3. 모든 터널 리소스 > us-east4-c 아래의 목록에서 첫 번째 노드 옆에 있는 체크박스를 선택합니다. 이름은 gke-nat-test-cluster-default-pool-b50db58d-075t와 유사합니다.

  4. 노드의 이름을 기록해 둡니다. 나중에 이를 사용하여 연결을 테스트합니다.

  5. 오른쪽 창에서 주 구성원 추가를 클릭합니다.

  6. 사용자, 그룹, 서비스 계정에 리소스에 대한 액세스 권한을 부여하려면 새 주 구성원 필드에 해당 사용자의 이메일 주소를 지정합니다.

    이 기능을 테스트만 할 경우 자신의 이메일 주소를 입력할 수 있습니다.

  7. 주 구성원에게 Cloud IAP의 TCP 전달 기능을 통해 리소스에 대한 액세스 권한을 부여하려면 역할 드롭다운 목록에서 Cloud IAP > IAP 보안 터널 사용자를 선택합니다.

  8. 저장을 클릭합니다.

gcloud

이 단계에서는 콘솔 안내를 사용합니다.

5단계: 노드에 로그인하고 인터넷에 연결할 수 없는지 확인

콘솔

  1. Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. IAP SSH 권한을 만든 노드를 찾습니다. 연결 열에서 SSH 드롭다운 화살표를 클릭한 다음 브라우저 창에서 열기를 선택합니다.

    인스턴스에 처음으로 연결하는 경우 Google Cloud에서 SSH 키를 자동으로 생성합니다.

  3. 노드 프롬프트에서kube-dns 컨테이너의 프로세스 ID를 찾습니다.

    pgrep '^kube-dns$'
  4. 컨테이너에 액세스합니다.

    sudo nsenter --target PROCESS_ID --net /bin/bash
  5. kube-dns에서 인터넷 연결을 시도합니다.

    curl example.com

    결과가 표시되지 않습니다. 결과가 표시되면 클러스터를 비공개 클러스터로 만들지 않았거나 다른 문제가 있을 수 있습니다. 문제를 해결하려면 VM이 Public NAT 없이 예기치 않게 인터넷에 연결할 수 있음을 참조하세요.

    명령어를 종료하려면 Ctrl+C를 입력해야 할 수 있습니다.

gcloud

  1. 클러스터 노드 중 하나의 이름을 찾습니다.

    gcloud compute instances list

    노드 이름은 gke-nat-test-cluster-default-pool-1a4cbd06-3m8v와 같은 형태입니다. 노드 이름을 기록하고 다음 명령어에서 NODE_NAME이 표시될 때마다 해당 이름을 사용합니다.

  2. 노드에 연결합니다.

    gcloud compute ssh NODE_NAME \
        --zone us-east4-c \
        --tunnel-through-iap
  3. 노드 프롬프트에서kube-dns 컨테이너의 프로세스 ID를 찾습니다.

    pgrep '^kube-dns$'
  4. 컨테이너에 액세스합니다.

    sudo nsenter --target PROCESS_ID --net /bin/bash
  5. kube-dns에서 인터넷 연결을 시도합니다.

    curl example.com

    결과가 표시되지 않습니다. 명령어를 종료하려면 Ctrl+C를 입력해야 할 수 있습니다.

6단계: Cloud Router를 사용하여 NAT 구성 만들기

Public NAT를 사용하는 인스턴스와 동일한 리전에 Cloud Router를 만들어야 합니다. Public NAT는 VM에 NAT 정보를 배치하기 위해서만 사용됩니다. 실제 NAT 게이트웨이의 일부로는 사용되지 않습니다.

이 구성을 사용하면 리전 내 모든 인스턴스가 전체 기본 및 별칭 IP 범위에서 Public NAT를 사용할 수 있습니다. 또한 외부 IP 주소가 NAT 게이트웨이에 자동으로 할당됩니다. 더 많은 옵션은 Google Cloud CLI 문서를 참조하세요.

않습니다.

콘솔

  1. Google Cloud 콘솔에서 Cloud NAT 페이지로 이동합니다.

    Cloud NAT 페이지로 이동

  2. 시작하기 또는 NAT 게이트웨이 만들기를 클릭합니다.

  3. 게이트웨이 이름nat-config로 입력합니다.

  4. VPC 네트워크custom-network1로 설정합니다.

  5. 리전us-east4로 설정합니다.

  6. Cloud Router에서 새 라우터 만들기를 선택합니다.

    1. nat-router이름을 입력합니다.
    2. 만들기를 클릭합니다.
  7. 만들기를 클릭합니다.

gcloud

  1. Cloud Router를 만듭니다.

    gcloud compute routers create nat-router \
        --network custom-network1 \
        --region us-east4
  2. 라우터에 구성을 추가합니다.

    gcloud compute routers nats create nat-config \
        --router-region us-east4 \
        --router nat-router \
        --nat-all-subnet-ip-ranges \
        --auto-allocate-nat-external-ips

Terraform

Terraform 리소스를 사용하여 Cloud Router를 만들 수 있습니다.

resource "google_compute_router" "router" {
  project = var.project_id
  name    = "nat-router"
  network = var.network
  region  = "us-east4"
}

Terraform 모듈을 사용하여 NAT 구성을 만들 수 있습니다.

module "cloud-nat" {
  source                             = "terraform-google-modules/cloud-nat/google"
  version                            = "~> 5.0"
  project_id                         = var.project_id
  region                             = "us-east4"
  router                             = google_compute_router.router.name
  name                               = "nat-config"
  source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"
}

7단계: 인터넷에 다시 연결 시도

NAT 구성이 적용되는 데 최대 3분이 걸릴 수 있으므로 최소 1분 정도 기다린 후 인터넷에 액세스를 다시 시도합니다.

아직 kube-dns에 로그인하지 않은 경우 5단계의 절차를 사용하여 다시 연결합니다. 로그인한 후 curl 명령어를 다시 실행합니다.

curl example.com

다음 콘텐츠가 포함된 출력이 표시됩니다.


<html>
<head>
<title>Example Domain</title>
...
...
...
</head>

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is established to be used for illustrative examples in documents. You can use this
    domain in examples without prior coordination or asking for permission.</p>
    <p><a href="http://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>

다음 단계