使用 Terraform 創建 Kubernetes GKE 集群,實現容器化應用的部署和管理。
文章同步分享到
blog – https://devops-with-alex.com/day-27-terraform-gcp-programming-kubernetes/
ithome – https://ithelp.ithome.com.tw/articles/10338182
Medium – https://medium.com/p/a3be135547e2
1. GCP 運算服務 Kubernetes GKE 主要功能、用途與使用情境
GCP 運算服務 Kubernetes GKE 的主要功能、用途與使用情境,可以參考先前的章節來做了解,會更幫助我們了解對應用terraform產生的雲端資源。
Terraform/GCP實戰:使用 GCP Console GCP 運算服務 Kubernetes GKE
2. GCP 運算服務 — 使用Terraform創建Kubernetes GKE
在這個章節中,我們將深入探討如何使用Terraform在Google Cloud Platform上創建Cloud Run。我們將依次進行以下步驟:
- 創建自定義GKE
- 如何使用console來連線節點與查看狀況
- 部署nginx的服務到GKE上 (option)
- Terraform Kubernetes GKE 連結:可以到github參考對應的Terraform程式碼。
創建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。
GKE 需要先創建 secondary CIDR 在subnet
先在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部署
到專案目錄執行初始化計畫
terraform init
# or
tf init
確認部署計畫內容
terraform plan -out plan.out
# or
tfp
最後執行 terraform apply -auto-approve
來部署對應的資源到雲端架構上,就可以得到下列的結果。
terraform apply -auto-approve
# or
tfdp
測試部署的 Kubernetes GKE 服務
Terraform 創建修改完畢,並看到 Kubernetes GKE 後,可以點選查看節點的詳細資料。後續我們會利用工作負載來建立nginx的部署,同時暴露服務於公開網路中,方便我們測試。
創建 Kubernetes GKE 建立工作部署:
– 新增容器:新增容器並使用映像檔 nginx:latest
,設定使用預設設定後,可以點選查看yaml檔案,來查看部署的yaml檔案。
– 暴露容器:點選公開後,用service的方式公開部署檔案,通訊port使用80來暴露nginx,最後點選服務類型是負載平衡器 load balancer,最後執行部署。
Kubernetes GKE 中的 nginx 工作負載:
– 工作負載:新增容器完成後,可以看到nginx的部署已經完成,點選後可以看到3個pod,第二個可以看到公開服務service與對外ip。
接下來可以嘗試觸發服務,點選觸發條件中的網址,就可以轉發到服務。例如下面ip地址,就會轉發到我們部署的nginx server。
3. 總結 Summary
- Terraform 雲端資源實作:介紹如何使用Terraform自動化地創建Cloud Run的過程。主要步驟包括:
– 初始化 Terraform: 使用 terraform init 初始化 Terraform 項目,確保環境正確設定。
– 設定變數: 定義所需變數,如 GCP 專案 ID、區域和服務名稱,以便稍後在 Terraform 中使用。
– 建立 Kubernetes GKE 服務定義: 定義 Kubernetes GKE 服務的特性,包括服務名稱、叢集類型(Cluster)、叢集基本資訊和節點集區(Node Pool)。
– 設定進階功能:根據需求可以設定,垂直自動化調度pod資源(hpa)與節點自動佈建功能(auto cluster)的功能。
– 生成計劃執行部署: 使用 terraform plan 生成部署計劃,並使用 terraform apply 部署 Kubernetes GKE 服務及其相關資源到 Google Cloud Platform。 - 部署並測試 Kubernetes GKE 的工作負載workload:執行Terraform部署的指令,並完成了下列設定,並嘗試部署nginx應用來進行測試。
– 節點和工作負載的詳細資訊:包括察看節點和工作負載的詳細資訊,指定名稱、建立叢集與節點、網路設定等
-新增容器:設定nginx容器映像和相關設定。
– 暴露容器服務:設定nginx server 通訊端口、部署nginx server 服務service 和負載平衡器。
– 觸發服務:測試 nginx server 服務運行。
4. 相關連結
- 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雲端自動化架構課程