Harbor的安装记录

系统规划

镜像仓库作为Kubernets集群的重要基础设施,必须考虑在内网的互联网隔离问题。
Docker虽然自带了Registry,但是不能提供细粒度的权限设置,此外,在大型集群中为了解决镜像拉取的性能瓶颈,经常需要解决多级镜像的同步问题,因此Harbor已经成为事实标准,为此本文研究了如何在内网离线安装Harbor。

基线版本的信息如下:

- Centos=7.8
- Docker-CE=19.03.12
- Docker-compose=1.21.2
- Harbor=v1.10.3 

Harbor目前采用http方式,Admin URL:http://192.168.0.130:7350
Harbor用户数据的存放目录:/data/harbor。为避免重装系统造成数据丢失,采用一个独立硬盘mount到/data。

Harbor Server的安装步骤

  1. 安装docker-ce、docker-compose

    通过阿里云的镜像加速服务,yum安装docker-ce,详细操作方式参见Kubernetes集群的安装记录

    docker-compose的标准安装方法是从docker.com下载,速度太慢无法忍受。
    还好,阿里云提供了Docker-toolbox的下载地址
    注意:要手工改文件名,设置执行权限,并搬到PATH路径下。

  2. 下载harbor安装包

    这里是Harbor v1.10.3 下载地址,解压后放在目录/root/harbor/下。
    离线方式的安装包有600M+,其中包含了全部所需的镜像文件,后续安装中通过docker load方式直接读取压缩包,就不需要联网了。

    v1.10.2有个bug无法正常安装,表现是log容器启动时,爆出sudo权限过期,可能是基础镜像的问题)

  3. 配置并安装harbor

    在启动目录/root/harbor/下,编辑Harbor配置文件harbor.yml,关键信息如下:

     
    1
    2
    3
    4
    5
    hostname:192.168.0.130
    http:
    port:7350
    # https:
    data_volume: /data/harbor/

    运行命令install.sh,自动拉取压缩包的镜像文件,并生成docker-compose.yml,这就是以后的部署配置。
    最后,Harbor主目录的结构是这样的:

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [root@dnsmasq harbor]# tree /root/harbor -L 2
    /root/harbor ## Harbor Sever的主目录
    ├── common
    │   └── config
    ├── common.sh
    ├── docker-compose.yml ## 最后生成的Depolyment配置文件
    ├── harbor.v1.10.3.tar.gz ## 离线安装的镜像文件包,docker save && docker load
    ├── harbor.yml ## 初始化安装的配置文件
    ├── install.sh ## 安装入口程序
    ├── LICENSE
    └── prepare
  4. 启动harbor并检查

    通过docker-compose up -d --build启动Harbor,然后就可以通过浏览器访问http://192.168.0.130:7350
    在浏览器界面,输入用户名和密码,就可以看见镜像仓库的具体信息了。

Client的使用方法

需要注意的是,Client的docker是独立的配置,如果不需要上传镜像,根本不用登录Harbor Server,直接设置mirror镜像就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cat > /etc/docker/daemon.json << EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"insecure-registries": [
"192.168.0.130:7350"
],
"registry-mirrors": [
"http://192.168.0.130:7350"
]
}
EOF

systemctl daemon-reload
systemctl restart docker
docker info

当然,注意由于私有仓库是http模式,需要显示设置insecure-registries的不安全访问方式。
修改配置文件后,还需要重启守护进程和docker.service,然后你就可以正常使用私有仓库Harbor了!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost docker]# docker login http://192.168.0.130:7350 -u admin -p xxxxxx
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
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

[root@localhost docker]# docker tag python:3.7-slim 192.168.0.130:7350/library/python:3.7-slim

[root@localhost docker]# docker push 192.168.0.130:7350/library/python:3.7-slim
The push refers to repository [192.168.0.130:7350/library/python]
0c6163f2d025: Pushed
361df01300cf: Pushed
8f9ba0be9040: Pushed
0bd71a837902: Layer already exists
13cb14c2acd3: Layer already exists
3.7-slim: digest: sha256:e0f6a4df17d5707637fa3557ab266f44dddc46ebfc82b0f1dbe725103961da4e size: 1370

现在admin界面,就可以找到这个镜像了,以后就可以直接本地拉取了。

HTPPS访问的设置方法

可以采用基于IP地址的访问方式,但是更推荐采用域名方式,具体步骤参见harbor安装并配置https
主要包括以下环节:

  • 生成证书颁发机构证书:ca.key,ca.csr
  • 生成服务器证书: harbor.caogo.local.key, harbor.caogo.local.crt, v3.ext
  • 提供证书给Harbor和Docker: 注意Docker默认使用.cert文件,而非.crt
  • 部署或重新配置harbor: 编辑harbor.yml,运行install.sh进行设置,通过docker-compose启动

也可以参见Harbor配置HTTPS的官方文档

配置HTTPS方式后,客户端Docker访问Harbor就可以不需要设置unsecure-registries参数了。

个人强烈推荐Http方式,而不是Https方式!!!
因为自签名证书需要客户端Docker配合导入证书,而真实域名证书受到ECS出口带宽限制,速度很感人!


自制的image push小工具(还要优化……)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cat > harbor-push.sh << EOF
#!/bin/bash

count=1
while read repo tag others # 从docker images的输出中获得镜像信息,注意剔除第一行
do
src_image=$repo":"$tag
dst_image=192.168.0.130:7350/library/$src_image

echo "$count: $src_image is pushing..." >& 2

echo docker tag $src_image $dst_image
echo docker push $dst_image
echo docker rmi $dst_image

count=$(($count + 1))
done
EOF

chmod a+x harbor-push.sh
docker images |tail -n +2 |./harbor-push.sh

手工启动和停止Harbor的操作方法

由于Harbor是采用docker-compose方式启动的,因此关机之前最好手工停止服务,输入:

cd /root/harbor && docker-compose down

开机后,启动Harbor服务的方式也类似,执行命令:

cd /root/harbor && docker-compose up -d --build

通过Systemd设置Harbor开机自启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cat > /etc/systemd/system/harbor.service << EOF
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor

[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr/bin/docker-compose -f /root/harbor/docker-compose.yml up
ExecStop=/usr/bin/docker-compose -f /root/harbor/docker-compose.yml down

[Install]
WantedBy=multi-user.target
EOF

# 重载Systemd并设置Harbor自启动
systemctl daemon-reload
systemctl enable harbor
systemctl status harbor

参考资料