Harbor 入门指南 您所在的位置:网站首页 韩国最贵离婚案 Harbor 入门指南

Harbor 入门指南

2024-05-05 18:46| 来源: 网络整理| 查看: 265

Harbor 介绍

Harbor 是由 VMware 开源的一款云原生制品仓库,Harbor 的核心功能是存储和管理 Artifact。Harbor 允许用户用命令行工具对容器镜像及其他 Artifact 进行推送和拉取,并提供了图形管理界面帮助用户查看和管理这些 Artifact。在 Harbor 2.0 版本中,除容器镜像外,Harbor 对符合 OCI 规范的 Helm Chart、CNAB、OPA Bundle 等都提供了更多的支持。

Harbor 整体架构

如上图所示是 Harbor 2.0 的架构图,从上到下可分为代理层、功能层和数据层。

代理层:代理层实质上是一个 Nginx 反向代理,负责接收不同类型的客户端请求,包括浏览器、用户脚本、Docker 等,并根据请求类型和 URI 转发给不同的后端服务进行处理。功能层:Portal:是一个基于 Argular 的前端应用,提供 Harbor 用户访问的界面。Core:是 Harbor 中的核心组件,封装了 Harbor 绝大部分的业务逻辑。JobService:异步任务组件,负责 Harbor 中很多比较耗时的功能,比如 Artifact 复制、扫描、垃圾回收等。Docker Distribution:Harbor 通过 Distribution 实现 Artifact 的读写和存取等功能。RegistryCtl:Docker Distribution 的控制组件。Notary(可选):基于 TUF 提供镜像签名管理的功能。扫描工具(可选):镜像的漏洞检测工具。ChartMuseum(可选):提供 API 管理非 OCI 规范的 Helm Chart,随着兼容 OCI 规范的 Helm Chart 在社区上被更广泛地接受,Helm Chart 能以 Artifact 的形式在 Harbor 中存储和管理,不再依赖 ChartMuseum,因此 Harbor 可能会在后续版本中移除对 ChartMuseum 的支持。数据层:Redis:主要作为缓存服务存储一些生命周期较短的数据,同时对于 JobService 还提供了类似队列的功能。PostgreSQL:存储 Harbor 的应用数据,比如项目信息、用户与项目的关系、管理策略、配置信息、Artifact 的元数据等等。Artifact 存储:存储 Artifact 本身的内容,也就是每次推送镜像、Helm Chart 或其他 Artifact 时,数据最终存储的地方。默认情况下,Harbor 会把 Artifact 写入本地文件系统中。用户也可以修改配置,将 Artifact 存储在外部存储中,例如亚马逊的对象存储 S3、谷歌云存储 GCS、阿里云的对象存储 OSS 等等。Docker Compose 部署 Harbor前提要求

硬件要求:

软件要求:

下载安装包代码语言:javascript复制wget https://github.com/goharbor/harbor/releases/download/v2.3.1/harbor-offline-installer-v2.3.1.tgz tar -xzvf harbor-offline-installer-v2.3.1.tgz cd harbor 修改配置文件

拷贝模板文件为 harbor.yml。

代码语言:javascript复制cp harbor.yml.tmpl harbor.yml

编辑 harbor.yml 配置文件,hostname 是 harbor 对外暴露的访问地址,HTTP 服务对外暴露 8888 端口。这里暂时先不配置 HTTPS,将 HTTPS 相关内容注释。

部署 Harbor

修改完配置文件后,只需要执行 install.sh 脚本即可安装 Harbor。

代码语言:javascript复制./install.sh

查看 Harbor 组件运行状况:

代码语言:javascript复制> docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------------------------------ harbor-core /harbor/entrypoint.sh Up (healthy) harbor-db /docker-entrypoint.sh 96 13 Up (healthy) harbor-jobservice /harbor/entrypoint.sh Up (healthy) harbor-log /bin/sh -c /usr/local/bin/ ... Up (healthy) 127.0.0.1:1514->10514/tcp harbor-portal nginx -g daemon off; Up (healthy) nginx nginx -g daemon off; Up (healthy) 0.0.0.0:8888->8080/tcp,:::8888->8080/tcp redis redis-server /etc/redis.conf Up (healthy) registry /home/harbor/entrypoint.sh Up (healthy) registryctl /home/harbor/start.sh Up (healthy) 登录页面

浏览器输入 http://11.8.36.21:8888 访问 Harbor 页面,用户名和密码为 harbor.yml 配置文件中默认设置的 admin,Harbor12345。

推送镜像

从公网拉取一个 nginx:1.19 版本的镜像:

代码语言:javascript复制> docker pull nginx:1.19 1.19: Pulling from library/nginx 69692152171a: Already exists 49f7d34d62c1: Pull complete 5f97dc5d71ab: Pull complete cfcd0711b93a: Pull complete be6172d7651b: Pull complete de9813870342: Pull complete Digest: sha256:df13abe416e37eb3db4722840dd479b00ba193ac6606e7902331dcea50f4f1f2 Status: Downloaded newer image for nginx:1.19

编辑 /etc/docker/daemon.json,设置允许访问的 HTTP 仓库地址。

代码语言:javascript复制{ "insecure-registries":["11.8.36.21:8888"] }

修改镜像 tag:

代码语言:javascript复制docker tag nginx:1.19 11.8.36.21:8888/library/nginx:1.19

登录 Harbor:

代码语言:javascript复制> docker login 11.8.36.21:8888 Username: admin Password: Login Succeeded

推送镜像到 Harbor:

代码语言:javascript复制> docker push 11.8.36.21:8888/library/nginx:1.19 The push refers to a repository [11.8.36.21:8888/library/nginx] f0f30197ccf9: Pushed eeb14ff930d4: Pushed c9732df61184: Pushed 4b8db2d7f35a: Pushed 431f409d4c5a: Pushed 02c055ef67f5: Pushed 1.19: digest: sha256:eba373a0620f68ffdc3f217041ad25ef084475b8feb35b992574cd83698e9e3c size: 1570

查看推送的镜像:

HTTPS 配置(可选)

在生产环境中建议配置 HTTPS,可以使用由受信任的第三方 CA 签名的证书,也可以使用自签名证书。如果想要启用 Content Trust with Notary 来正确签名所有图像,则必须使用 HTTPS。

创建目录

首先创建目录存放生成的证书。

代码语言:javascript复制mkdir /root/cert cd /root/cert/ 生成 CA 证书

本次实验中我们使用自签名证书。生产环境中应使用受信任的第三方 CA 签名的证书。

生成 CA 证书私钥代码语言:javascript复制openssl genrsa -out ca.key 4096 生成 CA 证书

-subj 表示证书的组织。CN 后面的值改成 harbor 的 IP 地址或者域名。

代码语言:javascript复制openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=11.8.36.21" \ -key ca.key \ -out ca.crt 生成 Server 证书

生成 Harbor 使用的证书和私钥。

生成 Server 私钥代码语言:javascript复制openssl genrsa -out server.key 4096 生成 Server 证书签名请求(CSR)

生成 Harbor 的证书签名请求,使用上面生成的 CA 证书来给 Server 签发证书。

代码语言:javascript复制openssl req -sha512 -new \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=11.8.36.21" \ -key server.key \ -out server.csr 生成 x509 v3 扩展文件

通过 docker 或者 ctr 等工具拉取 HTTPS 的镜像时,要求 HTTPS 的证书包含 SAN 扩展。

SAN(Subject Alternative Name) 是 SSL 标准 x509 中定义的一个扩展。使用了 SAN 字段的 SSL 证书,可以扩展此证书支持的域名,使得一个证书可以支持多个不同域名的解析。例如下图中 Google 的这张证书的主题备用名称(SAN)中列了一大串的域名,因此这张证书能够被多个域名所使用。对于 Google 这种域名数量较多的公司来说,使用这种类型的证书能够极大的简化网站证书的管理。

使用以下命令生成 x509 v3 扩展文件:

代码语言:javascript复制cat > v3.ext docker push myharbor.com:30003/sign/nginx-sign:1.19 The push refers to a repository [myharbor.com:30003/sign/nginx-sign] f0f30197ccf9: Layer already exists eeb14ff930d4: Layer already exists c9732df61184: Layer already exists 4b8db2d7f35a: Layer already exists 431f409d4c5a: Layer already exists 02c055ef67f5: Layer already exists 1.19: digest: sha256:eba373a0620f68ffdc3f217041ad25ef084475b8feb35b992574cd83698e9e3c size: 1570 Signing and pushing trust metadata #创建根密钥 You are about to create a new root signing key passphrase. This passphrase will be used to protect the most sensitive key in your signing system. Please choose a long, complex passphrase and be careful to keep the password and the key file itself secure and backed up. It is highly recommended that you use a password manager to generate the passphrase and keep it safe. There will be no way to recover this key. You can find the key in your config directory. Enter passphrase for new root key with ID 00eeb53: Repeat passphrase for new root key with ID 00eeb53: #创建正在推送的镜像仓库的目标密钥 Enter passphrase for new repository key with ID 45f6c55 (myharbor.com:30003/sign/nginx-sign): Repeat passphrase for new repository key with ID 45f6c55 (myharbor.com:30003/sign/nginx-sign): Finished initializing "myharbor.com:30003/sign/nginx-sign" Successfully signed "myharbor.com:30003/sign/nginx-sign":1.19

生成的密钥都会以 ~/.docker/trust/private/.key 路径存放,对应的 TUF 元数据文件被存放在 ~/.docker/trust/tuf///metadata 目录下。

代码语言:javascript复制#tree ~/.docker/trust/ /root/.docker/trust/ ├── private │ ├── root_keys │ │ └── 00eeb53b454983f95c12718d1dcfdbc1e600253c20eab1ca8ee5743dac9f0fa0.key │ └── tuf_keys │ └── myharbor.com:30003 │ └── sign │ └── nginx-sign │ └── 45f6c55ea9846cf0ba552915e0599b4e7f45c742f6418c5f1116b61f2650ca48.key └── tuf └── myharbor.com:30003 └── sign └── nginx-sign ├── changelist └── metadata ├── root.json

签名成功后,登录 Harbor 管理界面,可以在镜像的 tag 列表中查看该镜像处于已签名的状态。

此时我们推送一个没有签名的镜像到 Harbor 中,在上传完镜像后我们不做签名的操作。

代码语言:javascript复制docker tag 11.8.36.21:8443/library/nginx:1.19 myharbor.com:30003/sign/nginx-unsign:1.19 docker push myharbor.com:30003/sign/nginx-unsign:1.19

查看该未签名的镜像。

未签名的镜像是无法拉取的,如果尝试拉取会有以下报错。

代码语言:javascript复制#docker pull myharbor.com:30003/sign/nginx-unsign:1.19 Error: remote trust data does not exist for myharbor.com:30003/sign/nginx-unsign: myharbor.com:30004 does not have trust data for myharbor.com:30003/sign/nginx-unsign

签名了的镜像无法直接通过 Harbor 进行删除。

如果想要删除该镜像,需要先通过 Notary 去掉镜像签名然后才可以删除。使用以下命令安装 Notary 客户端。

代码语言:javascript复制wget https://github.com/theupdateframework/notary/releases/download/v0.6.1/notary-Linux-amd64 mv notary-Linux-amd64 /usr/local/bin/notary chmod +x /usr/local/bin/notary

去掉镜像的签名,注意后面 tag 和镜像名是用空格隔开的。

代码语言:javascript复制notary -s https://myharbor.com:30004 \ -d ~/.docker/trust/ --tlscacert ~/.docker/tls/myharbor.com:30004/ca.crt \ remove -p myharbor.com:30003/sign/nginx-sign 1.19

查看镜像发现已经变成未签名的状态了。

此时就可以删除镜像了。

垃圾清理

在 Harbor 的日常使用过程中,对资源的使用会随着 Artifact 的增加而增加。由于资源有限,所以在删除 Artifact 后需要将其所占用的存储空间释放。当用户在 Harbor 中删除 Artifact 时是 “软删除”,即仅删除 Artifact 对应的数据记录,并不删除存储。垃圾回收的本质是对存储资源的自动管理,即回收 Harbor 中不再被使用的 Artifact 所占用的存储空间。

手动删除:

设置定时删除任务:

一个小坑

通过 Docker 客户端登录 Harbor 时遇到证书过期的报错,搞了一晚上一直无法登录成功,结果第二天的时候莫名奇妙又可以成功登陆 Harbor 了。

代码语言:javascript复制#docker login https://myharbor.com:30003 Username: admin Password: Error response from daemon: Get https://myharbor.com:30003/v1/users/: x509: certificate has expired or is not yet valid

于是想到有可能是时间的问题,可能是 Docker 客户端的时间比证书生效的时间还早。查看了系统时间果然发现时间比标准时间慢了 6 分钟。设置 NTP 同步时间以后就可以正常登录了。

代码语言:javascript复制#date Mon Aug 9 20:54:43 CST 2021 root@ydt-net-nginx-cisp:/etc/docker/certs.d/myharbor.com:30003 # #ntpdate ntp3.aliyun.com 9 Aug 21:00:47 ntpdate[96996]: step time server 203.107.6.88 offset 355.206298 sec root@ydt-net-nginx-cisp:/etc/docker/certs.d/ #date Mon Aug 9 21:00:51 CST 2021 #docker login https://myharbor.com:30003 Username: admin Password: Login Succeeded 参考资料Harbor 权威指南https://blog.csdn.net/weixin_34387468/article/details/91855502https://zhuanlan.zhihu.com/p/336866221https://fuckcloudnative.io/posts/install-harbor-on-kubernetes/https://goharbor.io/docs/1.10/install-config/configure-https/https://www.bladewan.com/2020/02/22/harbor_notary/


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有