当前位置: 首页 > news >正文

使用 Milvus Operator 在 Kubernetes 中部署 Milvus记录

前提条件:创建 K8s 集群。

检查集群信息:kubectl cluster-info
查看集群中的节点 (Node):kubectl get nodes
查看所有的命名空间:kubectl get namespaces

设置默认StorageClass
Milvus需要一个默认的StorageClass来创建PVC。将现有的local-path设置为默认

kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

验证默认StorageClass设置,运行以下命令确认设置成功:

kubectl get sc

您应该看到类似这样的输出:

NAME                   PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-path (default)   rancher.io/local-path   Delete          WaitForFirstConsumer   false                  375d

安装前检查硬件和软件要求

安装Milvus Operator,这里使用的是Kubectl方式。

kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/deploy/manifests/deployment.yaml

安装过程结束后,您将看到类似下面的输出。

namespace/milvus-operator created
customresourcedefinition.apiextensions.k8s.io/milvusclusters.milvus.io created
serviceaccount/milvus-operator-controller-manager created
role.rbac.authorization.k8s.io/milvus-operator-leader-election-role created
clusterrole.rbac.authorization.k8s.io/milvus-operator-manager-role created
clusterrole.rbac.authorization.k8s.io/milvus-operator-metrics-reader created
clusterrole.rbac.authorization.k8s.io/milvus-operator-proxy-role created
rolebinding.rbac.authorization.k8s.io/milvus-operator-leader-election-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/milvus-operator-manager-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/milvus-operator-proxy-rolebinding created
configmap/milvus-operator-manager-config created
service/milvus-operator-controller-manager-metrics-service created
service/milvus-operator-webhook-service created
deployment.apps/milvus-operator-controller-manager created

检查 Milvus Operator pod 是否正在运行:

kubectl get pods -n milvus-operator
NAME                               READY   STATUS    RESTARTS   AGE
milvus-operator-5fd77b87dc-msrk4   1/1     Running   0          46s

检查Milvus Operator日志:

kubectl logs -n milvus-operator deployment/milvus-operator

部署 Milvus 群集
运行了 Milvus Operator pod后,就可以开始部署 Milvus 群集。

重点:刚开始按照官方文档运行下面命令部署Milvus 群集,后续发现会出现错误无法正常部署。

kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_woodpecker.yaml

检查Milvus Operator日志:

kubectl logs -n milvus-operator deployment/milvus-operator

错误信息:

{"level":"info","ts":"2025-08-12T07:14:59Z","logger":"controller.status-syncer","msg":"syncHealthyUpdated end","duration":0.000114692}
{"level":"info","ts":"2025-08-12T07:14:59Z","logger":"controller.status-syncer","msg":"syncUnealthyOrUpdating end","duration":0.000220225}
{"level":"info","ts":"2025-08-12T07:15:29Z","logger":"controller.status-syncer","msg":"syncUnealthyOrUpdating start","time":"2025-08-12T07:                                                              15:29Z"}
{"level":"info","ts":"2025-08-12T07:15:29Z","logger":"controller.status-syncer","msg":"syncUnealthyOrUpdating end","duration":0.000313533}
{"level":"info","ts":"2025-08-12T07:15:59Z","logger":"controller.status-syncer","msg":"syncHealthyUpdated start","time":"2025-08-12T07:15:5                                                              9Z"}
{"level":"info","ts":"2025-08-12T07:15:59Z","logger":"controller.status-syncer","msg":"syncUnealthyOrUpdating start","time":"2025-08-12T07:                                                              15:59Z"}
{"level":"info","ts":"2025-08-12T07:15:59Z","logger":"controller.status-syncer","msg":"syncUnealthyOrUpdating end","duration":0.00007203}
{"level":"info","ts":"2025-08-12T07:15:59Z","logger":"controller.status-syncer","msg":"syncHealthyUpdated end","duration":0.00032039}
{"level":"info","ts":"2025-08-12T07:16:29Z","logger":"controller.status-syncer","msg":"syncUnealthyOrUpdating start","time":"2025-08-12T07:                                                              16:29Z"}
{"level":"info","ts":"2025-08-12T07:16:29Z","logger":"controller.status-syncer","msg":"syncUnealthyOrUpdating end","duration":0.000195307}
{"level":"info","ts":"2025-08-12T07:16:59Z","logger":"controller.status-syncer","msg":"syncHealthyUpdated start","time":"2025-08-12T07:16:5                                                              9Z"}
{"level":"info","ts":"2025-08-12T07:16:59Z","logger":"controller.status-syncer","msg":"syncHealthyUpdated end","duration":0.000159637}
{"level":"info","ts":"2025-08-12T07:16:59Z","logger":"controller.status-syncer","msg":"syncUnealthyOrUpdating start","time":"2025-08-12T07:                                                              16:59Z"}
{"level":"info","ts":"2025-08-12T07:16:59Z","logger":"controller.status-syncer","msg":"syncUnealthyOrUpdating end","duration":0.000167183}
{"level":"info","ts":"2025-08-12T07:17:29Z","logger":"controller.status-syncer","msg":"syncUnealthyOrUpdating start","time":"2025-08-12T07:                                                              17:29Z"}
{"level":"info","ts":"2025-08-12T07:17:29Z","logger":"controller.status-syncer","msg":"syncUnealthyOrUpdating end","duration":0.00028529}
{"level":"info","ts":"2025-08-12T07:17:59Z","logger":"controller.status-syncer","msg":"syncUnealthyOrUpdating start","time":"2025-08-12T07:                                                              17:59Z"}
{"level":"info","ts":"2025-08-12T07:17:59Z","logger":"controller.status-syncer","msg":"syncUnealthyOrUpdating end","duration":0.000095969}
{"level":"info","ts":"2025-08-12T07:17:59Z","logger":"controller.status-syncer","msg":"syncHealthyUpdated start","time":"2025-08-12T07:17:5                                                              9Z"}
{"level":"info","ts":"2025-08-12T07:17:59Z","logger":"controller.status-syncer","msg":"syncHealthyUpdated end","duration":0.000073126}
{"level":"info","ts":"2025-08-12T07:18:29Z","logger":"controller.status-syncer","msg":"syncUnealthyOrUpdating start","time":"2025-08-12T07:                                                              18:29Z"}
{"level":"info","ts":"2025-08-12T07:18:29Z","logger":"controller.status-syncer","msg":"syncUnealthyOrUpdating end","duration":0.000082232}
{"level":"error","ts":"2025-08-12T07:18:55Z","msg":"Reconciler error","controller":"milvus","controllerGroup":"milvus.io","controllerKind":                                                              "Milvus","Milvus":{"name":"my-release","namespace":"default"},"namespace":"default","name":"my-release","reconcileID":"b64c846a-5793-4f83-8                                                              698-859e35b932a0","error":"Milvus.milvus.io "my-release" is invalid: spec.dependencies.etcd.endpoints: Invalid value: "null": spec.depe                                                              ndencies.etcd.endpoints in body must be of type array: "null"","stacktrace":"sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Con                                                              troller[...]).reconcileHandler\n\t/go/pkg/mod/sigs.k8s.io/controller-runtime@v0.19.6/pkg/internal/controller/controller.go:316\nsigs.k8s.io                                                              /controller-runtime/pkg/internal/controller.(*Controller[...]).processNextWorkItem\n\t/go/pkg/mod/sigs.k8s.io/controller-runtime@v0.19.6/pk                                                               g/internal/controller/controller.go:263 \nsigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller[...]).Start.func2.2\n\t/go/pkg                                                              /mod/sigs.k8s.io/controller-runtime@v0.19.6/pkg/internal/controller/controller.go:224"}
{"level":"info","ts":"2025-08-12T07:18:59Z","logger":"controller.status-syncer","msg":"syncHealthyUpdated start","time":"2025-08-12T07:18:5                                                              9Z"}
{"level":"info","ts":"2025-08-12T07:18:59Z","logger":"controller.status-syncer","msg":"syncHealthyUpdated end","duration":0.0002522}
{"level":"info","ts":"2025-08-12T07:18:59Z","logger":"controller.status-syncer","msg":"syncUnealthyOrUpdating start","time":"2025-08-12T07:                                                              18:59Z"}
{"level":"info","ts":"2025-08-12T07:18:59Z","logger":"controller.status-syncer","msg":"syncUnealthyOrUpdating end","duration":0.000040847}
{"level":"info","ts":"2025-08-12T07:19:29Z","logger":"controller.status-syncer","msg":"syncUnealthyOrUpdating start","time":"2025-08-12T07:                                                              19:29Z"}
{"level":"info","ts":"2025-08-12T07:19:29Z","logger":"controller.status-syncer","msg":"syncUnealthyOrUpdating end","duration":0.000149089}

删除在 default 命名空间中创建失败的 my-release:

kubectl delete milvus my-release -n default

为Milvus集群创建一个新的命名空间:

kubectl create namespace milvus-prod

确认有权限在新命名空间中创建Milvus资源,如果输出是 yes则正常:

kubectl auth can-i create milvus -n milvus-prod

创建新的配置文件milvus-cluster.yaml:

apiVersion: milvus.io/v1beta1
kind: Milvus
metadata:name: my-releaselabels:app: milvus
spec:config: {}mode: clusterdependencies:etcd:inCluster:values:replicaCount: 3endpoints: []storage:inCluster:values:mode: distributedreplicas: 4msgStreamType: woodpeckercomponents:image: milvusdb/milvus:v2.6.0

在新命名空间中部署 Milvus:

kubectl apply -f milvus-cluster.yaml -n milvus-prod

使用 -n milvus-prod 来查看新命名空间中的Pod,:

kubectl get pods -n milvus-prod -w

看到etcd, minio, milvus的Pod被成功创建并进入Running状态(这个过程需要等待一段时间),表示部署成功。
Milvus 集群准备就绪后,Milvus 集群中所有 pod 的状态应该与下面类似。

NAME                                               READY   STATUS    RESTARTS   AGE
my-release-etcd-0                                  1/1     Running   0          23h
my-release-etcd-1                                  1/1     Running   0          23h
my-release-etcd-2                                  1/1     Running   0          23h
my-release-milvus-datanode-689b4c64db-njcpx        1/1     Running   0          23h
my-release-milvus-mixcoord-54f94d558b-t5fr9        1/1     Running   0          23h
my-release-milvus-proxy-6948b65d98-6kzmk           1/1     Running   0          23h
my-release-milvus-querynode-0-699ddd8469-bq67z     1/1     Running   0          23h
my-release-milvus-streamingnode-6468d68464-c4c2c   1/1     Running   0          23h
my-release-minio-6fd785f8c5-f7zhv                  1/1     Running   0          23h

检查Milvus资源的状态,status 字段,如果它的值是 Healthy,则部署成功:

kubectl get milvus my-release -n milvus-prod -o yaml

查看事件日志,查看某个特定Pod的事件:

# 先找到proxy Pod的完整名字
kubectl get pods -n milvus-prod | grep proxy
# 然后执行
kubectl describe pod my-release-milvus-proxy-6948b65d98-6kzmk -n milvus-prod

查看实时日志,查看Proxy组件的实时日志:

# -f 参数表示 follow,会持续输出新日志
kubectl logs -f my-release-milvus-proxy-6948b65d98-6kzmk -n milvus-prod

运行以下命令获取 Milvus 集群的服务端口,输出19530:

kubectl get pod my-release-milvus-proxy-6948b65d98-6kzmk -n milvus-prod --template='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'

将本地端口转发到 Milvus 服务的端口(临时):

kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530 -n milvus-prod

启用对 Milvus Web UI 的访问,需要将代理 pod 的端口转发到本地端口(临时):

kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091 -n milvus-prod

永久的服务暴露,这是永久性的配置修改命令。它将Milvus服务从一个只能在集群内部访问的类型(ClusterIP)变成了一个可以通过集群中任何一台物理机(节点)的IP和固定高位端口进行访问的类型(NodePort),31787这个端口是 Kubernetes集群自动随机分配的:

kubectl patch service my-release-milvus -n milvus-prod -p '{"spec": {"type": "NodePort"}}'

再次运行get service命令,会发现my-release-milvus 这一行发生了关键变化。它的TYPE列会变成NodePort,并且PORT(S)列会多出一个高位端口。

kubectl get service -n milvus-prod
NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                          AGE
my-release-etcd            ClusterIP   10.43.129.247   <none>        2379/TCP,2380/TCP                23h
my-release-etcd-headless   ClusterIP   None            <none>        2379/TCP,2380/TCP                23h
my-release-milvus          NodePort    10.43.38.7      <none>        19530:31787/TCP,9091:31495/TCP   23h
my-release-minio           ClusterIP   10.43.206.121   <none>        9000/TCP                         23h
http://www.dtcms.com/a/328765.html

相关文章:

  • LeetCode 刷题【40. 组合总和 II】
  • 3d游戏引擎中ContentTools中的文件模型导入代码1
  • python---list.sort() 和 sorted(list)的区别
  • JVM安全点轮询汇编函数解析
  • 计算机网络---IPv6
  • 第6节 torch.nn.Module
  • 熬夜面膜赛道跑出的新物种
  • Spring Boot初级概念及自动配置原理
  • 【递归、搜索与回溯算法】综合练习
  • 系统分析师-数据库系统-并发控制数据库安全
  • 使用 UDP 套接字实现客户端 - 服务器通信:完整指南
  • HiSmartPerf使用WIFI方式连接Android机显示当前设备0.0.0.0无法ping通!设备和电脑连接同一网络,将设备保持亮屏重新尝试
  • 【android bluetooth 协议分析 05】【蓝牙连接详解3】【app侧该如何知道蓝牙设备的acl状态】
  • 【KO】Android 面试高频词
  • 从内核数据结构的角度理解socket
  • Android Activity 的对话框(Dialog)样式
  • RxJava 在 Android 中的深入解析:使用、原理与最佳实践
  • 基于Apache Flink的实时数据处理架构设计与高可用性实战经验分享
  • 【cs336学习笔记】[第5课]详解GPU架构,性能优化
  • 深入 Linux 线程:从内核实现到用户态实践,解锁线程创建、同步、调度与性能优化的完整指南
  • iscc2025区域赛wp
  • 服务器通过生成公钥和私钥安全登录
  • Android 在 2020-2025 都做哪些更新?
  • 如何提供对外访问的IP(内网穿透工具)
  • 【Android】ChatRoom App 技术分析
  • OpenAI 回应“ChatGPT 用多了会变傻”
  • Control Center 安卓版:个性化手机控制中心
  • ClickHouse从入门到企业级实战全解析课程简介
  • 1688商品数据抓取:Python爬虫+动态页面解析
  • 基于elk实现分布式日志