本章介紹實務上如何寫出自己的 terraform module
課程內容與代碼會放在 Github 上: https://github.com/chechiachang/terraform-30-days
賽後文章會整理放到個人的部落格上 http://chechia.net/
今天的範例內容在此 azure/dev/southeastasia/chechia_net/kubernetes
chechia_net
路徑,把相關的 resource root module 放進來養成好習慣:使用任何 terraform module 時都務必檢查一下內容物
# azure/dev/southeastasia/chechia_net/kubernetes/terragrunt.hcl
terraform {
source = "../../../../..//azure/modules/kubernetes_cluster"
}
dependency "network"{
config_path = find_in_parent_folders("azure/foundation/compute_network")
}
inputs = {
...
kubernetes_cluster_name = "terraform-30-days"
default_node_pool_vm_size = "Standard_D2_v2" # This is beyond 12 months free quota
default_node_pool_count = 1
network = dependency.network.outputs.vnet_name # acctvnet
subnet = dependency.network.outputs.vnet_subnets[2] # dev-3
kubeconfig_output_path = pathexpand("~/.kube/azure-aks-terraform-30-days")
spot_node_pools = {
spot = {
vm_size = "Standard_D2_v2"
node_count = 1
...
}
}
}
terragrunt.hcl
把不同層的參數放在最上層傳入,方便使用,但會降低可讀性(不同 resource 的參數混雜)
看一下 modules
tree -L 1 azure/modules/kubernetes_cluster
azure/modules/kubernetes_cluster
├── README.md
├── client_config.tf
├── kubeconfig.tf
├── kubernetes_cluster.tf
├── node_pool.tf
├── output.tf
└── variables.tf
0 directories, 7 files
透過client_config.tf
取得 terraform 呼叫時的 provider 中的 config
# client_config.tf
data "azurerm_client_config" "current" {}
kubeconfig.tf
是透過 local_file
resource,將建立 cluster 後的 cluster config 與 credential 存入本地檔案
kubernetes_cluster.tf
描述 azurerm_kubernetes_cluster
resource,以及 aks 本身依賴的其他 resource
kubernetes_cluster.tf
使用了 terraform resource meta-argument: count 與 conditional expression: ,有空我們後面細講azure/modules/kubernetes_cluster
是如何寫出來的?其實就是圍繞需求,慢慢補齊 module 的功能
kubernetes_cluster.tf
azure/dev/southeastasia/chechia_net/kubernetes
嘗試 plan 與 apply
node_pool.tf
node_pool
所以使用了 for_each 語法
(細節請見第?章)
variables.tf
讓最上層呼叫的時候傳入由於我們的設計是會有 dev-aks, stag-aks, prod-aks 使用相同的 module 產生,所以要把不同環境下的不同參數,傳到最上層的 terragunt.hcl
azure/dev/southeastasia/chechia_net/kubernetes/terragrunt.hcl
azure/stag/southeastasia/chechia_net/kubernetes/terragrunt.hcl
azure/prod/southeastasia/chechia_net/kubernetes/terragrunt.hcl
foundation/compute_network
已經把 vpn subnets 產生出來了
看過內容,變來實際跑看看
cd azure/dev/southeastasia/chechia_net/kubernetes
terragrunt init
terragrunt plan
terragrunt apply
apply 時間較長
不熟悉 AKS / Kubernetes 的朋友可以搭配azure official doc: Create a Kubernetes cluster with Azure Kubernetes Service using Terraform
安裝 kubectl
~/.kube/azure-aks
路徑~/.kube/azure-aks
cat ~/.kube/azure-aks
KUBECONFIG_OUTPUT_PATH="/Users/che-chia/.kube/azure-aks"
kubectl --kubeconfig ${KUBECONFIG_OUTPUT_PATH} cluster-info
kubectl --kubeconfig ${KUBECONFIG_OUTPUT_PATH} get node
NAME STATUS ROLES AGE VERSION
aks-default-44401806-vmss000000 Ready agent 9m4s v1.20.7
可以使用 kubectl 控制 cluster 就成功了
這個自幹的 AKS module 有著以下問題
自幹的 module 通常會有比較多問題,所以安全性的掃描工具(ex. tfsec)是十分必要的
或是就不要自幹,使用社群維護的 module 版本
實務上,除了自己寫 module 外使用,也可以直接使用開源的 module
以上面的 AKS 範例,可以使用 azurerm AKS module
使用開源的 module,有幾個條件
建議常見的 resource 與泛用性高的基本架構可以使用社群
專門為公司服務打造的上層 infrastructure,可以自幹,放在私有 repository,並自己維護
合適的開源 module,除了 google terraform module aks
以外,可以到以下地方尋找
public cloud provider 都有出自家的 module,方便用戶使用
destroy 整座 cluster
azure/modules/kubernetes_cluster
本章節主要是代大家走過一次實務的開發流程