一、引言
随着业务规模的增长,单一Kubernetes集群往往无法满足复杂的业务需求。多集群架构成为企业级部署的必然选择。本文将深入探讨Kubernetes多集群架构设计的核心问题,包括集群数量决策、部署策略、隔离方式和管理工具。
二、SCQA分析框架
情境(Situation)
- 业务规模扩大,单一集群难以满足需求
- 不同业务对资源和SLA有不同要求
- 需要平衡资源利用率和隔离性
冲突(Complication)
- 集群过多会增加运维复杂度
- 集群过少会导致故障影响范围过大
- 需要在隔离性和成本之间找到平衡
问题(Question)
- 需要多少个Kubernetes集群?
- 如何划分集群?
- 如何实现集群间的隔离?
- 如何管理多个集群?
答案(Answer)
- 根据业务需求和SLA要求确定集群数量
- 按环境或业务划分集群
- 使用网络、命名空间、RBAC等方式隔离
- 采用专门的多集群管理工具
三、集群数量决策
3.1 影响因素分析
| 因素 | 影响 | 建议 |
|---|---|---|
| 业务重要性 | 核心业务需要独立集群 | 核心业务单独部署 |
| SLA要求 | 高SLA需要更高可用性 | 多集群冗余部署 |
| 合规要求 | 数据隔离和合规性 | 独立集群满足合规 |
| 团队规模 | 团队越多越需要隔离 | 按团队划分集群 |
| 成本预算 | 多集群增加成本 | 合理规划集群数量 |
3.2 常见集群数量方案
方案一:基础三集群
┌─────────────────────────────────────────────────────────────────┐
│ 基础三集群架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 开发集群 │ │ 测试集群 │ │ 生产集群 │ │
│ │ (Dev) │ │ (Test) │ │ (Prod) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
方案二:多生产集群
┌─────────────────────────────────────────────────────────────────┐
│ 多生产集群架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 核心业务 │ │ 非核心业务 │ │ 灾备集群 │ │
│ │ (Core) │ │ (Non-Core) │ │ (DR) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
方案三:地域分布式集群
┌─────────────────────────────────────────────────────────────────┐
│ 地域分布式集群架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 北京集群 │ │ 上海集群 │ │ 广州集群 │ │
│ │ (Beijing) │ │ (Shanghai) │ │ (Guangzhou)│ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
四、部署策略选择
4.1 按环境隔离
优点:
- 环境完全隔离,互不影响
- 测试环境可自由操作
- 生产环境更加安全
缺点:
- 资源利用率较低
- 运维成本较高
适用场景:
- 对安全性要求高的企业
- 开发测试频繁的团队
4.2 按业务隔离
优点:
- 业务间相互隔离
- 故障影响范围小
- 便于按业务进行资源分配
缺点:
- 集群数量较多
- 管理复杂度增加
适用场景:
- 多业务线并行发展
- 不同业务有不同SLA要求
4.3 混合策略
架构设计:
# 混合策略配置示例
clusters:
# 环境隔离集群
- name: dev-cluster
purpose: development
- name: test-cluster
purpose: testing
- name: staging-cluster
purpose: staging
# 业务隔离集群
- name: core-business-cluster
purpose: core-business
- name: non-core-cluster
purpose: non-core
- name: common-services-cluster
purpose: common-services
五、集群隔离方式
5.1 网络隔离
NetworkPolicy配置:
# 默认拒绝所有流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
# 允许特定流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-db-access
namespace: production
spec:
podSelector:
matchLabels:
app: backend
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 5432
5.2 命名空间隔离
命名空间规划:
# 创建生产环境命名空间
apiVersion: v1
kind: Namespace
metadata:
name: production-app1
labels:
environment: production
business: app1
# 创建生产环境命名空间
apiVersion: v1
kind: Namespace
metadata:
name: production-app2
labels:
environment: production
business: app2
资源配额配置:
# 命名空间资源配额
apiVersion: v1
kind: ResourceQuota
metadata:
name: production-quota
namespace: production-app1
spec:
hard:
requests.cpu: "10"
requests.memory: "10Gi"
limits.cpu: "20"
limits.memory: "20Gi"
pods: "100"
5.3 RBAC权限隔离
角色配置:
# 创建只读角色
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: readonly
namespace: production-app1
rules:
- apiGroups: [""]
resources: ["pods", "services", "configmaps"]
verbs: ["get", "watch", "list"]
# 创建管理员角色
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: admin
namespace: production-app1
rules:
- apiGroups: [""]
resources: ["*"]
verbs: ["*"]
- apiGroups: ["apps"]
resources: ["deployments", "statefulsets"]
verbs: ["*"]
角色绑定:
# 绑定只读角色
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: readonly-binding
namespace: production-app1
subjects:
- kind: User
name: developer@example.com
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: readonly
apiGroup: rbac.authorization.k8s.io
六、多集群管理工具
6.1 Cluster API
集群定义:
apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
name: production-cluster
spec:
topology:
class: default
version: v1.28.0
controlPlane:
replicas: 3
ref:
apiGroup: controlplane.cluster.x-k8s.io
kind: KubeadmControlPlane
name: production-control-plane
workers:
machineDeployments:
- class: worker
replicas: 10
name: worker-pool-1
机器模板:
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: AWSMachineTemplate
metadata:
name: production-control-plane
spec:
template:
spec:
instanceType: m5.xlarge
iamInstanceProfile: control-plane-profile
sshKeyName: my-ssh-key
6.2 Argo CD跨集群部署
集群注册:
# 注册远程集群
argocd cluster add remote-cluster --name remote-cluster
# 查看已注册集群
argocd cluster list
跨集群应用部署:
# Argo CD应用配置
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/your-org/app.git
targetRevision: HEAD
path: k8s
destination:
server: https://remote-cluster.example.com
namespace: production
syncPolicy:
automated:
prune: true
selfHeal: true
6.3 多集群监控
Thanos配置:
# Thanos Sidecar配置
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: thanos-sidecar
namespace: monitoring
spec:
selector:
matchLabels:
app: thanos-sidecar
endpoints:
- port: http
interval: 30s
跨集群告警:
# Prometheus联邦配置
scrape_configs:
- job_name: 'federate'
scrape_interval: 15s
honor_labels: true
metrics_path: '/federate'
params:
'match[]':
- '{job="prometheus"}'
- '{__name__=~"job:.*"}'
static_configs:
- targets:
- 'cluster1-prometheus:9090'
- 'cluster2-prometheus:9090'
- 'cluster3-prometheus:9090'
七、多集群最佳实践
7.1 集群命名规范
命名规则:
<环境>-<业务>-<地域>-<序号>
示例:
- prod-core-beijing-01
- prod-noncore-shanghai-01
- staging-common-guangzhou-01
7.2 统一配置管理
配置模板:
# 集群配置模板
apiVersion: v1
kind: ConfigMap
metadata:
name: cluster-config
namespace: kube-system
data:
cluster-name: production-cluster
environment: production
region: beijing
version: v1.28.0
7.3 自动化运维
运维脚本:
#!/bin/bash
# 多集群健康检查
CLUSTERS=("cluster1" "cluster2" "cluster3")
for cluster in "${CLUSTERS[@]}"; do
echo "=== Checking $cluster ==="
# 检查节点状态
kubectl --context=$cluster get nodes
# 检查Pod状态
kubectl --context=$cluster get pods -A | grep -E "Error|CrashLoopBackOff"
# 检查组件状态
kubectl --context=$cluster get componentstatuses
done
7.4 灾难恢复
跨集群灾备策略:
┌─────────────────────────────────────────────────────────────────┐
│ 跨集群灾备架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ 异步复制 ┌──────────────┐ │
│ │ 主集群 │ ──────────────────────→ │ 灾备集群 │ │
│ │ (Primary) │ │ (DR) │ │
│ └──────────────┘ └──────────────┘ │
│ │ │ │
│ │ 定时同步 │ │
│ └───────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
八、总结
核心要点
- 集群数量:根据业务需求和SLA要求确定
- 部署策略:按环境或业务划分,或采用混合策略
- 隔离方式:网络、命名空间、RBAC多层隔离
- 管理工具:Cluster API、Argo CD、Thanos等
最佳实践清单
- ✅ 根据业务重要性划分集群
- ✅ 实施多层隔离策略
- ✅ 使用专业工具管理多集群
- ✅ 建立统一的监控和告警体系
- ✅ 制定灾难恢复计划
本文对应的面试题:有几套K8S集群?两个平台分别部署在不同集群上吗?
附录:推荐工具
集群管理:
- Cluster API:集群生命周期管理
- Rancher:多集群管理平台
- VMware Tanzu:企业级Kubernetes管理
部署工具:
- Argo CD:GitOps持续部署
- Flux:GitOps工具包
- Helm:包管理器
监控工具:
- Thanos:跨集群监控
- Cortex:多租户监控
- Prometheus Federation:联邦监控
文档信息
- 本文作者:soveran zhong
- 本文链接:https://blog.clockwingsoar.cn/2026/07/05/kubernetes-multi-cluster-best-practices/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)