# 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>"] }