DevOps之harbor
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DevOps之harbor相关的知识,希望对你有一定的参考价值。
一、 Harbor仓库的基本介绍
Harbor,是一个英文单词,意思是港湾,港湾是干什么的呢,就是停放货物的,而货物呢,是装在集装箱中的,说到集装箱,就不得不提到Docker容器,因为docker容器的技术正是借鉴了集装箱的原理。所以,Harbor正是一个用于存储Docker镜像的企业级Registry服务。
Harbor通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
1. Harbor特性:
? 基于角色的访问控制 :用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
? 镜像复制 : 镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。
? 图形化用户界面 : 用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。
? AD/LDAP 支持 : Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
? 审计管理 : 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
? RESTful API : RESTful API 提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。
? 部署简单 : 提供在线和离线两种安装工具, 也可以安装到vSphere平台(OVA方式)虚拟设备。
2. Harbor核心组件介绍:
? Proxy:他是一个nginx的前端代理,代理Harbor的registry,UI, token等服务。
? Database:负责储存用户权限、审计日志、Dockerimage分组信息等数据。
? UI:提供图形化界面,帮助用户管理registry上的镜像, 并对用户进行授权。
? jobsevice:jobsevice是负责镜像复制工作的,他和registry通信,从一个registry pull镜像然后push到另一个registry,并记录job_log。
? Adminserver:是系统的配置管理中心附带检查存储用量,ui和jobserver启动时候回需要加载adminserver的配置。
? Registry:镜像仓库,负责存储镜像文件。
? Log:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。
? webhook:为了及时获取registry 上image状态变化的情况, 在Registry上配置webhook,把状态变化传递给UI模块
? token 服务:负责根据用户权限给每个docker push/pull命令签发token. Docker 客户端向Regi?stry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进行请求。
主要组件包括proxy,他是一个NGINX前端代理,主要是分发前端UI访问和镜像上传和下载流量,上图中通过深蓝色标识;UI提供了一个web管理界面,当然还包括一个前端和后端的API,底层使用mysql数据库;registry是镜像仓库,负责存储镜像文件。当镜像上传完毕后通过took通知UI创建repository,上图通过红色线标识,当然registry的token认证也是通过UI组件完成的,adminserver是系统的配置管理中心附带检查存储用量。UI和jobserver启动的时候会需要加载adminserver的配置,通过灰色线标识;jobservice是负责镜像的复制工作,他和registry通信,从一个registry pull镜像然后push到另一个registry,并记录job_log ,上图中通过紫色线标识,log是日志汇总组件,通过docker的log-diver把日志汇总到一起,通过浅蓝色线标识。
3. Harbor和Registry的比较
Harbor和Registry都是Docker的镜像仓库,但是Harbor作为更多企业的选择,是因为相比较于Regisrty来说,它具有很多的优势:
? 提供分层传输机制,优化网络传输:Docker镜像是分层的,而如果每次传输都使用全量文件(所以用FTP的方式并不适合),显然不经济。必须提供识别分层传输的机制,以层的UUID为标识,确定传输的对象。
? 提供WEB界面,优化用户体验:只用镜像的名字来进行上传下载显然很不方便,需要有一个用户界面可以支持登陆、搜索功能,包括区分公有、私有镜像。
? 支持水平扩展集群:当有用户对镜像的上传下载操作集中在某服务器,需要对相应的访问压力作分解。
? 良好的安全机制:企业中的开发团队有很多不同的职位,对于不同的职位人员,分配不同的权限,具有更好的安全性。
? Harbor提供了基于角色的访问控制机制,并通过项目来对镜像进行组织和访问权限的控制。kubernetes中通过namespace来对资源进行隔离,在企业级应用场景中,通过将两者进行结合可以有效将kubernetes使用的镜像资源进行管理和访问控制,增强镜像使用的安全性。尤其是在多租户场景下,可以通过租户、namespace和项目相结合的方式来实现对多租户镜像资源的管理和访问控制。
4. Harbor的实现
Harbor的每个组件都是以Docker容器的形式构建的,官方也是使用Docker Compose来对它进行部署。用于部署Harbor的Docker Compose模板位于 harbor/docker-compose.yml,打开这个模板文件,发现Harbor是由7个容器组成的:
nginx:nginx负责流量转发和安全验证,对外提供的流量都是从nginx中转,所以开放https的443端口,它将流量分发到后端的ui和正在docker镜像存储的docker registry。
harbor-jobservice:harbor-jobservice 是harbor的job管理模块,job在harbor里面主要是为了镜像仓库之间同步使用的。
harbor-ui:harbor-ui是web管理页面,主要是前端的页面和后端CURD的接口。
registry:registry就是docker原生的仓库,负责保存镜像。
harbor-adminserver:harbor-adminserver是harbor系统管理接口,可以修改系统配置以及获取系统信息。
harbor-db:harbor-db是harbor的数据库,这里保存了系统的job以及项目、人员权限管理。由于本harbor的认证也是通过数据,在生产环节大多对接到企业的ldap中。
harbor-log:harbor-log是harbor的日志服务,统一管理harbor的日志。通过inspect可以看出容器统一将日志输出的syslog。
这几个容器通过Docker link的形式连接在一起,这样,在容器之间可以通过容器名字互相访问。对终端用户而言,只需要暴露proxy (即Nginx)的服务端口。
二、Harbor的安装和基本使用
1. Harbor的安装
环境介绍:
#①安装docker:
yum install -y yum-utils device-mapper-persistent-data lvm2
#配置repository
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#安装docker,这里注意(docker的版本需要一致)比如,如果在拉去一个镜像之后并启动镜像时:[[email protected] harbor]#docker run -it centos echo hello world:
如果出现如下错误:
或者:
可能是因为docker的版本不对:
#这里我们需要将centos中自带的docker删除:
[[email protected] harbor]#yum remove docker-ce docker-ce-cli containerd.io
#查看docker的版本
yum list docker-ce --showduplicates | sort -r
#下载对应的版本:
[[email protected] harbor]#yum remove docker-ce docker-ce-cli containerd.io
#启动docker
[[email protected] harbor]#systemctl start docker
此时在尝试,运行一个镜像,如果没问题,说明docker安装成功!!!
#② 安装docker-compose
[[email protected] harbor]# yum install python-pip
[[email protected] harbor]# pip install docker-compose
#测试
[[email protected] harbor]# docker-compose –version
#卸载
#[[email protected] harbor]# pip uninstall docker-compose
#③安装harbor
这里我已经下载过了 ,使用离线安装。
下载地址:https://github.com/vmware/harbor/releases/download
也可以在线安装:
wget -P /usr/loca/src/ https://github.com/vmware/harbor/releases/download/v1.2.0/harbor-online-installer-v1.1.1.tgz
#下载成功后:
[[email protected] harbor]# tar zxf harbor-offline-installer-v1.1.1.tgz
[[email protected] harbor]# cd harbor
#修改配置文件:
? hostname:目标主机的主机名,用于访问UI和注册服务。
? ui_url_protocol:(http或https,默认为http)用于访问UI和令牌/通知服务的协议。
? db_password:用于db_auth的MySQL数据库的root密码。
? max_job_workers:(默认值为3)作业服务中的最大复制工作数。
? customize_crt:(开启或关闭,默认为开启),如果此属性开启,在准备脚本创建注册表的令牌生成/验证私钥和根证书。
? ssl_cert:SSL证书的路径,仅在协议设置为https时应用。
? ssl_cert_key:SSL密钥的路径,仅在协议设置为https时应用。
? log_rotate_count:日志文件在被删除之前会被轮询log_rotate_count次数。
? log_rotate_size:仅当日志文件大于log_rotate_size字节时才会轮换日志文件。
? harbor_admin_password:管理员的初始密码。默认用户名/密码为:admin/Harbor12345。
? auth_mode:使用的身份验证类型。默认情况下,它是db_auth,即凭据存储在数据库中。对于LDAP身份验证,请将其设置为ldap_auth。
#④执行安装脚本:
[[email protected] harbor]# ./install.sh
看到如下界面表示安装成功,此时可以根据你设置的hostname和port访问harbor的界面:
这里我们也可以看到harbor启动的docker容器:
注意:执行这条命令时,所在的目录中一定要有:docker-compose.yml文件。
#补充命令:
#启动Harbor d
[[email protected] harbor]#docker-compose start
#停止Harbor
[[email protected] harbor]#docker-comose stop
#重启Harbor
[[email protected] harbor]#docker-compose restart
2. harbor上传和下载镜像的测试
1)上传操作
#1.创建/etc/docker/daemon.json文件,在文件中指定仓库地址
[[email protected] harbor]#cat > /etc/docker/daemon.json << EOF { "insecure-registries":["hostname"] } EOF
#注意这里的hostname是harbor.cfg配置的那个。
#2.重启docker服务
[[email protected] harbor]# systemctl daemon-reload
[[email protected] harbor]# systemctl restart docker
#3.查看docker服务的本地registry
[[email protected] harbor]# systemctl info
#4.下载镜像,上传至本地服务
[[email protected] harbor]# docker pull busybox #下载
[[email protected] harbor]# docker tag busybox 192.168.130.101/library/busybox:0.1 #修改标签(ip/项目/名称)
[[email protected] harbor]# docker login 192.168.130.101 #登录自己的私有仓库
[[email protected] harbor]# docker push 192.168.130.101/library/busybox:0.1 #上传到私用仓库
2)下载操作
[[email protected] harbor]# docker pull 192.168.130.101/library/busybox:0.1
#查看
[[email protected] harbor]# docker images
3. 操作的常见问题
遇到的问题就是Harbor我配置的是http访问,但是docker客户端默认都是https访问Harbor,所以就会产生错误。
遇到上面的问题表示docker默认访问仓库时都是使用的https协议,而我们的仓库配置的是http:
#解决方法一:
#在docker启动的配置仓库地址添加如下内容:
--insecure-registry rgs.unixfbi.com
[[email protected] harbor]#vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd --insecure-registry rgs.unixfbi.com #不推荐 ,反正 我使用这个连docker都起不来
#解决方法二:
#创建/etc/docker/daemon.json文件,在文件中指定仓库地址
{ "insecure-registries":["私有仓库的地址"] }
#然后重启docker就可以了
[[email protected] harbor]#systemctl restart docker
以上是关于DevOps之harbor的主要内容,如果未能解决你的问题,请参考以下文章
linux12Devops -->10Jenkins流水线容器化+Harbor私有仓库