Harbor简介
Harbor 是由 VMware 公司中国团队为企业用户设计的 Registry server 开源项目。
容器应用的开发和运行离不开可靠的镜像管理。从安全和效率等方面考虑,部署在私有环境内的 Registry 是非常必要的。
Harbor是构建企业级私有docker镜像的仓库的开源解决方案,它是Docker Registry的更高级封装
作为一个企业级私有 Registry 服务器,Harbor 提供了更好的性能和安全。提升用户使用 Registry 构建和运行环境传输镜像的效率。
Harbor 支持安装在多个 Registry 节点的镜像资源复制,镜像全部保存在私有 Registry 中, 确保数据和知识产权在公司内部网络中管控。
另外,Harbor 也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
Harbor架构
proxy - 前端代理,主要是分发前端页面ui访问和镜像上传和下载流量;
ui - web管理页面,包括一个前端页面和后端API,底层使用mysql数据库;
registry - 镜像仓库,负责存储镜像文件,当镜像上传完毕后通过hook通知ui创建repository,registry的token认证也是通过ui组件完成;
adminserver - 系统的配置管理中心附带检查存储用量,ui和jobserver启动时候需要加载adminserver的配置;
jobsevice - 负责镜像复制工作的,他和registry通信,从一个registry pull镜像然后push到另一个registry,并记录job_log;
log - 日志汇总组件,通过docker的log-driver把日志汇总到一起。
环境准备:
- Centos7.8
- 配置好epel源
- 已安装好docker的k8s集群
本次配置harbor仓库,是为了让k8s集群的各个节点都能够实现从私有仓库上推拉镜像,便于镜像管理和提高工作效率。
配置过程
1. 安装docker-compose
Docker Compose是 docker 提供的一个命令行工具,用来定义和运行由多个容器组成的应用。
使用 compose,我们可以通过 YAML 文件声明式的定义应用程序的各个服务,并由单个命令完成应用的创建和启动。
[root@master ~]# yum install -y docker-compose
2. 下载harbor
Harbor下载地址: https://github.com/goharbor/harbor/releases
[root@master ~]# wget https://storage.googleapis.com/harbor-releases/release-1.9.0/harbor-offline-installer-v1.9.1.tgz
[root@master ~]# tar xf harbor-offline-installer-v1.9.1.tgz -C /usr/local
解压缩之后,目录下会生成harbor.conf文件,该文件就是Harbor的配置文件。
[root@master ~]# cd /usr/local/harbor/
[root@master harbor]# vim harbor.yml
## Configuration file of Harbor
# hostname设置访问地址,可以使用ip、域名,不可以设置为127.0.0.1或localhost
hostname = 192.168.144.30 # 需要修改为自己的IP地址
# 访问协议,默认是http,也可以设置https,如果设置https,则nginx ssl需要设置on
ui_url_protocol = http
# mysql数据库root用户默认密码root123,实际使用时修改下
db_password = root123
max_job_workers = 3
customize_crt = on
ssl_cert = /data/cert/server.crt
ssl_cert_key = /data/cert/server.key
secretkey_path = /data
admiral_url = NA
# 邮件设置,发送重置密码邮件时使用
email_identity =
email_server = smtp.mydomain.com
email_server_port = 25
email_username = sample_admin@mydomain.com
email_password = abc
email_from = admin <sample_admin@mydomain.com>
email_ssl = false
# 启动Harbor后,管理员UI登录的密码,默认是Harbor12345
harbor_admin_password = Harbor12345
# 认证方式,这里支持多种认证方式,如LADP、本次存储、数据库认证。默认是db_auth,mysql数据库认证
auth_mode = db_auth
# LDAP认证时配置项
#ldap_url = ldaps://ldap.mydomain.com
#ldap_searchdn = uid=searchuser,ou=people,dc=mydomain,dc=com
#ldap_search_pwd = password
#ldap_basedn = ou=people,dc=mydomain,dc=com
#ldap_filter = (objectClass=person)
#ldap_uid = uid
#ldap_scope = 3
#ldap_timeout = 5
# 是否开启自注册
self_registration = on
# Token有效时间,默认30分钟
token_expiration = 30
# 用户创建项目权限控制,默认是everyone(所有人),也可以设置为adminonly(只能管理员)
project_creation_restriction = everyone
verify_remote_cert = on
3. 配置并安装
把hostname修改为仓库的IP地址
[root@docker ~]# cd /usr/local/harbor/
[root@docker harbor]# vim harbor.yml
[root@docker harbor]# ./prepare
启动harbor
[root@master harbor]# ./install.sh
4. 安装完成后进入web界面
用户名: admin
登录密码:配置文件中的harbor_admin_password = Harbor12345
5. 测试上传镜像
5.1 先登录harbor的Web界面,创建一个项目
这个项目就相当于公司中不同的项目组,每个项目组分别管理各自的项目镜像,后期该项目不需要时,可直接删除该项目。
5.2 给要上传的镜像打标签, 以centos为例:
[root@master harbor]# docker tag centos:latest 192.168.144.30/k8s/centos
5.3 登录镜像库
[root@master harbor]# docker login -u admin -p Harbor12345 http://192.168.144.30
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
注意:如果执行登陆操作报错
Error response from daemon: Get https://192.168.144.30/v1/users/: dial tcp 192.168.144.30:443: getsockopt: connection refused
这是因为docker1.3.2版本开始默认docker registry使用的是https,我们设置Harbor默认http方式,所以当执行用docker login、pull、push等命令操作非https的docker regsitry的时就会报错。
解决办法:
- 如果系统是MacOS,则可以点击“Preference”里面的“Advanced”在“Insecure Registry”里加上192.168.144.30,重启Docker客户端就可以了。
- 如果系统是Ubuntu,则修改配置文件/lib/systemd/system/docker.service,修改[Service]下ExecStart参数,增加–insecure-registry 192.168.144.30。
- 如果系统是Centos,可以修改配置/etc/sysconfig/docker,将OPTIONS增加–insecure-registry 192.168.144.30。
5.4 解决centos登录报错
如果已经配置了docker加速,则直接覆盖掉;没有就创建。
[root@master harbor]# vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://pzpl72fb.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.144.30"],
"storage-driver": "overlay2",
"storage-opts": ["overlay2.override_kernel_check=true"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
然后重启docker
[root@master harbor]# systemctl damon-reload
[root@master harbor]# systemctl restart docker
能看到自己的IP就ok了
[root@master harbor]# docker info
....
Labels:
Experimental: false
Insecure Registries:
192.168.144.30
127.0.0.0/8
....
5.5 上传镜像
[root@master harbor]# docker push 192.168.144.30/k8s/centos
The push refers to repository [192.168.144.30/k8s/centos]
2653d992f4ef: Layer already exists
latest: digest: sha256:dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875 size: 529
可以在web页面查看是否上传成功
6. harbor的启动与关闭
6.1 启动
[root@master harbor]# docker-compose up -d
Starting harbor-log ... done
Starting harbor-db ...
Starting redis ...
Starting registryctl ...
Starting harbor-portal ...
Starting registry ... done
Starting harbor-core ... done
Starting harbor-jobservice ...
Starting nginx ... done
6.2 关闭
[root@master harbor]# docker-compose stop
Stopping nginx ... done
Stopping harbor-jobservice ... done
Stopping harbor-core ... done
Stopping registry ... done
Stopping redis ... done
Stopping harbor-db ... done
Stopping harbor-portal ... done
Stopping registryctl ... done
Stopping harbor-log ... done
7. 配置其他node节点使用此仓库
只需将其他节点进行以下配置即可
7.1 配置
步骤同5.4,在/etcdocker/damon.json添加一条insecure-registry 192.168.144.30
[root@node1 ~]# vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://pzpl72fb.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.144.30"],
"storage-driver": "overlay2",
"storage-opts": ["overlay2.override_kernel_check=true"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
然后重启docker
[root@node1 ~]# systemctl damon-reload
[root@node1 ~]# systemctl restart docker
7.2 验证
登录harbor仓库
[root@k8s-node1 ~]# docker login -u admin -p Harbor12345 http://192.168.144.30
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@k8s-node1 ~]# docker pull 192.168.144.30/k8s/centos
Using default tag: latest
latest: Pulling from k8s/centos
7a0437f04f83: Pull complete
Digest: sha256:dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875
Status: Downloaded newer image for 192.168.144.30/k8s/centos:latest