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

0%

好好学Sealos:Sealos制作nfs-provisioner集群镜像

1. 前言

本文中,我们会基于sealos制作一个nfs-provisioner集群镜像。
使用这个集群镜像,我们能够在sealos拉起的K8S集群中,一键部署nfs-provisioner,让K8S集群准备好storageclass,具有动态提供PV的能力。

参考文档:

2. 前置条件

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

3. 制作nfs-provisioner集群镜像

1、添加chart仓库

1
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/

2、下载chart

1
2
3
mkdir nfs-provisioner && cd nfs-provisioner
helm search repo nfs-subdir-external-provisioner/nfs-subdir-external-provisioner -l
helm fetch nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --version 4.0.18

这里下载 chart4.0.18 版本,对应 nfs-provisoner4.0.2 版本。
下载的文件名为:nfs-subdir-external-provisioner-4.0.18.tgz

3、修改chart

1
2
3
4
tar -xzvf nfs-subdir-external-provisioner-4.0.18.tgz
vim nfs-subdir-external-provisioner/values.yaml
tar -czvf nfs-subdir-external-provisioner-4.0.18-custom.tgz nfs-subdir-external-provisioner
rm nfs-subdir-external-provisioner -rf

修改chart的values.yaml,给一些默认值,然后重新打包chart,后续Dockerfile中的CMD中可以少填一些参数。

如下修改:

  • image.repository 修改为 registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner
  • image.tag 修改为 v4.0.0

4、添加镜像列表

1
2
mkdir -p images/shim/
vim images/shim/nfs-provisioner-images.txt

内容为:

1
registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0

5、编写Dockerfile

1
2
3
4
5
6
FROM scratch
COPY ../nfs-provisioner .
CMD ["helm install nfs-provisioner nfs-subdir-external-provisioner-4.0.18-custom.tgz \
--namespace nfs-provisioner --create-namespace \
--set nfs.server=192.168.56.101 \
--set nfs.path=/data/nfs"]

6、构建集群镜像

1
2
sealos build -f Dockerfile -t docker.io/voidking/nfs-provisioner:v4.0.0 .
sealos inspect docker.io/voidking/nfs-provisioner:v4.0.0

4. 使用nfs-provisioner集群镜像

4.1. 安装nfs-provisioner

运行nfs-provisioner应用,安装nfs-provisioner

1
sealos run docker.io/voidking/nfs-provisioner:v4.0.0

报错:bash: [helm: 未找到命令
排查解决过程参见【未找到helm命令问题排查】一节。

4.2. 自定义安装nfs-provisioner

1
2
3
4
5
6
7
8
sealos run docker.io/voidking/nfs-provisioner:v4.0.0 --cmd="helm install nfs-provisioner nfs-subdir-external-provisioner-4.0.18-custom.tgz \
--namespace nfs-provisioner --create-namespace \
--set nfs.server=192.168.56.102 \
--set nfs.path=/data/nfs \
--set storageClass.name=nfs-client \
--set storageClass.defaultClass=true"

kubectl get all -n nfs-provisioner

4.3. 上传集群镜像

上传到公共镜像仓库

1
2
3
4
sealos push docker.io/voidking/nfs-provisioner:v4.0.0
sealos tag docker.io/voidking/nfs-provisioner:v4.0.0 hub.sealos.cn/voidking/nfs-provisioner:v4.0.0
sealos login -k config.yml hub.sealos.cn
sealos push hub.sealos.cn/voidking/nfs-provisioner:v4.0.0

上传到私有镜像仓库

1
2
3
sealos tag docker.io/voidking/nfs-provisioner:v4.0.0 harbor.voidking.com/sealos/nfs-provisioner:v4.0.0
sealos login harbor.voidking.com
sealos push harbor.voidking.com/sealos/nfs-provisioner:v4.0.0

4.4. 卸载nfs-provisioner

1
2
3
4
5
helm list -A
helm uninstall nfs-privisioner -n nfs-privisioner
sealos ps
sealos rm default-xxx
cd /var/lib/sealos/data/default/applications && rm deafult-xxx -rf

4.5. 删除历史镜像

1
2
sealos images | grep '<none>' | awk '{print $3}' | xargs sealos rmi
# sealos rmi docker.io/voidking/nfs-provisioner:v4.0.0

5. 未找到helm命令问题排查

5.1. 问题描述

运行nfs-provisioner应用,安装nfs-provisioner

1
sealos run docker.io/voidking/nfs-provisioner:v4.0.0

报错:bash: [helm: 未找到命令

5.2. helm放入PATH

1
2
3
4
5
6
7
FROM scratch
COPY ../nfs-provisioner .
COPY ../nfs-provisioner/helm /usr/local/bin/
CMD ["helm install nfs-privisioner nfs-subdir-external-provisioner-4.0.18-custom.tgz \
--namespace nfs-provisioner --create-namespace \
--set nfs.server=192.168.56.101 \
--set nfs.path=/data/nfs"]

在Dockerfile中把helm拷贝到 /bin/、/usr/bin/、/usr/local/bin/ ,报错依旧。

5.3. 工作路径执行helm

1
2
3
4
5
6
FROM scratch
COPY ../nfs-provisioner .
CMD ["./helm install nfs-privisioner nfs-subdir-external-provisioner-4.0.18-custom.tgz \
--namespace nfs-provisioner --create-namespace \
--set nfs.server=192.168.56.101 \
--set nfs.path=/data/nfs"]

在Dockerfile中把helm拷贝到 workdir,报错 bash: [./helm: 没有那个文件或目录

5.4. 提前准备helm

在 sealos 中,宿主机/var/lib/sealos/data/default/rootfs 是应用的 root 文件系统的位置。
直接把helm放到宿主机/var/lib/sealos/data/default/rootfs目录中,报错依旧。

5.5. 存在缓存?

在 sealos 中,/var/lib/sealos/data/default/applications 是应用的目录。
sealos ps查看应用的id,然后在应用目录找到对应的目录,查看workdir中的文件。
发现多次构建然后run,对应的workdir内容并不会变化,这里有点坑了。

临时解决办法:删除container,删除workdir。

1
2
3
sealos ps
sealos rm deafult-xxx
cd /var/lib/sealos/data/default/applications && rm deafult-xxx -rf

5.6. 命令未改变?

想要查看下执行命令的路径,于是在Dockerfile中把命令修改为pwd,构建,run。
这时神奇的问题出现了,依然提示bash: [helm: 未找到命令,但是我们的镜像里明明已经没有了helm这条命。这说明,构建或者run的机制有问题。

那就自己指定命令:

1
sealos run docker.io/voidking/nfs-provisioner:v4.0.0 --cmd=["pwd"]

报错:bash: [pwd]: 未找到命令

不使用括号,直接传入命令:

1
sealos run docker.io/voidking/nfs-provisioner:v4.0.0 --cmd="pwd"

正常运行了,拿到path为/var/lib/sealos/data/default/applications/default-3slb7ema/workdir

5.7. 重新安装K8S

修改Dockerfile中的CMD,重新打包镜像,新的CMD命令并不会生效。虽然可以在sealos run时直接传入命令,但是这样就没有办法测试镜像的默认启动命令了。

没有找到解决办法,想要复现bash: [helm: 未找到命令这个问题,然后提个issue。

于是重新安装K8S,然后重新安装nfs-provisioner。
安装nfs-provisioner时,使用【制作nfs-provisioner集群镜像】一节中最初的Dockerfile,这次居然没有报错!安装nfs-provisioner成功!说好的缺少helm呢?

发现问题失败,于是删除/usr/bin/helm/usr/local/bin/helm,再次重新安装K8S,再次安装nfs-provisioner。
然后,再次安装nfs-provisioner成功!

神奇了,还没办法复现了。重新找了一台虚拟机,安装K8S,安装nfs-provisioner,顺利安装成功!
行吧,打扰了。。。

5.8. 小结

bash: [helm: 未找到命令 问题,可能是虚拟机环境引起的。因为在全新的环境中,可以找到helm命令。