🌐 第19课:多集群管理

📌 课程阶段:高级运维(4/5)|预计时间:60分钟|难度:⭐⭐⭐⭐☆

一、为什么需要多集群?

单集群存在爆炸半径、地域延迟、合规隔离等限制。多集群架构实现容灾、就近访问、环境隔离等需求。

┌────────── 多集群架构模式 ──────────┐
│                                      │
│  模式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 │       │
│  └─────┘└─────┘└─────┘└─────┘       │
└──────────────────────────────────────┘

二、kubectl多集群管理

# 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——多集群编排

# 安装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多集群管理

# 安装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

七、故障排查实战

7.1 集群间网络不通

# 检查集群连通性
# 从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跨集群解析未配置

7.2 应用调度不均

# 检查PropagationPolicy权重
kubectl get propagationpolicy -o yaml

# 检查集群资源余量
kubectl get clusters -o wide

# 调整权重或添加clusterAffinity约束

八、练习

  1. 配置kubectl多集群kubeconfig,使用kubectx快速切换
  2. 安装Karmada,加入2个成员集群并部署应用
  3. 配置PropagationPolicy实现按权重分配副本
  4. 使用MCS API实现跨集群Service发现
  5. 部署Thanos多集群监控,实现全局指标查询

🏆 第19课成就解锁

下一课预告:第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