腾讯云产品信息
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 控制台 创建一个存储桶:尽量选择和服务地域相近的地域
一直下一步,完成即可。
创建云 API 密钥
用作 harbor 连接 COS。在 访问密钥 这里新建密钥,记录 SecretId 和 SecretKey。
准备 CFS 文件存储
在腾讯云的 TKE 控制台,进入组件管理,安装 CFS 组件
同样在 TKE 控制台,存储—storageClass—新建,创建 storageClass,关键选择了 文件存储 CFS
即可,我这里使用了共享实例。
下载 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 路径
我也是手贱,非要改一下,导致在使用 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