blog post

Terraform 從零開始 (5) — GCP 運算服務 — 使用Terraform創建Kubernetes GKE

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

訂閱 Terraform 從零開始 — 10+實戰Lab打造GCP雲端自動化架構課程

1. GCP 運算服務 — Kubernetes GKE的主要功能和用途

Google Kubernetes Engine(GKE)是 Google Cloud Platform(GCP)中的一項運算服務,它提供了一個托管式的 Kubernetes 雲端平台,用於部署、管理和調度容器化的應用程式。以下是 GKE 的主要功能和用途:

  1. 自動化容器操作:Kubernetes GKE 可以自動化執行許多容器操作,減輕使用者的負擔,例如平衡負載、擴展、回滾等功能。
  2. 可靠的容器運營環境:Kubernetes GKE 提供多層次的安全機制,例如身份驗證、訪問控制、網路安全等,確保應用程式的安全性和可靠性。
  3. 快速建立 Kubernetes 叢集:使用者可以快速建立 Kubernetes 叢集,而不需要自己建置和維護基礎設施。
  4. 高可用性的應用程式支援:Kubernetes GKE 可以支援高可用性的應用程式,並且可以根據需要進行擴展,以滿足不斷增長的使用者需求。

2. GCP 運算服務 — Kubernetes GKE的使用情境

Google Cloud Platform 的 Kubernetes GKE 可在多種場景下使用,以下是一些常見的使用情境:

  1. 建立和管理 Kubernetes 叢集:例如一個應用程式需要在多個地區建立 Kubernetes 叢集,使用者可以使用 Kubernetes GKE 快速建立和管理這些叢集。
  2. 自動化容器操作:例如一個網站需要自動化載入平衡和水平擴展,使用者可以使用 Kubernetes GKE 自動化執行這些容器操作,以確保網站的正常運作。
  3. 支援高可用性的應用程式:例如一個金融應用程式需要保證高可用性和可靠性,使用者可以使用 Kubernetes GKE 支援這種高可用性的應用程式。
  4. 安全的容器運營環境:例如一個企業需要確保容器運營環境的安全性和可靠性,使用者可以使用 Kubernetes GKE 提供的多層次的安全機制來保護容器環境。

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

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

  1. 創建自定義GKE:使用 Terraform 定義 GKE 集群的配置,例如 GCP 專案、集群名稱、地區、區域、網路、子網、節點配置等。Terraform 將根據這些定義來自動創建和配置 GKE 集群。
  2. 如何使用console來連線節點與查看狀況:一旦 GKE 集群創建完成,你將學習如何使用 Google Cloud Console 來連線到 GKE 節點,以進行調試和檢查狀況。這將有助於你了解集群中的節點狀態和運作情況。
  3. 部署nginx的服務到GKE上 (option):學習如何使用 Kubernetes 部署一個 nginx 服務。
  4. Terraform 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"
}
}
}

provider "google" {
project = var.GCP_PROJECT
# region = var.GCP_REGION
# zone = var.zone
}

這個檔案主要用於配置 Terraform 的提供者(provider),以確保 Terraform 可以正確地與 Google Cloud Platform(GCP)進行交互。

  • terraform :這個區塊設定了 Terraform 的版本要求,確保使用的版本符合最低要求大於4.40.0版本。同時,它也定義了所需的提供者和版本。
  • provider "google" :這個區塊指定了要使用的 GCP 提供,指定了 GCP 專案 ID(由 var.GCP_PROJECT 變數提供)。

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":這是用於定義 Google Cloud GKE名稱的變數。

2-main.tf

##################################################################################
# RESOURCE
##################################################################################
# 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代碼片段是用於創建Google Cloud Platform (GCP) 上的建立 Google Kubernetes Engine(GKE)集群的。以下是這些程式碼的主要功能和意義:

cluster 部分的設定:

  1. data "google_client_config" "default" {}: 這個資源用於檢索 Google Cloud 的客戶端配置。這些配置將用於其他資源的建立和配置,以確保 Terraform 正確操作。
  2. data "google_compute_default_service_account" "default" {}: 這個資源用於檢索預設的 Google Compute Engine 服務帳戶的資訊。這將在後面的程式碼中用於指定 GKE 集群的服務帳戶。
  3. module "gke": 這個模組使用了 Terraform 的 Google Cloud GKE 模組。它會使用模組的參數來定義 GKE 集群的配置,例如 GCP 專案 ID、集群名稱、地區、區域、網路、子網、IP 範圍等等。
  4. create_service_account = falseservice_account = data.google_compute_default_service_account.default.email: 這些參數定義了是否要建立自定義的服務帳戶,以及服務帳戶的電子郵件地址。在這個情況下,服務帳戶是使用 data.google_compute_default_service_account.default.email 的預設 Compute Engine 服務帳戶。

network 部分的設定:GKE 需要使用這些 IP 範圍來分配給 Pod 和服務,以便進行通信。

  1. ip_range_pods: 這個參數定義了用於 Pod 的 IP 範圍。Pod 是 Kubernetes 集群中運行的容器實例,它們需要一個獨立的 IP 範圍來進行內部通信和連接。在這個例子中,asia-northeast1-pods-03263bcb 是自定義的名稱,表示這個 IP 範圍是分配給該地區(asia-northeast1)的 Pod,10.14.0.0/20 則是指定的 IP 地址範圍。
  2. ip_range_services: 這個參數定義了用於服務的 IP 範圍。在 Kubernetes 中,服務(Service)是一個抽象,它為一組 Pod 提供了單一的入口點,這可以是內部或外部的。服務也需要一個 IP 範圍來定義其 IP 位址。
  3. 在這個例子中,asia-northeast1-services-03263bcb 是自定義的名稱,表示這個 IP 範圍是分配給該地區的服務,10.18.0.0/20 則是指定的 IP 地址範圍。
ip_range_pods與ip_range_services
ip_range_pods與ip_range_services

node pool 部分的設定:

  1. remove_default_node_pool = true: 這個參數定義是否要移除 GKE 集群的預設節點池。
  2. node_pools: 這個參數定義了要創建的節點池的詳細配置,例如機器類型、最小節點數、最大節點數、是否使用 Spot 虛擬機等等。
  3. node_pools_oauth_scopes: 這個參數用於定義每個節點池的 OAuth 作用域(scopes)。OAuth 作用域指定了節點池可以訪問的 Google 服務的權限。在這個例子中,每個節點池都被授予了一些作用域,例如 https://www.googleapis.com/auth/logging.writehttps://www.googleapis.com/auth/monitoring
  4. node_pools_labels: 這個參數用於定義每個節點池的標籤。標籤是用於識別節點池的自訂鍵-值對。在這個例子中,所有節點池都具有一個空的標籤,而名為 spot-worker-pool 的節點池具有一個額外的標籤 spot-worker-pool,其值為 true
  5. node_pools_metadata: 這個參數用於定義每個節點池的元數據。元數據是存儲在節點上的自訂鍵-值對。在這個例子中,所有節點池都具有一個空的元數據,而名為 spot-worker-pool 的節點池具有一個自定義值 my-node-pool
  6. node_pools_taints: 這個參數用於定義每個節點池的污點(Taints)。污點是一種用於影響 Pod 調度的屬性,可以對節點進行標記,以使一些 Pod 選擇或避免運行在這些節點上。在這個例子中,所有節點池都沒有污點,而名為 spot-worker-pool 的節點池具有一個自定義污點。
  7. node_pools_tags: 這個參數用於定義每個節點池的標籤。標籤是用於分類和識別節點的標識。在這個例子中,所有節點池都沒有標籤,而名為 spot-worker-pool 的節點池具有一個名為 spot-worker-pool 的標籤。

總之,這些 Terraform 程式碼的目的是使用 Terraform 工具來自動化地建立 GKE 集群,並定義集群的各種配置和屬性。通過調整這些參數,你可以根據需求來定製和設定 GKE 集群,以符合你的應用程式和環境的需求。

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

terraform apply -auto-approve
GCP 運算服務 Kubernetes GKE
GCP 運算服務 Kubernetes GKE
GKE Cluster與Node pool設定
GKE Cluster與Node pool設定

Terraform tip:可以利用下列的 Terraform tip,來增進部署效率。

  1. 打開終端機中的 .bashrc or .zshrc 檔案
  2. 在文件最下方加入下列指令
  3. 執行 source ~/.zshrc 或是 source ~/.bashrc 讓下面的 alias 快捷鍵生效
alias tf="terraform"
alias tfv="terraform validate"
alias tfdp="terraform apply -auto-approve plan.out"
alias tfd="terraform apply -auto-approve"
alias tfr="terraform destroy -auto-approve"
alias tfp="terraform plan -out plan.out"


GKE完成部署後,在工作負載中部署nginx (Option):

  1. 工作負載:在GKE工作負載中點選部署,來部署nginx deployment
  2. 容器映像檔:部署容器配置,使用nginx:latest的版本,點選繼續
  3. 選擇叢集:使用預設的容器標籤,並點選對應的叢集名稱,點選部署
  4. 暴露服務:使用公開Service的方式,暴露deployment到對外網路,並選擇對應的port,並執行部署
  5. 部署完成:等待nginx deployment 與nginx service完成,即可以看到完成部署。
GKE 部署nginx deployment
GKE 部署nginx deployment — 工作負載
GKE 部署nginx deployment — 容器映像檔
GKE 部署nginx deployment — 選擇叢集
GKE 部署nginx deployment — 暴露服務
部署nginx在工作負載
GKE 部署nginx deployment — 部署完成

課程連結

如果您覺得這篇文章對您有幫助,我誠摯地邀請您透過以下連結訂閱我的 Udemy 課程,進一步深入學習 Terraform 和 GCP 的知識:

訂閱 Terraform 從零開始 — 10+實戰Lab打造GCP雲端自動化架構課程

訂閱 Terraform 從零開始 — 10+實戰Lab打造GCP雲端自動化架構課程
https://devops-with-alex.com/go/terraform

相關連結

  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. GCP 運算服務 Kubernetes GKE

發佈留言

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