惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
Recent Announcements
Recent Announcements
V
Visual Studio Blog
博客园 - 叶小钗
H
Help Net Security
aimingoo的专栏
aimingoo的专栏
宝玉的分享
宝玉的分享
U
Unit 42
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
F
Fortinet All Blogs
V
V2EX
Stack Overflow Blog
Stack Overflow Blog
WordPress大学
WordPress大学
D
DataBreaches.Net
J
Java Code Geeks
H
Hackread – Cybersecurity News, Data Breaches, AI and More
A
About on SuperTechFans
酷 壳 – CoolShell
酷 壳 – CoolShell
量子位
C
Check Point Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
Microsoft Azure Blog
Microsoft Azure Blog
M
MIT News - Artificial intelligence

陈少文的网站

巨变与机遇的未来十年 Kubernetes 平台管理软件压力测试方案 使用镜像部署 Hexo 静态页面 终于等到你 - GitHub 镜像仓库服务(ghcr.io) 一起来学 Go --(6)Interface 一起来学 Go --(5)Goroutine 和 Channel 什么是函数式编程 如何在 Kubernetes 集群集成 Kata 柯里化与偏函数 使用 PyGithub 自动创建 Label 软件产品是团队能力的输出 Helm 2 、Helm 3 比较 IoT 变现 Kubernetes 中的 DNS 服务 国内的 Helm 镜像源 Harbor 使用自签证书支持 Https 访问 DevOps 工具链之 Prow 如何使用 kfctl 安装 Kubeflow VS Code 无法下载 Go 插件的工具包 工程师更应具有服务精神 你不知道的 Docker 使用技巧 使用 Docker 运行 Tensorflow 论中国 什么是左移 如何清空 Git 仓库全部历史记录 一禅小和尚 有风吹过厨房 时间的玫瑰 如何在 CentOS 安装 GPU 驱动 开发 Tips(19)
镜像管理工具 -- Harbor
微信公众号 · 2019-09-12 · via 陈少文的网站

1. 搭建 Harbor 的要求

Harbor 硬件要求:

  • CPU,最少 2 核,4 核更好
  • Mem,最少 4 GB,8 GB 更好
  • Disk,最少 40 GB,160 GB 更好

Docker 版本要求:

  • 17.06.0 以上

在 Kubernetes 上搭建 Harbor ,可以参考文档,使用 Helm 搭建 harbor

2. Harbor 提供的功能

Harbor 是在 Docker Registry 的基础之上,进行了企业级扩展。Harbor 提供的功能包括:

  • 基于角色的权限控制

  • 基于策略的镜像复制

  • 漏洞扫描

  • LDAP 认证

  • 镜像垃圾清理

  • Notary 镜像签名

  • 操作日志

  • RESTful API

  • Chart 包的管理

3. Harbor 集成的组件

3.1 Clair

Clair 是 CoreOS 开源的镜像漏洞扫描工具。

Clair 的原理是,首先对镜像进行特征的提取,再将这些特征匹配 CVE 漏洞库。Clair 是以静态的方式,按照镜像 layer 层级,进行扫描的。

3.2 Notray

在构建镜像时,通常会基于一些基础镜像,添加符合应用场景的镜像层,得到新的镜像。为了防止在构建过程中,非法植入恶意镜像层,便有了内容信任(Content Trust)机制,用以保证镜像层来源可信。

Notary 是一套镜像的签名工具, 用来保证镜像层在 pull、push、transfer 过程中的一致性和完整性。避免中间人攻击,阻止非法的镜像更新和运行。

镜像层的创建者可以对镜像层做数字签名,生成摘要,保存在 Notary 服务中。开启 Content Trust 机制之后,未签名的镜像无法被拉取。

通过设置环境变量,可以开启 Content Trust 机制:

export DOCKER_CONTENT_TRUST=1
export DOCKER_CONTENT_TRUST_SERVER=https://notary.harbor.chenshaowen.com

推、拉镜像时,要求镜像层有签名:

1
2
3
docker pull core.harbor.chenshaowen.com/shaowenchen/devops-python-sample:31

Error: remote trust data does not exist for core.harbor.chenshaowen.com/shaowenchen/devops-python-sample: core.harbor.chenshaowen.com does not have trust data for core.harbor.chenshaowen.com/shaowenchen/devops-python-sample
1
2
3
4
5
6
7
8
docker push core.harbor.chenshaowen.com/shaowenchen/kube-apiserver:v1.15.3

The push refers to repository [core.harbor.chenshaowen.com/shaowenchen/kube-apiserver]
9b49e894f11a: Layer already exists
fe9a8b4f1dcc: Layer already exists
v1.15.3: digest: sha256:a21bcbcd23f7dbc6a331583645b56e639ec256cc6e2283a647ddd86505a4783e size: 741
Signing and pushing trust metadata
Enter passphrase for root key with ID dc948ea:

3.3 Docker Registry

Docker Registry 是 Docker 官方提供的镜像存储组件。

registry v2 拥有断点续传、镜像多层并发拉取等功能。

当 pull 一个镜像时,先进行认证,获取到 token 并授权通过,然后获取镜像的 manifest 文件,进行 signature 校验。校验完成之后,依据 manifest 包含的信息,拉取各层。拉取完成后,也需要先在本地进行校验。

当 push 一个镜像时,先将镜像各层并发推送至 registry ,推送完成后,再将镜像的 manifest 推至 registry。

在 registry 的存储目录下,能够找到两个文件夹:一个是 blobs,用于存储层级文件;另外一个是 repositories,以索引的方式保存了 registry 中镜像的元数据。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
tree -L 6
.
`-- docker
    `-- registry
        `-- v2
            |-- blobs
            |   `-- sha256
                   ...
            |       `-- ff
            `-- repositories
                |-- library
                |   `-- kube-proxy
                `-- shaowenchen
                    |-- devops-python-sample
                    |-- docker-robotframework
                    `-- zing-gallery

4. Kubernetes 中的 Harbor

上面是 Harbor 的架构图。下面根据 Kubernetes 中运行的 Pod 了解一下 Harbor 中的相关模块:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
kubectl get pod -n harbor

NAME                                           READY   STATUS    RESTARTS   AGE
harbor-harbor-chartmuseum-6b94bdff69-2n885     1/1     Running   2          96m
harbor-harbor-clair-5bd8f76d9c-crjqj           1/1     Running   6          96m
harbor-harbor-core-599747cd9b-vbhv5            1/1     Running   7          96m
harbor-harbor-database-0                       1/1     Running   2          96m
harbor-harbor-jobservice-54686b9f7-dpvms       1/1     Running   8          96m
harbor-harbor-notary-server-85b5587c5-tkntx    1/1     Running   1          96m
harbor-harbor-notary-signer-7b67669b7f-q2qkl   1/1     Running   2          96m
harbor-harbor-portal-64cff84747-tbmdp          1/1     Running   2          96m
harbor-harbor-redis-0                          1/1     Running   2          96m
harbor-harbor-registry-555c545d5b-gmzg5        2/2     Running   3          96m
  • chartmuseum, chart 存储,在挂载的 PV 中可以看到以文件目录形式存储的 chart 包。
  • clair,用于镜像安全扫描
  • core,核心功能控制
  • database,用于存储 projects、users、roles、images 等元数据。
  • jobservice,执行定时任务,提供 API 供外部提交任务及查询执行结果。
  • notary-server、notary-signer,实现 Docker Content Trust ,镜像签名。
  • portal,UI 页面入口
  • redis,缓存
  • registry,Docker 的原生 registry 组件

5. HA 方案

  • 多主复制

通过一个 LB ,将请求导向多个 Harbor 实例上。这种方式不能保证数据的一致性,在生产环境常会遇到问题。

  • 多实例,共享存储

同样是,通过一个 LB ,将请求导向多个 Harbor 实例。但是全部实例共享存储,只需要存储是高可用,那么整个 Harbor 集群也就高可用了。

6. Harbor 的一些问题

2022.07 新增

  • 任务队列慢

使用 Harbor 进行主从复制时,Harbor 的任务执行非常慢。如上图,日常推送不到 2K,而任务堆积了 5.7K,根本无法作为生产的同步方案使用。

主从 Harbor 的直接同步是不可行的,如果借助第三方工具或可一试。

  • Trivy 扫描不可用

我们采用的是 4C8GB 机器使用 docker compose 部署 Harbor。Harbor 有两种安全扫描自动触发方式:

- 上传镜像之后扫描。导致任务堆积,需要等十几个小时才能执行。

- 定时扫描。如上图,每次扫描时,内存不断增长,CPU 间歇性拉高,直至达到接近 98% 消耗,影响机器稳定性。而且,之前扫描过的镜像,第二次依然会扫描,无法控制资源消耗。

因此,建议采用外置的 Trivy 镜像安全扫描器,同时分散到多个实例进行扫描。

  • 任务执行机制缺陷

在基于 Kubernetes 的一个 Harbor 实例上,增加 Job Service 的副本数量不能显著提升任务的执行速度。

同时,在页面上取消的任务并不能马上取消,而是需要删掉 Redis 中的数据。如果采用的是无状态的 Redis,可以重启 Redis 取消任务。

7. 参考