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 进行交互的流程:

多集群测试环境架构图 多集群测试环境架构(Kind 本地模拟) Helm CLI dev-context Kind: dev-cluster API: localhost:6443 Namespace: default Helm Release: my-app-v1 staging-context Kind: staging-cluster API: localhost:6444 Namespace: staging Helm Release: my-app-v2 prod-context Kind: prod-cluster API: localhost:6445 Namespace: production Helm Release: my-app-v3 每个 Kind 集群运行在独立的 Docker 容器中,通过不同 hostPort 暴露 API Server Helm CLI 通过 --kube-context 参数切换目标集群,无需手动修改 kubeconfig

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 操作流程。
  • 回滚策略基础:了解不同场景下的回滚策略选择,为后续章节的故障排查打下基础。