一个计算机技术爱好者与学习者

0%

好好学Sealos:Sealos制作Milvus集群镜像

1. 前言

本文中,我们会基于sealos制作一个Milvus集群镜像。
使用这个集群镜像,我们能够在sealos拉起的K8S集群中,一键部署Milvus2.2.0。

参考文档:

2. 前置条件

安装sealos4.2.0,拉起K8S 1.24.8集群(同时安装helm),具体方法参考《sealos入门篇》

3. 制作cert-manager集群镜像

1、准备资源清单

1
2
3
mkdir cert-manager && cd cert-manager
mkdir manifests
wget -O manifests/cert-manager.yaml https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.yaml

2、添加镜像列表

1
2
3
cat manifests/* | grep image
mkdir -p images/shim/
vim images/shim/cert-manager-images.txt

cert-manager-images.txt 内容为:

1
2
3
quay.io/jetstack/cert-manager-cainjector:v1.5.3
quay.io/jetstack/cert-manager-controller:v1.5.3
quay.io/jetstack/cert-manager-webhook:v1.5.3

3、编写Dockerfile

1
2
3
FROM scratch
COPY ../cert-manager .
CMD ["kubectl apply -f manifests"]

默认安装到 cert-manager 命名空间。

4、构建集群镜像

1
2
sealos build -f Dockerfile -t docker.io/voidking/cert-manager:v1.5.3 .
sealos inspect docker.io/voidking/cert-manager:v1.5.3

4. 使用cert-manager集群镜像

4.1. 自定义安装安装

1
2
3
sealos run docker.io/voidking/cert-manager:v1.5.3 --cmd="kubectl apply -f manifests"

kubectl get all -n cert-manager

4.2. 上传集群镜像

上传到公共镜像仓库

1
2
3
4
sealos push docker.io/voidking/cert-manager:v1.5.3
sealos tag docker.io/voidking/cert-manager:v1.5.3 hub.sealos.cn/voidking/cert-manager:v1.5.3
sealos login -k config.yml hub.sealos.cn
sealos push hub.sealos.cn/voidking/cert-manager:v1.5.3

上传到私有镜像仓库

1
2
3
sealos tag docker.io/voidking/cert-manager:v1.5.3 harbor.voidking.com/sealos/cert-manager:v1.5.3
sealos login harbor.voidking.com
sealos push harbor.voidking.com/sealos/cert-manager:v1.5.3

5. 制作Milvus集群镜像

1、下载chart

1
2
3
4
mkdir milvus && cd milvus
helm repo add milvus https://milvus-io.github.io/milvus-helm/
helm search repo milvus/milvus -l
helm fetch milvus/milvus --version 3.3.6

这里下载chart3.3.6,对应milvus版本2.2.0。
下载的文件为:milvus-3.3.6.tgz

2、修改chart

1
2
3
4
tar -xzvf milvus-3.3.6.tgz
vim milvus/values.yaml
tar -czvf milvus-3.3.6-custom.tgz milvus
rm milvus -rf

values.yaml 如下修改:

  • cluster.enabled 建议修改为false,为 true 时非常消耗资源
  • service.type 改为 NodePort
  • x.resources 保持默认,按需修改
  • x.persistence.storageClass 保持默认,使用默认storageclass
  • x.persistence.size 保持默认,按需修改
  • etcd.replicaCount 改为 1,节省资源
  • minio.mode 改为 standalone,节省资源
  • pulsar.enabled 保持 true,pulsar是一个分布式发布订阅消息系统,必须安装
  • metrics.enabled 保持 true,对外暴露监控数据
  • metrics.serviceMonitor.enabled 改为 true,使prometheus可以获取到监控数据

milvus开放两个端口,19530是客户端连接端口,9091是http api端口。

注意:milvus不用配置用户名和密码。

3、获取镜像列表

1
2
3
helm template milvus-test milvus-3.3.6-custom.tgz > milvus_manifest.yaml
python get_image.py --manifest milvus_manifest.yaml
rm milvus_manifest.yaml get_image.py

get_image.py内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import argparse
import gzip
import os
import yaml
from nested_lookup import nested_lookup


if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Save Docker images")

parser.add_argument("--manifest",
required=True,
help="Path to the manifest yaml")
parser.add_argument("--save_path",
type=str,
default='images',
help='Directory to save images to')
arguments = parser.parse_args()

with open(arguments.manifest, 'r') as file:
template = file.read()

images=[]
parts = template.split('---')
for p in parts:
y = yaml.safe_load(p)
matches = nested_lookup("image", y)
if (len(matches)):
images += matches

for image_name in set(images):
print(image_name)

get_image.py 改写自脚本 save_image.py

4、添加镜像列表

1
2
mkdir -p images/shim/
vim images/shim/milvus-images.txt

milvus-images.txt 内容为:

1
2
3
4
5
milvusdb/milvus:v2.2.0
docker.io/milvusdb/etcd:3.5.0-r7
minio/minio:RELEASE.2022-03-17T06-34-49Z
milvusdb/milvus-config-tool:v0.1.0
apachepulsar/pulsar:2.8.2

5、编写Dockerfile

1
2
3
4
FROM scratch
COPY ../milvus .
CMD ["helm install milvus milvus-3.3.6-custom.tgz \
-n milvus --create-namespace"]

6、构建集群镜像

1
2
sealos build -f Dockerfile -t docker.io/voidking/milvus:v2.2.0 .
sealos inspect docker.io/voidking/milvus:v2.2.0

6. 使用Milvus集群镜像

6.1. 自定义安装Milvus

1
2
3
4
5
6
sealos run docker.io/voidking/milvus:v2.2.0 --cmd="helm install milvus milvus-3.3.6-custom.tgz \
-n milvus --create-namespace \
--set service.type=NodePort \
--set metrics.serviceMonitor.enabled=true"

kubectl get all -n milvus

6.2. 上传集群镜像

上传到公共镜像仓库

1
2
3
4
sealos push docker.io/voidking/milvus:v2.2.0
sealos tag docker.io/voidking/milvus:v2.2.0 hub.sealos.cn/voidking/milvus:v2.2.0
sealos login -k config.yml hub.sealos.cn
sealos push hub.sealos.cn/voidking/milvus:v2.2.0

上传到私有镜像仓库

1
2
3
sealos tag docker.io/voidking/milvus:v2.2.0 harbor.voidking.com/sealos/milvus:v2.2.0
sealos login harbor.voidking.com
sealos push harbor.voidking.com/sealos/milvus:v2.2.0