跳到主要内容

部署 Milvus

部署前准备

  1. 用于运行 Milvus 的节点,需要先加入 Kubernetes 集群,并确认节点状态为 Ready

  2. 部署 Milvus 之前,需要先准备好外部依赖:

    • Kafka
    • etcd
    • S3 对象存储(MinIO)
  3. 在 S3 对象存储(MinIO)中创建 Milvus 专用 bucket:mdmilvus

    Milvus 使用对象存储保存数据文件,建议单独创建一个专用 bucket。下面以 mc 连接 MinIO 为例,创建 mdmilvus bucket:

    mc alias set minio http://MINIO_ENDPOINT MINIO_ACCESS_KEY MINIO_SECRET_KEY
    mc mb minio/mdmilvus
    mc ls minio
    • MINIO_ENDPOINT 替换为 MinIO 的实际访问地址,例如 http://10.206.0.6:9000

    • MINIO_ACCESS_KEYMINIO_SECRET_KEY 替换为实际的访问密钥和私有密钥。

  4. 检查节点状态

    kubectl get nodes -o wide
    • 确认计划承载 Milvus 的节点已经加入 Kubernetes 集群。

    • 确认节点状态为 Ready

  5. 给 Milvus 专用工作节点打标签和污点

    先将用于运行 Milvus 的 K8s 工作节点标记出来,并通过污点避免其他业务 Pod 误调度到这些节点。

    kubectl label nodes <milvus-node-name> hap=milvus
    kubectl taint nodes <milvus-node-name> hap=milvus:NoSchedule
    • hap=milvus 是节点标签,用于标识 Milvus 专用工作节点。

    • hap=milvus:NoSchedule 是节点污点,用于阻止未声明容忍的 Pod 调度到这些节点。

    • 请将 <milvus-node-name> 替换为实际的 Milvus 工作节点名称;如有多个节点,请分别为每个节点添加节点标签与污点。

  6. 在 Milvus 专用工作节点提前下载镜像

    在开始安装 Milvus OperatorMilvus 之前,请先在计划承载 Milvus 的 Kubernetes 工作节点上准备好对应镜像。

    crictl pull registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-milvus-operator:v1.3.6
    crictl pull registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-milvus:v2.6.17
    • registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-milvus-operator:v1.3.6 用于部署 Milvus Operator。

    • registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-milvus:v2.6.17 用于部署 Milvus 集群工作负载。

部署 Milvus Operator

先部署 Milvus Operator,后续的 Milvus 自定义资源需要依赖它来创建工作负载。

为方便后续维护与复用,建议将本节涉及的 yaml 文件统一放在 Kubernetes Master 01 节点的 /data/mingdao/script/kubernetes/milvus/ 路径下,后续统一进入该目录后执行下载和部署命令。

  1. 准备 milvus-operator-deployment.yaml

    先在 Kubernetes Master 01 节点创建文件存放目录,并切换到该目录:

    mkdir -p /data/mingdao/script/kubernetes/milvus
    cd /data/mingdao/script/kubernetes/milvus

    然后下载 milvus-operator-deployment.yaml 到当前目录中。

    wget https://pdpublic.mingdao.com/private-deployment/offline/common/milvus-operator-deployment.yaml
  2. 应用 operator 资源

    kubectl apply -f milvus-operator-deployment.yaml
    • 该步骤用于部署 Milvus Operator 控制器。

    • 只有 operator 正常运行后,后续的 Milvus 资源才会被解析和创建。

  3. 查看 operator 状态

    kubectl get pod -n milvus-operator -o wide
    • 确认 Milvus Operator Pod 已正常启动。

部署 Milvus

以下步骤基于 milvus.yaml 执行。

为方便后续维护与复用,建议将本节涉及的 yaml 文件统一放在 Kubernetes Master 01 节点的 /data/mingdao/script/kubernetes/milvus/ 路径下,后续统一进入该目录后执行创建和部署命令。

  1. 创建 Milvus 命名空间

    kubectl create namespace milvus
    • 如果命名空间已存在,可忽略此命令。
  2. 创建 S3 凭据 Secret

    Milvus 的存储依赖配置中使用了 secretRef: milvus-s3-secret,因此需要先在 milvus 命名空间创建对应 Secret。

    kubectl -n milvus create secret generic milvus-s3-secret \
    --from-literal=accessKey='请替换为S3访问密钥' \
    --from-literal=secretKey='请替换为S3私有密钥'
    • accessKey 对应对象存储访问密钥。

    • secretKey 对应对象存储私有密钥。

  3. 准备 milvus.yaml

    先在 Kubernetes Master 01 节点的 /data/mingdao/script/kubernetes/milvus/ 目录下创建 milvus.yaml 文件,内容如下:

    apiVersion: milvus.io/v1beta1
    kind: Milvus
    metadata:
    name: hap-rag
    namespace: milvus
    labels:
    app: milvus
    spec:
    mode: cluster
    components:
    image: registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-milvus:v2.6.17
    imagePullPolicy: IfNotPresent
    nodeSelector:
    hap: milvus
    tolerations:
    - key: "hap"
    operator: "Equal"
    value: "milvus"
    effect: "NoSchedule"
    proxy:
    replicas: 2
    resources:
    requests:
    cpu: "250m"
    memory: "1Gi"
    limits:
    cpu: "2"
    memory: "4Gi"
    affinity:
    podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
    podAffinityTerm:
    topologyKey: kubernetes.io/hostname
    labelSelector:
    matchLabels:
    app.kubernetes.io/component: proxy
    mixCoord:
    replicas: 2
    resources:
    requests:
    cpu: "250m"
    memory: "1Gi"
    limits:
    cpu: "4"
    memory: "8Gi"
    affinity:
    podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
    podAffinityTerm:
    topologyKey: kubernetes.io/hostname
    labelSelector:
    matchLabels:
    app.kubernetes.io/component: mixcoord
    streamingNode:
    replicas: 2
    resources:
    requests:
    cpu: "250m"
    memory: "1Gi"
    limits:
    cpu: "6"
    memory: "12Gi"
    affinity:
    podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
    podAffinityTerm:
    topologyKey: kubernetes.io/hostname
    labelSelector:
    matchLabels:
    app.kubernetes.io/component: streamingnode
    queryNode:
    replicas: 2
    resources:
    requests:
    cpu: "250m"
    memory: "1Gi"
    limits:
    cpu: "8"
    memory: "32Gi"
    affinity:
    podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
    podAffinityTerm:
    topologyKey: kubernetes.io/hostname
    labelSelector:
    matchLabels:
    app.kubernetes.io/component: querynode
    dataNode:
    replicas: 2
    resources:
    requests:
    cpu: "250m"
    memory: "1Gi"
    limits:
    cpu: "6"
    memory: "12Gi"
    affinity:
    podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
    podAffinityTerm:
    topologyKey: kubernetes.io/hostname
    labelSelector:
    matchLabels:
    app.kubernetes.io/component: datanode
    dependencies:
    msgStreamType: kafka
    kafka:
    external: true
    brokerList: # 需修改,Kafka 地址
    - "192.168.10.31:9092"
    - "192.168.10.32:9092"
    - "192.168.10.33:9092"
    etcd:
    external: true
    endpoints: # 需修改,etcd 地址
    - "http://192.168.10.31:2379"
    - "http://192.168.10.32:2379"
    - "http://192.168.10.33:2379"
    storage:
    external: true
    type: S3
    endpoint: "cos.ap-nanjing.myqcloud.com:443" # 需修改,S3 对象存储地址
    secretRef: milvus-s3-secret # 需修改,S3 Secret 名称
    config:
    common:
    security:
    authorizationEnabled: true
    defaultRootPassword: "<设置强密码>" # 需修改,设置 Milvus root 用户的密码
    mixCoord:
    enableActiveStandby: true
    msgChannel:
    chanNamePrefix:
    cluster: milvus
    mq:
    type: kafka
    kafka:
    securityProtocol: PLAINTEXT
    etcd:
    rootPath: "milvus"
    metaSubPath: "meta"
    kvSubPath: "kv"
    auth:
    enabled: true
    userName: "root"
    password: "******" # 需修改,etcd 密码
    ssl:
    enabled: false
    minio:
    cloudProvider: aws # 固定配置,S3 兼容
    bucketName: "mdmilvus" # 按需修改,bucket 名称
    rootPath: "milvus"
    useSSL: true # 按需修改,是否使用 HTTPS 访问 S3
    useVirtualHost: true
    • dependencies.kafka.brokerListdependencies.etcd.endpoints 分别用于配置外部 Kafkaetcd 服务地址,部署前请确认这些地址都可以从 Milvus 工作节点正常访问。

    • dependencies.storage 用于配置外部 S3 对象存储,其中 endpointsecretRef 需要与实际环境保持一致。

    • config.common.security.authorizationEnabled 已开启鉴权,defaultRootPassword 需要设置为高强度的密码。

    • config.etcd.auth.userNameconfig.etcd.auth.password 用于访问外部 etcd,请替换为实际环境中的认证信息。

    • config.minio.bucketName 当前设置为 mdmilvus,代表使用的对象存储 bucket,rootPath 保持为 milvus,如对象存储地址或访问方式不同,请同步调整 useSSLuseVirtualHost

  4. 应用 Milvus 资源

    kubectl apply -f milvus.yaml
    • 该步骤会基于 Milvus Operator 创建 hap-rag 对应的 Milvus 集群。
  5. 查看 Milvus 资源状态

    kubectl get pods -n milvus -o wide
    kubectl get svc -n milvus
    • 确认各组件 Pod 已正常调度并运行。
    • 确认对外暴露的 Service 已创建完成。
  6. 访问 Milvus

    部署完成后,Milvus 的访问地址如下:

    http://hap-rag-milvus.milvus:19530
    • 该地址仅限当前 Kubernetes 集群内的 Pod 访问。

接入 HAP 服务

HAP 服务的 config.yaml 中新增如下环境变量

ENV_RAG_ENABLE: "true"
ENV_MILVUS_URL: "http://hap-rag-milvus.milvus:19530"
ENV_MILVUS_DATABASE: "default"
ENV_MILVUS_USERNAME: "root"
ENV_MILVUS_PASSWORD: "your_password"
  • ENV_MILVUS_PASSWORD 的值需要修改为前面自定义的 Milvus 密码。

  • 保存配置后,重启 HAP 微服务使配置生效。