הגדרת רשת לאשכול ייצור בסיסי

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

מטרות

במדריך הזה תלמדו איך:

  • יוצרים אשכול GKE.
  • איך יוצרים כתובת IP גלובלית ואזור Cloud DNS באמצעות Terraform.
  • הגדרת איזון עומסים ב-HTTPS.
  • פריסת אפליקציית אינטרנט לדוגמה.

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.

לפני שמתחילים

הגדרת הפרויקט

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.

    Roles required to 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

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Google Kubernetes Engine, Cloud DNS APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.

    Roles required to 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

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Google Kubernetes Engine, Cloud DNS APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  • אתם חייבים להיות הבעלים של שם דומיין. שם הדומיין לא יכול להיות ארוך מ-63 תווים. אתם יכולים להשתמש ב-Google Domains או ברשם אחר.

מגדירים את הסביבה

במדריך הזה משתמשים ב-Cloud Shell כדי לנהל משאבים שמתארחים ב-Google Cloud. ב-Cloud Shell מותקנת מראש התוכנה שדרושה ללימודים האלה, כולל Terraform,‏ kubectl ו-gcloud CLI.

  1. הגדרת משתני סביבה:

    PROJECT_ID=$(gcloud config get-value project)
    gcloud config set project $PROJECT_ID
    gcloud config set compute/region us-central1
    
  2. משכפלים את מאגר המקורות של הקוד:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
    
  3. עוברים לספריית העבודה:

    cd kubernetes-engine-samples/autopilot/networking-tutorial
    

יצירת אשכול GKE

קובץ Terraform הבא יוצר אשכול GKE:


terraform {
  required_version = "~> 1.3"
}

provider "google" {}

variable "region" {
  type        = string
  description = "Region where the cluster will be created."
  default     = "us-central1"
}

variable "cluster_name" {
  type        = string
  description = "Name of the cluster"
  default     = "networking-cluster"
}

resource "google_container_cluster" "default" {
  name             = var.cluster_name
  description      = "Cluster for sample web application"
  location         = var.region
  enable_autopilot = true

  ip_allocation_policy {}
}

output "region" {
  value       = var.region
  description = "Compute region"
}

output "cluster_name" {
  value       = google_container_cluster.default.name
  description = "Cluster name"
}

קובץ Terraform הבא יוצר כתובת IP גלובלית ואזור Cloud DNS:


terraform {
  required_version = "~> 1.3"
}

variable "base_domain" {
  type        = string
  description = "Your base domain"
}

variable "name" {
  type        = string
  description = "Name of resources"
  default     = "networking-tutorial"
}

data "google_client_config" "current" {}

resource "google_compute_global_address" "default" {
  name = var.name
}

resource "google_dns_managed_zone" "default" {
  name        = var.name
  dns_name    = "${var.name}.${var.base_domain}."
  description = "DNS Zone for web application"
}

resource "google_dns_record_set" "a" {
  name         = google_dns_managed_zone.default.dns_name
  type         = "A"
  ttl          = 300
  managed_zone = google_dns_managed_zone.default.name

  rrdatas = [google_compute_global_address.default.address]
}

resource "google_dns_record_set" "cname" {
  name         = join(".", compact(["www", google_dns_record_set.a.name]))
  type         = "CNAME"
  ttl          = 300
  managed_zone = google_dns_managed_zone.default.name

  rrdatas = [google_dns_record_set.a.name]
}

output "dns_zone_name_servers" {
  value       = google_dns_managed_zone.default.name_servers
  description = "Write these virtual name servers in your base domain."
}

output "domain" {
  value = trim(google_dns_record_set.a.name, ".")
}
  1. מאתחלים את Terraform:

    terraform init
    
  2. הצגת השינויים בתשתית:

    terraform plan
    

    כשמופיעה בקשה, מזינים את הדומיין, למשל my-domain.net.

  3. מחילים את ההגדרות של Terraform:

    terraform apply --auto-approve
    

    כשמופיעה בקשה, מזינים את הדומיין, למשל my-domain.net.

    הפלט אמור להיראות כך:

    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
    
    Outputs:
    
    cluster_name = "networking-cluster"
    region = "us-central1"
    

יצירת מאזן עומסים חיצוני של אפליקציות (ALB)

  1. במניפסט הבא מתוארים ManagedCertificate,‏ FrontendConfig,‏ Deployment,‏ Service ו-Ingress:

    ---
    apiVersion: networking.gke.io/v1
    kind: ManagedCertificate
    metadata:
      name: networking-managed-cert
    spec:
      domains:
        - DOMAIN_NAME
        - www.DOMAIN_NAME
    ---
    apiVersion: networking.gke.io/v1beta1
    kind: FrontendConfig
    metadata:
      name: networking-fc
    spec:
      redirectToHttps:
        enabled: true
        responseCodeName: MOVED_PERMANENTLY_DEFAULT
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: frontend
    spec:
      selector:
        matchLabels:
          app: frontend
      replicas: 2
      template:
        metadata:
          labels:
            app: frontend
        spec:
          containers:
          - name: echo-amd64
            image: us-docker.pkg.dev/google-samples/containers/gke/hello-app-cdn:1.0
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: frontend
    spec:
      type: LoadBalancer
      selector:
        app: frontend
      ports:
      - name: http
        port: 80
        targetPort: 8080
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: frontend
      annotations:
        networking.gke.io/managed-certificates: networking-managed-cert
        networking.gke.io/v1beta1.FrontendConfig: networking-fc
        kubernetes.io/ingress.global-static-ip-name: networking-tutorial
        kubernetes.io/ingress.class: gce
      labels:
        app: frontend
    spec:
      defaultBackend:
        service:
          name: frontend
          port:
            number: 80

    מחליפים את DOMAIN_NAME בשם הדומיין, למשל my-domain.net.

    למניפסט הזה יש את המאפיינים הבאים:

    • networking.gke.io/managed-certificates: השם של ManagedCertificate. המשאב הזה מקצה אישור SSL בניהול Google (קלאסי).
    • networking.gke.io/v1beta1.FrontendConfig: השם של משאב FrontendConfig.
    • kubernetes.io/ingress.global-static-ip-name: השם של כתובת ה-IP.
    • kubernetes.io/ingress.class: הנחיה ל-GKE Ingress Controller ליצור מאזן עומסים של אפליקציות חיצוני.
  2. מחילים את המניפסט על האשכול:

    kubectl apply -f kubernetes-manifests.yaml
    
  3. מוודאים שנוצר Ingress:

    kubectl describe ingress frontend
    

    הפלט אמור להיראות כך:

    ...
      Events:
        Type    Reason  Age   From                     Message
        ----    ------  ----  ----                     -------
        Normal  ADD     2m    loadbalancer-controller  default/frontend
        Normal  CREATE  1m    loadbalancer-controller  ip: 203.0.113.2
    ...
    

    יכול להיות שיחלפו כמה דקות עד שה-Ingress יוקצה.

אפליקציית בדיקה

  1. בודקים את הסטטוס של אישור ה-SSL:

    kubectl get managedcertificates.networking.gke.io networking-managed-cert
    

    יכול להיות שיחלפו עד 30 דקות עד שהקצאת אישור ה-SSL תושלם. הפלט הבא מציין שאישור ה-SSL מוכן:

    NAME                      AGE   STATUS
    networking-managed-cert   28m   Active
    
  2. מריצים פקודה curl:

    curl -Lv https://DOMAIN_NAME
    

    הפלט אמור להיראות כך:

    *   Trying 34.160.115.33:443...
    * Connected to DOMAIN_NAME (34.160.115.33) port 443 (#0)
    ...
    * TLSv1.3 (IN), TLS handshake, Certificate (11):
    ...
    * Server certificate:
    *  subject: CN=DOMAIN_NAME
    ...
    > Host: DOMAIN_NAME
    

הסרת המשאבים

כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.

מחיקת הפרויקט

    כדי למחוק Google Cloud פרויקט:

    gcloud projects delete PROJECT_ID

מחיקת משאבים בודדים

  1. מוחקים את משאבי Kubernetes:

    kubectl delete -f kubernetes-manifests.yaml
    
  2. מוחקים את משאבי Terraform:

    terraform destroy --auto-approve
    

    כשמופיעה בקשה, מזינים את הדומיין, למשל my-domain.net.

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