Harbor:在云原生中使用,附安装

内容主要源自邹佳在云原生社区的分享。

Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器,由 vmware 开源,是一个可信的云原生制品仓库,用来存储、签名、管理相关的内容。

Harbor 的一切设计都是围绕了云原生展开的,并且会在这个方向一直坚持下去。

在云原生下,镜像就是命脉,一切应用都是围绕着镜像,可以说镜像技术加速了云原生的发展。

那么 Harbor 在镜像方面做了哪些呢?

让镜像分发更高效

(1)基于策略的内容复制机制

Harbor 支持多种过滤器(镜像库、标签等)与多种触发模式(手动、定时等)来实现镜像的推送和拉取。

  • 初始的时候进行全量拉取

  • 然后再通过增量拉取

    image-20220916102245406

在大集群,多机房的情况下,可以使用主从模式(中心-边缘模式)来进行镜像的分发。

image-20220916102310954

(2)提供项目级别的缓存能力

最近开源圈热论的话题就是 DockerHub 限速问题,不过“上有政策,下有对策”,Harbor 就可以有效解决这个问题。

通过 Harbor 缓存下来的制品与“本地”制品无异,而且 Harbor 方面相关的管理策略也可以应用到缓存的镜像上,比如配额、扫描等。目前仅支持上游的 DockerHub 和其他的 Harbor。

在配置缓存时要注意几点:

  • 要使用缓存功能,则必须在新建项目的时候选择启用,切该项目不可推送
  • 已创建的普通项目无法直接转为缓存项目
  • Pull 镜像的路径有专门的格式。docker pull <harbor-host>/[cache-project-name]/<repository>_path,比如docker pull goharbor.io/my_cache_pro/library/nginx:latest

image-20220916102346470

(3)可以使用 P2P 进行镜像预热

PS:这里的 P2P 不是网贷机构,不会暴雷的。

那什么是 P2P 技术呢?

在 C/S 模式中,数据的分发采用专门的服务器,多个客户端都从此服务器获取数据。这种模式的优点是:数据的一致性容易控制,系统也容易管理。但是此种模式的缺点是:因为服务器的个数只有一个(即便有多个也非常有限),系统容易出现单一失效点;单一服务器面对众多的客户端,由于 CPU 能力、内存大小、网络带宽的限制,可同时服务的客户端非常有限,可扩展性差。

P2P 技术正是为了解决这些问题而提出来的一种对等网络结构。在 P2P 网络中,每个节点既可以从其他节点得到服务,也可以向其他节点提供服务。这样,庞大的终端资源被利用起来,一举解决了 C/S 模式中的两个弊端。

Harbor 也充分利用了这种技术,将所选镜像提前分发到 P2P 网络中,以便客户端拉取的时候直接从 P2P 网络中拉取。

  • 基于策略实现自动化

    • Repository 过滤器
    • Tag 过滤器
    • 标签(Label)过滤器
    • 漏洞状态条件
    • 签名状态条件
  • 基于事件触发或定时触发

Harbor 目前仅支持:

  • Dragonfly。是阿里自研并捐献给 CNCF 的 P2P 文件分发系统。
  • Kraken。是 Uber 开源的点对点(P2P)Docker 容器仓库.

image-20220916102431504

让镜像分发更安全

容器实际上是不透明的,被封装成一个个繁琐的镜像。当越来越多的镜像被创建时,没有人能确定镜像里到底封装了什么,所以日常使用的镜像都面临着严重的安全问题。

Harbor 在安全方面做了严格的把关。

(1)对镜像进行签名

  • 基于开源的 Notary 实现镜像的签名

image-20220916102500481

  • 基于 GPG 实现对 Helm Chart 的签名支持

image-20220916102519419

(2)对镜像进行漏洞扫描

  • 通过插件化接入扫描器,对镜像进行漏洞扫描

image-20220916102549435

  • 可以生成相应的扫描报告,以便与管理相关漏洞信息和了解安全威胁程度

    image-20220916102611582

(3)通过策略限制不安全镜像分发

可以在项目里设置相关的安全策略,以阻止不合安全规范的镜像分发。

  • 基于内容信任,仅允许通过认证的镜像分发

  • 基于危害级别,可以设置危害级别限制镜像分发

    image-20220916102641599

(4)通过规则来限制 Tag 不被覆盖或删除

默认情况下 Harbor 里的镜像是可以被覆盖和删除的,不过可以添加一些规则来保护一些 Tag 不被删除,比如 latest 的 tag。

image-20220916102720446

规则可以通过正则匹配,匹配上的 tag 会被标记为不可变。

优雅的资源清理和垃圾回收

犹记 Harbor1.x 的时候,资源清理和垃圾回收是多么的繁杂。要先调 API 进行资源清理,然后进重启进行垃圾回收。为此还专门写脚本进行定时清理。

不过在 Harbor2.x 就不用这么麻烦了。

(1)可以通过策略保留需要的 TAG

可以在项目仓库里通过策略来保留需要的 TAG。

image-20220916102749791

规则可以自定义,如下

image-20220916102825171

说明:

  • 不可变 TAG 一定会被保留
  • 该操作不释放存储空间,仅释放配额

(2)可以通过垃圾清理来释放空间

可以通过垃圾清理来释放空间。当然不一定释放很多空间,比如你的这个镜像的底层是链接了一个大的镜像,大镜像没被清理,空间也就释放不到多少。

image-20220916102858415

多种 HA 方案

(1)基于内容复制能力的 HA

通俗点说就是多套独立的环境,通过 Replicate 的方式来进行同步数据,如下:

image-20220916102924349

(2)基于外部共享服务的 HA

image-20220916102939271

(3)在 Kubernetes 集群中的多实例 HA

原则上和第二种 HA 差不多。

image-20220916103004547

(4)Harbor Operator 基于 Kubernetes 的 all-in-one HA

image-20220916103022171

(5)多数据中心的 HA

image-20220916103039945

动手安装 Harbor 玩玩

“纸上得来终觉浅,绝知此事要躬行”。下面我们就来安装 Harbor 来玩玩。

Harbor 的安装方式主要有以下几种。

  • 离线安装包
  • 在线安装包
  • Helm Chart
  • Harbor Operator(开发中)

这里主要尝试前三种安装方式。

系统:Centos 7.4

内核:Kernel 3.10

Harbor:2.1.1

docker-compose:1.27.4

helm:v3

kubernetes:1.17.9

下载地址:

https://github.com/goharbor/harbor/releases

https://github.com/docker/compose/releases

前提:系统做好了初始化

01 系统初始化以及安装所需软件

(1)关闭防火墙、SeLinux、修改主机名

1
2
3
4
5
6
7
# systemctl stop firewalld
# systemctl disable firewalld
# setenforce 0
# vim /etc/sysconfig/selinux
	SELINUX=disabeld
# hostnamectl set-hostname harbor
# hostname

(2)安装 docker-ce

1
2
3
4
5
6
7
# yum install -y yum-utils device-mapper-persistent-data lvm2
# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# yum install docker-ce -y
# systemctl start docker
# systemctl enable docker
# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
# systemctl restart docker

(3)安装 docker-compose

1
2
3
4
# wget https://github.com/docker/compose/releases/download/1.27.4/docker-compose-Linux-x86_64
# mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
# docker-compose version

02 离线安装 Harbor

(1)下载 Harbor 离线安装包并解压到/opt 目录下

1
2
# wget https://github.com/goharbor/harbor/releases/download/v2.1.1/harbor-offline-installer-v2.1.1.tgz
# tar xf harbor-offline-installer-v2.1.1.tgz -C /opt/

(2)拷贝配置文件,并对起进行修改

1
2
# cd /opt/harbor
# cp harbor.yml.tmpl harbor.yml

配置文件主要修改以下几个地方。

  • hostname:主机名或域名
  • https 证书
  • harbor_admin_password:管理员密码
  • data_volume:数据存放目录

修改后如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
hostname: 172.17.100.171,harbor.coolops.cn
http:
  port: 80
https:
  port: 443
  certificate: /opt/harbor/ssl/harbor.coolops.cn.crt
  private_key: /opt/harbor/ssl/harbor.coolops.cn.key
harbor_admin_password: Harbor12345
database:
  password: root123
  max_idle_conns: 50
  max_open_conns: 1000
data_volume: /data
......

(3)生成 ssl 证书

这里使用 openssl 工具生成。

1
2
3
4
5
6
7
# yum install -y openssl
# mkdir /opt/harbor/ssl
# cd /opt/harbor/ssl
# openssl genrsa -out ca.key 4096
# openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Chongqing/L=Chongqing/O=harbor.coolops.cn/OU=harbor.coolops.cn/CN=harbor.coolops.cn" -key ca.key -out ca.crt
# openssl genrsa -out harbor.coolops.cn.key 4096
# openssl req -sha512 -new -subj "/C=CN/ST=Chongqing/L=Chongqing/O=harbor.coolops.cn/OU=harbor.coolops.cn/CN=harbor.coolops.cn" -key harbor.coolops.cn.key -out harbor.coolops.cn.csr

创建一个外部配置文件

1
2
3
4
5
6
7
8
9
#cat > xexternalfile.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=harbor.coolops.cn
EOF

通过外部配置文件生成 crt 和 csr

1
# openssl x509 -req -sha512 -days 3650 -extfile xexternalfile.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in harbor.coolops.cn.csr -out harbor.coolops.cn.crt

将 crt 转为 cert

1
# openssl x509 -inform PEM -in harbor.coolops.cn.crt -out harbor.coolops.cn.cert

(4)预装 harbor

1
2
# cd /opt/harbor
# ./prepare

通过预装可以看看配置是否有问题。

(5)正式安装

直接执行目录下install.sh脚本

1
2
# cd /opt/harbor
# ./install.sh

看到如下输出表示安装完成。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[Step 5]: starting Harbor ...
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating redis         ... done
Creating registry      ... done
Creating registryctl   ... done
Creating harbor-portal ... done
Creating harbor-db     ... done
Creating harbor-core   ... done
Creating harbor-jobservice ... done
Creating nginx             ... done
✔ ----Harbor has been installed and started successfully.----

然后就可以访问了,如下。

image-20220916103147042

03 在线安装 Harbor

在线安装和离线安装唯一的区别就是在线安装需要从网上自己下载镜像。 依然按照第一步装好必要的基本软件。

然后下载在线安装包。

1
# wget https://github.com/goharbor/harbor/releases/download/v2.1.1/harbor-online-installer-v2.1.1.tgz

然后按照离线安装的第 2、第 3 步骤安装即可。

04 Helm Chart

(1)安装 helm3

helm 安装在 master 节点。

1
2
3
4
# wget https://get.helm.sh/helm-v3.0.0-linux-amd64.tar.gz
# tar zxvf helm-v3.0.0-linux-amd64.tar.gz
# mv linux-amd64/helm /usr/bin/
# helm version

(2)添加 Harbor 仓库

1
# helm repo add harbor https://helm.goharbor.io

(3)查看 helm 版本,并下载

1
2
3
4
5
6
# helm search repo harbor
NAME         	CHART VERSION	APP VERSION	DESCRIPTION
harbor/harbor	1.5.1        	2.1.1      	An open source trusted cloud native registry th...

# helm pull harbor/harbor --version 1.5.1
# tar xf harbor-1.5.1.tgz

(4)进入 harbor 目录,可以看到如下文件以及目录

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# cd harbor/
# ll
total 128
drwxr-xr-x  2 root root  4096 Nov 13 14:07 cert
-rwxr-xr-x  1 root root   576 Oct 30 10:48 Chart.yaml
drwxr-xr-x  2 root root  4096 Nov 13 14:07 conf
-rwxr-xr-x  1 root root 11357 Oct 30 10:48 LICENSE
-rwxr-xr-x  1 root root 72587 Oct 30 10:48 README.md
drwxr-xr-x 15 root root  4096 Nov 13 14:07 templates
-rwxr-xr-x  1 root root 25467 Oct 30 10:48 values.yaml

(5)修改 values.yaml 配置文件

主要修改地方如下:

1
2
3
4
5
6
7
8
9
......
  ingress:
    hosts:
      core: harbor.coolops.cn
      notary: notary.coolops.cn
......
externalURL: https://harbor.coolops.cn
......
harborAdminPassword: "Harbor12345"

关于持久化存储,如果自己配置 storageclass,就在 values.yaml 中对应填上名字,如果让起自动创建的话,则默认使用集群 default 的存储

(6)安装 harbor

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# helm install harbor ./harbor
NAME: harbor
LAST DEPLOYED: Fri Nov 13 14:21:06 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Please wait for several minutes for Harbor deployment to complete.
Then you should be able to visit the Harbor portal at https://harbor.coolops.cn
For more details, please visit https://github.com/goharbor/harbor

查看部署情况

1
2
3
# helm list
NAME  	NAMESPACE	REVISION	UPDATED                                	STATUS  	CHART       	APP VERSION
harbor	default  	1       	2020-11-13 14:21:06.555605312 +0800 CST	deployed	harbor-1.5.1	2.1.1

然后等待所有 pod 变成 running,就可以通过 Ingress 访问了。

image-20220916103227242

image-20220916103242127

image-20220916103251517

image-20220916103318690

image-20220916143209626

image-20220916143223502

image-20220916143237003

image-20220916143248598

image-20220916143301810

image-20220916143314632

image-20220916143324642

image-20220916143334165

image-20220916143342805

image-20220916143353442

image-20220916143404083

image-20220916143413031

image-20220916143430110

image-20220916143439967

image-20220916151751739

image-20220916151805518

image-20220916152145486

image-20220916152204511

image-20220916152233624

image-20220916152244023

image-20220916152254713

image-20220916152305056

image-20220916152315602

image-20220916152325411

转自文档:

https://www.yuque.com/coolops/kubernetes/kw3fcv#O7owm

Licensed under CC BY-NC-SA 4.0
最后更新于 Jan 06, 2025 05:52 UTC
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
Caret Up