写在前面

最近半年一直在折腾多云管理的事情,公司业务分散在阿里云、AWS和华为云三个平台,20多个K8s集群管理起来简直要命。每次发布新版本都要准备好几套配置文件,在不同的kubectl context之间切换,稍不注意就会把生产环境的配置应用到测试集群上。后来偶然接触到Kurator这个项目,试用了几个月下来,感觉确实解决了不少实际问题。

今天想系统地聊聊Kurator的技术架构、实战应用,以及我对分布式云原生未来发展的一些思考。这篇文章会包含不少代码和配置示例,如果你也在为多云管理头疼,希望能给你一些启发。

一、为什么需要Kurator?先看看痛点

1.1 多云管理的真实困境

让我先用一个表格总结下当前企业面临的核心问题:

痛点 具体表现 影响
管理碎片化 需要登录多个云平台控制台,学习不同的操作界面 效率低下,容易出错
配置不一致 各集群配置版本不同,难以保证一致性 故障排查困难
应用部署复杂 同一应用需要在多个集群重复部署 发布周期长
监控数据孤岛 各集群监控系统独立,缺乏全局视图 无法整体把控

传统的做法是写一堆脚本来自动化这些操作,但脚本维护成本很高,而且缺乏统一的抽象。Kurator的价值就在于提供了一套开箱即用的分布式云原生解决方案。

1.2 Kurator的核心理念

Kurator不是要重新发明轮子,而是整合业界最优秀的开源项目:Karmada做多集群编排、Istio做服务网格、KubeEdge做边缘计算、Volcano做批量调度、Prometheus做监控。它在这些组件之上提供了统一的管理层,让复杂的技术栈变得简单易用。

最关键的是Fleet(舰队)这个概念。你可以把多个集群组成一个Fleet,然后对整个Fleet进行统一管理。这种抽象很符合业务思维,比如可以按环境划分(生产Fleet、测试Fleet),也可以按地域划分(中国Fleet、海外Fleet)。

二、Kurator技术架构深度解析

2.1 整体架构

Kurator主要由两个核心组件构成:

Fleet Manager(舰队管理器)

  • 负责Fleet资源的抽象与管理

  • 处理多集群策略编排

  • 控制应用分发策略

Cluster Operator(集群操作器)

  • 基于Cluster API管理集群生命周期

  • 提供声明式的集群配置

  • 自动化集群运维操作

2.2 快速开始:部署你的第一个Kurator环境

下面我用一个实际的部署示例来说明,首先安装Kurator的CLI工具:

# 下载并安装kurator CLI
curl -Lo kurator https://github.com/kurator-dev/kurator/releases/latest/download/kurator-linux-amd64
chmod +x kurator
sudo mv kurator /usr/local/bin/

# 验证安装
kurator version

然后在宿主集群上部署Kurator控制平面:

# 创建kurator命名空间
kubectl create namespace kurator-system

# 安装Kurator operator
kurator install --kurator-version=v0.4.0

# 检查安装状态
kubectl get pods -n kurator-system

输出应该类似这样:

NAME                                          READY   STATUS    RESTARTS   AGE
kurator-fleet-manager-6d8b7c5f9c-x7k2m       1/1     Running   0          2m
kurator-cluster-operator-5b9c8d7f6d-p8n4q    1/1     Running   0          2m

2.3 创建第一个Fleet

接下来创建一个Fleet来管理我们的集群。假设我们有三个K8s集群,分别部署在阿里云、AWS和华为云:

apiVersion: fleet.kurator.dev/v1alpha1
kind: Fleet
metadata:
  name: production-fleet
  namespace: default
spec:
  clusters:
    - name: aliyun-prod-01
      # 集群的kubeconfig secret
      secretRef:
        name: aliyun-prod-01-kubeconfig
    - name: aws-prod-01
      secretRef:
        name: aws-prod-01-kubeconfig
    - name: huawei-prod-01
      secretRef:
        name: huawei-prod-01-kubeconfig
  # Fleet级别的策略配置
  plugin:
    # 启用统一监控
    monitoring:
      enabled: true
      prometheus:
        version: v2.45.0
    # 启用流量治理
    trafficManagement:
      enabled: true
      istio:
        version: 1.18.0

应用这个配置:

kubectl apply -f fleet.yaml

# 查看Fleet状态
kubectl get fleet production-fleet -o yaml

2.4 跨集群应用分发实战

现在我们有了Fleet,可以尝试部署一个跨集群的应用。这里用一个简单的nginx服务作为示例:

apiVersion: apps.kurator.dev/v1alpha1
kind: Application
metadata:
  name: nginx-demo
  namespace: default
spec:
  source:
    gitRepository:
      url: https://github.com/your-org/nginx-manifests
      branch: main
      path: ./deploy
  syncPolicies:
    - destination:
        fleet: production-fleet
      # 在所有集群部署3个副本
      kustomization:
        replicas: 3
        images:
          - name: nginx
            newTag: 1.25.0

Kurator会自动将这个应用同步到Fleet中的所有集群。如果你想针对不同集群做差异化配置,可以使用override策略:

apiVersion: apps.kurator.dev/v1alpha1
kind: Application
metadata:
  name: nginx-demo
  namespace: default
spec:
  source:
    gitRepository:
      url: https://github.com/your-org/nginx-manifests
      branch: main
      path: ./deploy
  syncPolicies:
    - destination:
        fleet: production-fleet
      kustomization:
        replicas: 3
      # 针对特定集群的覆盖策略
      overrides:
        # AWS集群需要更多副本
        - clusterSelector:
            matchLabels:
              provider: aws
          patches:
            - op: replace
              path: /spec/replicas
              value: 5
        # 华为云集群使用特定的镜像仓库
        - clusterSelector:
            matchLabels:
              provider: huawei
          patches:
            - op: replace
              path: /spec/template/spec/containers/0/image
              value: swr.cn-north-4.myhuaweicloud.com/my-org/nginx:1.25.0

三、核心能力深度实践

3.1 多集群监控:统一视图的价值

Kurator集成了Prometheus、Thanos和Grafana,提供开箱即用的多集群监控方案。架构思路是:

  • 每个成员集群运行一个Prometheus采集本地指标

  • Thanos Sidecar将数据推送到对象存储

  • 宿主集群的Thanos Query聚合全局数据

  • Grafana连接Thanos Query展示统一视图

启用监控功能:

apiVersion: fleet.kurator.dev/v1alpha1
kind: Fleet
metadata:
  name: production-fleet
spec:
  clusters:
    - name: aliyun-prod-01
      secretRef:
        name: aliyun-prod-01-kubeconfig
    - name: aws-prod-01
      secretRef:
        name: aws-prod-01-kubeconfig
  plugin:
    monitoring:
      enabled: true
      # Thanos对象存储配置
      thanos:
        objectStorage:
          type: s3
          config:
            bucket: kurator-metrics
            endpoint: s3.amazonaws.com
            access_key: ${AWS_ACCESS_KEY}
            secret_key: ${AWS_SECRET_KEY}
      # Grafana配置
      grafana:
        enabled: true
        adminPassword: ${GRAFANA_ADMIN_PASSWORD}

部署后,你可以访问Grafana查看全局指标。我写了一个简单的PromQL查询来展示跨集群的Pod总数:

# 按集群统计Pod数量
sum by (cluster) (kube_pod_info)

# 按Fleet统计总CPU使用率
sum(rate(container_cpu_usage_seconds_total{fleet="production-fleet"}[5m])) 
  / sum(kube_node_status_allocatable{resource="cpu"}) * 100

实际使用中,这种统一监控视图帮了大忙。有一次我们发现某个服务响应变慢,通过Grafana一眼就看出是AWS那边的集群负载突然飙升,及时做了流量切换,避免了更大的影响。

3.2 边缘计算:KubeEdge实战

我们公司有个IoT项目,在全国200多个门店部署了边缘设备做客流分析。之前边缘设备管理很头疼,每次模型更新都要运维同学出差去现场。用了Kurator+KubeEdge之后,真的省心多了。

首先在云端集群安装KubeEdge云端组件:

# 使用Kurator安装KubeEdge
kurator install kubeedge-cloudcore --version=v1.14.0

# 生成边缘节点接入token
kurator edge token create --fleet=production-fleet

然后在边缘设备上安装EdgeCore:

# 在边缘设备执行
wget https://github.com/kubeedge/kubeedge/releases/download/v1.14.0/keadm-v1.14.0-linux-amd64.tar.gz
tar -zxvf keadm-v1.14.0-linux-amd64.tar.gz
cd keadm-v1.14.0-linux-amd64/keadm/

# 加入集群
sudo ./keadm join \
  --cloudcore-ipport=cloudcore.example.com:10000 \
  --token=${EDGE_TOKEN} \
  --edgenode-name=store-beijing-01

部署边缘AI推理应用:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: face-detection
  namespace: edge-apps
spec:
  replicas: 1
  selector:
    matchLabels:
      app: face-detection
  template:
    metadata:
      labels:
        app: face-detection
    spec:
      # 指定调度到边缘节点
      nodeSelector:
        node-role.kubernetes.io/edge: ""
      containers:
      - name: detector
        image: my-registry/face-detector:v2.0
        resources:
          limits:
            # 使用边缘设备的GPU
            nvidia.com/gpu: 1
        volumeMounts:
        - name: model
          mountPath: /models
        - name: video
          mountPath: /dev/video0
      volumes:
      - name: model
        # 模型存储在边缘本地
        hostPath:
          path: /data/models
      - name: video
        hostPath:
          path: /dev/video0

关键的是,边缘节点即使断网了也能继续工作。我们测试过,网络中断后边缘应用依然正常运行,重新联网后会自动同步状态。这对于实际部署来说太重要了。

3.3 AI工作负载:Volcano批量调度

我们有个机器学习团队,经常需要跑大规模的模型训练任务。传统的K8s调度器在这种场景下有个大问题:分布式训练需要多个Pod同时启动,但默认调度器可能只调度成功一部分,导致任务卡住。

Volcano的Gang Scheduling完美解决了这个问题。先启用Volcano:

apiVersion: fleet.kurator.dev/v1alpha1
kind: Fleet
metadata:
  name: ai-training-fleet
spec:
  clusters:
    - name: gpu-cluster-01
      secretRef:
        name: gpu-cluster-01-kubeconfig
  plugin:
    batchScheduling:
      enabled: true
      volcano:
        version: v1.8.0

然后提交一个分布式训练任务:

apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
  name: pytorch-distributed-training
spec:
  # 最小成功数,必须全部Pod就绪才开始训练
  minAvailable: 16
  schedulerName: volcano
  queue: ai-training
  tasks:
    - replicas: 1
      name: master
      template:
        spec:
          containers:
          - name: pytorch
            image: pytorch/pytorch:2.0.0-cuda11.7-cudnn8-runtime
            command: ["python", "train.py"]
            args:
              - --master-addr=pytorch-distributed-training-master-0
              - --master-port=23456
              - --world-size=16
              - --rank=0
            resources:
              limits:
                nvidia.com/gpu: 1
    - replicas: 15
      name: worker
      template:
        spec:
          containers:
          - name: pytorch
            image: pytorch/pytorch:2.0.0-cuda11.7-cudnn8-runtime
            command: ["python", "train.py"]
            args:
              - --master-addr=pytorch-distributed-training-master-0
              - --master-port=23456
              - --world-size=16
            resources:
              limits:
                nvidia.com/gpu: 1

Volcano会确保所有16个Pod都调度成功后,才真正启动训练任务。这样避免了资源浪费,也提高了GPU利用率。我们测试下来,GPU利用率从之前的60%提升到了85%以上。

还可以配置队列和优先级:

apiVersion: scheduling.volcano.sh/v1beta1
kind: Queue
metadata:
  name: ai-training
spec:
  # 队列权重,高权重队列优先获得资源
  weight: 100
  # 资源配额
  capability:
    cpu: 200
    memory: 1000Gi
    nvidia.com/gpu: 32
---
apiVersion: scheduling.volcano.sh/v1beta1
kind: PriorityClass
metadata:
  name: high-priority
value: 1000
globalDefault: false

这样不同团队的训练任务可以按优先级和配额合理分配资源,既保证了公平性,又提高了资源利用率。

四、与其他方案的对比

很多人会问,市面上多云管理方案这么多,为什么选Kurator?我简单对比下几个主流方案:

方案 优势 劣势 适用场景
Kurator 开箱即用、组件整合好、Fleet抽象清晰 社区相对较新 中大型企业多云管理
Rancher UI友好、生态完整 商业化、有一定厂商锁定 需要UI操作的场景
原生Karmada 功能强大、性能好 需要自己集成其他组件 技术能力强的团队

从实际使用体验来说,Kurator最大的优势是省心。你不需要自己去研究Prometheus怎么做多集群监控、Istio怎么跨集群通信,这些Kurator都帮你配好了。对于中小团队来说,这个价值是巨大的。

五、对分布式云原生未来的思考

5.1 标准化是大势所趋

云原生生态现在太碎片化了,CNCF Landscape图虽然看起来很繁荣,但对普通用户来说就是噩梦。未来一定会出现更多像Kurator这样的"整合者",把最佳实践固化下来,降低使用门槛。

我觉得Kubernetes已经成为了云原生的"操作系统",接下来需要的是在它之上构建更高层次的抽象。就像当年Java有了Spring框架一样,云原生也需要类似的统一框架。

5.2 边缘计算将成为标配

5G都普及了,边缘算力会越来越丰富。但如果缺乏好的管理工具,这些算力就是一座座孤岛。KubeEdge的云边协同思路是对的,但还需要继续优化:

  • 更轻量化:边缘设备资源有限,运行时占用要降到最低

  • 更智能的调度:根据网络质量、算力情况动态调度

  • 安全增强:边缘设备直接暴露在外网,安全风险更高

Kurator通过整合KubeEdge,为边缘场景提供了一个不错的起点。我期待后续版本能进一步优化边缘体验。

5.3 可观测性需要全链路打通

现在监控、日志、追踪往往是分离的系统。未来应该实现真正的"一栈式"可观测性:

  • 统一的数据模型(OpenTelemetry在做这个事)

  • 智能化的异常检测(结合AIOps)

  • 自动化的根因分析

Kurator目前在监控这块做得不错,但日志和追踪还需要用户自己集成。希望后续能提供更完整的可观测性方案。

5.4 成本优化会越来越重要

多云管理不只是为了高可用,还有个重要目的是省钱。云厂商的定价差异很大,智能调度可以显著降低成本:

# 伪代码:智能选择最便宜的云平台
def schedule_workload(workload):
    # 获取各云平台当前价格
    prices = {
        'aliyun': get_aliyun_price(workload.resources),
        'aws': get_aws_price(workload.resources),
        'huawei': get_huawei_price(workload.resources)
    }
    
    # 考虑数据传输成本
    for cloud in prices.keys():
        prices[cloud] += calculate_egress_cost(cloud, workload.data_size)
    
    # 选择最便宜的
    cheapest_cloud = min(prices, key=prices.get)
    
    # 考虑可用性要求
    if workload.ha_required and prices[cheapest_cloud] < prices[second_cheapest] * 0.8:
        return [cheapest_cloud, second_cheapest]  # 多云部署
    else:
        return [cheapest_cloud]

Kurator可以在Fleet策略中内置这种成本优化逻辑,自动选择最经济的部署方案。

5.5 安全合规必须内置

随着数据保护法规越来越严格(GDPR、数据安全法等),云原生平台必须内置合规能力:

# 未来Kurator可以支持这样的策略配置
apiVersion: policy.kurator.dev/v1alpha1
kind: CompliancePolicy
metadata:
  name: gdpr-policy
spec:
  # 数据不能出境
  dataResidency:
    - region: eu-west-1
      allowedRegions: [eu-west-1, eu-central-1]
      deniedRegions: [us-*, cn-*]
  
  # 数据加密要求
  encryption:
    atRest: required
    inTransit: required
    keyRotation: 90d
  
  # 审计日志
  audit:
    enabled: true
    retention: 7y  # GDPR要求
    immutable: true

六、给新手的建议

如果你也想尝试Kurator,我有几个建议:

第一步:打好Kubernetes基础
Kurator是建立在K8s之上的,如果连Pod、Service这些基本概念都不清楚,直接上手会很吃力。建议先用Minikube在本地玩玩K8s,熟悉基本操作。

第二步:从简单场景开始
不要一开始就搞个20个集群的大型Fleet。先用两三个测试集群试试水,部署个简单的应用,感受一下多集群管理的流程。

第三步:逐步添加功能
Kurator集成了很多组件,但不需要一次性全部启用。先把基本的应用分发跑通,再考虑监控、服务网格这些高级功能。

第四步:多看文档和案例
Kurator的官方文档写得还算清楚,GitHub上也有一些示例。遇到问题先查文档,实在解决不了再去社区提Issue。

相关资源:

结语

云原生技术发展到今天,已经过了"野蛮生长"的阶段。现在需要的不是更多新工具,而是把现有的优秀工具整合起来,让更多人能够享受到云原生的红利。

Kurator在这方面做了一个很好的尝试。它不完美,也还在快速演进中,但方向是对的。作为一个普通开发者,我很高兴看到有这样的开源项目出现,也期待它能够发展得更好。

如果你也在为多云管理头疼,不妨试试Kurator。也许它就是你一直在寻找的那个答案。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐