Menggunakan Public NAT dengan GKE

Halaman ini menunjukkan cara mengonfigurasi contoh penyiapan NAT Publik dengan Google Kubernetes Engine (GKE). Sebelum menyiapkan NAT Publik, baca ringkasan NAT Publik.

Prasyarat

Anda harus melakukan hal berikut sebelum menyiapkan Public NAT.

Mendapatkan izin IAM

Peran roles/compute.networkAdmin memberi Anda izin untuk membuat gateway NAT di Cloud Router, mencadangkan dan menetapkan alamat IP NAT, serta menentukan subnetwork (subnet) yang traffic-nya harus menggunakan penafsiran alamat jaringan oleh gateway NAT.

Menyiapkan Google Cloud

Sebelum memulai, siapkan item berikut di Google Cloud.

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  4. Menginstal Google Cloud CLI.
  5. Untuk initialize gcloud CLI, jalankan perintah berikut:

    gcloud init
  6. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  7. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  8. Menginstal Google Cloud CLI.
  9. Untuk initialize gcloud CLI, jalankan perintah berikut:

    gcloud init

Menyiapkan contoh GKE

Gunakan contoh ini jika Anda ingin melihat konfigurasi NAT Publik sederhana yang berfungsi dengan GKE.

Langkah 1: Membuat jaringan dan subnet VPC

Jika sudah memiliki jaringan dan subnet, Anda dapat melewati langkah ini.

Konsol

  1. Di Konsol Google Cloud, buka halaman jaringan VPC.

    Buka halaman Jaringan VPC

  2. Klik Create VPC network.

  3. Masukkan Nama custom-network1.

  4. Di bagian Subnets, tetapkan Subnet creation mode ke Custom.

  5. Di bagian Subnet baru, masukkan Nama subnet-us-east-192.

  6. Di Region, pilih us-east4.

  7. Masukkan rentang alamat IP 192.168.1.0/24.

  8. Klik Selesai, lalu klik Buat.

gcloud

  1. Buat jaringan Virtual Private Cloud (VPC) mode kustom baru di project Anda:

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

    Output:

    NAME             MODE     IPV4_RANGE   GATEWAY_IPV4
    custom-network1  custom

  2. Tentukan awalan subnet untuk region pertama Anda. Dalam contoh ini, kami menetapkan 192.168.1.0/24 ke wilayah us-east4.

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

    Output:

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

Terraform

Anda dapat menggunakan modul Terraform untuk membuat jaringan dan subnet Virtual Private Cloud kustom.

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"
    }
  ]
}

Langkah 2: Buat cluster pribadi

Konsol

  1. Di konsol Google Cloud, buka halaman Cluster Kubernetes.

    Buka halaman cluster Kubernetes

  2. Klik Buat kluster.

  3. Untuk Name, masukkan nat-test-cluster.

  4. Tetapkan Location type ke Zonal.

  5. Tetapkan Zone ke us-east4-c.

  6. Di panel navigasi, klik Networking.

  7. Pilih Cluster pribadi.

  8. Hapus centang pada kotak Akses bidang kontrol menggunakan alamat IP eksternalnya.

  9. Masukkan Rentang IP bidang kontrol 172.16.0.0/28.

  10. Setel Network ke custom-network1.

  11. Untuk membuat dan memulai cluster, klik Buat.

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

Anda dapat menggunakan resource Terraform untuk membuat cluster pribadi.

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 {
  }
}

Langkah 3: Buat aturan firewall yang mengizinkan koneksi SSH

Konsol

  1. Pada konsol Google Cloud, buka halaman Kebijakan Firewall.

    Buka halaman Kebijakan firewall

  2. Klik Create firewall rule.

  3. Masukkan Nama allow-ssh.

  4. Tentukan Jaringan dari custom-network1.

  5. Tetapkan Arah traffic ke Ingress.

  6. Tetapkan Tindakan pada kecocokan ke Izinkan.

  7. Tetapkan Targets ke Semua instance dalam jaringan.

  8. Tetapkan Filter sumber ke rentang IPv4.

  9. Setel Rentang IP sumber ke 35.235.240.0/20.

  10. Tetapkan Protocols and ports ke Specified protocols and ports.

  11. Centang kotak tcp, lalu masukkan port 22.

  12. Klik Create.

gcloud

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

Terraform

Anda dapat menggunakan resource Terraform untuk membuat aturan firewall.

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"]
}

Langkah 4: Buat izin SSH IAP untuk salah satu node Anda

Pada langkah berikutnya, gunakan IAP untuk terhubung ke node Anda.

Konsol

  1. Di konsol Google Cloud, buka halaman Identity-Aware Proxy.

    Buka halaman Identity-Aware Proxy

  2. Pilih tab Resource SSH dan TCP.

  3. Pilih kotak centang di samping node pertama dalam daftar di bagian All Tunnel Resources > us-east4-c. Namanya akan mirip dengan gke-nat-test-cluster-default-pool-b50db58d-075t.

  4. Tuliskan nama node; nantinya Anda akan menggunakannya untuk menguji konektivitas.

  5. Di panel kanan, klik Add principal.

  6. Untuk memberi pengguna, grup, atau akun layanan akses ke resource, di kolom New principals, tentukan alamat email mereka.

    Jika hanya ingin menguji fitur ini, Anda dapat memasukkan alamat email Anda sendiri.

  7. Untuk memberikan akses akun utama ke resource melalui fitur penerusan TCP Cloud IAP, pada menu drop-down Peran, pilih Cloud IAP > IAP-secured Tunnel User.

  8. Klik Save.

gcloud

Untuk langkah ini, gunakan petunjuk Konsol.

Langkah 5: Login ke node dan pastikan node tersebut tidak dapat terhubung ke internet

Konsol

  1. Di Konsol Google Cloud, buka halaman VM instances.

    Buka halaman VM instances

  2. Temukan node tempat Anda membuat izin SSH IAP. Di kolom Connect, klik panah drop-down SSH, lalu pilih Open in browser window.

    Jika ini adalah pertama kalinya Anda terhubung ke instance, Google Cloud akan menghasilkan kunci SSH untuk Anda.

  3. Dari perintah node, temukan ID proses penampung kube-dns:

    pgrep '^kube-dns$'
  4. Akses penampung:

    sudo nsenter --target PROCESS_ID --net /bin/bash
  5. Dari kube-dns, coba hubungkan ke internet:

    curl example.com

    Anda seharusnya tidak mendapatkan hasil. Jika melakukannya, Anda mungkin belum membuat cluster sebagai cluster pribadi, atau mungkin ada masalah lain. Untuk memecahkan masalah, lihat VM dapat menjangkau internet secara tiba-tiba tanpa Public NAT.

    Untuk mengakhiri perintah, Anda mungkin harus memasukkan Ctrl+C.

gcloud

  1. Temukan nama salah satu node cluster Anda:

    gcloud compute instances list

    Nama node terlihat seperti gke-nat-test-cluster-default-pool-1a4cbd06-3m8v. Catat nama node dan gunakan nama tersebut di mana pun Anda melihat NODE_NAME dalam perintah berikut.

  2. Hubungkan ke node:

    gcloud compute ssh NODE_NAME \
        --zone us-east4-c \
        --tunnel-through-iap
  3. Dari perintah node, temukan ID proses penampung kube-dns:

    pgrep '^kube-dns$'
  4. Akses penampung:

    sudo nsenter --target PROCESS_ID --net /bin/bash
  5. Dari kube-dns, coba hubungkan ke internet:

    curl example.com

    Anda seharusnya tidak mendapatkan hasil.Untuk mengakhiri perintah, Anda mungkin harus memasukkan Ctrl+C.

Langkah 6: Buat konfigurasi NAT menggunakan Cloud Router

Anda harus membuat Cloud Router di region yang sama dengan instance yang menggunakan NAT Publik. NAT Publik hanya digunakan untuk menempatkan informasi NAT ke VM. NAT tidak digunakan sebagai bagian dari {i>gateway NAT<i} yang sebenarnya.

Konfigurasi ini memungkinkan semua instance di region menggunakan NAT Publik untuk semua rentang IP alias dan primer. NAT juga secara otomatis mengalokasikan alamat IP eksternal untuk gateway NAT. Untuk mengetahui opsi lainnya, lihat dokumentasi Google Cloud CLI.

Konsol

  1. Di Konsol Google Cloud, buka halaman Cloud NAT.

    Buka halaman Cloud NAT

  2. Klik Mulai atau Create Cloud NAT gateway.

  3. Masukkan Nama Gateway nat-config.

  4. Setel VPC network ke custom-network1.

  5. Tetapkan Region ke us-east4.

  6. Di bagian Cloud Router, pilih Create new router.

    1. Masukkan Nama nat-router.
    2. Klik Create.
  7. Klik Create.

gcloud

  1. Membuat cloud router

    gcloud compute routers create nat-router \
        --network custom-network1 \
        --region us-east4
  2. Tambahkan konfigurasi ke router:

    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

Anda dapat menggunakan resource Terraform untuk membuat Cloud Router.

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

Anda dapat menggunakan modul Terraform untuk membuat konfigurasi 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"
}

Langkah 7: Coba hubungkan kembali ke internet

Diperlukan waktu hingga tiga menit agar konfigurasi NAT diterapkan, jadi tunggu setidaknya satu menit sebelum mencoba mengakses internet lagi.

Jika Anda belum login ke kube-dns, hubungkan kembali dengan menggunakan prosedur di Langkah 5. Setelah login, jalankan kembali perintah curl:

curl example.com

Anda akan melihat output yang berisi konten berikut:


<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>

Langkah selanjutnya