【探索实战】Kurator·云原生实战派:构建企业级分布式云原生基础设施

在这里插入图片描述

摘要

随着企业数字化转型的深入,多云、混合云和边缘计算已成为常态。Kurator作为一个开源的分布式云原生平台,站在Kubernetes、Istio、Prometheus、FluxCD、KubeEdge、Volcano、Karmada、Kyverno等流行云原生技术的肩膀上,为企业提供了统一的多云多集群管理能力。本文将从实战角度深入探讨Kurator的核心架构、安装部署、多集群管理、应用分发、流量治理等关键能力,并通过真实场景的代码实践,帮助读者掌握如何利用Kurator构建企业级分布式云原生基础设施,实现高效的资源调度、应用分发和统一治理,推动企业云原生转型。

1. Kurator云原生平台概述

1.1 Kurator的定位与价值

Kurator是一个开源的分布式云原生平台,旨在帮助企业构建自己的分布式云原生基础设施,促进企业数字化转型。在多云、混合云和边缘计算场景下,传统的单集群管理方式已无法满足企业需求。Kurator通过整合多个成熟的云原生项目,提供了一个统一的平台,解决了多集群环境下的资源调度、应用分发、流量管理、监控告警等核心问题。

Kurator的核心价值在于其"统一"理念:统一资源编排、统一调度、统一流量管理、统一遥测、统一策略管理。这种统一性大大降低了企业在多云环境下的运维复杂度,提高了资源利用率和应用交付效率。

1.2 技术架构与核心组件

在这里插入图片描述

Kurator站在众多流行云原生技术的肩膀上,其架构设计充分体现了"组合优于重造"的理念。核心组件包括:

  • Karmada:负责多集群资源调度和应用分发
  • KubeEdge:提供边缘计算能力,实现云边协同
  • Volcano:提供批处理和高性能计算场景的调度能力
  • Istio:负责服务网格和流量管理
  • FluxCD:实现GitOps持续交付
  • Kyverno:提供策略管理能力
  • Prometheus:实现统一监控和告警

这些组件并非简单堆砌,而是通过Kurator的抽象层实现了深度集成,形成了一个有机的整体。

1.3 适用场景与企业价值

Kurator适用于多种企业场景:

  • 多云管理:统一管理公有云、私有云和混合云环境
  • 边缘计算:实现云边协同,将应用无缝扩展到边缘
  • 应用现代化:通过服务网格和统一调度,加速传统应用向云原生转型
  • 统一治理:通过策略引擎实现多集群的安全、合规和资源管控

对企业而言,Kurator带来的价值是显而易见的:降低运维复杂度、提高资源利用率、加速应用交付、增强系统稳定性和安全性。

2. 环境搭建与安装实践

2.1 前置条件与环境准备

在这里插入图片描述

在开始Kurator的安装之前,需要确保环境满足以下要求:

  • Kubernetes集群(v1.20+),建议至少3个master节点+3个worker节点
  • Helm v3.8+
  • kubectl v1.20+
  • 网络连通性:确保集群节点可以访问互联网,或已配置私有镜像仓库
  • 资源要求:Master节点至少4核8G,Worker节点至少8核16G
# 验证Kubernetes集群状态
kubectl get nodes
kubectl get pods -n kube-system

# 验证Helm和kubectl版本
helm version
kubectl version --client

2.2 源码获取与安装配置

Kurator的安装从获取源码开始,使用官方GitHub仓库:

# 克隆Kurator源码
git clone https://github.com/kurator-dev/kurator.git
cd kurator

# 查看版本信息
git tag -l
git checkout v0.5.0  # 切换到稳定版本

在这里插入图片描述

克隆完成后,需要根据实际环境修改安装配置。Kurator使用Helm Chart进行部署,配置文件位于charts/kurator目录:

# 创建自定义values文件
cp charts/kurator/values.yaml my-values.yaml

# 编辑配置文件,主要修改以下参数
vim my-values.yaml

关键配置项包括:

  • global.imageRegistry:镜像仓库地址,国内环境建议使用镜像加速
  • components.karmada.enabled:是否启用Karmada组件
  • components.kubeedge.enabled:是否启用KubeEdge组件
  • components.istio.enabled:是否启用Istio组件
  • storageClass:存储类配置

2.3 安装过程与问题排查

执行安装命令:

# 添加Helm仓库
helm repo add kurator https://kurator-dev.github.io/charts
helm repo update

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

# 执行安装
helm install kurator kurator/kurator -n kurator-system -f my-values.yaml

3. Fleet多集群管理架构解析

在这里插入图片描述

3.1 Fleet概念与设计原理

Fleet是Kurator的核心概念之一,代表一组逻辑相关的Kubernetes集群。Fleet提供了一种抽象,使得用户可以在多个集群上执行统一的操作,而无需关心底层集群的具体细节。Fleet的设计原则是"逻辑统一,物理隔离",即在逻辑层面提供统一的视图和操作接口,同时保持各集群的物理隔离性,确保安全性和稳定性。

Fleet的核心功能包括:

  • 集群注册和注销
  • 跨集群资源同步
  • 统一命名空间和服务管理
  • 跨集群服务发现
  • 聚合监控指标
  • 统一策略管理

3.2 创建与管理Fleet

在这里插入图片描述

创建Fleet的过程涉及多个步骤,以下是一个完整的示例:

# fleet.yaml
apiVersion: fleet.kurator.dev/v1alpha1
kind: Fleet
meta
  name: production-fleet
spec:
  clusters:
    - name: cluster-east
      kubeconfigSecretRef:
        name: cluster-east-kubeconfig
    - name: cluster-west
      kubeconfigSecretRef:
        name: cluster-west-kubeconfig
  namespacePlacement:
    - namespaces: ["default", "production"]
      clusters: ["cluster-east", "cluster-west"]
  servicePlacement:
    - services: ["frontend", "backend"]
      clusters: ["cluster-east"]
    - services: ["database"]
      clusters: ["cluster-west"]

应用此配置:

kubectl apply -f fleet.yaml

Fleet创建后,可以通过以下命令查看状态:

kubectl get fleet production-fleet -o yaml
kubectl describe fleet production-fleet

3.3 跨集群资源同步与服务发现

Fleet的一个重要能力是跨集群资源同步。通过Fleet,可以确保特定的资源(如ConfigMap、Secret、ServiceAccount等)在所有集群中保持一致:

# resource-sync.yaml
apiVersion: fleet.kurator.dev/v1alpha1
kind: ResourceSync
meta
  name: config-sync
spec:
  fleet: production-fleet
  resources:
    - apiVersion: v1
      kind: ConfigMap
      name: app-config
      namespace: production
    - apiVersion: v1
      kind: Secret
      name: db-credentials
      namespace: production
  placement:
    clusters: ["cluster-east", "cluster-west"]

跨集群服务发现是另一个关键功能。Kurator通过扩展Kubernetes Service DNS,实现了跨集群的服务发现:

# service-discovery.yaml
apiVersion: fleet.kurator.dev/v1alpha1
kind: ServiceExport
meta
  name: frontend
  namespace: production
spec:
  fleet: production-fleet
---
apiVersion: fleet.kurator.dev/v1alpha1
kind: ServiceImport
meta
  name: frontend-east
  namespace: production
spec:
  fleet: production-fleet
  service: frontend
  cluster: cluster-east

通过这种方式,应用可以像访问本地服务一样访问其他集群中的服务,大大简化了多集群架构下的应用开发。

4. Karmada集成与统一调度实践

在这里插入图片描述

4.1 Karmada在Kurator中的角色

Karmada是Kurator多集群调度的核心组件,它提供了高级的调度策略和资源分发能力。Karmada的设计目标是让用户无需修改应用,就能将应用部署到多个集群中,并根据策略实现自动调度和故障转移。

在Kurator中,Karmada被深度集成,通过Fleet API暴露其能力,使得用户可以利用Kurator的统一接口使用Karmada的功能,而无需直接操作Karmada的API。

4.2 调度策略配置与实践

在这里插入图片描述

Karmada提供了多种调度策略,包括副本调度、聚合调度、主备调度等。以下是一个副本调度的示例,将应用的副本均匀分布在多个集群中:

# propagationpolicy.yaml
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
meta
  name: nginx-propagation
  namespace: production
spec:
  resourceSelectors:
    - apiVersion: apps/v1
      kind: Deployment
      name: nginx
  placement:
    clusterAffinity:
      clusterNames: ["cluster-east", "cluster-west"]
    replicaScheduling:
      replicaDivisionPreference: Weighted
      replicaSchedulingType: Divided
      weightList:
        - targetCluster:
            clusterNames: ["cluster-east"]
          weight: 60
        - targetCluster:
            clusterNames: ["cluster-west"]
          weight: 40

更复杂的场景是基于集群状态的动态调度。例如,根据集群的资源利用率进行调度:

# cluster-resource-policy.yaml
apiVersion: policy.karmada.io/v1alpha1
kind: ClusterResourceBinding
meta
  name: high-priority-app
spec:
  resource:
    apiVersion: apps/v1
    kind: Deployment
    name: critical-app
    namespace: production
  placement:
    clusterAffinity:
      matchExpressions:
        - key: cluster.kurator.dev/resource-usage
          operator: LessThan
          values: ["70%"]
    replicaScheduling:
      replicaSchedulingType: Duplicated

4.3 故障转移与弹性伸缩

在这里插入图片描述

Karmada的另一个重要能力是故障转移。当某个集群出现故障时,Karmada可以自动将应用迁移到其他健康的集群:

# failover-policy.yaml
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
meta
  name: failover-policy
  namespace: production
spec:
  resourceSelectors:
    - apiVersion: apps/v1
      kind: Deployment
      name: mission-critical-app
  placement:
    clusterAffinity:
      clusterNames: ["cluster-east", "cluster-west"]
    failover:
      enabled: true
      threshold: 3  # 3次失败后触发故障转移
      timeout: 300s  # 5分钟内没有恢复则转移

与Kubernetes HPA结合,Karmada还能实现跨集群的弹性伸缩:

# cross-cluster-hpa.yaml
apiVersion: autoscaling.karmada.io/v1alpha1
kind: CrossClusterHPA
meta
  name: frontend-hpa
  namespace: production
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: frontend
  minReplicas: 3
  maxReplicas: 20
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 50
  clusterStrategy:
    type: Weighted
    weights:
      cluster-east: 60
      cluster-west: 40

这种跨集群的弹性伸缩能力,在应对突发流量时特别有用,可以确保应用在不同区域的集群中实现最优的资源分配。

5. Kurator应用分发与GitOps实现

5.1 应用分发架构设计

在这里插入图片描述

Kurator的应用分发基于GitOps理念,使用FluxCD作为核心组件。GitOps的核心思想是将基础设施和应用配置存储在Git仓库中,通过自动化流程将这些配置同步到目标集群。这种方式提供了配置的版本控制、审计跟踪和回滚能力。

在Kurator中,应用分发流程如下:

  1. 用户将应用配置提交到Git仓库
  2. FluxCD控制器监控Git仓库的变化
  3. 当检测到变化时,FluxCD将配置同步到Kurator的Fleet管理器
  4. Fleet管理器根据调度策略将应用分发到目标集群
  5. 目标集群上的Karmada代理执行实际的部署操作

5.2 GitOps仓库结构设计

一个典型的GitOps仓库结构如下:

gitops-repo/
├── clusters/
│   ├── cluster-east.yaml
│   └── cluster-west.yaml
├── fleets/
│   └── production-fleet.yaml
├── apps/
│   ├── frontend/
│   │   ├── base/
│   │   │   ├── deployment.yaml
│   │   │   ├── service.yaml
│   │   │   └── kustomization.yaml
│   │   ├── overlays/
│   │   │   ├── prod/
│   │   │   │   ├── deployment-patch.yaml
│   │   │   │   └── kustomization.yaml
│   │   │   └── staging/
│   │   │       ├── deployment-patch.yaml
│   │   │       └── kustomization.yaml
│   ├── backend/
│   │   └── ...
│   └── database/
│       └── ...
├── policies/
│   ├── security-policies.yaml
│   └── resource-quota.yaml
└── scripts/
    ├── deploy.sh
    └── validate.sh

这种结构设计支持多环境、多集群的应用管理,符合12-Factor应用原则。

5.3 FluxCD集成与自动化部署

在这里插入图片描述

在Kurator中配置FluxCD集成:

# flux-integration.yaml
apiVersion: source.toolkit.fluxcd.io/v1beta1
kind: GitRepository
meta
  name: kurator-gitops
  namespace: kurator-system
spec:
  url: https://github.com/your-org/gitops-repo
  ref:
    branch: main
  interval: 1m
---
apiVersion: kustomize.toolkit.fluxcd.io/v1beta1
kind: Kustomization
meta
  name: kurator-apps
  namespace: kurator-system
spec:
  targetNamespace: production
  sourceRef:
    kind: GitRepository
    name: kurator-gitops
  path: ./apps
  prune: true
  validation: client
  interval: 5m
  timeout: 2m

为了实现自动化部署,可以结合GitHub Actions或GitLab CI:

# .github/workflows/deploy.yaml
name: Deploy to Kurator

on:
  push:
    branches: [ main ]
    paths:
      - 'apps/**'
      - 'fleets/**'
      - 'policies/**'

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    
    - name: Set up kubectl
      uses: azure/setup-kubectl@v1
      with:
        version: 'v1.23.0'
    
    - name: Configure kubeconfig
      run: |
        echo "${{ secrets.KUBECONFIG }}" > kubeconfig
        export KUBECONFIG=kubeconfig
    
    - name: Validate manifests
      run: |
        kubectl apply -f apps/ --dry-run=server
    
    - name: Deploy to Kurator
      run: |
        kubectl apply -f apps/
        kubectl apply -f fleets/
        kubectl apply -f policies/

5.4 高级GitOps实践:多环境管理

在这里插入图片描述

在企业环境中,通常需要管理多个环境(开发、测试、预发布、生产)。Kurator通过Fleet和FluxCD的结合,可以实现精细化的多环境管理:

# multi-env-deployment.yaml
apiVersion: fleet.kurator.dev/v1alpha1
kind: Fleet
meta
  name: dev-fleet
spec:
  clusters: ["cluster-dev1", "cluster-dev2"]
  namespacePlacement:
    - namespaces: ["development"]
      clusters: ["cluster-dev1", "cluster-dev2"]

---
apiVersion: fleet.kurator.dev/v1alpha1
kind: Fleet
meta
  name: prod-fleet
spec:
  clusters: ["cluster-east", "cluster-west"]
  namespacePlacement:
    - namespaces: ["production"]
      clusters: ["cluster-east", "cluster-west"]

---
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
meta
  name: frontend-prod
  namespace: production
spec:
  resourceSelectors:
    - apiVersion: apps/v1
      kind: Deployment
      name: frontend
  placement:
    clusterAffinity:
      clusterNames: ["cluster-east"]
    replicaScheduling:
      replicaSchedulingType: Divided
      weightList:
        - targetCluster:
            clusterNames: ["cluster-east"]
          weight: 70
        - targetCluster:
            clusterNames: ["cluster-west"]
          weight: 30

这种设计使得团队可以在不同环境中使用不同的部署策略,同时保持配置的一致性和可追溯性。

6. 高级流量治理:金丝雀与蓝绿发布

6.1 Kurator流量治理架构

在这里插入图片描述

Kurator的流量治理能力主要基于Istio服务网格实现。Istio提供了强大的流量管理能力,包括路由规则、故障注入、流量镜像等。Kurator将这些能力封装在更高层次的API中,使得用户无需深入了解Istio的复杂配置,就能实现高级的流量治理策略。

Kurator的流量治理架构包括以下核心组件:

  • VirtualService:定义路由规则
  • DestinationRule:定义目标服务的策略
  • Gateway:管理入站和出站流量
  • ServiceEntry:管理外部服务访问
  • EnvoyFilter:高级Envoy代理配置

6.2 金丝雀发布实践

金丝雀发布是一种渐进式的发布策略,通过将少量流量导向新版本,验证其稳定性和性能,再逐步扩大流量比例。在Kurator中,可以通过以下方式实现金丝雀发布:

# canary-release.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
meta
  name: frontend
  namespace: production
spec:
  hosts:
  - frontend.production.svc.cluster.local
  http:
  - route:
    - destination:
        host: frontend
        subset: v1
      weight: 90
    - destination:
        host: frontend
        subset: v2
      weight: 10

---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
meta
  name: frontend
  namespace: production
spec:
  host: frontend
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

结合Kurator的监控能力,可以实现自动化的金丝雀发布:

# automated-canary.yaml
apiVersion: kurator.dev/v1alpha1
kind: Canary
meta
  name: frontend-canary
  namespace: production
spec:
  target:
    deployment: frontend
    namespace: production
  traffic:
    initialWeight: 5
    stepWeight: 10
    maxWeight: 50
    interval: 5m
  metrics:
    - name: error-rate
      threshold: 0.1%  # 错误率超过0.1%则回滚
      interval: 2m
    - name: latency
      threshold: 200ms  # 延迟超过200ms则暂停
      interval: 2m
  promotionStrategy: automatic  # 自动提升
  rollbackStrategy: automatic   # 自动回滚

在这里插入图片描述

6.3 蓝绿发布实现

蓝绿发布是一种零停机部署策略,通过维护两个相同的生产环境(蓝环境和绿环境),在新版本验证完成后,一次性切换所有流量。在Kurator中实现蓝绿发布:

# blue-green-release.yaml
apiVersion: kurator.dev/v1alpha1
kind: BlueGreen
meta
  name: backend-release
  namespace: production
spec:
  target:
    deployment: backend
    namespace: production
  blue:
    version: v1
    replicas: 3
  green:
    version: v2
    replicas: 3
  traffic:
    initial: blue
    final: green
    switchStrategy: manual  # 手动切换
  validation:
    - type: http
      path: /health
      port: 8080
      successThreshold: 100%
    - type: metric
      name: error-rate
      threshold: 0.05%
  notification:
    email: team@example.com
    slack: "#deployments"

蓝绿发布的关键在于流量切换的原子性。Kurator通过Istio的VirtualService实现秒级切换:

# traffic-switch.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
meta
  name: backend
  namespace: production
spec:
  hosts:
  - backend.production.svc.cluster.local
  http:
  - route:
    - destination:
        host: backend
        subset: v2  # 从v1切换到v2
      weight: 100

在这里插入图片描述

6.4 流量治理的监控与可观测性

高级流量治理离不开完善的监控体系。Kurator集成了Prometheus、Grafana和Jaeger,提供了全方位的可观测性:

# observability-config.yaml
apiVersion: monitoring.kurator.dev/v1alpha1
kind: ServiceMonitor
meta
  name: frontend-monitor
  namespace: production
spec:
  selector:
    matchLabels:
      app: frontend
  endpoints:
  - port: metrics
    interval: 15s
    path: /metrics
  - port: http
    interval: 30s
    path: /health
  metricsRelabelings:
  - sourceLabels: [__name__]
    regex: 'http_requests_total'
    action: keep

---
apiVersion: tracing.kurator.dev/v1alpha1
kind: TracingConfig
meta
  name: frontend-tracing
  namespace: production
spec:
  samplingRate: 0.1  # 10%采样率
  maxSpans: 100
  tags:
    - key: cluster
      valueFrom: metadata
      fieldPath: spec.cluster
    - key: version
      valueFrom: label
      labelKey: version

通过这些配置,团队可以实时监控金丝雀发布和蓝绿发布过程中的关键指标,及时发现问题并采取相应措施,确保发布的安全性和稳定性。

7. 统一监控与策略管理

在这里插入图片描述

7.1 Kurator监控架构设计

Kurator的监控体系建立在Prometheus生态之上,通过联邦集群(Federation)的方式实现多集群监控数据的聚合。其架构设计包括以下层次:

  • 数据采集层:各集群中的Prometheus实例负责本地指标采集
  • 数据聚合层:中心Prometheus通过联邦方式聚合各集群数据
  • 存储层:使用Thanos或Mimir实现长期存储和高可用
  • 查询层:Grafana提供统一的可视化界面
  • 告警层:Alertmanager实现统一告警管理

这种分层架构既保证了各集群的独立性,又实现了数据的集中管理和分析。

7.2 策略管理与安全合规

Kurator通过Kyverno实现统一的策略管理。Kyverno是一个Kubernetes原生的策略引擎,支持验证、变更和生成资源。在Kurator中,策略管理主要包括:

# security-policy.yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-pod-security
spec:
  validationFailureAction: enforce
  rules:
  - name: check-pod-security
    match:
      any:
      - resources:
          kinds:
          - Pod
    validate:
      message: "Pods must run as non-root users"
      pattern:
        spec:
          securityContext:
            runAsNonRoot: true
          containers:
          - securityContext:
              allowPrivilegeEscalation: false
              capabilities:
                drop: ["ALL"]

---
apiVersion: kyverno.io/v1
kind: ClusterPolicy
meta
  name: resource-quota
spec:
  validationFailureAction: enforce
  rules:
  - name: limit-resources
    match:
      any:
      - resources:
          kinds:
          - Pod
    validate:
      message: "Resource requests and limits are required"
      pattern:
        spec:
          containers:
          - resources:
              requests:
                memory: "?*"
                cpu: "?*"
              limits:
                memory: "?*"
                cpu: "?*"

这些策略在Fleet级别统一管理,确保所有集群遵循相同的安全和合规标准。

7.3 自动化策略修复与治理

Kurator不仅支持策略验证,还支持自动化修复。当检测到策略违规时,可以自动修复或生成修复建议:

# auto-remediation.yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
meta
  name: auto-fix-image-pull-policy
spec:
  background: true
  rules:
  - name: set-image-pull-policy
    match:
      any:
      - resources:
          kinds:
          - Pod
    mutate:
      patchStrategicMerge:
        spec:
          containers:
          - (image): "*"
            imagePullPolicy: Always
  - name: add-default-probes
    match:
      any:
      - resources:
          kinds:
          - Deployment
    mutate:
      patchesJson6902: |-
        - op: add
          path: /spec/template/spec/containers/0/livenessProbe
          value:
            httpGet:
              path: /health
              port: 8080
            initialDelaySeconds: 30
            periodSeconds: 10

结合Kurator的GitOps能力,策略违规可以自动创建Pull Request进行修复:

# gitops-remediation.yaml
apiVersion: kurator.dev/v1alpha1
kind: PolicyRemediation
metadata:
  name: security-remediation
  namespace: kurator-system
spec:
  policyRef:
    name: require-pod-security
  remediationStrategy: pull-request
  gitRepo:
    url: https://github.com/your-org/gitops-repo
    branch: policy-fixes
    commitMessage: "Auto-fix: security policy violations"
  notification:
    slack: "#security-alerts"
    email: security-team@example.com

这种自动化修复机制大大降低了运维团队的负担,提高了安全合规的执行效率。

结语

Kurator作为新一代的分布式云原生平台,通过深度整合多个优秀开源项目,为企业提供了统一的多云多集群管理能力。从环境搭建到高级流量治理,从GitOps实践到统一监控策略,Kurator覆盖了企业云原生转型的全生命周期需求。

本文通过实战角度深入探讨了Kurator的核心架构和关键能力,希望能够帮助读者理解Kurator的价值,并在实际工作中应用这些知识。随着云原生技术的不断发展,Kurator也将持续演进,为企业提供更强大、更易用的分布式云原生基础设施。

在数字化转型的浪潮中,选择合适的云原生平台至关重要。Kurator凭借其开放、灵活、可扩展的架构,有望成为企业云原生战略的重要支撑。我们期待更多的开发者和企业参与到Kurator的生态建设中,共同推动云原生技术的发展和普及。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐