blog post

Day 27 — Terraform/GCP實戰 :使用 Terraform 創建 GCP 運算服務 Kubernetes GKE

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

Day 27 — Terraform/GCP實戰 :使用 Terraform 創建 GCP 運算服務 Kubernetes GKE
Day 27 — Terraform/GCP實戰 :使用 Terraform 創建 GCP 運算服務 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

GCP 運算服務 Kubernetes GKE

2. GCP 運算服務 — 使用Terraform創建Kubernetes GKE

在這個章節中,我們將深入探討如何使用Terraform在Google Cloud Platform上創建Cloud Run。我們將依次進行以下步驟:

  1. 創建自定義GKE
  2. 如何使用console來連線節點與查看狀況
  3. 部署nginx的服務到GKE上 (option)
  4. Terraform Kubernetes GKE 連結:可以到github參考對應的Terraform程式碼。

創建terraform檔案

接著創建三個檔案,分別是 0-provider.tf, 1-variables.tf, 2-main.tf。

0-provider.tf

terraform檔案 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檔案 1-variables.tf

這個檔案用於定義 Terraform 使用的變數,以實現更高度的可配置性和重用性。

  • variable "GCP_PROJECT":這是 GCP 專案 ID 的變數,它描述了 GCP 專案的 ID。它的預設值是 “terraform101-384507″,但可以在使用時指定不同的值。
  • variable "GCP_REGION":這是定義網路服務所在位置(地區)的變數。
  • variable "cluster_name":這是用於定義 Kubernetes GKE Cluster 名稱的變數。

2-main.tf

terraform檔案 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叢集的可用區域。
  • networksubnetwork:指定Kubernetes叢集的網絡和子網絡配置。
  • ip_range_podsip_range_services:指定Kubernetes叢集的IP範圍配置。

GKE節點集區(節點池)

  • create_service_accountservice_account:控制是否創建服務帳戶以及服務帳戶的配置。
  • remove_default_node_pool:控制是否移除默認的節點池。
  • node_pools:定義Kubernetes叢集的節點池配置,包括節點的大小、數量、硬碟配置等。
  • node_pools_oauth_scopes:配置節點池的OAuth範圍。
  • node_pools_labelsnode_pools_metadata:配置節點池的標籤和元數據。
  • node_pools_taintsnode_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 plan -out plan.out

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

terraform apply -auto-approve
# or
tfdp
部署雲端架構 terraform apply -auto-approve
GCP 運算服務 — 創建Kubernetes GKE

測試部署的 Kubernetes GKE 服務

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

Kubernetes GKE 服務 — 節點資訊

創建 Kubernetes GKE 建立工作部署:
新增容器:新增容器並使用映像檔 nginx:latest,設定使用預設設定後,可以點選查看yaml檔案,來查看部署的yaml檔案。
暴露容器:點選公開後,用service的方式公開部署檔案,通訊port使用80來暴露nginx,最後點選服務類型是負載平衡器 load balancer,最後執行部署。

Kubernetes GKE 服務 — 新增容器並使用映像檔 nginx:latest
Kubernetes GKE 服務 — 容器設定
Kubernetes GKE 服務 — 容器yaml檔案設定
Kubernetes GKE 服務 — 容器公開服務並部署
Kubernetes GKE 服務 — 部署中

Kubernetes GKE 中的 nginx 工作負載:
工作負載:新增容器完成後,可以看到nginx的部署已經完成,點選後可以看到3個pod,第二個可以看到公開服務service與對外ip。

Kubernetes GKE 服務 — nginx 工作負載
Kubernetes GKE 服務 — nginx 公開服務 service

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

Kubernetes GKE 服務 — nginx server

3. 總結 Summary

  1. 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。
  2. 部署並測試 Kubernetes GKE 的工作負載workload:執行Terraform部署的指令,並完成了下列設定,並嘗試部署nginx應用來進行測試。
    – 節點和工作負載的詳細資訊:包括察看節點和工作負載的詳細資訊,指定名稱、建立叢集與節點、網路設定等
    -新增容器:設定nginx容器映像和相關設定。
    – 暴露容器服務:設定nginx server 通訊端口、部署nginx server 服務service 和負載平衡器。
    – 觸發服務:測試 nginx server 服務運行。

4. 相關連結

  1. 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
  2. Terraform-project-best-practice — https://github.com/qwedsazxc78/terraform-project-best-practice
  3. 歡迎訂閱我的udemy課程:Terraform 從零開始 — 10+實戰Lab打造GCP雲端自動化架構課程

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *