
2025 年云原生运维实战文档 X 篇原创计划第 17 篇|Milvus 最佳实战「2025」系列第 3 篇
大家好,我是术哥,一名专注于云原生、AI技术的布道者。作为 KubeSphere Ambassador 和 Milvus 北辰使者,我很荣幸能在「运维有术」与大家分享经验。
Milvus最佳实战-往期内容精选:
未来已来!基于 MCP 打造 Milvus 智能运维新范式,一文带你体验氛围运维(Vibe Ops)的效率革命!
万字长文 + 25 张高清大图,手把手教你搭建 Milvus Standalone 生产级监控体系
在云原生时代,向量数据库 Milvus 已成为 AI 应用的重要基础设施。然而,在离线环境下部署 Milvus 集群仍然是一个技术挑战。本文将详细介绍如何利用 Milvus Operator 在离线环境中构建一个生产级的高可用 Milvus 集群。我们将从环境准备、镜像制作到最终部署验证,提供完整的技术实践指南。无论你是运维新手还是经验丰富的工程师,这份实战指南都将助你轻松驾驭 Milvus 的离线部署。
实战服务器配置(架构1:1复刻小规模生产环境,只是配置略有不同)
节点角色 | 主机名 | CPU(核) | 内存(GB) | 系统盘(GB) | 数据盘(GB) | IP | 备注 |
|---|---|---|---|---|---|---|---|
Control 节点 | ksp-control-1 | 4 | 8 | 50 | 100 | 192.168.9.91 | 控制节点 |
Control 节点 | ksp-control-2 | 4 | 8 | 50 | 100 | 192.168.9.92 | 控制节点 |
Control 节点 | ksp-control-3 | 4 | 8 | 50 | 100 | 192.168.9.93 | 控制节点 |
Worker 节点 | ksp-worker-1 | 8 | 32 | 50 | 100 | 192.168.9.94 | 部署通用工作负载 |
Worker 节点 | ksp-worker-2 | 8 | 32 | 50 | 100 | 192.168.9.95 | 部署通用工作负载 |
Worker 节点 | ksp-worker-3 | 8 | 32 | 50 | 100 | 192.168.9.96 | 部署通用工作负载 |
负载均衡节点 | ksp-slb-1 | 2 | 4 | 50 | 部署负载均衡(云上环境可忽略) | ||
负载均衡节点 | ksp-slb-2 | 2 | 4 | 50 | 部署负载均衡(云上环境可忽略) | ||
合计 | 8 | 40 | 128 | 400 | 600 |
实战环境涉及软件版本信息:
考虑到文章篇幅,本文将不再赘述 K8s 集群的部署细节。各位读者可根据自身偏好,选择合适的工具和方式进行部署。如果你是初学者,可以参考我之前的文章:告别宕机!KubeSphere v4.1.3 联手 K8s v1.32.5,手把手教你打造“永不掉线”的云原生底座
请确保你的 K8s 集群已配置存储类(StorageClass)。在本次实验环境中,我们准备了两种存储类:
local(本文将采用此项)nfs-sckubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
local (default) openebs.io/local Delete WaitForFirstConsumer false 14d
nfs-sc k8s-sigs.io/nfs-subdir-external-provisioner Delete Immediate false 10d
重要提示: 存储是 K8s 集群的基石。本次实验为演示目的,我们选择了基于 OpenEBS 部署的
local类型本地存储。在生产环境中,请务必根据实际场景选择最适合的存储方案。特别强调:生产环境强烈不建议使用 NFS!
对于离线环境,镜像包的准备至关重要。官方提供了详细(但略显复杂)的离线制作工具和指南,你可以参考 Milvus 官方离线安装文档。但更简单的方法是,找一台能联网并能下载 Docker 镜像的机器。
执行以下脚本,拉取所需镜像:
# 拉取原始镜像
dockerpullmilvusdb/milvus:v2.5.13
dockerpullmilvusdb/etcd:3.5.18-r1
dockerpullmilvusdb/milvus-operator:v1.3.0-rc1
dockerpullminio/minio:RELEASE.2023-03-20T20-16-18Z
dockerpullapachepulsar/pulsar:3.0.7
dockerpullzilliz/attu:v2.5
为了方便传输和管理,我们将这些镜像打包并进行压缩:
# 打包镜像为 .tar 文件(不用执行)
#docker save milvusdb/milvus:v2.5.13 milvusdb/etcd:3.5.18-r1 milvusdb/milvus-operator:v1.3.0-rc1 minio/minio:RELEASE.2023-03-20T20-16-18Z apachepulsar/pulsar:3.0.7 zilliz/attu:v2.5 > milvus-images-v2.5.13.tar
# 使用 gzip 压缩,进一步减小文件大小
docker save milvusdb/milvus:v2.5.13 milvusdb/etcd:3.5.18-r1 milvusdb/milvus-operator:v1.3.0-rc1 minio/minio:RELEASE.2023-03-20T20-16-18Z apachepulsar/pulsar:3.0.7 zilliz/attu:v2.5 | gzip > milvus-images-v2.5.13.tar.gz
不同格式的镜像包大小对比如下:
# 未压缩的 .tar 文件
$ ls -lh milvus-images-v2.5.13.tar
-rw-r--r-- 1 root root 3.8G Jun 28 20:28 milvus-images-v2.5.13.tar
# 压缩后的 .tar.gz 文件
$ ls -lh milvus-images-v2.5.13.tar.gz
-rw-r--r-- 1 root root 1.8G Jun 29 06:31 milvus-images-v2.5.13.tar.gz
如果你觉得手动制作离线镜像不方便,也可以从我这里下载已制作好的镜像包:
链接1:https://pan.quark.cn/s/b1b6c7d64e24?pwd=h94z
提取码:h94z
链接2:https://pan.xunlei.com/s/VOTtm7MXoECzIwd7INcOisSYA1
提取码:rmhe
完成镜像打包后,接下来需要将 milvus-images-v2.5.13.tar.gz 上传到你的离线镜像仓库。这里我们以 Harbor 为例,假设内部域名为 registry.opsxlabs.cn:8443。
步骤一:创建 Harbor 项目
为了与官方镜像地址前缀保持一致,请在 Harbor 中创建以下四个项目:
步骤二:加载镜像
将打包好的镜像加载到 Docker 中:
# docker load 会自动识别并解压 .tar.gz 文件
docker load -i milvus-images-v2.5.13.tar.gz
步骤三:重新打 Tag 并推送镜像
执行以下脚本,为镜像重新打上内部仓库的 Tag,并将其推送到 Harbor:
# 重新打 Tag
docker tag milvusdb/milvus:v2.5.13 registry.opsxlabs.cn:8443/milvusdb/milvus:v2.5.13
docker tag milvusdb/etcd:3.5.18-r1 registry.opsxlabs.cn:8443/milvusdb/etcd:3.5.18-r1
docker tag milvusdb/milvus-operator:v1.3.0-rc1 registry.opsxlabs.cn:8443/milvusdb/milvus-operator:v1.3.0-rc1
docker tag minio/minio:RELEASE.2023-03-20T20-16-18Z registry.opsxlabs.cn:8443/minio/minio:RELEASE.2023-03-20T20-16-18Z
docker tag apachepulsar/pulsar:3.0.7 registry.opsxlabs.cn:8443/apachepulsar/pulsar:3.0.7
docker tag zilliz/attu:v2.5 registry.opsxlabs.cn:8443/zilliz/attu:v2.5
# 推送镜像到 Harbor
docker push registry.opsxlabs.cn:8443/milvusdb/milvus:v2.5.13
docker push registry.opsxlabs.cn:8443/milvusdb/etcd:3.5.18-r1
docker push registry.opsxlabs.cn:8443/milvusdb/milvus-operator:v1.3.0-rc1
docker push registry.opsxlabs.cn:8443/minio/minio:RELEASE.2023-03-20T20-16-18Z
docker push registry.opsxlabs.cn:8443/apachepulsar/pulsar:3.0.7
docker push registry.opsxlabs.cn:8443/zilliz/attu:v2.5
首先,下载 Milvus Operator 的部署资源清单:
wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/deploy/manifests/deployment.yaml
接着,下载 Milvus 集群的默认部署资源清单:
wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
默认清单内容预览:
# This is a sample to deploy a milvus cluster in milvus-operator's default configurations.
apiVersion:milvus.io/v1beta1
kind:Milvus
metadata:
name:my-release
labels:
app:milvus
spec:
mode:cluster
dependencies:{}
components:{}
config:{}
重要提示: 默认的 Milvus 集群部署资源清单不适用于离线环境。在后续步骤中,我们将基于此配置进行定制化修改,以适应离线部署的需求。
将下载好的资源清单文件上传到离线 K8s 集群的 Control-1 节点,并统一存放在 /srv/milvus 目录下。
操作规范:
/srv/milvus 目录存放配置文件。万事俱备,我们开始在离线环境部署 Milvus Operator 和 Milvus 集群吧!
首先,确认 Operator 的部署资源清单文件 deployment.yaml 已就位:
ls /srv/milvus/deployment.yaml
为了确保 Operator 能够正确拉取离线镜像,我们需要修改 deployment.yaml 文件,将原始镜像地址替换为你的内部镜像仓库地址:
$ sed -i 's#milvusdb/milvus-operator:v1.3.0-rc1#registry.opsxlabs.cn:8443/&#g' deployment.yaml
执行以下命令,开始安装 Milvus Operator:
$ kubectl apply -f deployment.yaml
安装过程完成后,你将看到类似如下的输出,这表明 Operator 的相关资源已成功创建:
namespace/milvus-operator created
serviceaccount/milvus-operator created
customresourcedefinition.apiextensions.k8s.io/milvusclusters.milvus.io created
customresourcedefinition.apiextensions.k8s.io/milvuses.milvus.io created
customresourcedefinition.apiextensions.k8s.io/milvusupgrades.milvus.io created
clusterrole.rbac.authorization.k8s.io/milvus-operator-manager-role created
clusterrolebinding.rbac.authorization.k8s.io/milvus-operator-manager-rolebinding created
role.rbac.authorization.k8s.io/milvus-operator-leader-election-role created
rolebinding.rbac.authorization.k8s.io/milvus-operator-leader-election-rolebinding created
service/milvus-operator-metrics-service created
service/milvus-operator-webhook-service created
deployment.apps/milvus-operator created
运行以下命令,检查 Milvus Operator 的 deployment 和 pod 资源是否已成功启动并运行:
kubectl get deployment,pod -n milvus-operator
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/milvus-operator 1/1 1 1 18s
NAME READY STATUS RESTARTS AGE
pod/milvus-operator-5c974cbd87-nfsj8 1/1 Running 0 18s
你也可以通过 KubeSphere 管理控制台进行可视化查看(可选):
当 Milvus Operator 的 Pod 正常运行后,我们就可以着手部署 Milvus 集群了。我们将对默认的 milvus_cluster_default.yaml 资源清单进行定制化修改,以满足以下常见场景需求:
milvus-release-v25,便于识别和管理。registry.opsxlab.cn:8443,确保离线部署的顺利进行。local 为例。limits)与请求(requests)。这能有效避免因默认配置资源过大或过小,导致 K8s 节点宕机或 Milvus 集群无法创建的问题。修改后的资源清单示例:
apiVersion: milvus.io/v1beta1
kind:Milvus
metadata:
name:milvus-release-v25
labels:
app:milvus
spec:
mode:cluster
config:{}
components:
image:registry.opsxlabs.cn:8443/milvusdb/milvus:v2.5.13
resources:
requests:
cpu:100m
memory:100Mi
limits:
cpu:'2'
memory:8Gi
dependencies:
etcd:
inCluster:
deletionPolicy:Delete
pvcDeletion:true
values:
global:
imageRegistry:registry.opsxlabs.cn:8443
storageClass:local
storage:
inCluster:
deletionPolicy:Delete
pvcDeletion:true
values:
resources:
limits:
cpu:'2'
memory:8Gi
image:
repository:registry.opsxlabs.cn:8443/milvusdb/minio
tag:RELEASE.2023-03-20T20-16-18Z
persistence:
storageClass:local
accessMode:ReadWriteOnce
size:10Gi
pulsar:
inCluster:
chartVersion:pulsar-v3
deletionPolicy:Delete
pvcDeletion:true
values:
existingStorageClassName:local
pulsar_metadata:
image:
repository:registry.opsxlabs.cn:8443/apachepulsar/pulsar
tag:3.0.7
zookeeper:
replicaCount:
volumes:
data:
size:5Gi
storageClassName:local
bookkeeper:
volumes:
journal:
size:5Gi
storageClassName:local
ledgers:
size:5Gi
storageClassName:local
images:
zookeeper:
repository:registry.opsxlabs.cn:8443/apachepulsar/pulsar
tag:3.0.7
proxy:
repository:registry.opsxlabs.cn:8443/apachepulsar/pulsar
tag:3.0.7
broker:
repository:registry.opsxlabs.cn:8443/apachepulsar/pulsar
tag:3.0.7
bookie:
repository:registry.opsxlabs.cn:8443/apachepulsar/pulsar
tag:3.0.7
autorecovery:
repository:registry.opsxlabs.cn:8443/apachepulsar/pulsar
tag:3.0.7
配置完成后,运行以下命令部署 Milvus 集群:
$ kubectl apply -f milvus_cluster_default.yaml
Milvus Operator 会智能地先创建 Milvus 所依赖的中间件(如 Etcd、Zookeeper、Pulsar 和 MinIO),随后再部署 Milvus 核心组件(如代理、协调器和节点)。
首先,确认所有依赖组件的 StatefulSet 均已正常运行:
$ kubectl get sts
NAME READY AGE
milvus-release-v25-etcd 3/3 2m42s
milvus-release-v25-minio 4/4 2m41s
milvus-release-v25-pulsar-bookie 3/3 2m39s
milvus-release-v25-pulsar-broker 2/2 2m39s
milvus-release-v25-pulsar-proxy 2/2 2m39s
milvus-release-v25-pulsar-recovery 1/1 2m39s
milvus-release-v25-pulsar-zookeeper 3/3 2m39s
你也可以通过 KubeSphere 图形化控制台直观查看:
接下来,验证 Milvus 核心服务组件的 Deployment 状态:
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
milvus-release-v25-milvus-datanode 1/1 1 1 115s
milvus-release-v25-milvus-indexnode 1/1 1 1 115s
milvus-release-v25-milvus-mixcoord 1/1 1 1 116s
milvus-release-v25-milvus-proxy 1/1 1 1 115s
milvus-release-v25-milvus-querynode-0 1/1 1 1 115s
milvus-release-v25-milvus-querynode-1 0/0 0 0 114s
milvus-release-v25-milvus-standalone 0/0 0 0 115s
同样,KubeSphere 也提供了直观的图形界面:
这里有一个值得注意的现象: Milvus Operator 会创建一个副本数为 0 的 standalone 和 querynode-1 组件。初次见到可能会感到疑惑,但经过多次部署验证,这似乎是 Operator 的正常行为,它们会自动创建并停止。
这两个看似奇怪的组件,我第一次见到就感到非常奇怪,经过多次的部署验证,发现每次部署都会自动创建并停止,貌似属于 Operator 的正常操作。
带着这份好奇,我曾在 Milvus Operator 社区提交了一个 Issue,官方的回复如下:
官方解释(机器翻译):
A:这是预期行为。我们保留了独立部署,以便在不中断服务的情况下,能够从集群模式扩展到独立部署模式。
B:对于 querynode-1 和 querynode-0,它们在滚动升级时非常有用。最终,正如您在 Issue 中所见,两者中只有一个会保持运行状态。
当 Milvus 集群成功部署并准备就绪后,所有 Pod 的状态应类似于以下内容:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
milvus-release-v25-etcd-0 1/1 Running 0 6m8s
milvus-release-v25-etcd-1 1/1 Running 0 6m8s
milvus-release-v25-etcd-2 1/1 Running 0 6m8s
milvus-release-v25-milvus-datanode-864c965448-qn76b 1/1 Running 0 3m27s
milvus-release-v25-milvus-indexnode-d7ff76b4d-lxwc5 1/1 Running 0 3m27s
milvus-release-v25-milvus-mixcoord-746879f784-m4g9z 1/1 Running 0 3m27s
milvus-release-v25-milvus-proxy-b5597cf8f-pncdx 1/1 Running 0 3m27s
milvus-release-v25-milvus-querynode-0-57fd78d8fc-w9rh6 1/1 Running 0 3m26s
milvus-release-v25-minio-0 1/1 Running 0 6m7s
milvus-release-v25-minio-1 1/1 Running 0 6m7s
milvus-release-v25-minio-2 1/1 Running 0 6m7s
milvus-release-v25-minio-3 1/1 Running 0 6m6s
milvus-release-v25-pulsar-bookie-0 1/1 Running 0 6m4s
milvus-release-v25-pulsar-bookie-1 1/1 Running 0 6m4s
milvus-release-v25-pulsar-bookie-2 1/1 Running 0 6m4s
milvus-release-v25-pulsar-broker-0 1/1 Running 0 6m5s
milvus-release-v25-pulsar-broker-1 1/1 Running 0 6m4s
milvus-release-v25-pulsar-proxy-0 1/1 Running 0 6m5s
milvus-release-v25-pulsar-proxy-1 1/1 Running 0 6m5s
milvus-release-v25-pulsar-recovery-0 1/1 Running 0 6m5s
milvus-release-v25-pulsar-zookeeper-0 1/1 Running 0 6m5s
milvus-release-v25-pulsar-zookeeper-1 1/1 Running 0 6m4s
milvus-release-v25-pulsar-zookeeper-2 1/1 Running 0 6m4s
milvus-release-v25-pulsar-bookie-init-2vrsc 0/1 Completed 0 6m4s
milvus-release-v25-pulsar-pulsar-init-fcwc8 0/1 Completed 0 6m4s
验证是否使用了自定义的 storageClass: local及自定义容量大小是否正确。
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
data-milvus-release-v25-etcd-0 Bound pvc-e3186833-857e-4d50-99ce-356aa6358a8f 10Gi RWO local <unset> 6m30s
data-milvus-release-v25-etcd-1 Bound pvc-b1f65632-66c9-4eb2-a7f7-8faa8ad2f1ae 10Gi RWO local <unset> 6m30s
data-milvus-release-v25-etcd-2 Bound pvc-02e73bdd-1269-4509-b25e-419bb7041b8a 10Gi RWO local <unset> 6m30s
export-milvus-release-v25-minio-0 Bound pvc-60c3eccd-8cfd-4488-a39c-e52491bb62b1 10Gi RWO local <unset> 6m29s
export-milvus-release-v25-minio-1 Bound pvc-b1156630-ba1f-4f8a-a7ab-3c136c227ae6 10Gi RWO local <unset> 6m29s
export-milvus-release-v25-minio-2 Bound pvc-f048abf3-a516-43d8-93e2-a7c88c12b2a2 10Gi RWO local <unset> 6m29s
export-milvus-release-v25-minio-3 Bound pvc-d43f5998-4a3e-4ca6-82fb-0b87de899a2c 10Gi RWO local <unset> 6m29s
milvus-release-v25-pulsar-bookie-journal-milvus-release-v25-pulsar-bookie-0 Bound pvc-edbb8f05-522a-4e81-9f3c-4eaf35fa8e87 5Gi RWO local <unset> 6m27s
milvus-release-v25-pulsar-bookie-journal-milvus-release-v25-pulsar-bookie-1 Bound pvc-069bb237-97d3-416e-b4dd-021f9ac6a815 5Gi RWO local <unset> 6m26s
milvus-release-v25-pulsar-bookie-journal-milvus-release-v25-pulsar-bookie-2 Bound pvc-5a20aef1-3323-4177-9e8e-0f0e8e581030 5Gi RWO local <unset> 6m26s
milvus-release-v25-pulsar-bookie-ledgers-milvus-release-v25-pulsar-bookie-0 Bound pvc-565551d3-30c1-4d3f-8811-fc89db385df9 5Gi RWO local <unset> 6m27s
milvus-release-v25-pulsar-bookie-ledgers-milvus-release-v25-pulsar-bookie-1 Bound pvc-f70bc3f2-b50d-48bf-8308-6563b05aebb5 5Gi RWO local <unset> 6m26s
milvus-release-v25-pulsar-bookie-ledgers-milvus-release-v25-pulsar-bookie-2 Bound pvc-61abdad3-b4cc-421f-a3c5-d1d1b2659445 5Gi RWO local <unset> 6m26s
milvus-release-v25-pulsar-zookeeper-data-milvus-release-v25-pulsar-zookeeper-0 Bound pvc-db26130e-b6f3-40de-af5f-aa524967cf5e 5Gi RWO local <unset> 6m27s
milvus-release-v25-pulsar-zookeeper-data-milvus-release-v25-pulsar-zookeeper-1 Bound pvc-4d6d198c-9c3f-4367-9ddf-467403a689d0 5Gi RWO local <unset> 6m27s
milvus-release-v25-pulsar-zookeeper-data-milvus-release-v25-pulsar-zookeeper-2 Bound pvc-82d988f9-fbff-4abe-ac17-5c071665b239 5Gi RWO local <unset> 6m27s
以 mixcoord 组件为例,验证资源限制 resources.limits配置是否正确。
$ kubectl get deployment milvus-release-v25-milvus-mixcoord -o jsonpath='{.spec.template.spec.containers[*].resources.limits}' | jq
{
"cpu": "2",
"memory": "8Gi"
}
$ kubectl get deployment milvus-release-v25-milvus-mixcoord -o jsonpath='{.spec.template.spec.containers[0].image}'
registry.opsxlab.cn:8443/milvusdb/milvus:v2.5.4
经常有人问我,如何在 k8s 集群外部访问Milvus 服务?
Milvus 服务默认部署为 ClusterIP 类型,这意味着它只能在 Kubernetes 集群内部被访问。为了让外部应用也能连接到 Milvus,我们需要为其配置外部访问方式。
对 k8s 集群之外发布服务一般有三种方式:
本文将采用最直接的 NodePort 方式,打通 Milvus 与外部世界的连接。
Milvus 默认配置没有设置加密认证,不符合生产环境要求,因此,在开放对外访问之前需要先增加认证配置。
kubectl edit configmap milvus-release-v25 -n default
修改内容如下
apiVersion: v1
data:
user.yaml: |
common:
security:
authorizationEnabled: true
......(已有内容)
修改效果如图:
kubectl -n default rollout restart deployment milvus-release-v25-milvus-mixcoord
kubectl -n default rollout restart deployment milvus-release-v25-milvus-datanode
kubectl -n default rollout restart deployment milvus-release-v25-milvus-indexnode
kubectl -n default rollout restart deployment milvus-release-v25-milvus-proxy
kubectl -n default rollout restart deployment milvus-release-v25-milvus-querynode-0
Service 资源清单 milvus-external-svc.yaml。kind: Service
apiVersion:v1
metadata:
name:milvus-release-v25-external-svc
namespace:default
labels:
app.kubernetes.io/instance:milvus-release-v25
app.kubernetes.io/name:milvus
spec:
ports:
-name:milvus
protocol:TCP
port:
targetPort:milvus
nodePort:
-name:metrics
protocol:TCP
port:
targetPort:metrics
nodePort:
selector:
app.kubernetes.io/component:proxy
app.kubernetes.io/instance:milvus-release-v25
app.kubernetes.io/name:milvus
clusterIP:
type:NodePort
kubectl apply -f milvus-external-svc.yaml
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
milvus-release-v25-external-svc NodePort 10.233.43.114 <none> 19530:31530/TCP,9091:31531/TCP 7s
milvus-release-v25-etcd ClusterIP 10.233.7.167 <none> 2379/TCP,2380/TCP 14m
milvus-release-v25-etcd-headless ClusterIP None <none> 2379/TCP,2380/TCP 14m
milvus-release-v25-milvus ClusterIP 10.233.21.215 <none> 19530/TCP,9091/TCP 12m
milvus-release-v25-minio ClusterIP 10.233.59.255 <none> 9000/TCP 14m
milvus-release-v25-minio-svc ClusterIP None <none> 9000/TCP 14m
milvus-release-v25-pulsar-bookie ClusterIP None <none> 3181/TCP,8000/TCP 14m
milvus-release-v25-pulsar-broker ClusterIP None <none> 8080/TCP,6650/TCP 14m
milvus-release-v25-pulsar-proxy ClusterIP 10.233.41.68 <none> 80/TCP,6650/TCP 14m
milvus-release-v25-pulsar-recovery ClusterIP None <none> 8000/TCP 14m
milvus-release-v25-pulsar-zookeeper ClusterIP None <none> 8000/TCP,2888/TCP,3888/TCP,2181/TCP 14m
Milvus 内置 GUI 工具,名为 Milvus WebUI,您可以通过浏览器访问。Milvus Web UI 通过简单直观的界面增强了系统的可观察性。您可以使用 Milvus Web UI 观察 Milvus 组件和依赖项的统计数据和指标,检查数据库和集合详细信息,并列出详细的 Milvus 配置。有关 Milvus Web UI 的详细信息,请参阅Milvus WebUI 官方文档。
Milvus 部署完成后,使用浏览器打开以下链接,http://k8s任意节点IP:31531/webui/,打开 Web UI 界面。
重要说明:由于默认的WebUi 没有任何密码验证,为了保证安全,生产环境建议不要开放或是在前端用 Nginx 配置基于 Basic认证的代理。
验证外部是否能访问 milvus 的服务端口 31530(内部:19530)。
执行 curl 命令,验证简单端口是否可以连接。
curl http://192.168.9.91:31530
命令返回类似下面的内容,说明端口访问正常。
{"code":1800,"message":"user hasn't authenticated"}
Attu 作为 Milvus 的官方认可的可视化管理工具,以其直观友好的界面深受用户喜爱。它不仅能帮助我们轻松管理 Milvus 数据,还能实时监控集群状态。接下来,我们将详细介绍 Attu 的部署与对外发布过程。
Deployment 资源清单 milvus-attu.yaml。apiVersion: apps/v1
kind:Deployment
metadata:
name:milvus-release-v25-attu
labels:
app:milvus-release-v25-attu
app.kubernetes.io/component:attu
app.kubernetes.io/name:milvus
spec:
replicas:
selector:
matchLabels:
app:milvus-release-v25-attu
app.kubernetes.io/component:attu
app.kubernetes.io/name:milvus
template:
metadata:
labels:
app:milvus-release-v25-attu
app.kubernetes.io/component:attu
app.kubernetes.io/name:milvus
spec:
containers:
-name:milvus-attu
image:registry.opsxlabs.cn:8443/zilliz/attu:v2.5
imagePullPolicy:IfNotPresent
ports:
-name:milvus-attu
containerPort:
protocol:TCP
env:
-name:MILVUS_URL
value:"milvus-release-v25-milvus:19530"
kubectl apply -f milvus-attu.yaml
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
milvus-release-v25-attu 1/1 1 1 24s
......(省略一万字)
Service 资源清单 milvus-attu-svc.yaml,通过 NodePort 方式对外发布。apiVersion: v1
kind:Service
metadata:
name:milvus-release-v25-external-svc-attu
labels:
app:milvus-release-v25-attu
app.kubernetes.io/name:milvus
spec:
type:NodePort
clusterIP:
ports:
-name:attu
protocol:TCP
port:
targetPort:
nodePort:
selector:
app:milvus-release-v25-attu
app.kubernetes.io/component:attu
app.kubernetes.io/name:milvus
kubectl apply -f milvus-attu-svc.yaml
Attu 部署完成后,使用浏览器打开以下链接:http://k8s任意节点IP:31532,打开 Attu 管理界面。
在管理页面使用以下信息连接 Milvus 数据库:
登录成功后如图:
通过本文,我们详细探讨了如何利用 Milvus Operator 在离线环境中部署 Milvus 向量数据库,并成功配置了外部访问和可视化管理工具 Attu。Milvus Operator 极大地简化了 Milvus 在 Kubernetes 上的部署和管理,使其成为构建 AI 应用向量数据底座的理想选择。
本文仅完成了 Milvus 集群离线部署的初步实践,对于生产级 Milvus 集群还需要注意以下事项:
展望未来,随着 AI 技术的飞速发展,向量数据库将在更多场景中发挥核心作用。Milvus 作为开源向量数据库的佼佼者,其生态系统将持续完善,为开发者提供更强大、更便捷的工具和解决方案。