Harbor部署-oss存储

官网文档:https://goharbor.io/docs/2.3.0/
OSS: https://github.com/docker/docker.github.io/blob/master/registry/storage-drivers/oss.md

前置环境

1、安装docker

$ curl -fsSL http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu/gpg |  sudo apt-key add -
# 在/etc/apt/source.list新增以下行
$ vim /etc/apt/source.list
deb [arch=amd64] http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu focal stable
$ apt-get update
$ apt-get -y install docker-ce=5:19.03.14~3-0~ubuntu-focal docker-ce-cli=5:19.03.14~3-0~ubuntu-focal containerd.io

2、安装docker-compose

# 下载 docker compose
$ curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
$ ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

部署harbor

Harbor的安装包分为在线版和离线版,离线版包含安装所需的所有镜像
Harbor无法登录问题: https://blog.csdn.net/weixin_43952432/article/details/100577560

下载harbor离线安装包

$ wget https://github.com/goharbor/harbor/releases/download/v2.1.0/harbor-offline-installer-v2.1.0.tgz
# 上传到服务器后,解压压缩包
$ tar -xf harbor-offline-installer-v2.1.0.tgz

修改harbor配置

进到harbor-offline-installer-v2.1.0.tgz 解压后的目录, 从harbor.yml.tmpl复制一份harbor.yml

$ cp harbor.yml.tmpl harbor.yml
$ vim harbor.yml
# Configuration file of Harbor
# 此处定义为harbor的域名或者IP,注意不能定义为 localhost、127.0.0.1
hostname: harbor.domin.com
# http related config
http:
 # port for http, default is 80\. If https enabled, this port will redirect to https port
 port: 80
# 这里把https注释掉(根据自己实际需求配置)
# https:
 # https port for harbor, default is 443
 # port: 443
 # The path of cert and key files for nginx
 # certificate: /your/certificate/path
 # private_key: /your/private/key/path

# 如果要启用外部代理,请取消去掉external_url的注释,当它启用时,hostname将不再使用
# 因为我们还会给harbor接入反向代理,所以此处去掉external_url的注释
external_url: https://harbor.domin.com 
•
# harbor admin账户的初始密码(建议修改)
harbor_admin_password: Harbor12345
•
# 因为我们会使用外部postgres数据库,所以此处此database的配置可以忽略
database:
 password: root123
 max_idle_conns: 50
 max_open_conns: 1000
•
# 默认harbor数据存储目录
# 注意:虽然本次部署会使用oss作为registry的外部存储,但是data_volume字段不要注释掉
data_volume: /data/harbor-storage 
•
# 更改镜像存储位置,本地的话不用配置直接用,本次部署中使用了阿里云的oss作为后端存储
# 去掉storage注释,配置oss 可参考:https://docs.docker.com/registry/configuration/#storage
•
storage:
 cache:
 layerinfo: redis
 oss:
 accesskeyid: 填写你的具有阿里云oss权限账户的RAM的AccessKey ID
 accesskeysecret: 填写你的具有阿里云oss权限账户的RAM的AccessKey Secret
 region: 地域节点 # EndPoint, 如cn-shenzhen
 endpoint: Bucket 域名 #[bucket].[region].aliyuncs.com 或者 当 internal=true, [bucket].[region]-internal.aliyuncs.com
 internal: 
 secure: true   # 指定是否通过ssl传输数据到bucket
 bucket: Bucket 名称
 rootdirectory: 指定oss下面某路径作为存储目录

# 保持默认配置
trivy:
 ignore_unfixed: false
 skip_update: false
 insecure: false
# 保持默认配置
jobservice:
 max_job_workers: 10
# 保持默认配置
notification:
 # Maximum retry count for webhook job
 webhook_job_max_retry: 10
# 保持默认配置
chart:
 absolute_url: disabled
# 日志配置,根据自己需求进行修改
log:
 level: info
 local:
 rotate_count: 50
 rotate_size: 200M
 location: /var/log/harbor
_version: 2.2.0
•
# 使用外部数据库,需要把external_database的注释取消,进行配置, 注意需要在postgres数据库中将registry、clair的数据库预先创建
 external_database:
 harbor:
 host: harbor_db_host
 port: harbor_db_port
 db_name: harbor_db_name
 username: harbor_db_username
 password: harbor_db_password
 ssl_mode: disable
 max_idle_conns: 2
 max_open_conns: 0
 clair:
 host: clair_server_db_host
 port: clair_server_db_port
 db_name: clair_server_db_name
 username: clair_server_db_username
 password: clair_server_db_password
 ssl_mode: disable 
#   notary_signer:
#     host: notary_signer_db_host
#     port: notary_signer_db_port
#     db_name: notary_signer_db_name
#     username: notary_signer_db_username
#     password: notary_signer_db_password
#     ssl_mode: disable
#   notary_server:
#     host: notary_server_db_host
#     port: notary_server_db_port
#     db_name: notary_server_db_name
#     username: notary_server_db_username
#     password: notary_server_db_password
#     ssl_mode: disable
•
# 如果使用外部redis的情况下,需要将external_redis的注释去掉
 external_redis:
 host: redis:6379
 password:
 registry_db_index: 1
 jobservice_db_index: 2
 chartmuseum_db_index: 3
 trivy_db_index: 5
 idle_timeout_seconds: 30

安装harbor

  1. 使用prepare初始化harbor配置文件
./prepare --with-clair --with-trivy  --with-chartmuseum
#--with-clair  镜像安全扫描插件
#--with_notary 内容信任插件 
#--with-trivy   镜像漏洞检测插件
#--with-chartmuseum Chart仓库服务
  1. 注释掉docker-compose.yml 中registry、registryctl、chartmuseum 的本地存储路径,使用oss进行存储

提前需确认初始化后的配置文件: common/config/registry/config.yaml 、common/config/chartserver/env配置的是否是OSS的路径

# 如:以registry为例
registry:
 image: goharbor/registry-photon:v2.0.0
 container_name: registry
 restart: always
 cap_drop:
 - ALL
 cap_add:
 - CHOWN
 - SETGID
 - SETUID
 volumes:
#      - /data/registry:/storage:z
  1. 如果harbor 前面还会加一层proxy代理,且代理中有配置“X-Forwarded-Proto”,则需要将harbor的proxy组件中的配置文件’X-Forwarded-Proto‘注释或删掉
sed -i '/X-Forwarded-Proto/d' common/config/nginx/nginx.conf
  1. 启动Harbor
# 将harbor相关镜像文件导入
docker load -i harbor.v2.1.0.tar.gz
# 启动harbor
docker-compose up -d

验证harbor

增加harbor的域名到docker-daemon

$ vim /etc/docker/daemon.json 
{
    "insecure-registries": ["harbor.mydomian.com"]
}
# 重载docker服务
$ systemctl reload docker

绑定hosts

$ vim /etc/hosts
[ip] harbor.mydomian.com

harbor常见问题

1) harbor push出现unknow blob

解决:一般出现这个问题是由:X-Forwarded-Proto 这个导致的,如果harbor应用前有多个nginx 代理,要确保只保留一个

# 删除harbor自己nginx配置中的X-Forwarded-Proto
sed -i '/X-Forwarded-Proto/d' common/config/nginx/nginx.conf

2) 阿里云harbor实例前的slb健康检测不通过

查看slb的健康检查日志提示以下问题:

[x.x.x.x]:80 to x.x.x.x:80 abnormal; cause: check protocol http error

排查

slb 健康检查异常报错:https://www.sites-help.com/aliyun/1575843803.html check protocol http error 表示响应中HTTP status code不是用户指定的(默认为 2xx/3xx)

1、在harbor应用服务器上使用NC检测,发现结果返回的状态码确实为400
echo -e 'HEAD /harbor/sign-in HTTP/1.0\r\n' | nc -t harbor_ip 80
2、增加Host后,结果返回的状态码为200
echo -e ‘HEAD /harbor/sign-in HTTP/1.0\r\nHost: harbor.mydomian.com\r\n\r\n’ | nc -t harbor_ip 80

解决 将阿里云slb的健康检查中增加”健康检查域名:harbor.mydomian.com“

3) harbor 登录状态时好时坏

排查:harbor后端有两个实例,连接同一个pgsql和redis,最后查到由于harbor安装时两个实例上分别执行了install.sh脚本,自动生成的保存在本地harbor-data下面的secret/下面的密钥文件不一致导致这个问题出现
解决:将其中一个实例下的secret目录覆盖到另一个实例下,重启这个实例的harbor

3) harbor登录失败

报错

$ docker login -u admin -p Harbor12345 reg.mydomain.com
Error response from daemon: Get https://reg.mydomain.com/v2/: unauthorized: authentication required

解决

在harbor2.x当中如果需要使用nginx做代理,官方提供了external_url字段解决了这个问题,只需要在harbor.yml文件当中配置这个字段值即可。
eg:
hostname: reg.mydomain.com
external_url: https://reg.mydomain.com

修改后 docker-compose 重启即可
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容