Menggunakan Public NAT dengan GKE

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

Prasyarat

Anda perlu melakukan hal berikut sebelum menyiapkan NAT Publik.

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 terjemahan alamat jaringan oleh gateway NAT.

Menyiapkan Google Cloud

Sebelum memulai, siapkan item berikut di 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. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Make sure that billing is enabled for your Google Cloud project.

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

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

    Buka pemilih project

  7. Make sure that billing is enabled for your Google Cloud project.

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

    gcloud init

Menyiapkan contoh GKE

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

Langkah 1: Buat jaringan VPC dan subnet

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 New subnet, masukkan Name subnet-us-east-192.

  6. Di bagian 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, kita menetapkan 192.168.1.0/24 ke region 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 Kubernetes clusters.

    Buka halaman cluster Kubernetes

  2. Klik Buat kluster.

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

  4. Tetapkan Location type ke Zonal.

  5. Setel Zona ke us-east4-c.

  6. Di panel navigasi, klik Networking.

  7. Pilih Cluster pribadi.

  8. Hapus centang pada kotak Akses panel 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 Create.

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 Direction of traffic ke Ingress.

  6. Tetapkan Action on match ke Allow.

  7. Tetapkan Target ke All instances in the network.

  8. Tetapkan Source filter ke IPv4 ranges.

  9. Tetapkan Rentang IP sumber ke 35.235.240.0/20.

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

  11. Pilih kotak centang 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 SSH and TCP resources.

  3. Centang kotak 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; nanti Anda akan menggunakannya untuk menguji konektivitas.

  5. Di panel kanan, klik Tambahkan akun utama.

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

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

  7. Untuk memberikan akses kepada akun utama ke resource melalui fitur penerusan TCP Cloud IAP, pilih Cloud IAP > IAP-secured Tunnel User di daftar drop-down Role.

  8. Klik Simpan.

gcloud

Untuk langkah ini, gunakan petunjuk Konsol.

Langkah 5: Login ke node dan konfirmasi bahwa node tidak dapat menjangkau internet

Konsol

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

    Buka halaman Instance VM

  2. Temukan node yang izin SSH IAP-nya telah Anda buat. 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 membuat kunci SSH untuk Anda.

  3. Dari prompt 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 tidak akan mendapatkan hasil apa pun. Jika demikian, Anda mungkin belum membuat cluster sebagai cluster pribadi, atau mungkin ada masalah lain. Untuk memecahkan masalah, lihat VM dapat menjangkau internet secara tidak terduga tanpa NAT Publik.

    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 prompt node, temukan ID proses container 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: Membuat 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. Cloud NAT tidak digunakan sebagai bagian dari gateway NAT yang sebenarnya.

Dengan konfigurasi ini, semua instance di region tersebut dapat menggunakan NAT Publik untuk semua rentang utama dan alias IP. Konfigurasi ini juga otomatis mengaloksiasikan 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. Tetapkan 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 lagi ke internet

Mungkin perlu waktu hingga tiga menit agar konfigurasi NAT diterapkan, jadi tunggu minimal satu menit sebelum mencoba mengakses internet lagi.

Jika Anda belum login ke kube-dns, hubungkan kembali menggunakan prosedur di Langkah 5. Setelah Anda 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