3. 多集群环境搭建:Kubernetes多集群配置与Helm CLI操作基础
在多集群变更门禁场景中,SRE 需要同时管理多个 Kubernetes 集群(如开发、预发、生产),并能够通过 Helm CLI 在集群间切换执行部署与回滚操作。本章将系统讲解多集群环境的配置方法、Helm 多集群操作基础,并指导搭建模拟测试环境。
3.1 Kubernetes 多集群配置(kubeconfig context)
Kubernetes 使用 kubeconfig 文件管理集群访问凭证。一个 kubeconfig 文件可以包含多个集群、用户和上下文(context),通过切换 context 实现多集群管理。
3.1.1 kubeconfig 文件结构
默认 kubeconfig 路径为 ~/.kube/config,其核心结构如下:
| 字段 | 说明 | 示例 |
|---|---|---|
| clusters | 集群列表,包含 API Server 地址和 CA 证书 | cluster: dev-cluster, prod-cluster |
| users | 用户凭证列表,包含证书或 | user: dev-admin, prod-admin |
| contexts | 上下文,将 cluster、user 和 namespace 绑定 | context: dev-context, prod-context |
| current-context | 当前使用的默认上下文 | current-context: dev-context |
3.1.2 配置多集群 context
以下命令演示如何添加两个集群并创建对应的 context:
# 添加集群配置
kubectl config set-cluster dev-cluster \
--server=https://dev-api.example.com:6443 \
--certificate-authority=./dev-ca.crt
kubectl config set-cluster prod-cluster \
--server=https://prod-api.example.com:6443 \
--certificate-authority=./prod-ca.crt
# 添加用户凭证
kubectl config set-credentials dev-admin \
--client-certificate=./dev-admin.crt \
--client-key=./dev-admin.key
kubectl config set-credentials prod-admin \
--=prod--xxxxx
# 创建上下文(绑定集群、用户和命名空间)
kubectl config set-context dev-context \
--cluster=dev-cluster \
--user=dev-admin \
--namespace=default
kubectl config set-context prod-context \
--cluster=prod-cluster \
--user=prod-admin \
--namespace=production
# 查看所有上下文
kubectl config get-contexts
# 切换当前上下文
kubectl config use-context prod-context
最佳实践:生产集群的 kubeconfig 应单独管理,避免将生产凭证混入开发环境配置文件中。建议使用
KUBECONFIG 环境变量指向不同文件,或使用 --kubeconfig 参数显式指定。
3.2 Helm CLI 多集群操作基础
Helm CLI 原生支持通过 --kube-context 参数指定目标集群,无需手动切换 kubeconfig context。这使得在多集群环境中执行 Helm 操作更加灵活和可脚本化。
3.2.1 Helm 多集群操作命令对比
| 操作 | 单集群命令 | 多集群命令(指定 context) |
|---|---|---|
| 安装 chart | helm install my-release ./mychart |
helm install my-release ./mychart --kube-context prod-context |
| 升级 release | helm upgrade my-release ./mychart |
helm upgrade my-release ./mychart --kube-context prod-context |
| 回滚 release | helm rollback my-release 2 |
helm rollback my-release 2 --kube-context prod-context |
| 查看 release 列表 | helm list |
helm list --kube-context prod-context |
| 查看 release 历史 | helm history my-release |
helm history my-release --kube-context prod-context |
3.2.2 多集群 Helm 操作脚本示例
以下脚本演示如何在三个集群中依次执行 Helm 操作:
#!/bin/bash
# 多集群 Helm 部署脚本
CLUSTERS=("dev-context" "staging-context" "prod-context")
RELEASE_NAME="my-app"
CHART_PATH="./myapp-chart"
for ctx in "${CLUSTERS[@]}"; do
echo "=== 部署到集群: $ctx ==="
# 检查 release 是否存在
helm status $RELEASE_NAME --kube-context $ctx &>/dev/null
if [ $? -eq 0 ]; then
# 存在则升级
helm upgrade $RELEASE_NAME $CHART_PATH \
--kube-context $ctx \
--values values-${ctx%%-*}.yaml \
--atomic \
--timeout 5m
else
# 不存在则安装
helm install $RELEASE_NAME $CHART_PATH \
--kube-context $ctx \
--values values-${ctx%%-*}.yaml \
--atomic \
--timeout 5m
fi
if [ $? -ne 0 ]; then
echo "ERROR: 集群 $ctx 部署失败"
exit 1
fi
done
echo "所有集群部署完成"
注意:在多集群环境中使用
--atomic 参数时,如果部署失败 Helm 会自动回滚。但在生产集群中,建议先使用 --dry-run 验证,再执行实际部署。
3.3 模拟多集群测试环境
为了在不占用真实基础设施的情况下测试多集群变更门禁和回滚策略,可以使用 Kind(Kubernetes in Docker)或 Minikube 快速搭建多个本地集群。
3.3.1 使用 Kind 搭建多集群
Kind 可以在 Docker 容器中运行多个 Kubernetes 集群,非常适合本地测试:
# 创建三个 Kind 集群
kind create cluster --name dev-cluster --config - <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 6443
hostPort: 6443
EOF
kind create cluster --name staging-cluster
kind create cluster --name prod-cluster
# 查看集群列表
kind get clusters
# 输出: dev-cluster, staging-cluster, prod-cluster
# 获取集群的 kubeconfig(自动合并到默认 kubeconfig)
kind get kubeconfig --name dev-cluster > ~/.kube/dev-config
kind get kubeconfig --name staging-cluster > ~/.kube/staging-config
kind get kubeconfig --name prod-cluster > ~/.kube/prod-config
# 合并 kubeconfig(使用 KUBECONFIG 环境变量)
export KUBECONFIG=~/.kube/dev-config:~/.kube/staging-config:~/.kube/prod-config
kubectl config view --flatten > ~/.kube/config
# 验证上下文
kubectl config get-contexts
3.3.2 模拟多集群环境架构
下图展示了使用 Kind 搭建的本地多集群测试环境,包含三个独立集群以及 Helm CLI 通过不同 context 进行交互的流程:
3.3.3 验证多集群环境
搭建完成后,通过以下命令验证多集群环境是否正常工作:
# 查看所有上下文
kubectl config get-contexts
# 输出示例:
# CURRENT NAME CLUSTER AUTHINFO NAMESPACE
# dev-context kind-dev-cluster kind-dev-cluster default
# staging-context kind-staging-cluster kind-staging-cluster staging
# * prod-context kind-prod-cluster kind-prod-cluster production
# 测试每个集群的连通性
kubectl --context dev-context get nodes
kubectl --context staging-context get nodes
kubectl --context prod-context get nodes
# 在每个集群中安装 Helm chart 测试
helm install test-release ./mychart --kube-context dev-context
helm install test-release ./mychart --kube-context staging-context
helm install test-release ./mychart --kube-context prod-context
# 查看各集群的 release
helm list --kube-context dev-context
helm list --kube-context staging-context
helm list --kube-context prod-context
3.4 多集群环境下的 Helm 回滚策略基础
在多集群环境中,回滚策略需要考虑集群间的差异性和一致性。以下表格对比了不同场景下的回滚策略选择:
| 场景 | 回滚策略 | Helm 命令 | 适用集群 |
|---|---|---|---|
| 单个 release 回滚 | 回滚到指定版本 | helm rollback RELEASE REVISION --kube-context CTX |
开发、预发 |
| 全集群回滚 | 所有集群回滚到同一版本 | 脚本遍历所有 context 执行 rollback | 灾备场景 |
| 灰度回滚 | 仅回滚部分集群 | 指定特定 context 执行 rollback | 生产(金丝雀) |
| 自动回滚 | 部署失败自动回滚 | helm upgrade --atomic |
所有集群 |
关键概念:在多集群变更门禁中,回滚策略需要与 CI/CD 流水线集成。建议在流水线中为每个集群设置独立的回滚触发条件,例如:开发集群允许自动回滚,生产集群需要人工审批后再执行回滚。
3.5 本章小结
通过本章学习,您已经掌握了:
- kubeconfig 多集群配置:理解 context 结构,掌握添加、切换、管理多集群上下文的方法。
- Helm CLI 多集群操作:使用
--kube-context参数在集群间切换,编写多集群部署脚本。 - 模拟测试环境搭建:使用 Kind 快速创建多个本地集群,验证多集群 Helm 操作流程。
- 回滚策略基础:了解不同场景下的回滚策略选择,为后续章节的故障排查打下基础。