[k8s] 用 Terraform 部署 GKE — module

Bryan Yang
A multi hyphen life
6 min readMar 15, 2018

Coding everything

前一篇 main.tf 介紹了怎麼啟動集群,但是如果想要增加不同的 Node Pools,難道要一直重複貼上嗎?很幸運 Terraform 和一般程式語言一樣有 Module 的概念,可以透過 Module 來快速產生多個相似的物件.

在使用 Module 之前,要先看一下資料夾結構

其中 node_pool 和裡面的 node_pool.tf 就是Module,node_pools.tf 就是實際將 Module 實體化的方式.

Module

Module 裡面主要分成兩個部分

  • variable:Module 內部所要使用的變數,可以讓外部傳參數進去
  • resource:實際的 Module 設計
variable "node_pool_name" {}

variable "zone" {}

variable "node_count" {}

variable "google_container_cluster_name" {}

variable "machine_type_node" {}

variable "disk_size_gb_node" {}

variable "local_ssd_count_node" {}

variable "oauth_scopes" {
type = "list"
}

variable "minNodeCount_node" {}

variable "maxNodeCount_node" {}

variable "auto_repair" {}

variable "auto_upgrade" {}

variable "project_id" {}

resource "google_container_node_pool" "container_cluster_node_pool" {
name = "${var.node_pool_name}-node"
zone = "${var.zone}"
node_count = "${var.node_count}"
cluster = "${var.google_container_cluster_name}"

node_config {
machine_type = "${var.machine_type_node}"
disk_size_gb = "${var.disk_size_gb_node}"
local_ssd_count = "${var.local_ssd_count_node}"
oauth_scopes = "${var.oauth_scopes}"
}

# Autoscale
autoscaling {
min_node_count = "${var.minNodeCount_node}"
max_node_count = "${var.maxNodeCount_node}"
}

management {
auto_repair = "${var.auto_repair}"
auto_upgrade = "${var.auto_upgrade}"
}

project = "${var.project_id}"
}

呼叫 Module

至於其他 tf 檔案要使用 Module 也很方便.直接下 module 關鍵字,裡面使用 source 指定 Module 的位置,再將參數傳進去就可以了.以下面這個例子,我用相同的 node_pool Mudule 建立兩個 node_pools,分別是 spark_nodes 和 power_nodes,可以根據兩者的需求取不同的名字、起始 nodes 數量等等,非常方便,可以說是使用 Terraform 必會的技巧.

module "spark_nodes" {
source = "./node_pool"
node_pool_name = "spark"
zone = "${var.zone}"
node_count = "1"
minNodeCount_node = "1"
maxNodeCount_node = "3"
oauth_scopes = "${var.oauth_scopes}"
project_id = "${var.project_id}"
machine_type_node = "${var.machine_type_node}"
auto_repair = "${var.auto_repair}"
auto_upgrade = "${var.auto_upgrade}"
google_container_cluster_name = "${google_container_cluster.new_container_cluster.name}"
disk_size_gb_node = "${var.disk_size_gb_node}"
local_ssd_count_node = "${var.local_ssd_count_node}"
}

module "power_nodes" {
source = "./node_pool"
node_pool_name = "power"
zone = "${var.zone}"
node_count = "1"
minNodeCount_node = "1"
maxNodeCount_node = "3"
oauth_scopes = "${var.oauth_scopes}"
project_id = "${var.project_id}"
machine_type_node = "${var.machine_type_node}"
auto_repair = "${var.auto_repair}"
auto_upgrade = "${var.auto_upgrade}"
google_container_cluster_name = "${google_container_cluster.new_container_cluster.name}"
disk_size_gb_node = "${var.disk_size_gb_node}"
local_ssd_count_node = "${var.local_ssd_count_node}"
}

--

--

Bryan Yang
A multi hyphen life

Data Engineer, Data Producer Manager, Data Solution Architect