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

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Blog — PlanetScale
Blog — PlanetScale
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Last Watchdog
The Last Watchdog
AI
AI
Recent Announcements
Recent Announcements
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Stack Overflow Blog
Stack Overflow Blog
V
Visual Studio Blog
J
Java Code Geeks
TaoSecurity Blog
TaoSecurity Blog
L
LangChain Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Project Zero
Project Zero
Microsoft Security Blog
Microsoft Security Blog
量子位
T
Threatpost
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园 - Franky
博客园 - 聂微东
L
LINUX DO - 最新话题
Security Archives - TechRepublic
Security Archives - TechRepublic
Hugging Face - Blog
Hugging Face - Blog
T
The Blog of Author Tim Ferriss
P
Proofpoint News Feed
The GitHub Blog
The GitHub Blog
C
Check Point Blog
宝玉的分享
宝玉的分享
G
Google Developers Blog
Spread Privacy
Spread Privacy
Cloudbric
Cloudbric
SecWiki News
SecWiki News
有赞技术团队
有赞技术团队
www.infosecurity-magazine.com
www.infosecurity-magazine.com
W
WeLiveSecurity
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
美团技术团队
V
Vulnerabilities – Threatpost
Cyberwarzone
Cyberwarzone
A
Arctic Wolf
P
Privacy & Cybersecurity Law Blog
P
Palo Alto Networks Blog
H
Help Net Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Cisco Talos Blog
Cisco Talos Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
A
About on SuperTechFans
N
Netflix TechBlog - Medium
罗磊的独立博客
月光博客
月光博客

陈少文的网站

巨变与机遇的未来十年 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) 使用 Velero 备份 Kubernetes 集群 Kubernetes Cheat Sheet 开发 Tips(18) 如何构建一个 Java 工程 开发 Tips(17) KubeSpray 安装 Kubernetes 报错 ip in ansible_all_ipv4_addresses 基于 Kubernetes 和 Jenkins 搭建自动化测试系统 在 Kubernetes 上动态创建 Jenkins Slave 使用 Jenkins 进行服务拨测 开发 Tips(16) Kubernetes 签发 Ingress 证书及日常故障运维 Kubernetes 中 Deployment 的基本操作 Kubernetes 中的证书 如何使用 KubeBuilder 开发一个 Operator Kubernetes 1.6.0 安装问题汇总 开发 Tips(15) Docker 如何拉取镜像 开发 Tips(14) 使用 Helm 安装 harbor 开发 Tips(13) 使用 S2I 构建云原生应用 在 Kubernetes 中使用 emptyDir、hostPath、localVolume 开发 Tips(12) 开发 Tips(11) 代码质量分析工具 SonarQube 使用 Kubeadm 安装 Kubernetes 集群 一起来学 Go --(4)常用函数 Kubernetes 中的 Ceph Kubernetes 之 Volumes Kubernetes 之 Labels、Selectors 开发 Tips(10) 开源正在重构商业模式 Kubernetes 之网络 Kubernetes 之 API 使用 Helm 和 Operator 快速部署 Prometheus Kubernetes 复杂有状态应用管理框架 -- Operator Kubernetes 的包管理器 -- Helm 一起来学 Go --(3)Go Modules 如何一步一步地优化博客方案 kubectl 实用指南 Kubernetes 中的基本概念 搭建远程 Kubernetes 开发环境 大公司和小公司的 ToB 思路 开发 Tips(9) Go 入门指南 一起来学 Go --(2)数据与逻辑结构 如何预防 Web 富文本中的 XSS 攻击 django-xss-cleaner 云工作时代 一起来学 Go --(1)背景与特点 SaaS 开发团队的不同阶段 你不知道的 Git 使用技巧 输出既服务 微服务设计 继续奔跑 开发 Tips(8) 从账户安全到二次验证 Django 性能之数据库查询优化 Django 性能之分库分表 敏捷开发之研发流程 打造一致性的团队 开发 Tips(7) Pytest 进阶学习之 Mock PaaS 部署之 buildpack Go 开发配置 领域输出才是 PaaS 的核心竞争力 Pytest 入门学习 开发 Tips(6) 如何使用 Jenkins、Docker、GitLab 搭建 Django 自动化部署流程 开发 Tips(5)
镜像管理工具 -- 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. 参考