[k8s] 用 Terraform 部署 GKE— main.tf

Bryan Yang
A multi hyphen life
5 min readMar 14, 2018

神器x神器=?

Kubernetes(k8s)

k8s 是由 google 釋出的 container 編排工具,就不再這篇多介紹:k8s 讀書會 — introduction

Terraform

HashiCorp 出的 Provision 工具,可以相同的定義方式,操縱多種雲服務.https://www.terraform.io/ (我很驚訝居然還沒寫過相關介紹)

這篇主要介紹怎麼用 Terraform 操控 GKE.

原始 Code 是參考:https://github.com/terraform-providers/terraform-provider-kubernetes/tree/master/_examples/google-gke-cluster 這篇,有為了自己的需求稍微改了一下.

main.tf

## 表示一個自定義變項,可以給其他資源使用.在 terraform 中用 ${resource_type.resource_name} 可以呼叫其他資源的變項
locals
{
name_prefix = "${var.name}-${var.env}-${var.zone}"
}
## data 表示要從“已建立”資源中取得相關變項
data "google_container_engine_versions" "region" {
zone = "${var.zone}"
project = "${var.project_id}"
}
## resource 表示要建立新資源,後面接的 “google_container_cluster”表示資源的種類,"new_container_cluster" 表示這個資源的名字(用於 tf 資源間的溝通)## 每個 resource 裡面都有很多configuration 可以設定,詳細的內容可以參考:https://www.terraform.io/docs/providers/google/r/container_cluster.htmlresource "google_container_cluster" "new_container_cluster" { ## 這就是在GKE上真實看到的 cluster name
name = "${local.name_prefix}-master"

## 這邊用了 tf 裡面的 if condition
min_master_version = "${var.min_master_version != "false" ? var.min_master_version : data.google_container_engine_versions.region.latest_node_version}"
zone = "${var.zone}"
initial_node_count = "${var.init_cluster_count}"
additional_zones = "${var.additional_zones}"
network = "${var.network}"
subnetwork = "${var.subnetwork}"

master_auth {
username = "${var.username}"
password = "${var.password}"
}

## 設定基本的 cluster
node_config {
machine_type = "${var.machine_type}"
image_type = "${var.image_type}"
disk_size_gb = "${var.disk_size_gb}"
local_ssd_count = "${var.local_ssd_count}"
oauth_scopes = "${var.oauth_scopes}"

labels {
environment = "${var.env}"
}

tags = ["${local.name_prefix}-master", "${var.env}", "${var.tags}"]
}
## 其他設定
addons_config {
http_load_balancing {
disabled = "${var.http_load_balancing_disable}"
}

horizontal_pod_autoscaling {
disabled = "${var.horizontal_pod_autoscaling_disable}"
}

kubernetes_dashboard {
disabled = "${var.kubernetes_dashboard}"
}
}

maintenance_policy {
daily_maintenance_window {
start_time = "${var.maintenance_window}"
}
}

project = "${var.project_id}"
}

基本上只要這樣設定,就可以開一個 GKE Cluster 囉~下一次會介紹怎樣用 Module 來設定不同的 Node Pool~

--

--

Bryan Yang
A multi hyphen life

Data Engineer, Data Producer Manager, Data Solution Architect