本章介绍实务上如何写出自己的 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
本章节主要是代大家走过一次实务的开发流程
昨天写了写了基本的Node.js,但还没有介绍程序码,今天就来介绍昨天的程序码。 Node.js入门...
YAML YAML的诞生不算太晚, 1.0在2004就出了, 虽然晚了JSON 5年(1999年),...
Interceptor 拦截器 在许多的Java Web 框架都有实现Interceptor 的方法...
前言 昨天我们使用了 Python 自然语言处理套件 spaCy 预训练好的 word embedd...
VPC使用 昨天提到了关於VPC是什麽?以及如何简单的建立VPC XPN等的内容,那今天就来说说关於...