从零实现过程
这一页按项目生成顺序组织。读完后应该能理解每个目录为什么存在、先写什么、后写什么,以及每一步如何验证。
1. 创建仓库骨架
mkdir -p iac-gitops-hybrid-k8s-ha
cd iac-gitops-hybrid-k8s-ha
git init
mkdir -p aliyun tencent modules scripts website/docs
ln -s website/docs docs
创建忽略规则:
touch .gitignore
.gitignore 至少包含:
**/terraform.tfvars
**/terraform.tfstate
**/terraform.tfstate.*
**/*.tfplan
**/tfplan
**/.terraform/
generated/
generated/**/*.json
generated/**/kubeconfig
generated/**/*token*
generated/**/*certificate*
*.log
2. 建立 Terraform root module
先为两云创建相同结构:
touch aliyun/main.tf aliyun/variables.tf aliyun/outputs.tf aliyun/versions.tf aliyun/terraform.tfvars.example
touch tencent/main.tf tencent/variables.tf tencent/outputs.tf tencent/versions.tf tencent/terraform.tfvars.example
versions.tf 负责 Terraform 和 provider 版本:
terraform {
required_version = ">= 1.5.0"
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "~> 1.279"
}
}
}
腾讯云侧使用:
terraform {
required_version = ">= 1.5.0"
required_providers {
tencentcloud = {
source = "tencentcloudstack/tencentcloud"
version = "~> 1.82"
}
}
}
3. 拆分模块
创建模块目录:
mkdir -p modules/aliyun-vpc modules/aliyun-ecs modules/aliyun-security-group modules/aliyun-lb modules/aliyun-vpn
mkdir -p modules/tencent-vpc modules/tencent-cvm modules/tencent-security-group modules/tencent-lb modules/tencent-vpn
每个模块使用同样文件结构:
touch modules/aliyun-vpc/main.tf modules/aliyun-vpc/variables.tf modules/aliyun-vpc/outputs.tf modules/aliyun-vpc/versions.tf
模块拆分原则:
- VPC 模块只管 VPC、子网、路由表。
- 节点模块只管 ECS/CVM、SSH key、实例输出。
- 安全组模块只管端口规则。
- LB 模块只管 API 和 Cluster Mesh 入口。
- VPN 模块只管可选 IPsec 路线。
4. 编写 root module 编排
root module 先整理公共输入,再调用模块:
module "vpc" {
source = "../modules/aliyun-vpc"
name_prefix = var.name_prefix
vpc_cidr = var.vpc_cidr
vswitch_cidr = var.vswitch_cidr
zone_id = var.zone_id
tags = local.common_tags
}
模块之间通过输出连接:
module "ecs" {
source = "../modules/aliyun-ecs"
vswitch_id = module.vpc.vswitch_id
security_group_id = module.security_group.security_group_id
node_groups = local.node_groups
}
5. 编写 Makefile
Makefile 把常用命令固定下来:
aliyun-plan:
cd aliyun && terraform fmt -recursive && terraform validate && terraform plan -out=tfplan
aliyun-output:
mkdir -p generated/aliyun
cd aliyun && terraform output -json > ../generated/aliyun/terraform-output.json
所有人都执行同一组 target,避免手写命令不一致。
6. 编写脚本
脚本放在 scripts/:
bootstrap-common.sh
setup-wireguard-underlay.sh
render-kubeadm-config.sh
render-cilium-values.sh
init-first-master.sh
join-worker.sh
install-cilium.sh
enable-clustermesh.sh
check-underlay.sh
check-cluster.sh
脚本共同约束:
set -euo pipefail。- 输入来自参数、环境变量或
generated/*/terraform-output.json。 - 不把密钥、token、kubeconfig 写进 Git。
- 每个脚本只做一类事。
7. 接上 kubeadm
先渲染 kubeadm config:
scripts/render-kubeadm-config.sh aliyun
scripts/render-kubeadm-config.sh tencent
配置里写入:
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
clusterName: "aliyun-guangzhou"
controlPlaneEndpoint: "<k8s-api-lb-host>:6443"
networking:
podSubnet: "172.16.0.0/16"
serviceSubnet: "10.96.0.0/16"
再执行节点初始化、master 初始化和 worker 加入。
8. 接上 Cilium
渲染 Helm values:
cluster:
name: aliyun-guangzhou
id: 1
routingMode: tunnel
tunnelProtocol: vxlan
ipam:
mode: kubernetes
安装:
helm upgrade --install cilium cilium/cilium \
--namespace kube-system \
--version "<cilium-version>" \
--values generated/aliyun/cilium-values.yaml \
--kube-context aliyun-guangzhou
9. 接上 Cluster Mesh
cilium clustermesh enable --context aliyun-guangzhou --service-type NodePort --enable-kvstoremesh=false
cilium clustermesh enable --context tencent-guangzhou --service-type NodePort --enable-kvstoremesh=false
固定 NodePort:
kubectl --context aliyun-guangzhou -n kube-system patch service clustermesh-apiserver \
--type='json' \
-p='[{"op":"replace","path":"/spec/ports/0/nodePort","value":32379}]'
连接集群:
cilium clustermesh connect \
--context aliyun-guangzhou \
--destination-context tencent-guangzhou \
--destination-endpoint "<tencent-node-or-lb>:32379" \
--allow-mismatching-ca
10. 建立文档站
cd website
npm install
npm run start
npm run build
文档站需要覆盖:
- 项目介绍。
- 架构设计。
- 快速开始。
- 代码走读。
- 排障记录。
- 后续路线。
11. 每个阶段的提交检查
terraform fmt -check -recursive
npm run build
git status --short
如果修改脚本,至少手工检查:
bash -n scripts/bootstrap-common.sh
bash -n scripts/setup-wireguard-underlay.sh
bash -n scripts/render-kubeadm-config.sh
bash -n scripts/render-cilium-values.sh
bash -n scripts/install-cilium.sh
bash -n scripts/enable-clustermesh.sh