单集群存在爆炸半径、地域延迟、合规隔离等限制。多集群架构实现容灾、就近访问、环境隔离等需求。
┌────────── 多集群架构模式 ──────────┐
│ │
│ 模式1:主备容灾 │
│ ┌──────┐ ┌──────┐ │
│ │ 主集群 │←──→│ 备集群 │ │
│ │ Active │ │Standby│ │
│ └──────┘ └──────┘ │
│ │
│ 模式2:多活对等 │
│ ┌──────┐ ┌──────┐ │
│ │ 集群A │←──→│ 集群B │ │
│ │Active │ │Active │ │
│ └───┬───┘ └───┬──┘ │
│ └─────┬───────┘ │
│ ┌───▼───┐ │
│ │全局LB │ │
│ └───────┘ │
│ │
│ 模式3:联邦管理 │
│ ┌──────────────────┐ │
│ │ 控制平面 │ │
│ │ KubeFed / ACM │ │
│ └──┬──────┬──────┬──┘ │
│ ┌──▼──┐┌──▼──┐┌──▼──┐ │
│ │C1 ││C2 ││C3 │ │
│ │cn-east││cn-south││us-west│ │
│ └─────┘└─────┘└─────┘ │
│ │
│ 模式4:分层管理 │
│ ┌──────────────────────┐ │
│ │ 管理集群(Management) │ │
│ │ 部署策略/配置/监控 │ │
│ └──┬──────┬──────┬──────┘ │
│ ┌──▼──┐┌──▼──┐┌──▼──┐┌──▼──┐ │
│ │Dev ││Stage││Prod ││Prod │ │
│ └─────┘└─────┘└─────┘└─────┘ │
└──────────────────────────────────────┘
# kubeconfig多集群配置
# 合并多个kubeconfig
export KUBECONFIG=~/.kube/config:~/cluster2-config:~/cluster3-config
kubectl config view --flatten > ~/.kube/merged-config
# 查看所有上下文
kubectl config get-contexts
# CURRENT NAME CLUSTER AUTHINFO NAMESPACE
# * cluster1 cluster1 user1 default
# cluster2 cluster2 user2 default
# cluster3 cluster3 user3 default
# 切换集群
kubectl config use-context cluster2
# 使用kubectx快速切换
brew install kubectx
kubectx cluster1 # 切换到cluster1
kubectx - # 切换回上一个
# 跨集群查询
kubectl get pods --context=cluster1
kubectl get pods --context=cluster2
# ✅ 验证通过
kubectl config current-context
# cluster2
# 安装Karmada
git clone https://github.com/karmada-io/karmada
cd karmada
hack/local-up-karmada.sh
# 加入成员集群
kubectl karmada join cluster1 --kubeconfig-karmada=~/.kube/karmada.config --kubeconfig-member=~/.kube/cluster1.config
kubectl karmada join cluster2 --kubeconfig-karmada=~/.kube/karmada.config --kubeconfig-member=~/.kube/cluster2.config
# ✅ 验证通过
kubectl get clusters --kubeconfig=~/.kube/karmada.config
# NAME VERSION MODE READY AGE
# cluster1 v1.30.x Push True 5m
# cluster2 v1.30.x Push True 3m
# 部署应用到多集群
apiVersion: apps.karmada.io/v1alpha1
kind:PropagationPolicy
metadata:
name: nginx-propagation
spec:
resourceSelectors:
- apiVersion: apps/v1
kind: Deployment
name: nginx
placement:
clusterAffinity:
clusterNames: [cluster1, cluster2] # 目标集群
replicaScheduling:
replicaDivisionPreference: Weighted # 按权重分配
replicaSchedulingType: Divided
weightPreference:
staticWeightList:
- targetCluster:
clusterNames: [cluster1]
weight: 2 # cluster1: 2/3副本
- targetCluster:
clusterNames: [cluster2]
weight: 1 # cluster2: 1/3副本
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 6
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
# ✅ 验证通过 - 4副本在cluster1,2副本在cluster2
# 安装Rancher
helm repo add rancher-latest https://releases.rancher.com/server-charts/latest
helm install rancher rancher-latest/rancher \
--namespace cattle-system \
--create-namespace \
--set hostname=rancher.example.com \
--set certmanager.version=v1.14.0 \
--set replicas=1
# Rancher功能:
# 1. 统一认证(LDAP/OIDC/SAML)
# 2. 多集群仪表盘
# 3. RBAC多集群权限
# 4. 应用目录(Catalog)
# 5. CIS安全扫描
# 6. 集群模板与配置管理
# ✅ 验证通过
kubectl get pods -n cattle-system
# NAME READY STATUS RESTARTS AGE
# rancher-xxxxx 1/1 Running 0 5m
# 多集群Service导出(K8s 1.28+ MCS)
apiVersion: multicluster.x-k8s.io/v1alpha1
kind: ServiceExport
metadata:
name: my-service
namespace: default
---
# 另一集群导入
apiVersion: multicluster.x-k8s.io/v1alpha1
kind: ServiceImport
metadata:
name: my-service
namespace: default
spec:
type: ClusterSetIP
ports:
- port: 80
protocol: TCP
ips:
- 10.96.100.1 # 跨集群VIP
# 多集群Ingress(全局入口)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: global-ingress
annotations:
nginx.ingress.kubernetes.io/upstream-vhost: "my-service.default.svc.cluster.local"
spec:
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service # 跨集群Service
port:
number: 80
# Thanos多集群监控架构
# ┌──────────────────────┐
# │ Thanos Query │ ← 全局查询入口
# │ (Global View) │
# └───┬──────┬──────┬────┘
# │ │ │
# ┌───▼──┐┌──▼──┐┌──▼──┐
# │Sidecar││Sidecar││Sidecar│
# │+Prom ││+Prom ││+Prom │
# │C1 ││C2 ││C3 │
# └───────┘└───────┘└───────┘
# 安装Thanos
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install thanos bitnami/thanos \
--namespace monitoring \
--set query.enabled=true \
--set storegateway.enabled=true \
--set compactor.enabled=true
# 每个集群的Prometheus配置远程写入
# prometheus.yml
remote_write:
- url: http://thanos-receive.monitoring.svc:19291/api/v1/receive
# 检查集群连通性
# 从cluster1的Pod访问cluster2的Service
kubectl exec -it test-pod -- curl -v http://my-service.default.svc.cluster2.local:80
# 常见问题:
# 1. 集群间VPN/隧道未建立
# 2. 防火墙规则阻止跨集群流量
# 3. ServiceExport/ServiceImport配置错误
# 4. CoreDNS跨集群解析未配置
# 检查PropagationPolicy权重
kubectl get propagationpolicy -o yaml
# 检查集群资源余量
kubectl get clusters -o wide
# 调整权重或添加clusterAffinity约束
下一课预告:第20课深入灾难恢复——K8s备份与容灾实践。
19-多集群管理补充要点K8s生产实践扩展
🔹 资源配额(ResourceQuota):限制命名空间总资源
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-quota
namespace: production
spec:
hard:
requests.cpu: "20"
requests.memory: 40Gi
limits.cpu: "40"
limits.memory: 80Gi
pods: "50"
services: "10"
🔹 LimitRange:设置默认资源限制
apiVersion: v1
kind: LimitRange
metadata:
name: default-limits
spec:
limits:
- type: Container
default:
cpu: "200m"
memory: 256Mi
defaultRequest:
cpu: "100m"
memory: 128Mi
max:
cpu: "2"
memory: 4Gi
🔹 Pod优先级与抢占
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
globalDefault: false
---
spec:
preemptionPolicy: PreemptLowerPriority
🔹 优雅处理Pod中断
• PDB保证最小可用副本
• preStop钩子处理连接排空
• terminationGracePeriodSeconds充足
• 应用必须处理SIGTERM信号
🔹 生产环境Checklist
✅ 设置resources requests/limits
✅ 配置liveness/readiness探针
✅ 使用PDB保护关键服务
✅ 实现优雅关闭(SIGTERM)
✅ 配置HPA自动伸缩
✅ 使用NetworkPolicy隔离
✅ 开启RBAC最小权限
✅ 日志结构化输出
✅ 指标暴露/metrics端点
✅ 配置PVC数据备份
19-多集群管理生产环境进阶要点
🔹 性能优化关键参数
• kubelet: --max-pods=110 --pods-per-core=10
• kube-apiserver: --max-requests-inflight=800
• etcd: --quota-backend-bytes=8589934592
• kube-scheduler: --percentage-of-nodes-to-score=50
🔹 集群容量规划
• 控制平面:3节点,8C16G起步
• Worker节点:按应用类型分组
• etcd:SSD磁盘,<2ms延迟
• 网络带宽:10Gbps+集群内互联
🔹 故障自愈最佳实践
1. Pod: livenessProbe自动重启
2. Deployment: ReplicaSet保证副本数
3. Node: kubelet自注册+健康检查
4. Cluster: Cluster Autoscaler增减节点
5. Multi-Cluster: Karmada联邦容灾
🔹 K8s版本升级策略
• 每次只升一个minor版本
• 先升级控制平面,再升级Worker
• 使用kubeadm upgrade plan预检
• 准备回滚方案
• 在staging环境验证后再升级prod