前言
今天要來介紹的是如何用 Terraform 建立 Google Kubernetes Engine,如果對使用 Terraform 建立、修改和刪除的指令不清楚可以參考我之前的文章 Terraform 基本操作,這篇文章主要是要介紹如何使用 Terraform 建立 GKE 叢集,並且建立 Nginx Load Balancer 來做為服務的入口,最後再透過 kubectl 來部署一個簡單的應用程式來測試負載平衡器是否正常運作。同時也會介紹要怎麼撰寫 Google Kubernetes Engine tf 檔案,應該參考什麼網站。
GKE 結構
GKE 的結構是: 叢集(cluster) > 節點池(node_pool) > 節點(node)
叢集
- 叢集是 Kubernetes 的核心單位,包含所有管理與執行工作負載所需的資源。它是由一組節點組成的容器管理平台。
節點池
- 節點池是一組具有相同配置的節點(虛擬機),是叢集資源的計算單位。
- 節點池內的所有節點使用相同的規格,例如機型、磁碟類型、映像類型等。
- 在 GKE 中,一個叢集可以有多個節點池。
節點
- 節點是 Kubernetes 叢集中的實際計算單位,通常是 GCP 的虛擬機(VM),負責執行容器化的工作負載。
1. 前置設定
這個章節主要會說明:
- 如何設定 gcloud cli
- 如何設定子網域指定 Pod 與 Service 的 IP 範圍
1.1 gcloud cli 的安裝與設定
可以參考官方文件 gcloud cli 來安裝 gcloud cli,安裝完成後可以使用 gcloud init
來設定帳號,選擇專案等等。
1.1.1 OAuth Login
user/password oauth login
如果你是Mac可以遵循以下步驟:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
brew install python@3.11
brew install --cask google-cloud-sdk
./google-cloud-sdk/install.sh
gcloud version
Google Cloud SDK 427.0.0 beta 2023.04.17 bq 2.0.91 core 2023.04.17 gcloud-crc32c 1.0.0 gke-gcloud-auth-plugin 0.5.2 gsutil 5.23 kubectl 1.24.12
gcloud init
gcloud auth application-default login
|
1.1.2 Service account
如果你想使用 service account login 可以參考以下步驟:
- 建立service account 後下載金鑰
- 把金鑰放在terraform執行的本地目錄
- provider 設置如下
1 2 3 4 5 6 7 8 9 10 11 12
| provider "google" { credentials = file("tf101-sa.json") project = "terraform101-384507" region = "asia-east1" }
resource "google_storage_bucket" "quick-start-gcs" { name = "quick-start-gcs-bucket" location = "asia-east1" force_destroy = true }
|
1.2 設定子網域(可選)
如果你希望 Pod 與 Service 有特定的 IP 範圍,可以設定子網域,這樣可以避免 Pod 與 Service 的 IP 與其他服務衝突。
步驟如下:
-
進入虛擬私有雲網路 VPC 網路
-
因為我們案例打算把叢集建立在 default
網路裡面的asia-northeast1
,所以我們要進入 default
網路的 asia-northeast1
子網路裡面
-
可以新增新的子網域,這邊我們使用 10.14.0.0/20
給 Pod 使用,而 Service 使用 10.18.0.0/20
設定可參考以下:
1 2
| asia-northeast1-pods-03263bcb = 10.14.0.0/20 asia-northeast1-services-03263bcb = 10.18.0.0/20
|
2. 建立叢集
接下來這個章節會一步步教你撰寫Terraform的設定檔,並且建立GKE叢集。主要分為以下幾個部分:
Variable
與 Data Source
設定
- 這邊我們會設定專案名稱、區域、叢集名稱等等,這樣比較好管理與修改。
- 這裡的 data source 是用來取得 token 來連接 GKE 叢集,以及 email 等資訊,這樣我們就可以使用 kubectl 來操作叢集。
Provider
設定
- 這邊我們會設定 provider 來連接 GCP,以及 kubernetes 來連接 GKE 叢集。
- 建立叢集
- 這邊我們會使用
terraform-google-modules/kubernetes-engine/google
來建立叢集,這個 module 是由 Google 官方提供的,可以參考 Terraform Registry 來了解更多設定參數。
2.1 設定 Variable 與 Data Source
因為我們要在特定專案下建立 GKE 叢集,所以我們需要設定專案名稱、區域、叢集名稱等等,這樣比較好管理與修改。這裡的 data source 是用來取得 token 來連接 GKE 叢集,以及 email 等資訊,這樣我們就可以使用 kubectl 來操作叢集。
./variables.tf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| data "google_client_config" "default" {}
data "google_compute_default_service_account" "default" {}
variable "GCP_PROJECT" { type = string default = "terraform101-xxxxx" }
variable "GCP_REGION" { type = string default = "asia-northeast1" }
variable "cluster_name" { type = string default = "shannon-gke-cluster" }
|
2.2 設定 Provider
如果你已經正常安裝gcloud cli並且登入,可以直接使用以下的設定:
./provider.tf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
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 }
provider "kubernetes" { host = "https://${module.gke.endpoint}" cluster_ca_certificate = base64decode(module.gke.ca_certificate) token = data.google_client_config.default.access_token }
|
2.3 建立叢集
可以參考官方的相關設置參數了解怎麼寫terraform的設定檔 GKE Cluster
這邊需要注意的是:
要先完成Step1設定子網域,否則ip_range_pods
跟ip_range_services
會出錯喔
有!!!
的地方是需要根據你的node pool名稱來設定,這樣可以更好的管理與識別。其他可以複製貼上即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| module "gke" { source = "terraform-google-modules/kubernetes-engine/google" project_id = var.GCP_PROJECT region = var.GCP_REGION name = var.cluster_name zones = ["asia-northeast1-a"] deletion_protection = false
network = "default" subnetwork = "default" 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
remove_default_node_pool = true http_load_balancing = true gce_pd_csi_driver = true filestore_csi_driver = false kubernetes_version = "1.30.5-gke.1443001"
node_pools = [ { name = "shannon-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 preemptible = false initial_node_count = 3 }, ]
node_pools_oauth_scopes = { all = [ "https://www.googleapis.com/auth/logging.write", "https://www.googleapis.com/auth/monitoring", ] } node_pools_labels = { all = {}
shannon-worker-pool = { shannon-worker-pool = true } }
node_pools_metadata = { all = {}
shannon-worker-pool = { node-pool-metadata-custom-value = "shannon-node-pool" } }
node_pools_taints = { all = []
shannon-worker-pool = [ { key = "shannon-worker-pool" value = true effect = "PREFER_NO_SCHEDULE" }, ] } node_pools_tags = { all = []
shannon-worker-pool = [ "shannon-worker-pool", ] } }
|
然後執行以下指令開始進行部署:
1 2 3
| $ terraform init $ terraform plan -out plan.out $ terraform apply -auto-approve plan.out
|
部署完之後就可以在 GCP 的 Kubernetes Engine 看到剛建立的叢集了。
3. 負載平衡器與測試
接下來我們會:
- 使用透過網頁介面建立 Nginx Load Balancer
- 使用 kubectl 連線到 GKE 叢集
- 部署一個簡單的應用程式來測試負載平衡器是否正常運作
3.1 建立 Nginx Load Balancer
進入工作負載,點擊『部署』
設定Deployment的名稱、要部署的叢集、映像、埠口等等
檢查創立是否成功,要可以在『閘道、Service 與 Ingress』看到剛建立的服務
然後就可以透過點擊『端點』看到這個服務了
3.2 建立 Hello World App
在開始之前我們需要使用kubectl
來連線到我們的叢集,這裡我們會使用gcloud cli
進行操作,首先我們需要取得gcloud
的登入資訊,這樣我們才能使用kubectl
來連線到叢集。
-
進入叢集
-
取得登入資訊,你就複製上面的指令,然後執行在你的終端機
1 2 3 4 5 6 7 8 9
| gcloud container clusters get-credentials xxxxxx --region asia-northeast1 --project terraform101-xxxxx
kubectl create deployment hello-server --image=gcr.io/google-samples/hello-app:1.0 kubectl expose deployment hello-server --type=LoadBalancer --port 8080 kubectl get service
http://[EXTERNAL-IP]:8080
|
就可以看到 app hello-server 的 附載平衡,裡面都會記錄著你的 app 的 log 資訊
結論
在這篇我們學到了什麼?
- 如何使用 Terraform 建立 GKE 叢集
- 如何使用 kubectl 連線到 GKE 叢集
- 如何建立 Nginx Load Balancer
參考連結