使用harbor作为chart仓库实现内网部署
制作好的chart包可以传到chart仓库进行共享,chart仓库可以是公有仓库或者使用Harbor搭建的私有仓库。
本文使用的环境信息:
root@master1:~# kubectl get node
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane 22d v1.28.2
master2 Ready control-plane 22d v1.28.2
master3 Ready control-plane 22d v1.28.2
worker1 Ready <none> 22d v1.27.1# helm 版本
root@master1:/tmp# helm version
version.BuildInfo{Version:"v3.15.2", GitCommit:"1a500d5625419a524fdae4b33de351cc4f58ec35", GitTreeState:"clean", GoVersion:"go1.22.4"}# harbor版本
root@master1:~# helm ls -n harbor
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
harbor harbor 2 2024-07-13 15:36:40.772521934 +0800 CST deployed harbor-1.15.0 2.11.0
关于chart仓库
chart仓库介绍
chart仓库是打包的chart存储和分享的位置。chart仓库由chart包和包含了仓库中所有chart索引的特殊文件index.yaml。 通常描述chart的index.yaml也托管在同一个服务器上作为来源文件。
基于OCI的注册中心
从Helm 3开始,可以使用具有 OCI支持的容器注册中心来存储和共享chart包。从Helm v3.8.0开始,默认启用OCI支持。
以下是几种chart可以使用的托管容器注册中心,都支持OCI,例如:
- Amazon ECR
- Azure Container Registry
- Docker Hub
- Google Artifact Registry
- IBM Cloud Container Registry
- JFrog Artifactory
同样的,harbor作为是一款云原生制品仓库,可以存储和管理容器镜像、Helm Chart 等 Artifact,同样启用了OCI支持。
本文使用harbor作为chart仓库。
上传chart到harbor
如果Harbor版本低于2.8,安装harbor时需要启用chartmuseum。
harbor启用helm chart仓库(harbor 2.8之前)
默认新版 harbor 不会启用 chart repository service,如果启用安装方式要添加一个参数 --with-chartmuseum
$ ./install.sh --with-chartmuseum
如果是后期修改配置文件,可以使用 ./prepare --with-chartmuseum
后,再 docker-compose up -d
启用后Harbor中有独立的Helm Charts页面。Charts支持UI上传、helm push两种上传chart的方式。
Harbor2.8(包括)之后管理Helm Charts
harbor版本大于等于2.8,按照下面的命令直接推送chart即可。Harbor中Charts与Image保存在相同目录下,没有单独的页面。
# 登录helm仓库
root@master1:~/harbor# helm registry login harbor.test.com --insecure
Username: admin
Password:
Login Succeeded# 提前在harbor中创建号harbor项目。上传不再支持UI界面,必须使用helm push
root@master1:~/hello# ls
app.py Dockerfile my-hello my-hello-1.0.tgz
root@master1:~/hello# helm push my-hello-1.0.tgz oci://harbor.test.com/library/
Error: failed to do request: Head "https://harbor.test.com/v2/library/my-hello/blobs/sha256:0db1fb6272f773572edb9ebad8c7fb902a76166bf14d896d3790f2a82f524838": tls: failed to verify certificate: x509: certificate signed by unknown authority
# 加--insecure-skip-tls-verify跳过tls验证
root@master1:~/hello# helm push my-hello-1.0.tgz oci://harbor.test.com/library/ --insecure-skip-tls-verify
Pushed: harbor.test.com/library/my-hello:1.0
Digest: sha256:b3d7820d0e46450992aefb7480c49afe9aa345c296813b021eeb9034aa362ab3# 下载chart执行下面命令,命令可以从harbor界面复制
helm pull oci://harbor.test.com/library/my-hello --version 1.0 -insecure-skip-tls-verify
这样就实现了上篇文章中构建的chart上传到harbor仓库。
修改第三方chart重新打包推送到harbor
这里演示将harbor的官方chart从官方仓库下载后,修改镜像仓库地址,重新打包上传到私有仓库harbor,方便内部后续进行部署。
# 下载harbor官方的helm chart,这里可以换成其他chart进行测试
root@master1:~/harbor# helm repo add harbor https://helm.goharbor.io
root@master1:~/harbor# helm repo update
root@master1:~/harbor# helm pull harbor/harbor
root@master1:~/harbor# ls
harbor-1.15.0.tgz
root@master1:~/harbor# tar xf harbor-1.15.0.tgz
root@master1:~/harbor# cd harbor# 修改value.yaml中的镜像仓库为私有harbor
root@master1:~/harbor/harbor# ls
Chart.yaml LICENSE README.md templates values.yaml
root@master1:~/harbor/harbor# sed -i 's/repository: goharbor/repository: harbor.test.com\/harbor/g' values.yaml# 重新打包chart
root@master1:~/harbor/harbor# helm package .
Successfully packaged chart and saved it to: /root/harbor/harbor/harbor-1.15.0.tgz
将chart推送到harbor:
root@master1:~/harbor/harbor# helm push harbor-1.15.0.tgz oci://harbor.test.com/harbor --insecure-skip-tls-verify
拉取部署chart所需的容器镜像并重新打tag推送到harbor,该过程通过如下脚本进行:
# 脚本内容
root@master1:~/harbor# cat images-pull-push-2-harbor.sh
NAMESPACE="harbor"
kubectl get pods -n $NAMESPACE -o jsonpath="{range .items[*]}{.spec.containers[*].image}{'\n'}{end}" | sort |NAMESPACE="harbor" # 命名空间
HARBOR_URL="harbor.test.com" # harbor访问的域名
HARBOR_PROJECT="harbor" # 镜像项目名称# 获取所有Pod的镜像
IMAGES=$(kubectl get pods -n $NAMESPACE -o jsonpath="{range .items[*]}{.spec.containers[*].image}{'\n'}{end}" | sort | uniq)# 登录Harbor
docker login $HARBOR_URL -u admin -p Harbor12345# 拉取镜像、重新tag并推送到Harbor
for IMAGE in $IMAGES; doIMAGE_NAME=$(echo $IMAGE | awk -F'/' '{print $NF}')NEW_TAG="$HARBOR_URL/$HARBOR_PROJECT/$IMAGE_NAME"# 拉取原镜像docker pull $IMAGE# 重新tag镜像docker tag $IMAGE $NEW_TAG# 推送到Harbordocker push $NEW_TAG# 删除本地镜像docker rmi $IMAGEdocker rmi $NEW_TAG
done# 运行脚本
root@master1:~/harbor# sh images-pull-push-2-harbor.sh
最终在harbor的harbor项目下,同时存放了harbor的chart和部署所需的镜像。
chart部署验证
在另外一套k8s集群,验证上传到harbor的chart:
#下载chart
[root@k8s ~]# helm pull oci://harbor.test.com/harbor/harbor --version 1.15.0 --insecure-skip-tls-verify[root@k8s ~]# helm upgrade --install harbor harbor-1.15.0.tgz --namespace harbor --create-namespace \
> --set expose.type=ingress \
> --set expose.ingress.className=nginx \
> --set expose.ingress.hosts.core=harbor.abc.com \
> --set expose.ingress.hosts.notary=notary.abc.com \
> --set externalURL=https://harbor.abc.com \
> --set harborAdminPassword="Harbor12345" \
> --set persistence.persistentVolumeClaim.registry.storageClass="openebs-hostpath" \
> --set persistence.persistentVolumeClaim.jobservice.jobLog.storageClass="openebs-hostpath" \
> --set persistence.persistentVolumeClaim.database.storageClass="openebs-hostpath" \
> --set persistence.persistentVolumeClaim.redis.storageClass="openebs-hostpath" \
> --set persistence.persistentVolumeClaim.trivy.storageClass="openebs-hostpath"
检查部署的harbor相关容器正常。
[root@k8s ~]# kubectl get pod -n harbor
NAME READY STATUS RESTARTS AGE
harbor-core-f647b8997-6sk6d 1/1 Running 1 (6m17s ago) 7m22s
harbor-database-0 1/1 Running 0 7m22s
harbor-jobservice-6bc775ffb7-bcgn9 1/1 Running 2 (5m53s ago) 7m22s
harbor-portal-5d7876f8bf-wjxpn 1/1 Running 0 7m22s
harbor-redis-0 1/1 Running 0 7m22s
harbor-registry-78988bfcc8-pbgwx 2/2 Running 0 7m22s
harbor-trivy-0 1/1 Running 0 7m22s
测试安装chart正常,且会从harbor拉取镜像,这样就可以实现官方chart的内网部署。同理一切官方发布的chart都可以使用类似的过程修改重新打包后部署到自己的私有harbor仓库中。
相关资料
- Chart仓库指南
- 使用基于OCI的注册中心