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

KubeSphere 部署向量数据库 Milvus 实战指南

作者:运维有术星主

Milvus 是一个为通用人工智能(GenAI)应用而构建的开源向量数据库。它以卓越的性能和灵活性,提供了一个强大的平台,用于存储、搜索和管理大规模的向量数据。Milvus 能够执行高速搜索,并以最小的性能损失扩展到数百亿向量。其分布式架构确保了系统的高可用性和水平可扩展性,满足不断增长的数据需求。同时,Milvus 提供了丰富的 API 和集成选项,使其成为机器学习、计算机视觉和自然语言处理等 AI 应用的理想选择。

随着 AI 大模型的兴起,Milvus 成为了众多 AI 应用的首选向量数据库。本文将引导您探索,如何在 KubeSphere 管理的 Kubernetes 集群上,高效地部署和管理 Milvus 集群,让您的应用能够充分利用 Milvus 的强大功能。

实战服务器配置(架构 1:1 复刻小规模生产环境,配置略有不同)

主机名IPCPU内存系统盘数据盘用途
ksp-registry192.168.9.904840200Harbor 镜像仓库
ksp-control-1192.168.9.914840100KubeSphere/k8s-control-plane
ksp-control-2192.168.9.924840100KubeSphere/k8s-control-plane
ksp-control-3192.168.9.934840100KubeSphere/k8s-control-plane
ksp-worker-1192.168.9.9481640100k8s-worker/CI
ksp-worker-2192.168.9.9581640100k8s-worker
ksp-worker-3192.168.9.9681640100k8s-worker
ksp-storage-1192.168.9.974840400+ElasticSearch/Longhorn/Ceph/NFS
ksp-storage-2192.168.9.984840300+ElasticSearch/Longhorn/Ceph
ksp-storage-3192.168.9.994840300+ElasticSearch/Longhorn/Ceph
ksp-gpu-worker-1192.168.9.10141640100k8s-worker(GPU NVIDIA Tesla M40 24G)
ksp-gpu-worker-2192.168.9.10241640100k8s-worker(GPU NVIDIA Tesla P100 16G)
ksp-gateway-1192.168.9.1032440自建应用服务代理网关/VIP:192.168.9.100
ksp-gateway-2192.168.9.1042440自建应用服务代理网关/VIP:192.168.9.100
ksp-mid192.168.9.1054840100部署在 k8s 集群之外的服务节点(Gitlab 等)
合计15681526002100+

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

  • 操作系统:openEuler 22.03 LTS SP3 x86_64
  • KubeSphere:v3.4.1
  • Kubernetes:v1.28.8
  • KubeKey: v3.1.1
  • Milvus Helm Charts:4.2.0
  • Milvus: v.2.4.6

1. Milvus 部署规划

部署目标:官方架构图所示的 Milvus 集群(不包含 Load Balancer)。

milvus-architecture-overview

由于是初次安装部署,对 Milvus 的架构、组件关系仅有一个初步的了解,所以第一次部署只做如下考虑:

  • 使用 Helm 的方式,大部分配置采用默认的 Values 部署
  • 更改组件镜像地址为本地私有仓库
  • 持久化存储使用自定义的 NFS 存储类 nfs-sc(生产不建议用,可能会造成磁盘 IO 不满足 etcd 的需求)
  • coordinators 没有选择 mixCoordinator,而是使用多个独立的 coordinators,这种方案运维成本高,维护麻烦
  • 消息队列使用官方默认推荐的 pulsar,不选择 kafka

后续会深入研究,更正式的部署考虑:

  • 使用 Helm 和自定义 values 生成部署资源清单,修改清单,使用原生 kubectl 方式部署
  • 使用 Ceph 或是其它高性能存储,不使用 NFS 存储
  • 消息队列继续使用官方推荐的 pulsar
  • 使用社区官方推荐的包含所有 coordinators 的 mixCoordinator ,降低运维成本
  • 合理规划 Minio、Etcd、pulsar 等组件使用持久化存储时所分配的存储空间,默认配置不可能满足所有场景
  • Milvus 日志存储到持久化存储,适配没有集中日志采集能力的 k8s 集群

重要说明: 本文的内容对于安装部署 Milvus 有一定的借鉴意义,但切勿将本文的实战过程直接用于任何类型的正式环境

2. 前置条件

以下内容来自 Milvus 官方环境需求文档,比较好理解,不做翻译了。

2.1 硬件需求

ComponentRequirementRecommendationNote
CPUIntel 2nd Gen Core CPU or higherApple SiliconStandalone: 4 core or moreCluster: 8 core or more
CPU instruction setSSE4.2AVXAVX2AVX-512SSE4.2AVXAVX2AVX-512Vector similarity search and index building within Milvus require CPU's support of single instruction, multiple data (SIMD) extension sets. Ensure that the CPU supports at least one of the SIMD extensions listed. See CPUs with AVX for more information.
RAMStandalone: 8GCluster: 32GStandalone: 16GCluster: 128GThe size of RAM depends on the data volume.
Hard driveSATA 3.0 SSD or CloudStorageNVMe SSD or higherThe size of hard drive depends on the data volume.

2.2 软件需求

Operating systemSoftwareNote
Linux platformsKubernetes 1.16 or laterkubectlHelm 3.0.0 or laterminikube (for Milvus standalone)Docker 19.03 or later (for Milvus standalone)See Helm Docs for more information.
SoftwareVersionNote
etcd3.5.0See additional disk requirements.
MinIORELEASE.2023-03-20T20-16-18Z
Pulsar2.8.2

2.3 磁盘需求

磁盘性能对 etcd 至关重要。官方强烈建议使用本地 NVMe SSD 磁盘。较慢的磁盘响应可能导致频繁的集群选举,最终降低 etcd 服务的性能,甚至是集群的崩溃。

这个需求比较重要,我刚接触 Milvus 时,由于时间比较仓促,在略知一二的情况下,使用默认配置部署了一套半生产的 Milvus 集群。

因为选择了 NFS 存储且没有测试磁盘 IO 性能,经常会出现 etcd 服务异常,响应慢,被 Kubernetes 的存活检测机制判断为不可用,导致频繁自动重建 etcd 集群。

因此,在 K8s 上创建 Milvus 集群时最好先测试一下集群持久化存储的性能。

Milvus 官方给出的测试磁盘性能的工具和命令如下:

mkdir test-data
fio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=2200m --bs=2300 --name=mytest

测试结果,理想情况下,您的磁盘应该达到 500 IOPS 以上,99th percentile fsync latency 低于 10ms。请阅读 etcd 官方文档 了解更详细的需求。

具体的磁盘性能测试过程,请参考下文。

2.4 Kubernetes 集群配置

k8s 集群一定要配置默认存储类,Milvus 的 Helm 控制 storageClass 的参数不够灵活,最好直接使用默认存储类,简化配置。

3. 持久化存储性能测试

实战环境使用了自建的 NFS 存储,部署 Milvus 之前,先测试存储性能:

官方建议的测试工具是 fio ,为了在 K8s 中模拟测试,我选择了 openEBS 官方提供的 openebs/tests-fio:latest 作为测试镜像,创建测试 Pod。

3.1 创建测试 pvc

编辑测试 PVC 资源清单,vi test-nfs-fio-pvc.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: test-nfs-fio-pvc
spec:storageClassName: nfs-scaccessModes:- ReadWriteManyresources:requests:storage: 1Gi

执行命令,创建 PVC。

kubectl apply -f test-nfs-fio-pvc.yaml

3.2 创建测试 Pod

编辑测试 Pod 资源清单,vi test-nfs-fio-pod.yaml

kind: Pod
apiVersion: v1
metadata:name: test-nfs-fio-pod
spec:containers:- name: test-nfs-fio-podimage: openebs/tests-fio:latestcommand:- "/bin/sh"args:- "-c"- "touch /mnt/SUCCESS && sleep 86400"volumeMounts:- name: nfs-fio-pvcmountPath: "/mnt"restartPolicy: "Never"volumes:- name: nfs-fio-pvcpersistentVolumeClaim:claimName: test-nfs-fio-pvc

执行命令,创建 Pod。

kubectl apply -f test-nfs-fio-pod.yaml

3.3 连接测试 Pod 终端

执行下面的命令,打开 fio 测试 Pod 终端。

kubectl exec -it test-nfs-fio-pod -- /bin/bash

查看已经挂载的 NFS 存储。

root@test-nfs-fio-pod:/# df -h
Filesystem                                                                                   Size  Used Avail Use% Mounted on
overlay                                                                                      100G  6.5G   94G   7% /
tmpfs                                                                                         64M     0   64M   0% /dev
tmpfs                                                                                        7.6G     0  7.6G   0% /sys/fs/cgroup
192.168.9.97:/datanfs/k8s/default-test-nfs-fio-pvc-pvc-7158aa17-f003-47a2-b6d6-07c69d014178  100G  746M  100G   1% /mnt
/dev/mapper/openeuler-root                                                                    35G  2.3G   31G   7% /etc/hosts
/dev/mapper/data-lvdata                                                                      100G  6.5G   94G   7% /etc/hostname
shm                                                                                           64M     0   64M   0% /dev/shm
tmpfs                                                                                         14G   12K   14G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                                                                                        7.6G     0  7.6G   0% /proc/acpi
tmpfs                                                                                        7.6G     0  7.6G   0% /proc/scsi
tmpfs                                                                                        7.6G     0  7.6G   0% /sys/firmware

3.4 测试磁盘性能

执行下面的测试命令。

mkdir /mnt/test-data
fio --rw=write --ioengine=sync --fdatasync=1 --directory=/mnt/test-data --size=2200m --bs=2300 --name=nfstest

测试结果:

root@test-nfs-fio-pod:/# fio --rw=write --ioengine=sync --fdatasync=1 --directory=/mnt/test-data --size=2200m --bs=2300 --name=nfstest
nfstest: (g=0): rw=write, bs=2300-2300/2300-2300/2300-2300, ioengine=sync, iodepth=1
fio-2.2.10
Starting 1 process
nfstest: Laying out IO file(s) (1 file(s) / 2200MB)
Jobs: 1 (f=1): [W(1)] [100.0% done] [0KB/956KB/0KB /s] [0/426/0 iops] [eta 00m:00s]
nfstest: (groupid=0, jobs=1): err= 0: pid=26: Tue Jul 23 02:55:35 2024write: io=2199.2MB, bw=870003B/s, iops=378, runt=2651558msecclat (usec): min=4, max=87472, avg=224.30, stdev=309.99lat (usec): min=4, max=87473, avg=224.71, stdev=310.00clat percentiles (usec):|  1.00th=[    7],  5.00th=[    8], 10.00th=[    8], 20.00th=[    9],| 30.00th=[   10], 40.00th=[   12], 50.00th=[  302], 60.00th=[  338],| 70.00th=[  366], 80.00th=[  398], 90.00th=[  442], 95.00th=[  482],| 99.00th=[  588], 99.50th=[  700], 99.90th=[ 1848], 99.95th=[ 3120],| 99.99th=[ 7008]bw (KB  /s): min=    1, max= 1078, per=100.00%, avg=873.03, stdev=221.69lat (usec) : 10=25.84%, 20=16.33%, 50=1.64%, 100=0.03%, 250=0.23%lat (usec) : 500=52.30%, 750=3.19%, 1000=0.15%lat (msec) : 2=0.20%, 4=0.05%, 10=0.03%, 20=0.01%, 50=0.01%lat (msec) : 100=0.01%cpu          : usr=0.38%, sys=1.56%, ctx=1567342, majf=0, minf=12IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%issued    : total=r=0/w=1002985/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0latency   : target=0, window=0, percentile=100.00%, depth=1Run status group 0 (all jobs):WRITE: io=2199.2MB, aggrb=849KB/s, minb=849KB/s, maxb=849KB/s, mint=2651558msec, maxt=2651558msec

测试结果说明: 测试结果明显不符合官方建议的最低值。由于,是个人测试环境也就无所谓了。生产环境请严谨测试、评估

4. 使用 Helm 安装 Milvus 集群

Milvus 官方提供了 Operator、Helm 等多种方式的集群安装文档。本文实战演示了 Helm 的安装方式。其他方式请参考 Milvus 官方文档。

4.1 安装 Milvus Helm Chart

添加 Milvus Helm repository。

helm repo add milvus https://zilliztech.github.io/milvus-helm/

更新本地 charts。

helm repo update milvus

4.2 安装 Milvus

官方默认安装命令(仅供参考,本文未用)。

helm install my-release milvus/milvus

按规划设置自定义配置项,执行下面的安装命令:

helm install --namespace opsxlab --create-namespace opsxlab milvus/milvus \--set image.all.repository="milvusdb/milvus" \--set image.tools.repository="milvusdb/milvus-config-tool" \--set etcd.image.registry="docker.io" \--set etcd.image.repository="milvusdb/etcd" \--set pulsar.images.broker.repository="milvusdb/pulsar" \--set pulsar.images.autorecovery.repository="milvusdb/pulsar" \--set pulsar.images.zookeeper.repository="milvusdb/pulsar" \--set pulsar.images.bookie.repository="milvusdb/pulsar" \--set pulsar.images.proxy.repository="milvusdb/pulsar" \--set pulsar.images.pulsar_manager.repository="milvusdb/pulsar-manager" \--set pulsar.pulsar_metadata.image.repository="milvusdb/pulsar" \--set minio.image.repository="milvusdb/minio" \--set etcd.persistence.storageClass="nfs-sc" \--set minio.persistence.storageClass="nfs-sc" \--set pulsar.zookeeper.volumes.data.storageClassName="nfs-sc" \--set pulsar.bookkeeper.volumes.journal.storageClassName="nfs-sc"

自定义配置说明:

  • 指定并自动创建命名空间 opsxlab
  • 设置组件的镜像地址,本文为了演示修改方法,保留了默认值,实际使用中可以修改为自己的镜像仓库地址
  • etcd 的镜像地址比较特殊,有两个配置项,请注意
  • 设置持久化存储类为 nfs-sc,适用于 k8s 有多种存储类,需要部署到指定存储类的场景
  • 所有配置仅供参考,请参考官方文档查看更详细的配置

附录: 默认安装的组件镜像地址及版本:

序号组件名称默认 repository组件版本
1milvusmilvusdb/milvusv2.4.6
2milvus-config-toolmilvusdb/milvus-config-toolv0.1.2
3etcdmilvusdb/etcd3.5.5-r4
4pulsarapachepulsar/pulsar2.9.5
5pulsar-managerapachepulsar/pulsar-managerv0.1.0
6miniominio/minioRELEASE.2023-03-20T20-16-18Z

4.3 查看安装结果

Helm 安装命令成功执行后,观察 Pod 运行状态。

kubectl get pods -n opsxlab

安装成功后,输出结果如下:

$ kubectl get pods -n opsxlab
NAME                                         READY   STATUS      RESTARTS        AGE
opsxlab-etcd-0                               1/1     Running     0               8m9s
opsxlab-etcd-1                               1/1     Running     0               8m20s
opsxlab-etcd-2                               1/1     Running     0               11m
opsxlab-milvus-datacoord-6cd875684d-fbkgx    1/1     Running     6 (9m19s ago)   13m
opsxlab-milvus-datanode-5c5558cbc7-r24vj     1/1     Running     6 (9m40s ago)   13m
opsxlab-milvus-indexcoord-f48d66647-52crb    1/1     Running     0               13m
opsxlab-milvus-indexnode-c6979d59b-rvm5p     1/1     Running     6 (9m44s ago)   13m
opsxlab-milvus-proxy-79997676f9-hftdf        1/1     Running     6 (9m22s ago)   13m
opsxlab-milvus-querycoord-5d94f97dc4-tv52n   1/1     Running     6 (9m43s ago)   13m
opsxlab-milvus-querynode-59b9bd7c8b-7qljj    1/1     Running     6 (9m26s ago)   13m
opsxlab-milvus-rootcoord-745b9fbb68-mr7st    1/1     Running     6 (9m36s ago)   13m
opsxlab-minio-0                              1/1     Running     0               13m
opsxlab-minio-1                              1/1     Running     0               13m
opsxlab-minio-2                              1/1     Running     0               13m
opsxlab-minio-3                              1/1     Running     0               13m
opsxlab-pulsar-bookie-0                      1/1     Running     0               13m
opsxlab-pulsar-bookie-1                      1/1     Running     0               13m
opsxlab-pulsar-bookie-2                      1/1     Running     0               13m
opsxlab-pulsar-bookie-init-7l4kh             0/1     Completed   0               13m
opsxlab-pulsar-broker-0                      1/1     Running     0               13m
opsxlab-pulsar-proxy-0                       1/1     Running     0               13m
opsxlab-pulsar-pulsar-init-ntbh8             0/1     Completed   0               13m
opsxlab-pulsar-recovery-0                    1/1     Running     0               13m
opsxlab-pulsar-zookeeper-0                   1/1     Running     0               13m
opsxlab-pulsar-zookeeper-1                   1/1     Running     0               13m
opsxlab-pulsar-zookeeper-2                   1/1     Running     0               12m

KubeSphere 管理控制台查看部署的组件信息。

  • Depolyment(8 个

milvus-deployments-v2.4.6

  • StatefulSet(7 个

milvus-statefulsets-v2.4.6

  • Services(17 个

milvus-services-v2.4.6

从上面的 Deployment、StatefulSet、Services 资源数量来看,默认部署的 Milvus 组件还是比较多的,后期运维成本比较高。

4.4 配置认证并开启外部访问

默认配置部署的 Milvus,没有启用安全认证,任何人都可以随意读写。这不符合生产环境要求,因此,需要增加认证配置。

创建并编辑 Helm 自定义 values 配置文件,vi custom-milvus.yaml

extraConfigFiles:user.yaml: |+common:security:authorizationEnabled: true

执行 helm 命令更新配置。

helm upgrade opsxlab milvus/milvus --values custom-milvus.yaml -n opsxlab

注意: 如果安装时自定义了镜像地址,上面的操作会导致所有组件的镜像地址被还原成 helm 默认值,请谨慎使用。

默认配置部署的 Milvus 只能被 K8s 集群内部资源访问,如果开放给集群外部,需要定义外部访问方式,本文选择最简单的 NodePort 方式。

创建并编辑外部访问 svc 资源清单,vi milvus-external-svc.yaml

kind: Service
apiVersion: v1
metadata:name: opsxlab-milvus-externalnamespace: opsxlablabels:app: opsxlab-milvus-externalapp.kubernetes.io/name: milvus
spec:ports:- name: milvusprotocol: TCPport: 19530targetPort: 19530nodePort: 31011selector:app.kubernetes.io/instance: opsxlabapp.kubernetes.io/name: milvuscomponent: proxyclusterIP:type: NodePort

执行命令,创建外部服务。

kubectl apply -f milvus-external-svc.yaml

4.5 验证测试 Milvus 服务可用性

Milvus 官方默认提供了 hello_milvus.py 工具,用来测试数据库的连接和读写。

工具获取方式:

wget https://raw.githubusercontent.com/milvus-io/pymilvus/master/examples/hello_milvus.py

该脚本运行需要 Python 环境,为了测试方便,我自己制作了一个 Docker 镜像,可用于在 Docker、k8s 环境中进行测试。

创建并编辑 milvus 测试 Pod 资源清单,vi test-milvus-pod.yaml

kind: Pod
apiVersion: v1
metadata:name: test-milvus-pod
spec:containers:- name: test-milvus-podimage: opsxlab/milvus-hello:v2.3.7-amd64command:- "/bin/sh"args:- "-c"- "sleep 86400"restartPolicy: "Never"

执行命令,创建测试 Pod。

kubectl apply -f test-milvus-pod.yam

登录测试容器终端(等待一段时间,确认 Pod 创建成功后执行)。

kubectl exec -it test-milvus-pod -- /bin/bash

官方hello_milvus.py 脚本,默认连接不带密码认证的 Milvus 集群。我们的集群增加了认证,需要修改脚本,添加认证配置,默认的用户名和密码为 root/Milvus

# 原内容(32行)connections.connect("default", host="localhost", port="19530")# 修改为
connections.connect("default", host="192.168.9.91", port="31011", user="root", password='Milvus')

执行测试命令。

python hello_milvus.py

正确执行后,输出结果如下 :

root@test-milvus-pod:/app# python hello_milvus.py=== start connecting to Milvus     ===Does collection hello_milvus exist in Milvus: False=== Create collection `hello_milvus` ====== Start inserting entities       ===Number of entities in Milvus: 3001=== Start Creating index IVF_FLAT  ====== Start loading                  ====== Start searching based on vector similarity ===hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911
hit: id: 999, distance: 0.09934990108013153, entity: {'random': 0.9519034206569449}, random field: 0.9519034206569449
hit: id: 1310, distance: 0.10135537385940552, entity: {'random': 0.26669865443188623}, random field: 0.26669865443188623
hit: id: 2999, distance: 0.0, entity: {'random': 0.02316334456872482}, random field: 0.02316334456872482
hit: id: 2502, distance: 0.13083189725875854, entity: {'random': 0.9289998713260136}, random field: 0.9289998713260136
hit: id: 2669, distance: 0.1590736210346222, entity: {'random': 0.6080847854541138}, random field: 0.6080847854541138
search latency = 0.2742s=== Start querying with `random > 0.5` ===query result:
-{'random': 0.6378742006852851, 'embeddings': [np.float32(0.8367804), np.float32(0.20963514), np.float32(0.6766955), np.float32(0.39746654), np.float32(0.8180806), np.float32(0.1201905), np.float32(0.9467144), np.float32(0.6947491)], 'pk': '0'}
search latency = 0.2361s
query pagination(limit=4):[{'random': 0.6378742006852851, 'pk': '0'}, {'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]
query pagination(offset=1, limit=3):[{'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]=== Start hybrid searching with `random > 0.5` ===hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911
hit: id: 999, distance: 0.09934990108013153, entity: {'random': 0.9519034206569449}, random field: 0.9519034206569449
hit: id: 1553, distance: 0.12913644313812256, entity: {'random': 0.7723335927084438}, random field: 0.7723335927084438
hit: id: 2502, distance: 0.13083189725875854, entity: {'random': 0.9289998713260136}, random field: 0.9289998713260136
hit: id: 2669, distance: 0.1590736210346222, entity: {'random': 0.6080847854541138}, random field: 0.6080847854541138
hit: id: 2628, distance: 0.1914074569940567, entity: {'random': 0.940077754658375}, random field: 0.940077754658375
search latency = 0.2026s=== Start deleting with expr `pk in ["0" , "1"]` ===query before delete by expr=`pk in ["0" , "1"]` -> result:
-{'embeddings': [np.float32(0.8367804), np.float32(0.20963514), np.float32(0.6766955), np.float32(0.39746654), np.float32(0.8180806), np.float32(0.1201905), np.float32(0.9467144), np.float32(0.6947491)], 'pk': '0', 'random': 0.6378742006852851}
-{'embeddings': [np.float32(0.27875876), np.float32(0.95355743), np.float32(0.976228), np.float32(0.54545516), np.float32(0.16776836), np.float32(0.82360446), np.float32(0.65080017), np.float32(0.21096307)], 'pk': '1', 'random': 0.43925103574669633}query after delete by expr=`pk in ["0" , "1"]` -> result: []=== Drop collection `hello_milvus` ===

5. 部署可视化管理工具 Attu

Milvus 的可视化(GUI)管理工具官方推荐 Attu。它是一款 all-in-one 的 Milvus 管理工具。使用 Attu,可以显著的降低 Milvus 运维管理成本。

5.1 安装 Attu

Milvus Helm Chart 自带 Attu 的部署能力,默认是禁用的。我本人比较喜欢手工安装,所以下面介绍 kubectl 原生安装 Attu 的方法。

创建并编辑 Attu 部署资源清单, vi milvus-attu.yaml

apiVersion: v1
kind: Service
metadata:name: milvus-attu-externalnamespace: opsxlablabels:app: attu
spec:type: NodePortclusterIP:ports:- name: attuprotocol: TCPport: 3000targetPort: 3000nodePort: 31012selector:app: attu---
apiVersion: apps/v1
kind: Deployment
metadata:name: milvus-attunamespace: opsxlablabels:app: attu
spec:replicas: 1selector:matchLabels:app: attutemplate:metadata:labels:app: attuspec:containers:- name: attuimage: zilliz/attu:v2.4imagePullPolicy: IfNotPresentports:- name: attucontainerPort: 3000protocol: TCPenv:- name: MILVUS_URLvalue: "opsxlab-milvus:19530"

执行命令,创建 Attu 资源。

kubectl apply -f milvus-attu.yaml

5.2 登录 Attu 管理控制台

打开浏览器,访问 K8s 集群任意节点 IP 的 31012 端口,例如 http://192.168.9.91:31012,默认用户名密码 root/Milvus登录后请立即修改密码

下面以一组 Attu 管理界面的预览截图,结束本文。请各位自己探究 Attu 的强大功能。

  • 登录页面

milvus-attu-login-v2.4

  • 首页

milvus-attu-home-v2.4

  • 系统视图

milvus-attu-system-v2.4

  • 数据库-概览

milvus-attu-databases-default-overview-v2.4

  • 数据库-向量搜索

milvus-attu-databases-default-search-v2.4

  • 数据库-数据

milvus-attu-databases-default-data-v2.4

  • 数据库-分区

milvus-attu-databases-default-partitions-v2.4

  • 数据库-数据段

milvus-attu-databases-default-segments-v2.4

  • 数据库-属性

milvus-attu-databases-default-properties-v2.4

免责声明:

  • 笔者水平有限,尽管经过多次验证和检查,尽力确保内容的准确性,但仍可能存在疏漏之处。敬请业界专家大佬不吝指教。
  • 本文所述内容仅通过实战环境验证测试,读者可学习、借鉴,但严禁直接用于生产环境由此引发的任何问题,作者概不负责

本文由博客一文多发平台 OpenWrite 发布!

相关文章:

KubeSphere 部署向量数据库 Milvus 实战指南

作者:运维有术星主 Milvus 是一个为通用人工智能(GenAI)应用而构建的开源向量数据库。它以卓越的性能和灵活性,提供了一个强大的平台,用于存储、搜索和管理大规模的向量数据。Milvus 能够执行高速搜索,并以…...

前端canvas——贝塞尔曲线

曲线之美,不在于曲线本身,而在于用的人。 所以就有了这期贝塞尔曲线。 新规矩,先上个GIT。 效果图 开局一张图,代码全靠编。 代码 画骨 先想着怎么画一个心形吧,等你想好了,就知道怎么画了。 首先就还…...

Elasticsearch模糊查询之Wildcard

{“wildcard” : { “LPR.keyword” : { “wildcard” : “${Keyword}”} }},你的示例中使用了 wildcard 查询,它适用于模糊搜索,允许使用通配符(* 和 ?)来匹配字段值。你使用了 keyword 子字段来确保精确匹配,这是一…...

【人工智能】穿越科技迷雾:解锁人工智能、机器学习与深度学习的奥秘之旅

文章目录 前言一、人工智能1. 人工智能概述a.人工智能、机器学习和深度学习b.人工智能发展必备三要素c.小案例 2.人工智能发展历程a.人工智能的起源b.发展历程 3.人工智能的主要分支 二、机器学习1.机器学习工作流程a.什么是机器学习b.机器学习工作流程c.特征工程 2.机器学习算…...

Nginx服务 rewrite、proxy_pass 用rewrite去除URL中的特定参数

Nginx 是一个高性能的开源反向代理服务器,可以用于处理跨域请求、负载均衡和缓存等功能。在本文中,我们将介绍如何使用 Nginx 配置文件来实现反向代理。 我们可以实现跨域请求的处理,同时保护用户的隐私和安全。此外,Nginx 还…...

RocketMQ事务消息机制原理

RocketMQ工作流程 在RocketMQ当中,当消息的生产者将消息生产完成之后,并不会直接将生产好的消息直接投递给消费者,而是先将消息投递个中间的服务,通过这个服务来协调RocketMQ中生产者与消费者之间的消费速度。 那么生产者是如何…...

【C++】选择结构- 嵌套if语句

嵌套if语句的语法格式&#xff1a; if(条件1) { if(条件1满足后判断是否满足此条件) {条件2满足后执行的操作} else {条件2不满足执行的操作} } 下面是一个实例 #include<iostream> using namespace std;int main4() {/*提示用户输入一个高考分数&#xff0c;根据分…...

scrapy解决管道阻塞问题采用threadpool库线程池+twisted同步语法异步编程

实现方法&#xff1a;process_item和download任务函数像下面编写即可&#xff0c;其他管道像往常一样写法 import time import threadpool import random from twisted.internet import deferclass VideoPipeline:def __init__(self):self.pool threadpool.ThreadPool(10) # …...

Axure RP:打造动态交互的大屏可视化设计利器

Axure大屏可视化是指使用Axure RP这款原型设计工具来创建具有视觉冲击力和数据展示功能的大屏幕界面。Axure以其强大的交互设计和丰富的组件库&#xff0c;成为了实现大屏可视化的重要工具之一。以下是对Axure大屏可视化的详细阐述&#xff1a; 一、Axure在大屏可视化中的优势 …...

“八股文”在实际工作中是助力、阻力还是空谈

目录 1.概述 1.1.对实际工作的助力 1.2.存在的问题 2.“八股文”对招聘过程的影响 2.1.“八股文”在筛选候选人时的作用 2.2.面试中的比重及其合理性 2.3.如何平衡“八股文”与实际编程能力的考察 3.“八股文”在日常工作中的实用价值 3.1.在团队协作环境中进行有效沟…...

项目开发:@ControllerAdvice注解的基本应用

目录 简介基本用法全局异常处理全局拦截器全局数据绑定 注解参数1.value(): String[]2.basePackages(): String[]3.basePackageClasses(): Class<?>[]4.assignableTypes(): Class<?>[]5.annotations(): Class<? extends Annotation>[] 三.注解组成总结 简…...

Jmeter三种方式获取数组中多个数据并将其当做下个接口参数入参【附带JSON提取器和CSV格式化】

目录 一、传统方式-JOSN提取器获取接口返回值 1、接口调用获取返回值 2、添加JSON提取器 3、调试程序查看结果 4、添加循环控制器 5、设置count计数器 6、添加请求 7、执行请求 二、CSV参数化 1、将结果写入后置处理程序 2、设置循环处理器 3、添加CSV文件 4、设置…...

C++入门基础:C++中的循环语句

循环语句是编程语言中用来重复执行一段代码直到满足特定条件的一种控制结构。它们对于处理需要重复任务的场景非常有用&#xff0c;比如遍历数组、累加数值、重复执行某项操作直到满足条件等。 但是在使用循环语句的时候需要注意下哈&#xff0c;有时候一不小心会构成死循环或者…...

VUE 基础(二)

1 v-show:根据表达值的真假&#xff0c;切换元素的显示和隐藏 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">&l…...

VMware Cloud Foundation ESXi 主机

一、准备嵌套 ESXi 主机环境# 1)物理 ESXi 主机信息 本次准备用于部署 VCF 嵌套实验环境的物理宿主机的配置信息如下图所示。其实,部署 VCF 环境主要对内存的大小要求比较高,部署完整的管理域相关组件下来差不多就要占用 200 GB左右内存,而对 CPU 和存储的需求可以根据实…...

PyTorch深度学习快速入门(下)

PyTorch深度学习快速入门&#xff08;下&#xff09; 一、现有网络模型的使用及修改&#xff08;一&#xff09;背景知识&#xff08;二&#xff09;修改网络模型的三种方法 二、网络模型的保存与加载&#xff08;一&#xff09;保存网络模型的两种方法&#xff08;二&#xff…...

轻松入门Linux—CentOS,直接拿捏 —/— <1>

一、什么是Linux Linux是一个开源的操作系统&#xff0c;目前是市面上占有率极高的服务器操作系统&#xff0c;目前其分支有很多。是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统 Linux能运行主要的UNIX工具软件、应用程序和网络协议 Linux支持 32…...

pandas安装以及导入CSV

安装pandas pip install pandas速度慢可以切换国内镜像源 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas执行导入csv操作 import pandas as pd# 读取csv文件 data pd.read_csv(yourPath)输入data查看数据 导入成功&#xff01;...

新能源车浪潮来袭,同时存在高压低压系统,如何准确进行高低压布线间距EMC分析?

摘要 随着车辆电气化水平的逐步提升&#xff0c;电气零部件布局和布线面临着前所未有的挑战&#xff0c;在不断的压缩电气零部件间间距后&#xff0c;EMC性能成为非常关键的性能指标。特别是对于新能源车型&#xff0c;同时存在高压和低压系统&#xff0c;高低压耦合若处理的不…...

QUIC 协议

详解 QUIC 协议&#xff1a;它为何比 TCP 更优越&#xff1f;...

【软件测试】--接口测试

1. 接口用例设计 接口测试的测试点 功能测试 单接口功能&#xff1a; 手工测试中的单个业务模块&#xff0c;一般对应一个接口 登陆业务 --> 登陆接口加入购物车业务 --> 加入购物车接口订单业务 --> 订单接口支付业务 --> 支付接口 借助工具、代码。绕开前端界面…...

【前端】上传视频,截取第一帧图片

使用input上传视频&#xff0c;获得视频的第一帧 参考&#xff1a;JavaScript获取视频的尺寸信息和第一帧图片 - 掘金 (juejin.cn) html&#xff1a; <inputbind:this{uploadRef}on:change{handleUpload}accept"video/*"type"file"/>视频类型校验&a…...

Redis-GEO数据结构的基本用法

GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本中加入了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据。常见的命令有&#xff1a; GEOADD&#xff1a;添加一个地理空间信息&#xff0c;包含&#xff1a;经度…...

【Linux C | 网络编程】进程池大文件传输的实现详解(三)

上一篇实现了进程池的小文件传输&#xff0c;使用自定义的协议&#xff0c;数据长度数据本身&#xff0c;类似小火车的形式&#xff0c;可以很好的解决TCP“粘包”的问题。 【Linux C | 网络编程】进程池小文件传输的实现详解&#xff08;二&#xff09; 当文件的内容大小少于…...

Mac如何通过SSH连接Github

目录 前言 一、实现步骤 1.生成 SSH 密钥对 2.添加 SSH 密钥到 GitHub&#xff1a; 3.配置 SSH 连接 1.更新远程仓库 URL 2.测试 SSH 连接 前言 GitHub 在 2021 年 8 月 13 日停止了对使用密码进行身份验证的支持。因此&#xff0c;你需要使用其他认证方式&#xff0c;如…...

成就巴西休闲游戏如何借助Google谷歌广告投放优势

在探讨巴西休闲游戏如何借助谷歌广告投放优势实现市场扩张的过程中&#xff0c;我们不得不深入分析巴西市场的独特属性、休闲游戏的兴起背景&#xff0c;以及谷歌广告平台在全球范围内的强大影响力。近年来&#xff0c;随着移动游戏市场的快速发展&#xff0c;特别是中轻度休闲…...

利用python检查磁盘空间使用情况

目录 一.前言 二.使用的库介绍 三.代码实现以及解析 3.1导入模块 3.2邮件发送函数 send_email 3.3检查磁盘空间函数 check_and_clean_disk 3.4主程序逻辑 四.致谢 一.前言 在信息技术飞速发展的今天&#xff0c;数据量的激增使得磁盘空间管理成为系统运维中的一项基…...

卷积神经网络(五)---图像增强的方法

前面的部分专注于卷积神经网络的层结构介绍&#xff0c;同时还介绍了到目前为止比较出名的卷积神经网络&#xff0c;接着使用比较复杂的卷积神经网络提高了 MNIST 数据集的准确率。下面将从另外的角度——图像增强的方面入手&#xff0c;提高模型的准确率和泛化能力。 一直以来…...

矩阵常见分解算法及其在SLAM中的应用

文章目录 常见特殊矩阵定义Cholesky分解&#xff08;正定Hermittian矩阵&#xff0c;分解结果唯一&#xff09;Cholesky分解应用 SVD分解&#xff08;将singularvalues排序后分解唯一&#xff09;SVD 分解的应用&#xff08;任意矩阵&#xff09; QR分解&#xff08;任意矩阵&a…...

【排序】快速排序详解

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;排序 个人主页&#xff1a;Celias blog~ 一、快速排序的思想 快速排序的核心思想是&#xff1a; 选定一个…...

贪心算法总结(2)

一、买卖股票的最佳时机 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int maxProfit(vector<int>& prices) {int miniINT_MAX;int ret0;for(int&price:prices){//遍历的时候&#xff0c;我们随时去更新最小的值&#xff0c;然后让每一位…...

弘景光电:技术实力与创新驱动并进

在光学镜头及摄像模组产品领域&#xff0c;广东弘景光电科技股份有限公司&#xff08;以下简称“弘景光电”&#xff09;无疑是一颗耀眼的明星。自成立以来&#xff0c;弘景光电凭借其强大的研发实力、卓越的产品性能、精密的制造工艺以及严格的质量管理体系&#xff0c;在光学…...

2024年7月23日~2024年7月29日周报

目录 一、前言 二、完成情况 2.1 一种具有边缘增强特点的医学图像分割网络 2.2 融合边缘增强注意力机制和 U-Net 网络的医学图像分割 2.3 遇到的困难 三、下周计划 一、前言 上周参加了一些师兄师姐的论文讨论会议&#xff0c;并完成了初稿。 本周继续修改论文&#xff0…...

M3U8流视频数据爬虫

M3U8流视频数据爬虫 HLS技术介绍 现在大部分视频客户端都采用HTTP Live Streaming&#xff08;HLS&#xff0c;Apple为了提高流播效率开发的技术&#xff09;&#xff0c;而不是直接播放MP4等视频文件。HLS技术的特点是将流媒体切分为若干【TS片段】&#xff08;比如几秒一段…...

保护您的数字财富:模块化沙箱在源代码防泄露中的突破

在数字化浪潮中&#xff0c;企业面临着前所未有的数据安全挑战。源代码、商业机密、客户数据……这些宝贵的数字资产一旦泄露&#xff0c;后果不堪设想。SDC沙盒防泄密系统&#xff0c;以其卓越的技术实力和创新的解决方案&#xff0c;为企业提供了一个坚不可摧的安全屏障。 核…...

FFmpeg源码:avio_r8、avio_rl16、avio_rl24、avio_rl32、avio_rl64函数分析

一、引言 AVIOContext是FFmpeg&#xff08;本文演示用的FFmpeg源码版本为5.0.3&#xff09;中的字节流上下文结构体&#xff0c;用来管理输入输出数据。打开一个媒体文件的时候&#xff0c;需要先把数据从硬盘读到缓冲区&#xff0c;然后会用到AVIOContext中的如下成员&#x…...

如何使用 API 查看极狐GitLab 镜像仓库中的镜像?

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…...

软件-vscode-plantUML-IDEA

文章目录 vscode基础命令 实操1. vscode实现springboot项目搭建 &#xff08;包括spring data jpa和sqlLite连接&#xff09; PlantUMLIDEA下载及安装Eval Reset插件配置修改IDEA创建项目的默认目录IDEA配置gitIDEA翻译插件translationIDEA断点调试IDEA全局搜索快捷键不能使用代…...

ES6语法详解,面试必会,通俗易懂版

目录 Set的基本使用WeakSet 使用Set 和 WeakSet 区别内存泄漏示例&#xff1a;使用普通 Set 保存 DOM 节点如何避免这个内存泄漏MapWeakMap 的使用 Set的基本使用 在ES6之前&#xff0c;我们存储数据的结构主要有两种&#xff1a;数组、对象。 在ES6中新增了另外两种数据结构&a…...

CTFshow--Web--代码审计

目录 web301 web302 web303 web304 web305 web306 web307 web308 web309 web310 web301 开始一个登录框, 下意识sql尝试一下 发现 1 的时候会到一个 checklogin.php 的路径下, 但啥也没有 好吧, 这是要审计代码的 ,下载好源码, 开始审计 看了一下源码 , 应该就是sql…...

Java语言程序设计——篇十(1)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 接口介绍 接口概述接口定义接口的实现实战演练 &#x1f445;接口的继承实战演练实战演练 接口的类型常量实战演练 静态方法默认方法解决默认方…...

Qt对比MFC优势

从Qt小白到现在使用了有四年的时间&#xff0c;之前也搞过MFC,WinForm,基本上都是桌面的框架&#xff0c; 从难易程度看MFC>QT>WinForm; 运行的效率上来看MFC>QT>WinForm; 开发效率上WinForm>QT>MFC; 跨平台Qt首选&#xff1b; 界面的美观难易程度Qt>…...

RuntimeError: No CUDA GPUs are available

RuntimeError: No CUDA GPUs are available 目录 RuntimeError: No CUDA GPUs are available 【常见模块错误】 【解决方案】 解决步骤如下&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科…...

URL参数中携带中文?分享 1 段优质 JS 代码片段!

本内容首发于工粽号&#xff1a;程序员大澈&#xff0c;每日分享一段优质代码片段&#xff0c;欢迎关注和投稿&#xff01; 大家好&#xff0c;我是大澈&#xff01; 本文约 800 字&#xff0c;整篇阅读约需 1 分钟。 今天分享一段优质 JS 代码片段&#xff0c;在发送 ajax 请…...

sass的使用

一、变量 //声明一个变量 $highlight-color: #F90; .selected {border: 1px solid $highlight-color; }//编译后 .selected {border: 1px solid #F90; }二、导入 import "xxx.scss"三、混合器简单定义 通过mixin定义&#xff0c;通过include调用 // mixin.scss /…...

【足球走地软件】走地数据分析预测【大模型篇】走地预测软件实战分享

了解什么是走地数据&#xff1f; 走地数据分析&#xff0c;在足球赛事的上下文中&#xff0c;是一种针对正在进行中的比赛进行实时数据分析的方法。这种方法主要用于预测比赛中的某些结果或趋势&#xff0c;如总进球数、比分变化、球队表现等。 在足球走地数据分析中&#xf…...

现在有什么赛道可以干到退休?

最近&#xff0c;一则“90后无论男女都得65岁以后退休”的消息在多个网络平台流传&#xff0c;也不知道是真是假&#xff0c;好巧不巧今天刷热点的时候又看到一条这样的热点&#xff1a;现在有什么赛道可以干到退休&#xff1f; 点进去看了几条热评&#xff0c;第一条热评说的…...

c程序杂谈系列(职责链模式与if_else)

从处理器的角度来说&#xff0c;条件分支会导致指令流水线的中断&#xff0c;所以控制语句需要严格保存状态&#xff0c;因为处理器是很难直接进行逻辑判断的&#xff0c;有可能它会执行一段时间&#xff0c;发现出错后再返回&#xff0c;也有可能通过延时等手段完成控制流的正…...

前端开发技术之CSS(层叠样式表)

盒模型&#xff08;Box Model&#xff09; CSS盒模型描述了如何计算一个元素的总宽度和高度。 它包括以下几个部分&#xff1a; 1. 内容&#xff08;Content&#xff09;&#xff1a;元素的实际内容&#xff0c;比如文本或图片。 2. 内边距&#xff08;Padding&#xff09;&…...

go语言day20 使用gin框架获取参数 使用自定义的logger记录日志

Golang 操作 Logger、Zap Logger 日志_golang zap-CSDN博客 目录 一、 从控制器中获取参数的几种形式 1&#xff09; 页面请求url直接拼接参数。 2&#xff09; 页面请求提交form表单 3&#xff09; 页面请求发送json数据&#xff0c;使用上下文对象c的BindJSON()方法接…...