腾讯云产品信息

TKE:腾讯云容器服务,Kubernetes 版本:1.24.4,containerd 版本:1.6.9
Helm 版本:helm 3,本文采用 helm 方式部署 Harbor。参考:Helm安装和使用
Harbor 版本:1.11.1
COS:腾讯云对象存储
CFS:腾讯云文件存储(可理解为NFS)

刚买完 TKE 托管集群的一台 work 节点,准备业务上容器使用,部署镜像仓库居然用了我半个礼拜。但是碰到坑确实也是没想到。

提前声明,镜像存储用了腾讯云 COS,s3 的存储方式,其他的类似数据库的存储用了腾讯云 CFS,文件存储的方式。

首先确保可操作的服务器可以通过 kubeconfig 连接到 TKE 集群。

准备 COS 对象存储

镜像的存储建议是放对象存储,因为容量大,可扩展,成本低,速度还快。腾讯云上的对象存储是 COS,而 harbor 的存储驱动暂不支持 COS,不过 COS 自身兼容 S3,所以可以配置 harbor 使用 S3 存储驱动。

下面我们登录腾讯云账号,在 COS 控制台 创建一个存储桶:尽量选择和服务地域相近的地域

TKE_harbor_COS

一直下一步,完成即可。

创建云 API 密钥

用作 harbor 连接 COS。在 访问密钥 这里新建密钥,记录 SecretId 和 SecretKey。

准备 CFS 文件存储

在腾讯云的 TKE 控制台,进入组件管理,安装 CFS 组件

TKE_harbor_cfs_module

同样在 TKE 控制台,存储—storageClass—新建,创建 storageClass,关键选择了 文件存储 CFS 即可,我这里使用了共享实例。

TKE_harbor-cfs_sc

下载 harbor chart 包

$ helm fetch harbor/harbor --untar
$ ls harbor
Chart.yaml  conf  LICENSE  README.md  templates  values.yaml

修改 value.yaml

下面我只贴出我该动过的位置

expose:
  type: nodePort     # 目前我的 ingress 因为版本原因还有点问题在处理,后续用 nginx 代理
  tls:
    enabled: false   # 不使用tls


# 因为关了tls,所以不用https,这里改为将要使用的域名。
# 如果只用nodePort,则改为 http://节点ip:30002
externalURL: http://core.harbor.domain    


# 以下harobr组件使用了 CFS 的 storageClass 来创建 pvc
persistence:
  enabled: true
  resourcePolicy: "keep"
  persistentVolumeClaim:
    registry:
      storageClass: "harbor-cfs"
    chartmuseum:
      storageClass: "harbor-cfs"
    jobservice:
      jobLog:
        storageClass: "harbor-cfs"
    database:
      storageClass: "harbor-cfs"
    redis:
      storageClass: "harbor-cfs"
    trivy:
      storageClass: "harbor-cfs"

# 镜像存储位置
  imageChartStorage:
    type: s3
    s3:
      region: ap-beijing          # COS所在地域
      bucket: harbor-130****660   # 存储桶名称
      accesskey: AKID****************************wqYT    # 创建的云API密钥SecretId
      secretkey: qZ6T************************J2cz        # 创建的云API密钥SecretKey
      regionendpoint: https://cos.ap-beijing.myqcloud.com
      secure: true
      rootdirectory: / # COS中的路径


# harbor admin默认密码,先不要改,这里在我的部署过程中是个坑。
harborAdminPassword: "Harbor12345"

安装 harbor

# 在harbor目录下
$ kubectl create ns harbor
$ helm install harbor . -n harbor

查看容器状态

$ kubectl get po -n harbor
NAME                                    READY   STATUS    RESTARTS        AGE
harbor-chartmuseum-57996fb754-wr9pl     1/1     Running   0               60s
harbor-core-766945fd8-2lz86             1/1     Running   0               60s
harbor-database-0                       1/1     Running   0               60s
harbor-jobservice-85cf4f86db-g9g28      1/1     Running   4 (60s ago)     60s
harbor-nginx-bf8bbf85b-rxv5v            1/1     Running   0               60s
harbor-notary-server-657677cf9d-4z7vh   1/1     Running   1 (60s ago)     60s
harbor-notary-signer-675f6696d-nffvm    1/1     Running   1 (60s ago)     60s
harbor-portal-6fdc5d74bf-hmzhz          1/1     Running   0               60s
harbor-redis-0                          1/1     Running   0               60s
harbor-registry-588757ff65-bjjcq        2/2     Running   0               60s
harbor-trivy-0                          1/1     Running   0               60s

查看svc

$ kubectl get svc  -n harbor
NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                       AGE
harbor                 NodePort    10.255.254.10    <none>        80:30002/TCP,4443:30004/TCP   60s
harbor-chartmuseum     ClusterIP   10.255.253.43    <none>        80/TCP                        60s
harbor-core            ClusterIP   10.255.254.134   <none>        80/TCP                        60s
harbor-database        ClusterIP   10.255.252.64    <none>        5432/TCP                      60s
harbor-jobservice      ClusterIP   10.255.253.208   <none>        80/TCP                        60s
harbor-notary-server   ClusterIP   10.255.254.125   <none>        4443/TCP                      60s
harbor-notary-signer   ClusterIP   10.255.254.22    <none>        7899/TCP                      60s
harbor-portal          ClusterIP   10.255.255.49    <none>        80/TCP                        60s
harbor-redis           ClusterIP   10.255.253.139   <none>        6379/TCP                      60s
harbor-registry        ClusterIP   10.255.255.185   <none>        5000/TCP,8080/TCP             60s
harbor-trivy           ClusterIP   10.255.254.217   <none>        8080/TCP                      60s

也可以执行 get all

$ kubectl get all -n harbor

访问验证

使用nginx代理节点ip:30002,访问域名登录

或者nodeport登录即可

踩坑记录

坑1:CFS root-dir 路径

TKE_harbor_CFS_dir

我也是手贱,非要改一下,导致在使用 storageClass 时,无法 bound PVC,一直处于 pending 状态,也有一个现象是基于 CFS 创建的 storageClass 相关 pod 无法 Running,报错信息类似于什么东西404。

分析是要在/var/lib/kubelet找一些相关组件,我当时改到了/data下。

坑2:Harbor UI 界面报错用户名密码不正确

这个问题我排查了整整两天,甚至重置密码,清空密码等操作,清楚浏览器 cookie 都没用,一度以为没有连接到数据库,无法验证用户密码的正确性。这部分在 harbor-core 容器里面有报错,但确实没什么有用的信息。

在我的不懈努力下,找到了原因,是harbor修改了密码的加密算法,应该是个bug,旧算法是sha256,新算法sha1。

进入harbor数据库修改admin用户的加密算法,以及密码。

$ kubectl exec -it -n harbor harbor-database-0  -- sh
sh-5.0$ psql -d postgres       # 登陆数据库
psql (13.10)
Type "help" for help.

No entry for terminal type "xterm";
using dumb terminal settings.
postgres=# \c registry         # 进入数据库registry
You are now connected to database "registry" as user "postgres".

registry=# select * from harbor_user;    # 查看用户表可以看到相关信息

# 将harbor_user表中的admin用户的加密算法改为sha1,密码改为Harbor2345
registry=# update harbor_user set password='a71a7d0df981a61cbb53a97ed8d78f3e', salt='ah3fdh5b7yxepalg9z45bu8zb36sszmr', password_version='sha1' where username='
admin';

退出数据库以及容器,重启 harbor-core 容器

# 删除即重启
$ kubectl delete po -n harbor harbor-core-766945fd8-2lz86

然后使用 admin/Harbor12345登陆即可,再改为自己想要的密码。

后续为又观察了下,改完密码之后,加密算法会恢复为sha256,但这之后不影响使用了。

坑3:创建项目后,无法进入项目,f12查看接口报错500

这部分是排查到我在配置 value.yaml 时,镜像存储的 COS 信息配置有误。

# 错误配置
regionendpoint: https://harbor-130****660.cos.ap-beijing.myqcloud.com
# 正确配置
regionendpoint: https://cos.ap-beijing.myqcloud.com

这里需要卸载harbor,修改为正确配置,重新部署。

$ helm uninstall -n harbor harbor

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0