harbor安装配置
# https://github.com/goharbor/harbor
# https://goharbor.io
# 建议阅读概览:
https://github.com/goharbor/harbor/wiki/Architecture-Overview-of-Harbor
# 概念:
一种开源可信云本机注册表项目,用于存储,签名和扫描内容。
# 特征
云本机注册表:Harbour 支持容器映像和Helm图表,可作为容器运行时和业务流程平台等云本机环境的注册表。
基于角色的访问控制:用户和存储库通过“项目”进行组织,用户可以对项目下的图像或Helm图表拥有不同的权限。
基于策略的复制:可以基于具有多个过滤器(存储库,标记和标签)的策略在多个注册表实例之间复制(同步)图像和图表。如果遇到任何错误,Harbor会自动重试复制。非常适合负载平衡,高可用性,多数据中心,混合和多云场景。
漏洞扫描:Harbor定期扫描图像并警告用户漏洞。
LDAP / AD支持:Harbor与现有企业LDAP / AD集成以进行用户身份验证和管理,并支持将LDAP组导入Harbor并为其分配适当的项目角色。
OIDC支持:Harbour利用OpenID Connect(OIDC)来验证由外部授权服务器或身份提供商进行身份验证的用户的身份。可以启用单点登录以登录Harbor门户。
图像删除和垃圾收集:可以删除图像,并可以回收它们的空间。
公证人:可以确保图像的真实性。
图形用户门户:用户可以轻松浏览,搜索存储库和管理项目。
审计:跟踪存储库的所有操作。
RESTful API:适用于大多数管理操作的RESTful API,易于与外部系统集成。嵌入式Swagger UI可用于探索和测试API。
轻松部署:提供在线和离线安装程序。此外,Helm Chart可用于在Kubernetes上部署Harbor。
# installation guide
https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md
# 安装docker,安装docker compose
# 安装harbor offline
# downalod offline tar
cd /opt/
wget https://storage.googleapis.com/harbor-releases/release-1.8.0/harbor-offline-installer-v1.8.2.tgz
tar xvf harbor-offline-installer-v1.8.2.tgz
cd harbor
# 自签ssl证书 https://github.com/goharbor/harbor/blob/master/docs/configure_https.md
# Getting Certificate Authority
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/CN=guojingyi.cn" -key ca.key -out ca.crt
# Getting Server Certificate
# 创建自己的私钥:
openssl genrsa -out guojingyi.cn.key 4096
# 生成证书签名请求:
# 如果您使用像guojingyi.cn这样的FQDN连接注册表主机,那么您必须使用guojingyi.cn作为CN(通用名称)。
openssl req -sha512 -new -subj "/C=CN/CN=guojingyi.cn" -key guojingyi.cn.key -out guojingyi.cn.csr
# 生成harbor server所在主机的证书:
# 无论您是使用类似guojingyi.cn的 FQDN 还是IP来连接注册表主机,请运行此命令以生成符合主题备用名称(SAN)和x509 v3扩展要求的注册表主机证书:
cat > v3.ext <<EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=guojingyi.cn
DNS.2=reg.guojingyi.cn
EOF
# 签名生成crt
openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in guojingyi.cn.csr -out guojingyi.cn.crt
# 配置和安装
# 配置harbor服务端的证书和密钥
# 获取guojingyi.cn.crt和guojingyi.cn.key文件后,您可以将它们放入以下目录/opt/harbor/cert:
mkdir -pv /opt/harbor/cert/
\cp -f guojingyi.cn.crt /opt/harbor/cert/
\cp -f guojingyi.cn.key /opt/harbor/cert/
# 为Docker客户端配置服务证书、密钥和CA,用来访问harbor服务.
# Docker守护程序将.crt文件解释为CA证书,将.cert文件解释为客户端证书。
# 需要转换guojingyi.cn.crt为guojingyi.cn.cert:
openssl x509 -inform PEM -in guojingyi.cn.crt -out guojingyi.cn.cert
# Delpoy guojingyi.cn.cert,guojingyi.cn.key和ca.crtDocker:(https://docs.docker.com/engine/security/certificates/)
mkdir -pv /etc/docker/certs.d/guojingyi.cn/
\cp -f guojingyi.cn.cert /etc/docker/certs.d/guojingyi.cn/
\cp -f guojingyi.cn.key /etc/docker/certs.d/guojingyi.cn/
\cp -f ca.crt /etc/docker/certs.d/guojingyi.cn/
# 以下说明了使用自定义证书的配置:
/etc/docker/certs.d/
└── guojingyi.cn:port
├── guojingyi.cn.cert <-- Server certificate signed by CA
├── guojingyi.cn.key <-- Server key signed by CA
└── ca.crt <-- Certificate authority that signed the registry certificate
# Configure harbor.yml
# 按需修改harbor.yml:
修改域名
修改/data为/opt/harbor/data
开启https访问配置
# install
chmod u+x install.sh
./install.sh
# 安装完毕
# 配置数据基本存放在/opt/harbor
# 日志存放在/var/log/harbor/
# core.log jobservice.log portal.log postgresql.log proxy.log redis.log registryctl.log registry.log
# 将dns/ip对应解析写入/etc/hosts
echo "192.168.1.249 guojingyi.cn reg.guojingyi.cn" >> /etc/hosts
# web访问
https://reg.guojingyi.cn admin/admin # 密码等在harbor.yml中设置
系统管理——用户管理——新建user01
项目——新建test01项目,并分配该项目的user01的角色权限(私有项目需要docker login,公共项目不需要)
# 登录测试使用
docker pull nginx
docker images
docker tag nginx:latest guojingyi.cn/test01/nginx:latest
docker login guojingyi.cn # url需要跟/etc/docker/certs.d/下的domain名称一致,登录的用户可以使用web新建用户,也可以先使用超级管理员admin
Username: user01
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
docker push guojingyi.cn/test01/nginx:latest
docker logout guojingyi.cn
# 登录web查验刚push的镜像
项目——test01——已经有刚才push的镜像了
# harbor服务管理
# 启停服务
docker-compose stop
docker-compose start
# 如果修改harbor.yml配置,并生效,则流程如下:
docker-compose down -v
vim harbor.yml
prepare
docker-compose up -d
# 重装
# 先进行清理
docker-compose down -v
rm -rf /etc/docker/certs.d/guojingyi.cn/
rm -rf /opt/harbor/
rm -rf /var/log/harbor/
# 然后进行重新安装流程
yield
# 升级harbor和管理harbor数据
cd /opt/harbor
docker-compose down
# 备份harbor和数据库
# 全备
mv /opt/harbor /backupdir/ # 因为我修改了默认harbor.yml中的data_volum路径,data目录也在此目录下
# 如果data目录在其他路径,记得备份data目录
\cp -r /data/Database /backupdir/
# 下载最新harbor最新安装包
https://github.com/goharbor/harbor/releases
# 迁移
docker pull goharbor/harbor-migrator:[tag]
# 将harbor.cfg升级为harbor.yml
docker run -it --rm -v ${harbor_cfg}:/harbor-migration/harbor-cfg/harbor.yml -v ${harbor_yml}:/harbor-migration/harbor-cfg-out/harbor.yml goharbor/harbor-migrator:[tag] --cfg up
# NOTE: The schema upgrade and data migration of Database is performed by core when Harbor starts, if the migration fails, please check the log of core to debug.
# 安装
sh install.sh or ./install.sh
# 回滚
cd /opt/harbor
docker-compose down
cd /opt && rm -rf /opt/harbor/
cp -rf /backupdir/harbor/ /opt/ # 如果data目录在其他路径,记得备份data目录 cp -rf /backupdir/database/ /data/
cd /opt/harbor/
sh install.sh or ./install.sh
# harbor高可用方案:
# 双主复制
# 主从同步
# harbor官方默认提供主从复制的方案来解决镜像同步问题,通过复制的方式,我们可以实时将测试环境harbor仓库的镜像同步到生产环境harbor,类似于如下流程:
git——CI系统——开发registry——测试registry——staging registry——生产registry
# 在实际生产运维的中,往往需要把镜像发布到几十或上百台集群节点上。这时,单个Registry已经无法满足大量节点的下载需求,因此要配置多个Registry实例做负载均衡。手工维护多个Registry实例上的镜像,将是十分繁琐的事情。Harbor可以支持一主多从的镜像发布模式,可以解决大规模镜像发布的难题
# 双主复制
# 所谓的双主复制其实就是复用主从同步实现两个harbor节点之间的双向同步,来保证数据的一致性,然后在两台harbor前端顶一个负载均衡器将进来的请求分流到不同的实例中去,只要有一个实例中有了新的镜像,就是自动的同步复制到另外的的实例中去,这样实现了负载均衡,也避免了单点故障,在一定程度上实现了Harbor的高可用性
——harbor master01——master01存储
请求——LB(负载均衡) 复制||复制
——harbor master02——master02存储
# 实际缺点
# 这个方案有一个问题就是有可能两个Harbor实例中的数据不一致。假设如果一个实例A挂掉了,这个时候有新的镜像进来,那么新的镜像就会在另外一个实例B中,后面即使恢复了挂掉的A实例,Harbor实例B也不会自动去同步镜像,这样只能手动的先关掉Harbor实例B的复制策略,然后再开启复制策略,才能让实例B数据同步,让两个实例的数据一致。
# 在实际生产使用中,主从复制十分的不靠谱。
# 多实例共享后端存储(较推荐)
# 共享后端存储算是一种比较标准的方案,就是多个Harbor实例共享同一个后端存储,任何一个实例持久化到存储的镜像,都可被其他实例中读取。通过前置LB进来的请求,可以分流到不同的实例中去处理,这样就实现了负载均衡,也避免了单点故障
——harbor instance01
请求——LB(负载均衡) redis(高可用)||mysql(高可用) ——共享存储
——harbor instance02
# 方案要考虑的三个问题:
1、共享存储的选取,Harbor的后端存储目前支持AWS S3、Openstack Swift, Ceph等,
2、Session在不同的实例上共享,这个现在其实已经不是问题了,在最新的harbor中,默认session会存放在redis中,我们只需要将redis独立出来即可。可以通过redis sentinel或者redis cluster等方式来保证redis的可用性。在我们的实验环境里,仍然使用单台redis
3、Harbor多实例数据库问题,这个也只需要将harbor中的数据库拆出来独立部署即可。让多实例共用一个外部数据库,数据库的高可用也可以通过数据库的高可用方案保证。
# kubernetes helm方式安装harbor官方教程
https://github.com/goharbor/harbor-helm
# 开发人员国际化指南
https://github.com/goharbor/harbor/blob/master/docs/developer_guide_i18n.md
# harbor源码编译指南:
https://github.com/goharbor/harbor/blob/master/docs/compile_guide.md
# harbor默认为本地仓库,还可以设置成其他仓库的镜像
# 注意:此设置下,harbor仅充当镜像服务器,不再接受image的推送
操作步骤:
# 修改配置
vi Deploy/templates/registry/config.yml
# 添加:
proxy:
remoteurl: https://registry-1.docker.io
# 如果连接docker hub私库,还需提供用户名和密码
proxy:
remoteurl: https://registry-1.docker.io
username: [username]
password: [password]
# 重新生效配置
./prepare
# docker使用此harbor镜像仓库
docker --registry-mirror=https://<my-docker-mirror-host> daemon
# 或者将registry-mirror添加到daemon.json
{
"registry-mirrors": ["https://<my-docker-mirror-host>"]
}