iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0
DevOps

Terraform 從零開始 - 實戰Lab打造GCP雲端自動化架構系列 第 27

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

  • 分享至 

  • xImage
  •  

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

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

文章同步分享到

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叢集的可用區域。

  • 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 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。
  1. 部署並測試 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-Codehttps://github.com/qwedsazxc78/Terraform-from-zero-to-hero-10-Lab-GCP-Infrastucture-as-Code

  2. Terraform-project-best-practicehttps://github.com/qwedsazxc78/terraform-project-best-practice

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


上一篇
Day 26 — Terraform/GCP實戰:使用 GCP Console 創建 GCP 運算服務 Kubernetes GKE
下一篇
Day 28 — Terraform/GCP實戰:使用 GCP Console 創建 GCP 資料庫服務 Cloud Sql (PostgreSQL)
系列文
Terraform 從零開始 - 實戰Lab打造GCP雲端自動化架構31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言