本文所使用到的文件都在这里 附件.zip

第一章:安装 Harbor

1.1 前提条件

  • ① Kubernetes版本:v 1.21.10。
  • ② Helm 版本:v 3.6.3 。
  • ③ 动态供应,如:nfs 等,需要设置默认的动态供应。
  • ③ Ingress (本人是在每个 Node 节点上都安装 Ingress 的)。

1.2 Harbor 核心组件

1.png

  • Nginx(Proxy):用于代理 Harbor 的 registry、UI、token 等服务。
  • db:负责储存用户权限、审计日志、Docker image 分组信息等数据。
  • UI:提供图形化界面,帮助用户管理 registry 上的镜像, 并对用户进行授权。
  • jobsevice:负责镜像复制工作的,他和 registry 通信,从一个 registry pull 镜像,然后 push 到另一个 registry ,并记录 job_log 。
  • adminserver:是系统的配置管理中心附带检查存储用量,ui 和 jobsevice 启动时候需要加载 adminserver 的配置。
  • Registry:原生的 docker 镜像仓库,负责存储镜像文件。
  • Log:为了帮助监控 Harbor 运行,负责收集其他组件的 log,记录到 syslog 中。

1.3 安装 Harbor

  • 生成 TLS 证书:
  1. openssl req -x509 -nodes -days 3650 -newkey rsa:4096 -keyout tls.key -out tls.crt -subj "/CN=*.xudaxian.com/O=*.xudaxian.com" \
  2. -extensions san \
  3. -config <(echo '[req]'; echo 'distinguished_name=req';
  4. echo '[san]'; echo 'subjectAltName=DNS:*.xudaxian.com,DNS:www.xudaxian.com,DNS:harbor.xudaxian.com')

注意:

  • 生成证书的 xudaxian.com 域名是顶级域名,像 harbor.xudaxian.com 为二级域名。
  • 实际开发中,需要自己购买域名,而不是这样手动伪造证书。

2.gif

  • 创建命名空间和 secret :
  1. kubectl create ns devops
  1. kubectl create secret tls xudaxian.com --cert=tls.crt --key=tls.key -n devops

3.gif

  • 添加 Harbor 的 chart 仓库:
  1. helm repo add harbor https://helm.goharbor.io

4.gif

  • 更新本地可用 chart 信息:
  1. helm repo update

5.gif

  • 下载 Harbor :
  1. helm pull harbor/harbor --version 1.9.0 --untar

6.gif

  • 进入到 harbor 目录:
  1. cd harbor

7.gif

  • 创建 override.yaml 文件:
  1. vi override.yaml
  1. expose: #web浏览器访问用的证书
  2. type: ingress
  3. tls:
  4. certSource: "secret"
  5. secret:
  6. secretName: "xudaxian.com"
  7. notarySecretName: "xudaxian.com"
  8. ingress:
  9. hosts:
  10. core: harbor.xudaxian.com
  11. notary: notary-harbor.xudaxian.com
  12. annotations:
  13. kubernetes.io/ingress.class: "nginx" # 此处一定要配置
  14. externalURL: https://harbor.xudaxian.com
  15. internalTLS: #harbor内部组件用的证书
  16. enabled: true
  17. certSource: "auto"
  18. persistence:
  19. enabled: true
  20. resourcePolicy: "keep"
  21. metrics:
  22. enabled: true
  23. #开启 chartmuseum,使 Harbor 能够存储 Helm 的 chart
  24. chartmuseum:
  25. enabled: true
  26. resources:
  27. requests:
  28. memory: 256Mi
  29. cpu: 500m

注意:

  • ① 这个文件是根据实际需要对 values.yaml 增删改之后形成的。
  • ② 我们完全可以使用 cp values.yaml override.yaml 命令,复制为新的 override.yaml 文件,然后增删改即可。
  • ③ 在新版本的 Harbor 中,Harbor 内部组件使用的是自己默认的证书,而 Ingress 需要用我们生成的证书。

8.gif

  • 安装 Harbor :
  1. helm install harbor -f values.yaml -f override.yaml . -n devops

9.gif

  • 需要等所有的组件都启动完毕:

10.PNG

  • 查看 ingress :
  1. kubectl get ing -n devops

11.PNG

  • 本人选择在开一台虚拟机(IP 地址是 192.168.65.137 )作为测试,并在 /etc/hosts 中配置:
  1. 192.168.65.101 harbor.xudaxian.com

12.PNG

  • 登录到 Harbor ,默认的用户名是 admin ,默认的密码是 Harbor12345

13.gif

1.4 Harbor 使用

1.4.1 Harbor 新建项目

  • Harbor 是以项目为单位的,所以需要新建项目:

14.gif

1.4.2 Docker 推送镜像到 Harbor 仓库中

  • 由于 Harbor 使用的是 https 通信,所以需要让 Docker 信任这个 https (即 Docker 不信任自定义的域名(自签证书)):
  • 将 192.168.65.100 上生成的 tls 证书复制到测试的机器上:
  1. scp tls.crt root@192.168.65.137:/root

15.gif

  • 在测试机器上使得 Docker 受信自定义域名:
  1. cd /etc/docker/
  1. # certs.d 是固定的名字,harbor.xudaxian.tom 和域名同名的文件夹
  2. mkdir -pv certs.d/harbor.xudaxian.com
  1. # 进入这个目录
  2. cd certs.d/harbor.xudaxian.com
  1. # 将证书文件复制到这个文件夹中
  2. cp ~/tls.crt .
  1. # 重启 Docker
  2. systemctl restart docker

注意:

  • 如果是自己购买的域名,上面的步骤就可以省略了。
  • 在 192.168.65.137 机器上的 /etc/hosts 文件增加 192.168.65.102 harbor.xudaxian.com,其中 192.168.65.102 表示部署了 Ingress 的 Node 机器的 IP 地址。

16.gif

  • Docker 登录:
  1. docker login -u admin harbor.xudaxian.com

17.gif

  • Docker 推送镜像:
  1. docker pull nginx
  1. docker tag nginx harbor.xudaxian.com/mall/nginx:v1.0
  1. docker push harbor.xudaxian.com/mall/nginx:v1.0

18.gif

  • 去 Harbor 中查看镜像是否推送完毕:

19.PNG

第二章:推送 Chart

2.1 前提说明

  • 阿里云、腾讯云等云厂商都提供了 Chart 仓库的功能,但是这些都是企业版的,需要收费;所以,我采取将 Chart 推送到 Helm 的 中央仓库 以及使用 Harbor 作为演示。

注意:

  • 推送到 Helm 的中央仓库需要配合 Github 使用。
  • 也可以使用 Harbor 作为 Helm 的仓库。
  • 在 GitHub 中新建 mall 的仓库:操作步骤略。

20.PNG

2.2 开源项目将 Chart 推送到 Helm 的中央仓库

  • ① 下载 Github 的项目:

21.gif

  • ② 制作 chart :
  1. # 为什么要创建 docs ,主要是为了做 github Page。
  2. cd mall && mkdir -pv docs && cd docs
  1. helm create mall

22.gif

注意:如果是微服务项目,只需要在 docs/mall/charts 目录中继续创建对应的微服务 chart 即可,此处不再展开。

  • ③ 将 chart 打包的 chart/ 目录中。
  1. helm package [CHART_PATH] -d charts/ [--version 1.0.0]

注意:

  • CHART_PATH:表示 chart 的路径。
  • --version :指定打包的版本号。
  1. helm package mall -d charts/

23.gif

  • ④ 对于每个 Helm 存储库,都必须有 index.yaml 文件,该文件保存当前存储库中的图表信息。

24.gif

注意:

  • 每次向在仓库中添加一个新的 chart 的时候,都需要重新生成 index 。helm repo index命令会完全无痕重建index.yaml文件。只包括在本地找到的 chart 。
  • 不过,我们可以使用 -merge 参数增量添加新的 chart 到现有的 index.yaml 文件中。
  • ⑤ 提交代码到 GitHub 中:略。

25.PNG

  • ⑥ GitHub 设置 Pages :

26.PNG

27.PNG

  • ⑦ Helm 中央仓库中增加 Repository :

28.PNG

29.PNG

  • ⑧ 添加仓库:
  1. helm repo add xudaxian https://aurorxa.github.io/mall/charts/

30.gif

  • ⑨ 安装应用:
  1. helm install mall xudaxian/mall

31.gif

  • ⑩ 这样操作,还是不太灵活,因为用户并不清楚其中的细节,我们能否提供文档,告诉其安装的步骤等。
    • 步骤 ② 操作完之后,创建 README.md 文件,内容如下: ```markdown

      这是一个非常简单的商城。

商城

1 安装 Chart和卸载 Chart

  • 安装:
  1. helm repo add xudaxian https://aurorxa.github.io/mall/charts/
  1. helm install mall xudaxian/mall
  • 卸载:
  1. helm uninstall mall

2 其他

  • 略。 ```

    • 提交到 Github 中,并重复执行 步骤 ② 之后的步骤。

32.gif

注意:

  • Helm 官方其实推荐是建立一个项目,名为 charts ,所有的 Helm 的 chart 都推送到此项目中,这样方便管理,可以参考 Bitnami
  • 如果使用 GitHub ,最好结合 GitHub 的 Action(CI/CD),这样效率更高,我上面的示例为手动版。

2.3 Helm 3.7 及以下客户端版本推送 Chart 到 Harbor

  • ① 开启 Helm 3 的客户端实验特性:
  1. export HELM_EXPERIMENTAL_OCI=1

33.gif

  • ② 登录到 Harbor :
  1. helm registry login [--insecure host] -u xxx
  • --insecure 192.168.86.5 :表示不以 https 的方式登录。
  • host:仓库的地址。
  • u:用户名。
  1. helm registry login --insecure http://harbor.xudaxian.com -u admin

34.gif

  • ③ 制作 Chart 包:
  1. helm create mall

35.gif

  • ④ 给 chart 打包 :
  1. helm chart save [path] [ref] [flags]
  • path:chart 的路径:
  • ref:harbor的域名/项目/chart名称:tag
  1. helm chart save mall/ harbor.xudaxian.com/mall/mall:1.0

36.gif

  • ⑤ 推送 Chart :
  1. helm chart push [ref] [flags]

ref:harbor的域名/项目/chart名称:tag

  1. helm chart push harbor.xudaxian.com/mall/mall:1.0

37.gif

之所以,出现错误,是因为 Harbor 中的证书是我伪造的,没有经过 CA 认证。

  • ⑥ 退出 :
  1. helm registry logout [host] [flags]

2.4 Helm 3.8 推送 Chart 到 Harbor

  • ① 登录:
  1. helm registry login [host] [flags]
  • ② 将 chart 目录打包成压缩包:
  1. helm package [CHART_PATH] [...] [flags]
  • ③ 推送:
  1. helm push CHART_PACKAGE oci://域名/项目名