Mengonfigurasi jejaring untuk cluster produksi dasar


Tutorial ini ditujukan untuk arsitek cloud dan administrator operasi yang tertarik untuk men-deploy aplikasi web ke cluster Google Kubernetes Engine (GKE) dan mengeksposnya dengan load balancer HTTPS.

Tujuan

Dalam tutorial ini, Anda akan mempelajari cara:

  • Membuat cluster GKE.
  • Membuat alamat IP global dan zona Cloud DNS dengan Terraform.
  • Mengonfigurasi load balancing HTTPS.
  • Men-deploy contoh aplikasi web.

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

Menyiapkan project

  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, klik Buat project untuk mulai membuat project Google Cloud baru.

    Buka pemilih project

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

  4. Aktifkan API Google Kubernetes Engine, Cloud DNS.

    Mengaktifkan API

  5. Di konsol Google Cloud, pada halaman pemilih project, klik Buat project untuk mulai membuat project Google Cloud baru.

    Buka pemilih project

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

  7. Aktifkan API Google Kubernetes Engine, Cloud DNS.

    Mengaktifkan API

  • Anda harus memiliki nama domain. Nama domain tidak boleh lebih dari 63 karakter. Anda dapat menggunakan Google Domains atau registrar lain.

Menyiapkan lingkungan

Dalam tutorial ini, Anda akan menggunakan Cloud Shell untuk mengelola resource yang dihosting di Google Cloud. Cloud Shell telah diinstal sebelumnya dengan software yang Anda perlukan untuk tutorial ini, termasuk Terraform, kubectl, dan gcloud CLI.

  1. Menetapkan variabel lingkungan:

    PROJECT_ID=$(gcloud config get-value project)
    gcloud config set project $PROJECT_ID
    gcloud config set compute/region us-central1
    
  2. Clone repositori kode:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
    
  3. Ubah ke direktori kerja:

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

Membuat cluster GKE

File Terraform berikut membuat cluster 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"
}

File Terraform berikut membuat alamat IP global dan zona 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. Lakukan inisialisasi Terraform:

    terraform init
    
  2. Lihat perubahan infrastruktur:

    terraform plan
    

    Saat diminta, masukkan domain Anda, seperti my-domain.net.

  3. Terapkan konfigurasi Terraform:

    terraform apply --auto-approve
    

    Saat diminta, masukkan domain Anda, seperti my-domain.net.

    Output akan mirip dengan yang berikut ini:

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

Membuat Load Balancer Aplikasi eksternal

  1. Manifes berikut menjelaskan ManagedCertificate, FrontendConfig, Deployment, Service, dan 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

    Ganti DOMAIN_NAME dengan nama domain Anda, seperti my-domain.net.

    Manifes ini memiliki properti berikut:

    • networking.gke.io/managed-certificates: nama ManagedCertificate.
    • networking.gke.io/v1beta1.FrontendConfig: nama resource FrontendConfig.
    • kubernetes.io/ingress.global-static-ip-name: nama alamat IP.
    • kubernetes.io/ingress.class: menginstruksikan pengontrol GKE Ingress untuk membuat Load Balancer Aplikasi eksternal.
  2. Terapkan manifes ke cluster Anda:

    kubectl apply -f kubernetes-manifests.yaml
    
  3. Pastikan Ingress telah dibuat:

    kubectl describe ingress frontend
    

    Output akan mirip dengan yang berikut ini:

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

    Diperlukan waktu beberapa menit untuk menyediakan Ingress.

Aplikasi pengujian

  1. Periksa status sertifikat SSL:

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

    Penyediaan sertifikat SSL mungkin memerlukan waktu hingga 30 menit. Output berikut menunjukkan bahwa sertifikat SSL sudah siap:

    NAME                      AGE   STATUS
    networking-managed-cert   28m   Active
    
  2. Jalankan perintah curl:

    curl -Lv https://DOMAIN_NAME
    

    Output akan mirip dengan yang berikut ini:

    *   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
    

Pembersihan

Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.

Menghapus project

    Menghapus project Google Cloud:

    gcloud projects delete PROJECT_ID

Menghapus resource satu per satu

  1. Hapus resource kubernetes:

    kubectl delete -f kubernetes-manifests.yaml
    
  2. Hapus resource Terraform:

    terraform destroy --auto-approve
    

    Saat diminta, masukkan domain Anda, seperti my-domain.net.

Langkah berikutnya