使用 Terraform 創建 Kubernetes GKE 集群,實現容器化應用的部署和管理。

GCP 運算服務 Kubernetes GKE 的主要功能、用途與使用情境,可以參考先前的章節來做了解,會更幫助我們了解對應用terraform產生的雲端資源。
Terraform/GCP實戰:使用 GCP Console GCP 運算服務 Kubernetes GKE
在這個章節中,我們將深入探討如何使用Terraform在Google Cloud Platform上創建Cloud Run。我們將依次進行以下步驟:
創建自定義GKE
如何使用console來連線節點與查看狀況
部署nginx的服務到GKE上 (option)
Terraform Kubernetes GKE 連結:可以到github參考對應的Terraform程式碼。
接著創建三個檔案,分別是 0-provider.tf, 1-variables.tf, 2-main.tf。
0-provider.tf

##################################################################################
# CONFIGURATION
##################################################################################
terraform {
  required_version = ">=1.0"
    required_providers {
      google = {
        source  = "hashicorp/google"
        version = ">= 4.40.0"
      }
    }
}
##################################################################################
# PROVIDERS
##################################################################################
provider "google" {
  project = var.GCP_PROJECT
  region  = var.GCP_REGION
  # zone        = var.zone
}
provider "kubernetes" {
  host                   = "https://${module.gke.endpoint}"
  cluster_ca_certificate = base64decode(module.gke.ca_certificate)
  token                  = data.google_client_config.default.access_token
}
這個檔案主要用於配置 Terraform 的提供者(provider),以確保 Terraform 可以正確地與 Google Cloud Platform(GCP)進行交互。
terraform :這個區塊設定了 Terraform 的版本要求,確保使用的版本符合最低要求大於4.40.0版本。同時,它也定義了所需的提供者和版本。
provider "google" :這個區塊指定了要使用的 GCP 提供,指定了 GCP 專案 ID(由 var. GCP_PROJECT 變數提供)。
kubernetes:它用於管理Kubernetes叢集,需要配置Kubernetes的相關參數,例如host、cluster_ca_certificate和token。正確的輸入驗證資訊後,可以使用這個提供者來部署和管理Kubernetes上的應用程式。
1-variables.tf
variable "GCP_PROJECT" {
  description = "GCP Project ID"
  type        = string
  default     = "terraform101-384507"
}
variable "GCP_REGION" {
  type    = string
  default = "asia-northeast1"
}
variable "cluster_name" {
  type    = string
  default = "gke-tf-ch4-7-3"
}

這個檔案用於定義 Terraform 使用的變數,以實現更高度的可配置性和重用性。
variable "GCP_PROJECT":這是 GCP 專案 ID 的變數,它描述了 GCP 專案的 ID。它的預設值是 "terraform101-384507",但可以在使用時指定不同的值。
variable "GCP_REGION":這是定義網路服務所在位置(地區)的變數。
variable "cluster_name":這是用於定義 Kubernetes GKE Cluster 名稱的變數。
2-main.tf

# google_client_config and kubernetes provider must be explicitly specified like the following.
data "google_client_config" "default" {}
data "google_compute_default_service_account" "default" {}
module "gke" {
  source     = "terraform-google-modules/kubernetes-engine/google"
  project_id = var.GCP_PROJECT
  name       = var.cluster_name
  region     = var.GCP_REGION
  zones      = ["asia-northeast1-a"]
  network    = "default"
  subnetwork = "default"
  # asia-northeast1-pods-03263bcb     10.14.0.0/20
  # asia-northeast1-services-03263bcb 10.18.0.0/20
  ip_range_pods     = "asia-northeast1-pods-03263bcb"
  ip_range_services = "asia-northeast1-services-03263bcb"
  create_service_account = false
  service_account        = data.google_compute_default_service_account.default.email
  # use our spot pool
  remove_default_node_pool = true
  http_load_balancing      = true
  gce_pd_csi_driver        = true
  filestore_csi_driver     = false
  kubernetes_version       = "1.26.5-gke.1200"
  node_pools = [
    {
      name               = "spot-worker-pool"
      machine_type       = "e2-medium"
      min_count          = 0
      max_count          = 3
      spot               = true
      disk_size_gb       = 100
      disk_type          = "pd-standard"
      image_type         = "COS_CONTAINERD"
      enable_gcfs        = false
      enable_gvnic       = false
      auto_repair        = true
      initial_node_count = 1
    },
  ]
  node_pools_oauth_scopes = {
    all = [
      "https://www.googleapis.com/auth/logging.write",
      "https://www.googleapis.com/auth/monitoring",
    ]
  }
  node_pools_labels = {
    all = {}
    spot-worker-pool = {
      spot-worker-pool = true
    }
  }
  node_pools_metadata = {
    all = {}
    spot-worker-pool = {
      node-pool-metadata-custom-value = "my-node-pool"
    }
  }
  node_pools_taints = {
    all = []
    spot-worker-pool = [
      {
        key    = "spot-worker-pool"
        value  = true
        effect = "PREFER_NO_SCHEDULE"
      },
    ]
  }
  node_pools_tags = {
    all = []
    spot-worker-pool = [
      "spot-worker-pool",
    ]
  }
}
這段 Terraform 程式碼的目的是使用 Terraform 工具自動化地在 Google Cloud Platform 上創建一個 GKE,並將相關的資源設定和配置進行定義。:
使用 data 區塊拿取遠端的雲端架構配置:
data google_client_config default {} :這個部分使用data區塊來擷取Google Cloud Platform(GCP)的用戶端配置資訊,這些資訊將用於後續的操作,例如設定Kubernetes叢集。
data google_compute_default_service_account default {}
:這個部分擷取GCP的預設服務帳戶,以便將其分配給Kubernetes叢集。
使用module gke 區塊,將一個名為 gke 的模組應用到配置中。這個模組來自於 terraform-google-modules/kubernetes-engine/google 的來源,用於部署GKE叢集。
GKE叢集:
project_id:指定GCP項目的ID。
name:指定Kubernetes叢集的名稱。
region:指定Kubernetes叢集所在的區域。
zones:指定Kubernetes叢集的可用區域。
network和subnetwork:指定Kubernetes叢集的網絡和子網絡配置。
ip_range_pods和ip_range_services:指定Kubernetes叢集的IP範圍配置。
GKE節點集區(節點池)
create_service_account和service_account:控制是否創建服務帳戶以及服務帳戶的配置。
remove_default_node_pool:控制是否移除默認的節點池。
node_pools:定義Kubernetes叢集的節點池配置,包括節點的大小、數量、硬碟配置等。
node_pools_oauth_scopes:配置節點池的OAuth範圍。
node_pools_labels和node_pools_metadata:配置節點池的標籤和元數據。
node_pools_taints和node_pools_tags:配置節點池的污點和標籤。
總之,這段 Terraform 程式碼創建一個 GKE 服務,自動化部署和管理Google Kubernetes Engine(GKE)集群,並配置叢集的相關屬性和資源。這使得在GCP上運行容器化應用程式變得更容易且可重複,實現自動化地在 Google Cloud Platform 上創建和配置 Google Kubernetes Engine。
先在default vpc中創建secondary CIDR,terraform會來部署pod與service的相關服務。
asia-northeast1-pods-03263bcb = 10.14.0.0/20
asia-northeast1-services-03263bcb = 10.18.0.0/20
到專案目錄執行初始化計畫
terraform init
# or
tf init
確認部署計畫內容
terraform plan -out plan.out
# or
tfp

最後執行 terraform apply -auto-approve來部署對應的資源到雲端架構上,就可以得到下列的結果。
terraform apply -auto-approve
# or
tfdp


Terraform 創建修改完畢,並看到 Kubernetes GKE 後,可以點選查看節點的詳細資料。後續我們會利用工作負載來建立nginx的部署,同時暴露服務於公開網路中,方便我們測試。

創建 Kubernetes GKE 建立工作部署:





Kubernetes GKE 中的 nginx 工作負載:


接下來可以嘗試觸發服務,點選觸發條件中的網址,就可以轉發到服務。例如下面ip地址,就會轉發到我們部署的nginx server。

Terraform-from-zero-to-hero-10-Lab-GCP-Infrastucture-as-Code — https://github.com/qwedsazxc78/Terraform-from-zero-to-hero-10-Lab-GCP-Infrastucture-as-Code
Terraform-project-best-practice — https://github.com/qwedsazxc78/terraform-project-best-practice
歡迎訂閱我的udemy課程:Terraform 從零開始 - 10+實戰Lab打造GCP雲端自動化架構課程 - https://devops-with-alex.com/go/terraform