首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >三强联手! Milvus + k8s + KubeSphere, 手把手教你离线部署生产级 AI 向量数据底座

三强联手! Milvus + k8s + KubeSphere, 手把手教你离线部署生产级 AI 向量数据底座

作者头像
运维有术
发布2025-06-30 10:55:04
发布2025-06-30 10:55:04
1.7K0
举报
文章被收录于专栏:运维有术运维有术

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

实战环境涉及软件版本信息

  • 操作系统:openEuler 24.03 LTS SP1 x86_64
  • KubeSphere: v4.1.3
  • Kubernetes:v1.32.5
  • Milvus: v.2.5.13
  • Milvus Operator:v1.3.0-rc1

1. Milvus 部署架构一览

milvus-operator-deployment-architecture-v1.0
milvus-operator-deployment-architecture-v1.0

2. 部署前必读:环境准备与核心要点

2.1 K8s 集群就绪

考虑到文章篇幅,本文将不再赘述 K8s 集群的部署细节。各位读者可根据自身偏好,选择合适的工具和方式进行部署。如果你是初学者,可以参考我之前的文章:告别宕机!KubeSphere v4.1.3 联手 K8s v1.32.5,手把手教你打造“永不掉线”的云原生底座

2.2 存储类配置

请确保你的 K8s 集群已配置存储类(StorageClass)。在本次实验环境中,我们准备了两种存储类:

  • 默认的本地存储类 local本文将采用此项
  • 基于 NFS 的存储类 nfs-sc
代码语言:javascript
复制
kubectl 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!

2.3 离线镜像制作:告别网络依赖

  1. 获取原始镜像

对于离线环境,镜像包的准备至关重要。官方提供了详细(但略显复杂)的离线制作工具和指南,你可以参考 Milvus 官方离线安装文档。但更简单的方法是,找一台能联网并能下载 Docker 镜像的机器。

执行以下脚本,拉取所需镜像:

代码语言:javascript
复制
# 拉取原始镜像
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
  1. 打包与压缩镜像

为了方便传输和管理,我们将这些镜像打包并进行压缩:

代码语言:javascript
复制
# 打包镜像为 .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
  1. 查看打包后镜像大小

不同格式的镜像包大小对比如下:

代码语言:javascript
复制
# 未压缩的 .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. 获取已打包的离线镜像

如果你觉得手动制作离线镜像不方便,也可以从我这里下载已制作好的镜像包:

代码语言:javascript
复制
链接1:https://pan.quark.cn/s/b1b6c7d64e24?pwd=h94z
提取码:h94z

链接2:https://pan.xunlei.com/s/VOTtm7MXoECzIwd7INcOisSYA1
提取码:rmhe

2.4 离线镜像上传:打通内部仓库

完成镜像打包后,接下来需要将 milvus-images-v2.5.13.tar.gz 上传到你的离线镜像仓库。这里我们以 Harbor 为例,假设内部域名为 registry.opsxlabs.cn:8443

步骤一:创建 Harbor 项目

为了与官方镜像地址前缀保持一致,请在 Harbor 中创建以下四个项目:

  • milvusdb
  • minio
  • apachepulsar
  • zilliz

步骤二:加载镜像

将打包好的镜像加载到 Docker 中:

代码语言:javascript
复制
# docker load 会自动识别并解压 .tar.gz 文件
docker load -i milvus-images-v2.5.13.tar.gz

步骤三:重新打 Tag 并推送镜像

执行以下脚本,为镜像重新打上内部仓库的 Tag,并将其推送到 Harbor:

代码语言:javascript
复制
# 重新打 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

2.5 部署资源清单准备:核心配置先行

  1. 获取 Operator 部署清单

首先,下载 Milvus Operator 的部署资源清单:

代码语言:javascript
复制
wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/deploy/manifests/deployment.yaml
  1. 获取 Milvus 集群部署清单

接着,下载 Milvus 集群的默认部署资源清单:

代码语言:javascript
复制
wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml

默认清单内容预览:

代码语言:javascript
复制
# 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 集群部署资源清单不适用于离线环境。在后续步骤中,我们将基于此配置进行定制化修改,以适应离线部署的需求。

  1. 上传资源清单至 K8s 集群

将下载好的资源清单文件上传到离线 K8s 集群的 Control-1 节点,并统一存放在 /srv/milvus 目录下。

操作规范:

  • 命令执行位置: 所有 K8s 集群相关操作均在 Control-1 节点执行。
  • 配置文件路径: 统一使用 /srv/milvus 目录存放配置文件。

万事俱备,我们开始在离线环境部署 Milvus Operator 和 Milvus 集群吧!

3. Milvus Operator 部署:核心组件就位

3.1 检查 Operator 部署资源清单

首先,确认 Operator 的部署资源清单文件 deployment.yaml 已就位:

代码语言:javascript
复制
ls /srv/milvus/deployment.yaml

3.2 修改资源清单:适配离线环境

为了确保 Operator 能够正确拉取离线镜像,我们需要修改 deployment.yaml 文件,将原始镜像地址替换为你的内部镜像仓库地址:

代码语言:javascript
复制
$ sed -i 's#milvusdb/milvus-operator:v1.3.0-rc1#registry.opsxlabs.cn:8443/&#g' deployment.yaml

3.3 部署 Milvus Operator

执行以下命令,开始安装 Milvus Operator:

代码语言:javascript
复制
$ kubectl apply -f deployment.yaml

安装过程完成后,你将看到类似如下的输出,这表明 Operator 的相关资源已成功创建:

代码语言:javascript
复制
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

3.4 验证 Operator 部署状态

运行以下命令,检查 Milvus Operator 的 deployment 和 pod 资源是否已成功启动并运行:

代码语言:javascript
复制
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-deployments-v130-rc1
milvus-operator-deployments-v130-rc1

4. Milvus 集群部署:定制化与验证

4.1 部署 Milvus 集群:个性化配置

当 Milvus Operator 的 Pod 正常运行后,我们就可以着手部署 Milvus 集群了。我们将对默认的 milvus_cluster_default.yaml 资源清单进行定制化修改,以满足以下常见场景需求:

  • 自定义集群名称: 设置为 milvus-release-v25,便于识别和管理。
  • 指定离线镜像仓库: 将所有镜像源指向内部离线仓库 registry.opsxlab.cn:8443,确保离线部署的顺利进行。
  • 明确存储类: 当 K8s 集群存在多个存储类时,为 MinIO、etcd 等持久化存储组件指定使用的存储类名称。本文以 local 为例。
  • 精细化资源配置: 调整 Milvus 各组件的 CPU 和内存资源限制(limits)与请求(requests)。这能有效避免因默认配置资源过大或过小,导致 K8s 节点宕机或 Milvus 集群无法创建的问题。
  • 资源自动清理: 配置在删除 Milvus 集群时,自动清理所有相关资源,避免残留。

修改后的资源清单示例:

代码语言:javascript
复制
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 集群:

代码语言:javascript
复制
$ kubectl apply -f milvus_cluster_default.yaml

4.2 验证 Milvus 集群状态:步步为营

Milvus Operator 会智能地先创建 Milvus 所依赖的中间件(如 Etcd、Zookeeper、Pulsar 和 MinIO),随后再部署 Milvus 核心组件(如代理、协调器和节点)。

  1. 检查依赖组件状态(StatefulSet)

首先,确认所有依赖组件的 StatefulSet 均已正常运行:

代码语言:javascript
复制
$ 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-statefulsets-v2513
milvus-statefulsets-v2513
  1. 检查 Milvus 服务组件状态(Deployment)

接下来,验证 Milvus 核心服务组件的 Deployment 状态:

代码语言:javascript
复制
$ 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-deployments-v2513
milvus-deployments-v2513

这里有一个值得注意的现象: Milvus Operator 会创建一个副本数为 0 的 standalone 和 querynode-1 组件。初次见到可能会感到疑惑,但经过多次部署验证,这似乎是 Operator 的正常行为,它们会自动创建并停止。

这两个看似奇怪的组件,我第一次见到就感到非常奇怪,经过多次的部署验证,发现每次部署都会自动创建并停止,貌似属于 Operator 的正常操作

带着这份好奇,我曾在 Milvus Operator 社区提交了一个 Issue,官方的回复如下:

milvus-operator-issues-274-1
milvus-operator-issues-274-1
milvus-operator-issues-274-2
milvus-operator-issues-274-2

官方解释(机器译):

A:这是预期行为。我们保留了独立部署,以便在不中断服务的情况下,能够从集群模式扩展到独立部署模式。

B:对于 querynode-1 和 querynode-0,它们在滚动升级时非常有用。最终,正如您在 Issue 中所见,两者中只有一个会保持运行状态。

  1. 验证所有 Pod 运行状态

当 Milvus 集群成功部署并准备就绪后,所有 Pod 的状态应类似于以下内容:

代码语言:javascript
复制
$ 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
  1. 验证存储类

验证是否使用了自定义的 storageClass: local及自定义容量大小是否正确。

代码语言:javascript
复制
$ 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
  1. 验证 Milvus 资源限制

以 mixcoord 组件为例,验证资源限制 resources.limits配置是否正确。

代码语言:javascript
复制
$ kubectl get deployment milvus-release-v25-milvus-mixcoord -o jsonpath='{.spec.template.spec.containers[*].resources.limits}' | jq
{
  "cpu": "2",
  "memory": "8Gi"
}
  1. 验证自定义镜像
代码语言:javascript
复制
$ 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

5. 开放 Milvus 外部访问:打通内外连接

经常有人问我,如何在 k8s 集群外部访问Milvus 服务?

Milvus 服务默认部署为 ClusterIP 类型,这意味着它只能在 Kubernetes 集群内部被访问。为了让外部应用也能连接到 Milvus,我们需要为其配置外部访问方式。

对 k8s 集群之外发布服务一般有三种方式:

  • Nodeport
  • Ingress
  • 负载均衡

本文将采用最直接的 NodePort 方式,打通 Milvus 与外部世界的连接。

5.1 配置 Milvus 开启认证

Milvus 默认配置没有设置加密认证,不符合生产环境要求,因此,在开放对外访问之前需要先增加认证配置。

  1. 编辑 configmap 修改配置如下

kubectl edit configmap milvus-release-v25 -n default

修改内容如下

代码语言:javascript
复制
apiVersion: v1
data:
  user.yaml: |
    common:
      security:
        authorizationEnabled: true
    ......(已有内容)

修改效果如图:

milvus-configmap-security-v25
milvus-configmap-security-v25
  1. 重启 milvs 组件
代码语言:javascript
复制
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

5.2 NodePort 发布 Milvus 服务:配置与部署

  1. 创建并编辑外部访问 Milvus 服务的 Service 资源清单 milvus-external-svc.yaml
代码语言:javascript
复制
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
  1. 执行命令,创建外部服务。
代码语言:javascript
复制
kubectl apply -f milvus-external-svc.yaml
  1. 查看服务状态
代码语言:javascript
复制
$ 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

5.3 访问 Milvus WebUI:可视化管理初体验

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 界面。

milvus-webui-home-v2513
milvus-webui-home-v2513

重要说明:由于默认的WebUi 没有任何密码验证,为了保证安全,生产环境建议不要开放或是在前端用 Nginx 配置基于 Basic认证的代理。

5.4 验证数据服务端口:确保外部连通性

验证外部是否能访问 milvus 的服务端口 31530(内部:19530)。

执行 curl 命令,验证简单端口是否可以连接。

代码语言:javascript
复制
curl http://192.168.9.91:31530

命令返回类似下面的内容,说明端口访问正常。

代码语言:javascript
复制
{"code":1800,"message":"user hasn't authenticated"}

6. Milvus 可视化管理:Attu 部署与实践

Attu 作为 Milvus 的官方认可的可视化管理工具,以其直观友好的界面深受用户喜爱。它不仅能帮助我们轻松管理 Milvus 数据,还能实时监控集群状态。接下来,我们将详细介绍 Attu 的部署与对外发布过程。

6.1 Attu 部署:配置与启动

  1. 创建 Attu 的 Deployment 资源清单 milvus-attu.yaml
代码语言:javascript
复制
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"
  1. 部署 Attu
代码语言:javascript
复制
kubectl apply -f milvus-attu.yaml
  1. 查看部署结果
代码语言:javascript
复制
$ kubectl get deployment
NAME                                    READY   UP-TO-DATE   AVAILABLE   AGE
milvus-release-v25-attu                 1/1     1            1           24s
......(省略一万字)

6.2 Attu 对外发布:便捷访问

  1. 创建 Attu 的 Service 资源清单 milvus-attu-svc.yaml,通过 NodePort 方式对外发布。
代码语言:javascript
复制
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
  1. 发布服务
代码语言:javascript
复制
kubectl apply -f milvus-attu-svc.yaml

6.3 访问 Attu:连接 Milvus 数据库

Attu 部署完成后,使用浏览器打开以下链接:http://k8s任意节点IP:31532,打开 Attu 管理界面。

在管理页面使用以下信息连接 Milvus 数据库:

  • Milvus 的外部地址(主要是为了验证 Milvus 外部服务是否可用,实际使用中可保持默认配置:即使用集群内部地址
  • 默认用户名和密码(root/Milvus。登录成功后,请立即修改密码!
milvus-attu-login-v25
milvus-attu-login-v25

登录成功后如图:

milvus-attu-home-v25
milvus-attu-home-v25

7. 总结与展望:AI 向量数据底座的未来

通过本文,我们详细探讨了如何利用 Milvus Operator 在离线环境中部署 Milvus 向量数据库,并成功配置了外部访问和可视化管理工具 Attu。Milvus Operator 极大地简化了 Milvus 在 Kubernetes 上的部署和管理,使其成为构建 AI 应用向量数据底座的理想选择。

本文仅完成了 Milvus 集群离线部署的初步实践,对于生产级 Milvus 集群还需要注意以下事项:

  1. 安全配置:确保 Milvus 服务的访问控制和认证机制。
  2. 存储配置:根据数据量和访问模式,合理规划存储配置。
  3. 监控与告警:设置完善的监控系统,及时发现和解决问题。
  4. 备份与恢复:设置完善的备份策略,确保数据的安全性和可用性。
  5. 性能优化:根据业务负载和硬件配置,优化 Milvus 的性能参数。
  6. 高可用与容灾:配置多副本和异地多活策略,增强系统的可用性。

展望未来,随着 AI 技术的飞速发展,向量数据库将在更多场景中发挥核心作用。Milvus 作为开源向量数据库的佼佼者,其生态系统将持续完善,为开发者提供更强大、更便捷的工具和解决方案。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维有术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. Milvus 部署架构一览
  • 2. 部署前必读:环境准备与核心要点
    • 2.1 K8s 集群就绪
    • 2.2 存储类配置
    • 2.3 离线镜像制作:告别网络依赖
    • 2.4 离线镜像上传:打通内部仓库
    • 2.5 部署资源清单准备:核心配置先行
  • 3. Milvus Operator 部署:核心组件就位
    • 3.1 检查 Operator 部署资源清单
    • 3.2 修改资源清单:适配离线环境
    • 3.3 部署 Milvus Operator
    • 3.4 验证 Operator 部署状态
  • 4. Milvus 集群部署:定制化与验证
    • 4.1 部署 Milvus 集群:个性化配置
    • 4.2 验证 Milvus 集群状态:步步为营
  • 5. 开放 Milvus 外部访问:打通内外连接
    • 5.1 配置 Milvus 开启认证
    • 5.2 NodePort 发布 Milvus 服务:配置与部署
    • 5.3 访问 Milvus WebUI:可视化管理初体验
    • 5.4 验证数据服务端口:确保外部连通性
  • 6. Milvus 可视化管理:Attu 部署与实践
    • 6.1 Attu 部署:配置与启动
    • 6.2 Attu 对外发布:便捷访问
    • 6.3 访问 Attu:连接 Milvus 数据库
  • 7. 总结与展望:AI 向量数据底座的未来
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档