Harbor安装与配置
官方文档:Harbor docs | Harbor Installation and Configuration (goharbor.io)
文章目录
一.安装前提条件:
硬件
资源 | 最低 | 推荐 |
---|---|---|
CPU | 2C | 4C |
内存 | 4G | 8G |
硬盘 | 40G | 160G |
软件
软件 | 版本 | 描述 |
---|---|---|
docker | v17.0.6-ce+ | 安装参考 安装 Docker 引擎|Docker 文档 |
docker compose | v1.18.0+ | 安装参考 Install Docker Compose | Docker Documentation |
Openssl | latest | 用于为 Harbor 生成证书和密钥 |
端口
需要开放端口
端口 | 协议 | 描述 |
---|---|---|
443 | HTTPS | 网页https访问端口 |
4443 | HTTPS | 与 Harbor 的 Docker Content Trust 服务的连接。仅当启用了公证时才需要 |
80 | HTTP | 网页访问端口 |
二.安装配置
1.安装Harbor
下载页面 Releases · goharbor/harbor · GitHub
1.下载解压
wget https://github.com/goharbor/harbor/releases/download/v2.4.2/harbor-online-installer-v2.4.2.tgz
tar xvf harbor-online-installer-v2.4.2.tgz -C /usr/local/
2.相关文件介绍
# harbor配置文件模板
harbor.yml.tmpl
# 首次安装需要先执行,会生成docekr-compose.yml文件
# 更新harbor配置文件后也需要执行此文件
prepare
# 安装启动脚本
install.sh
# 容器启动相关配置文件目录
common
3.修改配置
cd /usr/local/harbor/
cp harbor.yml.tmpl harbor.yml
vi harbor.yml
###==== 修改以下参数
# 访问域名
hostname : my.harbor.com
# 配置https证书路径
certificate: /data/cert/my.harbor.com.crt
private_key: /data/cert/my.harbor.com.key
# 管理员密码
harbor_admin_password: AdminPassword
database:
# 设置pgsql管理员密码
password: root123
# 存储路径
data_volume: /data
4.安装
cd /usr/local/harbor/
# 每次修改配置后都先执行此命令
./prepare
# 执行安装脚本
./install.sh
2.配置HTTPS
2.1 生成证书颁发机构证书
- 生成 CA 证书私钥
openssl genrsa -out ca.key 4096
- 生成 CA 证书
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=hubei/L=wuhan/O=test/OU=test/CN=my.harbor.com" \
-key ca.key \
-out ca.crt
2.2 生成服务器证书
证书通常包含一个文件和一个文件
.crt
.key
my.harbor.com.crt
my.harbor.com.key
1.生成私钥
openssl genrsa -out my.harbor.com.key 4096
2.生成证书签名请求 (CSR)
openssl req -sha512 -new \
-subj "/C=CN/ST=hubei/L=wuhan/O=test/OU=test/CN=my.harbor.com" \
-key my.harbor.com.key \
-out my.harbor.com.csr
3.生成 x509 v3扩展文件
无论您使用FQDN还是IP地址连接到Harbor主机,都必须创建此文件,以便可以为您的Harbor主机生成符合主题备用名称(SAN)和x509 v3的证书扩展要求。替换DNS
条目以反映您的域
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=my.harbor.com
DNS.2=my.harbor
DNS.3=harbor
EOF
4.使用该
v3.ext
文件为您的Harbor主机生成证书
openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in my.harbor.com.csr \
-out my.harbor.com.crt
2.3 提供证书给Harbor和Docker
生成文件后,需要提供给 Harbor 和 Docker,并重新配置 Harbor 使用证书
1.将服务器证书和密钥复制到 Harbor主机证书文件夹中
cp my.harbor.com.crt /data/cert/
cp my.harbor.com.key /data/cert/
2.转换my.harbor.com.crt为my.harbor.com.cert,供Docker使用
Docker守护程序将.crt文件解释为CA证书,并将.cert文件解释为客户端证书
openssl x509 -inform PEM -in my.harbor.com.crt -out my.harbor.com.cert
3.将服务器证书、密钥和 CA 文件复制到 Harbor 主机上的 Docker 证书文件夹中
cp my.harbor.com.cert /etc/docker/certs.d/my.harbor.com/
cp my.harbor.com.key /etc/docker/certs.d/my.harbor.com/
cp ca.crt /etc/docker/certs.d/my.harbor.com/
如果将默认nginx端口443映射到其他端口,请创建文件夹
/etc/docker/certs.d/my.harbor.com:port或/etc/docker/certs.d/harbor_IP:port
4.重新启动Docker Engine
systemctl restart docker
2.4 部署或重新配置Harbor
如果尚未部署 Harbor,需要配置harbor的yml文件中 hostname、https参数
如果已部署Harbor希望配置为HTTPS,执行以下步骤
- 运行 prepare 脚本以启用 HTTPS
./prepare
- Harbor正在运行,需要先停止并删除现有实例
docker-compose down -v
重新启动Harbor
docker-compose up -d
3.加入开机启动
3.1 创建 systemd 服务脚本
vi /usr/lib/systemd/system/harbor.service
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor
[Service]
Type=simple
Restart=on-failure
RestartSec=5
# docker-compose.yml文件为harbor启动文件,使用绝对路径
ExecStart=/usr/local/bin/docker-compose -f /usr/local/harbor/docker-compose.yml up -d
ExecStop=/usr/local/bin/docker-compose -f /usr/local/harbor/docker-compose.yml down
[Install]
WantedBy=multi-user.target
3.2 启动服务并加入开机自启
systemctl start harbor
systemctl enable harbor
三.重置密码
1.修改密码
进入 harbor-db 容器内
docker exec -it harbor-db /bin/bash
登录 pgsql 操作
# 登录pgsql
psql -U postgres -d postgres
# 切换到harbor所在数据库
\c registry
# 查看 harbor_user 表
select * from harbor_user;
# 清空密码,重启服务后重置为默认 Harbor12345
update harbor_user set salt='', password='' where user_id='1';
# 退出
\q
exit
2.重启服务
docker-compose down -v
docker-compose up -d
3.重启问题
按重置密码的步骤操作后,重启服务,发现 harbor-db容器都一直处于Restarting状态 ,按照网上各种教程尝试都不行,日志报错如下:
Apr 29 09:26:10 bogon postgresql[16052]: ls: cannot access '/var/lib/postgresql/data': O
peration not permitted
Apr 29 09:26:10 bogon postgresql[16052]: The files belonging to this database system wil
l be owned by user "postgres".
Apr 29 09:26:10 bogon postgresql[16052]: This user must also own the server process.
Apr 29 09:26:10 bogon postgresql[16052]:
Apr 29 09:26:10 bogon postgresql[16052]: The database cluster will be initialized with l
ocales
Apr 29 09:26:10 bogon postgresql[16052]: COLLATE: en_US.UTF-8
Apr 29 09:26:10 bogon postgresql[16052]: CTYPE: en_US.UTF-8
Apr 29 09:26:10 bogon postgresql[16052]: MESSAGES: C
Apr 29 09:26:10 bogon postgresql[16052]: MONETARY: C
Apr 29 09:26:10 bogon postgresql[16052]: NUMERIC: C
Apr 29 09:26:10 bogon postgresql[16052]: TIME: C
Apr 29 09:26:10 bogon postgresql[16052]: The default text search configuration will be s
et to "english".
Apr 29 09:26:10 bogon postgresql[16052]:
Apr 29 09:26:10 bogon postgresql[16052]: Data page checksums are disabled.
Apr 29 09:26:10 bogon postgresql[16052]:
Apr 29 09:26:10 bogon postgresql[16052]: initdb: error: directory "/var/lib/postgresql/d
ata/pg13" exists but is not empty
Apr 29 09:26:10 bogon postgresql[16052]: If you want to create a new database system, ei
ther remove or empty
Apr 29 09:26:10 bogon postgresql[16052]: the directory "/var/lib/postgresql/data/pg13" o
r run initdb
Apr 29 09:26:10 bogon postgresql[16052]: with an argument other than "/var/lib/postgresq
l/data/pg13".
在google上找了许久终于找到解决方法 。是由于harbor v2.3之后使用了PostgreSQL v13.2,需要用到高版本docker,将docker升级到20.10.8 之后版本 即可解决
参考: harbor-db restarting (1) seconds ago | 我是皮皮虾 (wsppx.cn)
[Harbor-db keep restarting after restart VM or restart harbor services. · Issue #15456 · goharbor/harbor · GitHub](https://github.com/goharbor/harbor/issues/15456)
四.数据备份
1.Harbor中的数据
Harbor所依赖的数据可分为两大类: 临时数据和持久化数据
1.1 临时数据
在 Harbor 安装期间通过配置文件生成的数据,主要是 Harbor 组件所依赖的配置文件和环境变量。
这些数据通常在 Harbor 安装目录的 common 目录下(如果 Harbor 是通过源代码安装的,则这些数据在源码目录的“make/common”目录下)
在 Harbor 各组件启动时会被挂载到对应的容器中。虽然临时数据对服务的顺利运行至关重要,但是安装程序每次都会读取 Harbor 配置文件重新生成一份临时数据,所以我们仅需备份配置文件即可,不必将整个 common 目录全部备份
1.2 持久化数据
存放在数据目录配置项下(即配置文件中 data_volume 项所配置的值),这些数据主要包括 Harbor 的数据库数据、Artifacts 数据、Redis 数据、Chart 数据,以及 Harbor 各个组件所依赖的运行时数据
data目录包含的文件夹和相应的作用如下
- ca_download:存放用户访问Harbor时所需的CA
- cert:Harbor启动HTTPS服务时所需的证书和密钥。
- chart_storage:存放Helm v2版本的Chart数据。
- database:存放数据库的目录,Harbor、Clair和Notary数据库的数据都在此目录下。
- job_logs:存放JobService的日志信息。
- redis:存放Redis数据。
- registry:存放OCI Artifacts数据(对于大部分用户来说是镜像数据)。
- secret:存放Harbor内部组件通信所需的加密信息。
注意:
Harbor在启动时需要挂载这些目录下的文件,在Harbor各组件的容器中除了log容器(依赖logrotate,必须以root权限运行)
其他容器都是以非root用户身份运行的,这些文件的用户组信息及权限信息与其在容器中的信息不匹配,在容器中就会发生读取权限相关的错误
所以在主机上需要将这些目录和文件设置成容器的指定用户和用户组,这些文件的用户和权限信息主要有如下两类:
- 数据库和Redis:以999:999的用户组运行容器,即harbor-db组件和harbor-redis组件;
- Harbor的其他容器:以10000:10000的用户组运行容器
2. Harbor备份
2.1 备份harbor安装目录
cp -rf /usr/local/harbor /usr/local/harbor_bak
2.1 备份 harbor data
harbor.yml中data_volume 值为 持久化数据目录
cp -rf /data /data/harbor_data_back
五.版本更新
参考:
软件的版本升级一般分为两个阶段:现有 Harbor 实例的数据迁移和 Harbor 软件升级。
1.数据迁移
在升级 Harbor 版本之前,我们首先需要对现有的数据进行迁移,以适配新的版本。需要迁移的数据有两类:数据库模式(schema)和配置文件数据
- 数据库模式,也就是数据库中表的结构,每次新版本发布时新的功能及对老功能、代码的重构都会导致数据库模型的变更,因此几乎每次升级都需要升级数据库模式
- 配置文件数据,是指 Harbor 组件的配置文件,在部分新功能或者新的组件出现时,都需要在配置文件中新增其参数;在老功能、组件重构或者废弃时,也会对配置文件进行更新
如果升级时不做数据迁移,则会导致数据与新版本不兼容而引发问题。而数据迁移是一个高风险操作,操作中出现问题会造成数据丢失等严重后果,所以一定要先进行数据备份,主要就是数据库的数据导出备份。
1.1 数据库迁移
其实每次启动 Harbor 实例时,它的数据库模式都是自动升级的
其原理为:Harbor 在每次启动时都会调用第三方库 “golang-migrate”,它会检测当前数据库模式的版本,如果实例的版本比当前数据库的版本更高,则会自动升级。
1.2 配置升级
因为数据库升级是自动完成,用户其实只需操作配置文件的迁移即可。
需要用户手动执行升级配置文件的命令行工具包。此工具包与 Harbor 一同发布,被包含在“goharbor/prepare”镜像中
Harbor的升级遵循一个约定:小版本的升级不会涉及配置文件和数据库的修改,大版本升级不能大于2个版本号,如2.3可以直接升级到2.5
用户可以在 Harbor 的离线安装包导入,也可以在 Docker Hub 上获取:
docker pull goharbor/prepare:version
运行以下命令进行配置文件迁移:
docker run -v /:/hostfs goharbor/prepare:v2.5.0 migrate --input /usr/local/harbor/harbor-2.4.2.yml --output /usr/local/harbor/harbor-2.5.0.yml --target 2.5.0
# 其中,“-v /:/hostfs” 是将主机的根目录 “/” 挂载到容器中的“/hostfs”目录。
# 因为命令是运行在容器中的,而文件是在宿主机上的,为了能在容器中访问到指定的文件,需要这样挂载,之后 prepare 会对 “/hostfs” 这个文件做特殊处理,使得在容器里也能访问主机上的指定文件
migrate 命令有如下3个参数。
--input(缩写形式为“-i”):是输入文件的绝对路径,也就是需要升级的原配置文件。
--output(缩写形式为“-o”):是输出文件的绝对路径,也是升级后的配置文件,是可选参数,如果取默认值,则升级后的文件会被写回输入文件中。
--target(缩写形式为“-t”):是目标版本,也就是打算升级到的版本,也是可选参数,如果取默认值,则版本为此工具发布时所支持的最新版
# 所以上命令是将 Harbor 2.4.2 的配置文件 “/usr/local/harbor/harbor-2.4.2.yml” 升级到 Harbor 2.5.0 版本,并且保存到 “/usr/local/harbor/harbor-2.5.0.yml” 目录下。若使用缩写和默认的参数,则命令可以简化如下:
docker run -v /:/hostfs goharbor/prepare:v2.5.0 migrate -i /usr/local/harbor/harbor-2.4.2.yml
2.完整升级操作
- 停止 harbor
docker-compose down -v
- 备份旧版本 harbor 安装路径
mv harbor /path/harbor_install_backup
- 备份数据
cp -rp /data/database /habor_data_backup
- 数据迁移
docker run -v /:/hostfs goharbor/prepare:v2.5.0 migrate -i ${原harbor.yml路径}
# 参考 1.1 数据迁移详细操作
- 使用新配置文件安装Harbor
tar zxf ${新版本Harbor离线包}
cd ${新版本Harbor解压的文件夹}
cp ${新生成的harbor.yml} ${新版本Harbor目录}
./install.sh
- 升级后 harbor-db 无法启动
- 通过修改 docker-compose.yml
#在 postgresql 下 添加
privileged: true