Skip to content

应用商城 Helm(v3.6.x)下

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

第一章:安装 Harbor

1.1 前提条件

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

1.2 Harbor 核心组件

1651330817922-1cfee250-6a76-4ad4-818d-9f647c3515e0.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 证书:
openssl req -x509 -nodes -days 3650 -newkey rsa:4096 -keyout tls.key -out tls.crt -subj "/CN=*.xudaxian.com/O=*.xudaxian.com" \
  -extensions san \
  -config <(echo '[req]'; echo 'distinguished_name=req';
            echo '[san]'; echo 'subjectAltName=DNS:*.xudaxian.com,DNS:www.xudaxian.com,DNS:harbor.xudaxian.com')

注意:

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

1651330826371-e5f23774-7636-49d2-a7ba-9514054ffcf8.gif

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

1651330833943-cbc095f5-84a0-48d0-95e5-ebedbfea1d8f.gif

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

1651330838207-7d79c58e-e29b-4ac3-9384-db92dd790027.gif

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

1651330842463-13f75f9b-18c5-4de7-8ec6-c56b61760d8d.gif

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

1651330847440-f7df605e-120b-4684-8777-95613f96c887.gif

  • 进入到 harbor 目录:
cd harbor

1651330852127-a72e8a72-b053-4dc3-a939-491d2743c9b0.gif

  • 创建 override.yaml 文件:
vi override.yaml
expose:  #web浏览器访问用的证书
  type: ingress
  tls:
    certSource: "secret"
    secret:
      secretName: "xudaxian.com"
      notarySecretName: "xudaxian.com"
  ingress:
    hosts:
      core: harbor.xudaxian.com
      notary: notary-harbor.xudaxian.com
    annotations:
      kubernetes.io/ingress.class: "nginx" # 此处一定要配置
externalURL: https://harbor.xudaxian.com
internalTLS:  #harbor内部组件用的证书
  enabled: true
  certSource: "auto"
persistence:
  enabled: true
  resourcePolicy: "keep"
metrics:
  enabled: true
#开启 chartmuseum,使 Harbor 能够存储 Helm 的 chart
chartmuseum:
  enabled: true
  resources:
    requests:
     memory: 256Mi
     cpu: 500m

注意:

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

1651330859135-37ef7b0c-f87d-4a51-a01f-fb3f64caa890.gif

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

1651330866356-41e0cc52-0e7e-4813-ae5e-d156290b89f4.gif

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

1651330872366-433b3ba7-5cfa-4fa7-b764-69009435c22a.png

  • 查看 ingress :
kubectl get ing -n devops

1651330876882-eb8080dd-f659-4fad-80b0-c2153a56e3ff.png

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

1651330881241-f92ea53d-e3dd-428c-b554-95a60addab2e.png

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

1651330885995-ffe7ef04-0687-4f05-9a5f-2e4db620b7ba.gif

1.4 Harbor 使用

1.4.1 Harbor 新建项目

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

1651330894327-19763b0c-1161-4a0a-beff-dabd63b74f9a.gif

1.4.2 Docker 推送镜像到 Harbor 仓库中

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

1651330900030-ab725a86-6455-4490-87e5-301b3a715ef3.gif

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

注意:

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

1651330907318-f9a24708-f699-4665-bc00-44e038213fd9.gif

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

1651330914812-2c2e04d3-bc26-4b32-80bb-46764008bf04.gif

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

1651330919777-4740f993-98f8-42e2-ae1d-1320763b5e7f.gif

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

1651330924677-ca477c18-119a-4966-bac4-e5c6a79d4482.png

第二章:推送 Chart

2.1 前提说明

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

注意:

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

1651330932636-10fd9b93-c43b-417c-bd0f-0b5ce5afba7b.png

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

  • ① 下载 Github 的项目:

1651330941933-87749be3-f809-4c94-9fc4-9e3daf4ba1fc.gif

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

1651330947928-fba669ab-371b-474c-8412-4bd41b7ff309.gif

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

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

注意:

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

1651330967877-92fa6f70-e993-4d59-83a9-a6ee9391733a.gif

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

1651330973127-f3151d5c-cef5-4116-9f38-504e5930b6e9.gif

注意:

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

1651330980448-47dc09d2-b988-46f0-83d3-934f5eee30b3.png

  • ⑥ GitHub 设置 Pages :

1651330984778-282ba24c-f000-4a5b-8c60-c6f7dc948f7d.png

1651330988710-290e807e-1e61-47dc-9d2e-f7c167f666ca.png

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

1651330992648-1a362374-cb05-49fa-a0d8-e0f5ad002ac5.png

1651330997040-c840e215-15fa-4c61-a99a-01cd9d9bb0da.png

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

1651331004834-0010e731-1fdd-4de7-9b36-ccc8a781556d.gif

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

1651331011654-9c6f814e-1ca0-4a5c-98de-6991926a1ae6.gif

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

# 商城

## 1 安装 Chart和卸载 Chart

* 安装:

```shell
helm repo add xudaxian https://aurorxa.github.io/mall/charts/
helm install mall xudaxian/mall
  • 卸载:
helm uninstall mall

2 其他

  • 略。
        - 提交到 Github 中,并重复执行 `步骤 ②` 之后的步骤。
    
    ![1651331019097-4de4c13b-74b2-4580-b1c6-f6c117ac4fbe.gif](./img/4k0yujKxAm0AgLGM/1651331019097-4de4c13b-74b2-4580-b1c6-f6c117ac4fbe-802310.gif)
    
    
    
    > 注意:
    >
    > + Helm 官方其实推荐是建立一个项目,名为 charts ,所有的 Helm 的 chart 都推送到此项目中,这样方便管理,可以参考 [Bitnami](https://github.com/bitnami) 。
    > + 如果使用 GitHub ,最好结合 GitHub 的 Action(CI/CD),这样效率更高,我上面的示例为手动版。
    >
    
    
    
    ## 2.3 Helm 3.7 及以下客户端版本推送 Chart 到 Harbor
    
    
    + ① 开启 Helm 3 的客户端实验特性:
    
    
    
    ```shell
    export HELM_EXPERIMENTAL_OCI=1
    

1651331031399-0b878f11-6ac0-44b3-9924-2c1bad471613.gif

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

1651331038065-e718112a-f389-44cd-9df1-ca21cb56ded4.gif

  • ③ 制作 Chart 包:
helm create mall

1651331043653-0dc6c8b6-8275-451c-9252-7a4f6676a8fc.gif

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

1651331049490-3f556155-095f-480c-be10-175796015285.gif

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

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

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

1651331055552-69970b04-dcec-4bb0-be48-44114f7130b1.gif

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

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

2.4 Helm 3.8 推送 Chart 到 Harbor

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

更新: 2022-04-30 22:04:36
原文: https://www.yuque.com/fairy-era/yg511q/ar93ua

Comments