使用harbor作为chart仓库实现内网部署

使用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,例如:

同样的,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; do
  IMAGE_NAME=$(echo $IMAGE | awk -F'/' '{print $NF}')
  NEW_TAG="$HARBOR_URL/$HARBOR_PROJECT/$IMAGE_NAME"

  # 拉取原镜像
  docker pull $IMAGE

  # 重新tag镜像
  docker tag $IMAGE $NEW_TAG

  # 推送到Harbor
  docker push $NEW_TAG

  # 删除本地镜像
  docker rmi $IMAGE
  docker 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仓库中。

相关资料

  1. Chart仓库指南
  2. 使用基于OCI的注册中心

相关推荐

  1. 使用harbor作为chart仓库实现部署

    2024-07-14 20:24:03       19 阅读
  2. 阿里云主机使用 docker-compose 部署 harbor 镜像仓库

    2024-07-14 20:24:03       25 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-14 20:24:03       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-14 20:24:03       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-14 20:24:03       57 阅读
  4. Python语言-面向对象

    2024-07-14 20:24:03       68 阅读

热门阅读

  1. uniapp使用微信登录

    2024-07-14 20:24:03       19 阅读
  2. git patch怎么使用?

    2024-07-14 20:24:03       20 阅读
  3. git 分支介绍

    2024-07-14 20:24:03       20 阅读
  4. Mybatis-plus3.4.3下使用lambdaQuery报错

    2024-07-14 20:24:03       21 阅读
  5. 模拟电路再理解系列(2)-电源滤波电路

    2024-07-14 20:24:03       22 阅读
  6. 【Python】ftplib的使用

    2024-07-14 20:24:03       19 阅读