שימוש ב-Public NAT עם GKE

בדף הזה מוסבר איך להגדיר דוגמה של NAT ציבורי באמצעות Google Kubernetes Engine ‏ (GKE). לפני שמגדירים NAT ציבורי, כדאי לקרוא את הסקירה הכללית על NAT ציבורי.

דרישות מוקדמות

לפני שמגדירים NAT ציבורי, צריך לבצע את הפעולות הבאות.

קבלת הרשאות IAM

התפקיד roles/compute.networkAdmin מעניק הרשאות ליצור שער NAT ב-Cloud Router, להזמין ולהקצות כתובות IP של NAT, ולציין רשתות משנה (subnets) שתעבורת הנתונים שלהן צריכה להשתמש בתרגום כתובות רשת (NAT) דרך שער ה-NAT.

הגדרה של Cloud de Confiance by S3NS

לפני שמתחילים, צריך להגדיר את הפריטים הבאים ב- Cloud de Confiance.

  1. In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Cloud de Confiance project.

  3. התקינו את ה-CLI של Google Cloud.

  4. הגדירו שה-CLI של gcloud ישתמש בזהות המאוחדת שלכם.

    איך נכנסים ל-CLI של gcloud באמצעות הזהות המאוחדת?

  5. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init

הגדרת הדוגמה של GKE

אפשר להשתמש בדוגמה הזו אם רוצים לראות הגדרה פשוטה של NAT ציבורי שפועלת עם GKE.

שלב 1: יצירת רשת VPC ורשת משנה

אם כבר יש לכם רשת ותת-רשת, אתם יכולים לדלג על השלב הזה.

המסוף

  1. נכנסים לדף VPC networks במסוף Cloud de Confiance .

    לדף VPC networks

  2. לוחצים על יצירת רשת VPC.

  3. מזינים שם של custom-network1.

  4. בקטע Subnets (רשתות משנה), מגדירים את Subnet creation mode (מצב יצירת רשת משנה) לערך Custom (מותאם אישית).

  5. בקטע New subnet (רשת משנה חדשה), מזינים שם של subnet-us-east-192.

  6. בקטע Region (אזור), בוחרים באפשרות us-east4.

  7. מזינים טווח כתובות IP של 192.168.1.0/24.

  8. לוחצים על Done ואז על Create.

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      = "~> 13.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. נכנסים לדף Kubernetes clusters במסוף Cloud de Confiance .

    כניסה לדף Kubernetes clusters

  2. לוחצים על יצירת אשכול.

  3. בשדה Name (שם), מזינים nat-test-cluster.

  4. מגדירים את סוג המיקום לאזורי.

  5. מגדירים את Zone לערך us-east4-c.

  6. בחלונית הניווט, לוחצים על Networking (רשת).

  7. בוחרים באפשרות Private cluster (אשכול פרטי).

  8. מבטלים את הסימון של התיבה מישור בקרת הגישה באמצעות כתובת ה-IP החיצונית שלו.

  9. מזינים טווח כתובות IP של מישור הבקרה של 172.16.0.0/28.

  10. מגדירים את Network לערך custom-network1.

  11. כדי ליצור את האשכול ולהפעיל אותו, לוחצים על Create.

gcloud

gcloud container clusters create "nat-test-cluster" \
    --zone "us-east4-c" \
    --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. נכנסים לדף Firewall policies במסוף Cloud de Confiance .

    כניסה לדף Firewall policies

  2. לוחצים על יצירת כלל לחומת האש.

  3. מזינים שם של allow-ssh.

  4. מציינים רשת של custom-network1.

  5. מגדירים את Direction of traffic (כיוון התנועה) ל-Ingress (נכנסת).

  6. מגדירים את הפעולה במקרה של התאמה לאישור.

  7. מגדירים את היעדים לכל המופעים ברשת.

  8. מגדירים את Source filter בתור IPv4 ranges.

  9. מגדירים את Source IP ranges (טווחי כתובות 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: יוצרים הרשאות SSH ל-IAP לאחד מהצמתים

בשלב מאוחר יותר, משתמשים ב-IAP כדי להתחבר לצומת.

המסוף

  1. נכנסים לדף שרת proxy לאימות זהויות (IAP) במסוף Cloud de Confiance .

    כניסה לדף 'שרת proxy לאימות זהויות (IAP)'

  2. לוחצים על הכרטיסייה SSH and TCP resources (משאבי SSH ו-TCP).

  3. מסמנים את תיבת הסימון לצד הצומת הראשון ברשימה בקטע All Tunnel Resources > us-east4-c. השם שלו יהיה דומה ל-gke-nat-test-cluster-default-pool-b50db58d-075t.

  4. רושמים את שם הצומת. בהמשך תשתמשו בו כדי לבדוק את הקישוריות.

  5. בחלונית השמאלית, לוחצים על Add principal.

  6. כדי להעניק למשתמשים, לקבוצות או לחשבונות שירות גישה למשאבים, בשדה New principals (חשבונות משתמשים חדשים), מציינים את כתובות האימייל שלהם.

    אם אתם רק בודקים את התכונה הזו, אתם יכולים להזין את כתובת האימייל שלכם.

  7. כדי לתת לחשבונות הראשיים גישה למשאבים באמצעות התכונה להעברת TCP של Cloud IAP, בתפריט הנפתח תפקיד בוחרים באפשרות Cloud IAP > IAP-secured Tunnel User.

  8. לוחצים על Save.

gcloud

בשלב הזה, פועלים לפי ההוראות לשימוש ב-Console.

שלב 5: מתחברים לצומת ומוודאים שאי אפשר לגשת לאינטרנט

המסוף

  1. נכנסים לדף VM instances במסוף Cloud de Confiance .

    לדף VM instances

  2. מוצאים את הצומת שיצרתם עבורו הרשאות SSH לרכישות מתוך האפליקציה. בעמודה Connect, לוחצים על החץ לתפריט הנפתח SSH ובוחרים באפשרות Open in browser window.

    אם זו הפעם הראשונה שאתם מתחברים למופע,Cloud de Confiance ייצור בשבילכם את מפתחות ה-SSH.

  3. בשורת הפקודה של הצומת, מחפשים את מזהה התהליך של מאגר kube-dns:

    pgrep '^kube-dns$'
  4. ניגשים למאגר:

    sudo nsenter --target PROCESS_ID --net /bin/bash
  5. מ-kube-dns, מנסים להתחבר לאינטרנט:

    curl example.com

    לא אמורה להתקבל תוצאה. אם כן, יכול להיות שלא יצרתם את האשכול כאשכול פרטי, או שיש בעיה אחרת. לפתרון בעיות, אפשר לעיין במאמר מכונות וירטואליות יכולות להתחבר לאינטרנט באופן לא צפוי ללא 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:

    pgrep '^kube-dns$'
  4. ניגשים למאגר:

    sudo nsenter --target PROCESS_ID --net /bin/bash
  5. מ-kube-dns, מנסים להתחבר לאינטרנט:

    curl example.com

    לא אמורה להתקבל תוצאה.כדי לסיים את הפקודה, יכול להיות שתצטרכו להזין את Ctrl+C.

שלב 6: יצירת הגדרת NAT באמצעות Cloud Router

צריך ליצור את Cloud Router באותו אזור שבו נמצאות המכונות הווירטואליות שמשתמשות ב-Public NAT. ‏Public NAT משמש רק להצבת פרטי NAT במכונות הווירטואליות. הוא לא משמש כחלק משער NAT בפועל.

ההגדרה הזו מאפשרת לכל המכונות באזור להשתמש ב-NAT ציבורי לכל טווחי ה-IP הראשיים וכתובות ה-IP של הכינויים. בנוסף, המערכת מקצה באופן אוטומטי את כתובות ה-IP החיצוניות לשער ה-NAT. אפשרויות נוספות מפורטות במאמרי העזרה בנושא Google Cloud CLI.

המסוף

  1. נכנסים לדף Cloud NAT במסוף Cloud de Confiance .

    כניסה לדף Cloud NAT

  2. לוחצים על שנתחיל? או על יצירת שער NAT.

  3. מזינים שם שער של nat-config.

  4. מגדירים את רשת ה-VPC ל-custom-network1.

  5. מגדירים את Region לערך 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 תתעדכן, לכן כדאי לחכות לפחות דקה לפני שמנסים לגשת שוב לאינטרנט.

אם אתם לא מחוברים ל-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>

המאמרים הבאים