Harbor 镜像仓库安装与 Helm Chart 管理
Harbor 是一款非常优秀的企业级开源镜像仓库管理器。Harbor 是基于 Docker Registry之上带有用户权限控制,镜像扫描,镜像签名的款工具。用起来很方便,我们公司目前在测试和生产都在使用。从去年 10 月到今天,除去一次 ceph 集群扩容,没有发生一次事故,一直运行很稳定;本文将记录一下我们的使用方式和遇到的一些问题解决方式。
Harbor 资源准备
1 | Harbor 1.7.6 版本 |
公司目前的 harbor 是基于 1.76 搭建的高可用方案,证书的问题,我们是公网使用第三方证书。内网使用自签名的证书;在我这里,我在 harbor 的搭建中采用的是内部 http,外部挂 F5。架构图如下:
生产上我们用 F5 替代 Haproxy。
我们在 Haproxy/F5 层将 https 转成 http 再转发给内部 harbor。
下载 harbor 并进行配置
直接去github release 下载 1.7.6 的版本(现在最新为 1.10)。下载之后解压,修改里面harbor.cfg
配置文件:
1 | ## Configuration file of Harbor |
配置好 cfg 文件后,我们开始我们的操作。
申请或安装 ceph,ceph 版本为 12;
安装 pg 数据库(生产应为高可用):
docker run --name pg -e POSTGRES_PASSWORD=123456 -p 5432:5432 -d postgres:10.6
- 安装 redis(生产因为高可用):
docker run --name redis -p 6379:6379 -d redis
- 安装 harbor:
./install.sh --with-clair --with-chartmuseum
这里除了 notaty 必须要有个 https 外,其他的你都可以装。clair 是镜像扫描工具;chartmuseum 是 helm chart ;
你需要在两台机器都启动,并且保持cfg 文件一致。
- 配置 haproxy(F5)
如果在 F5 做 https 转 http,那haproxy 就正常启动并将后段指向 harbor 地址就可以了。如果是让 https 做证书认证,那么就按照配置就好。我这边有在 F5 做解证书,贴一份 haproxy 的配置吧haproxy.cfg
:
1 | global |
访问harbor.chenzhijun.me
就可以了。
https 问题 1 : docker login failed
安装完之后,你可能会遇到一些问题,比如在你直接 docker login 出现:
1 | Error response from daemon: Get https://harbor.chenzhijun.me/v2/: Get http://harbor.chenzhijun.me/service/token?account=admin&client_id=docker&offline_token=true&service=harbor-registry: dial tcp 100.77.53.130:80: getsockopt: connection refused |
你在页面登陆可以,当是你用 docker login却有问题。你可以curl -X GET -I "https://harbor.chenzhijun.me/v2/"
看一下是否返回了一个 http 的请求。如果是的话,修改一个参数:sed -i "s/realm: http/realm: https/g" common/config/registry/config.yml
;在common/config/registry/config.yml
中修改返回值为 https:1
2
3
4
5
6auth:
token:
issuer: harbor-token-issuer
realm: https://harbor.chenzhijun.me/service/token #就是这里要返回 https 而不是 http
rootcertbundle: /etc/registry/root.crt
service: harbor-registry
这个地方改不是特别好改,我是在install.sh
在 docker-compose启动之前加入的这个 sed 命令;
然后再 curl 一下看是不是返回 https 的结果了。如果是就可以了。
https 问题2 : docker push 出现 unkown blob
因为我们的架构是:域名 –> dns解析到 –> F5 VIP –> haproxy –> Harbor docker-compose;
在这个过程中,出现了一个问题。域名到到 F5是 https,而后面的 Harbor 接到的 http;所以在 docker login 成功。在 docker push 的时候出现了问题 unkown blob
;这个问题的原因就是在反向代理中 harbor 的 nginx 代理用的还是 https 方式:Harbor Troubleshooting。修改common/templates/nginx/nginx.http.conf
中的proxy_set_header X-Forwarded-Proto $scheme;
把这行注释掉就可以了。
另外就是要注意 pg 的权限问题。
https 问题3: docker push 出现 unauthorized: authentication required
这是一个很诡异的问题,找了我两个小时;现象是harbor 的页面能登陆,并且页面一切功能正常;直接使用 docker login 也是没有问题,但是在 push 镜像的时候出现,unauthorized: authentication required;明明已经登陆了,也没有问题,但是不知道为啥还是会报错。这个问题在我这里是由于 haproxy 的配置出现的问题。harbor push 镜像的过程是从 harbor 服务获取一个 token,然后再去访问 registry 的存储来存储数据,如果是是本地存储,那么会访问 80 端口。我的配置中将 haproxy 的 80 端口转了 redirect,所以导致认证失败。附上一段在 haproxy 段做证书解析而后端 harbor 为 http 的 haproxy 的服务配置:
1 | frontend harbor |
如果还是有问题,可以在/var/log/harbor
目录下查看相关的 log 日志。也可以查看系统日志:/var/log/message
来定位问题。
我们也安装了 /install.sh --with-clair --with-chartmuseum
clair 和 chartmuseum,这两个工具,clair 的主要目的是扫描 CVE 漏洞,所以是不是需要链接一下外网更新一下;chartmuseum 是一个 helm chart 管理器;
升级问题
最近尝试在本地进行了一次 1.7 升级到 1.8,其实还好啊,就是 cfg 文件变成了 yml 文件,其他的还是一样。并且有迁移工具:
https://github.com/goharbor/harbor/blob/release-1.8.0/docs/migration_guide.md
迁移工具使用方式:
docker run -it --rm -v /data/harbor/harbor/harbor.cfg:/harbor-migration/harbor-cfg/harbor.cfg -v /data/harbor/harbor/harbor.yml:/harbor-migration/harbor-cfg-out/harbor.yml harbor.uat.cmft.com/goharbor/harbor-migrator:v1.8.3 --cfg up
然后就停掉原来的 1.7 使用新的 1.8 的安装包启动就可以了。
迁移前一定要进行数据备份,一定要备份。
helm 使用
helm 在 v3 之后(我只用了 v3)其实特别好用。在 github 上下载 helm 的安装包,然后把 helm 放到 /usr/local/bin 下面就可以直接执行 helm 命令了。当然前提是要本机有 kubectl,并且本地有 kubeconfig 文件~/.kube/config
。这样我们就能愉快的使用 helm 了。那我们怎么使用 harbor 来管理我们的 helm chart 了?
helm repo add --username readonly --password Read2019 myharbor http://harbor.chenzhijun.me/chartrepo/helm-repo
http://harbor.chenzhijun.me/chartrepo/
这一段是固定的,helm-repo
是 harbor 中的 project 名。然后你将一个 chart 包导入:
helm search repo myharbor
helm repo update
helm install myharbor/consul --gernerate-name
好了,就是这么简单粗暴。