Helm-离线安装资源准备

Helm-离线安装资源准备

Posted by zhmingyong on June 24, 2024

Kubernetes Helm离线安装资源准备

搬运镜像

搬运镜像指的就是将镜像从公网下载到本地,然后上传至你的私有镜像仓库的过程。为了搬运镜像,你需要一台能顺利访问外网的工作机,以及能够与之传输文件的集群内操作节点(具备 kubectl 管理员权限)。

准备资源

1.对于 Helm 安装方式(对于生产集群,这无疑是更为推荐的安装方式),可以直接用下方命令获取需要搬运的镜像列表:

helm template . | grep -E ' *image:' | sed 's/ *image: //' | sort | uniq > images.txt

而如果你直接使用 kubectl 进行安装,也可以使用类似上方的文本处理流程,提取出需要搬运的镜像列表。但由于生产集群不推荐使用 kubectl 直接安装 k8s.yaml,此处不过多介绍。

上述步骤完成后,images.txt 中就已经包含了所有需要搬运的镜像,编写该文档时执行结果如下:

juicedata/juicefs-csi-driver:v0.21.0
registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.9.0
registry.k8s.io/sig-storage/csi-provisioner:v2.2.2
registry.k8s.io/sig-storage/csi-resizer:v1.9.0
registry.k8s.io/sig-storage/livenessprobe:v2.12.0

2.将所有镜像下载到本地,并统一重命名。注意拉取镜像的机器,CPU 架构需要和线上环境相同,否则需要使用 –platform 参数指定运行环境。

cat images.txt | xargs --max-procs=10 --max-lines=1 docker pull --platform=linux/amd64

不同 CPU 架构的镜像无法跨环境使用,会出现 exec user process caused: exec format error 的容器启动报错,因此务必注意镜像的 CPU 架构需要匹配。

3.如果你拉取机器的工作机无法直接推送镜像到私有镜像仓库,那么需要将镜像导出到文件,传输到集群内,准备后续的导入操作:

# 将所有镜像统一输出打包
cat images.txt | xargs docker image save -o juicefs-k8s-images.tar

# 将所有牵涉的资源打包,准备传输
tar -czf juicefs-k8s.tar.gz juicefs-k8s-images.tar k8s.yaml images.txt

# 自行将压缩包传输到 Kubernetes 集群的 master 节点,或者其他具备 kubectl 管理员操作权限的节点
scp juicefs-k8s.tar.gz ...

导入资源

1.将容器镜像导入到本地,以 Docker 为例:

mkdir juicefs-k8s && tar -xzf juicefs-k8s.tar.gz -C juicefs-k8s && cd juicefs-k8s
docker image load -i juicefs-k8s-images.tar

如果该离线集群不使用私有镜像仓库,那么上边的步骤便需要在所有 Kubernetes 节点上运行。除此外,你还需要保证这些镜像会持续存在于节点上,不会被意外清理(比如 kubelet 默认在磁盘空间高于 80% 的时候清理镜像)。

而如果你为离线集群搭建了内网镜像仓库,那么需要将镜像推送到该镜像仓库,继续参考下方步骤进行镜像搬运。

2.上传镜像到私有仓库

将导入的镜像统一重命名:

REGISTRY=registry.example.com:32000
cat images.txt | awk "{print \$0,\"$REGISTRY/\"\$0}" | xargs -L 1 docker tag

执行完后,确认 Docker 中已经载入以下镜像:

$ docker image ls
registry.example.com:32000/juicedata/juicefs-csi-driver:v0.10.5
registry.example.com:32000/juicedata/csi-provisioner:v1.6.0
registry.example.com:32000/juicedata/livenessprobe:v1.3.0
registry.example.com:32000/juicedata/csi-node-driver-registrar:v1.1.0
registry.example.com:32000/juicedata/mount:xx-xx

将镜像推送到私有仓库,请确保 Docker 有权限推送镜像:

cat images.txt | sed "s@^@$REGISTRY/@" | xargs --max-procs=10 --max-lines=1 docker push

3.更改 k8s.yaml 中的容器镜像地址

将 k8s.yaml 中所有的容器镜像(image: 后面的内容)改成上一步中推送到私有仓库相应镜像:

sed -i.orig \
  -e "s@juicedata/juicefs-csi-driver@$REGISTRY/juicedata/juicefs-csi-driver@g" \
  -e "s@quay.io/k8scsi@$REGISTRY/juicedata@g" \
  k8s.yaml

备注 由于修改了 Mount Pod 容器镜像的 tag,因此你需要一并更改 CSI 驱动设置,让 CSI 驱动从内网镜像仓库下载 Mount Pod 容器镜像。详见覆盖默认容器镜像。