使用 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