在实际生产运维中,每每须要把镜像发布到几10、上百台或更多的节点上。这时单台Docker主机上镜像已没法知足,项目愈来愈多,镜像就愈来愈多,都放到一台Docker主机上是不行的,咱们须要一个像Git仓库同样系统来统一管理镜像。这里介绍的是一个企业级镜像仓库Harbor,将做为咱们容器云平台的镜像仓库中心。python
Habor是由VMWare公司开源的容器镜像仓库。事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而得到了更加普遍的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制 ,AD/LDAP集成以及审计日志等,足以知足基本企业需求。mysql
Harbor和Registry都是Docker的镜像仓库,可是Harbor做为更多企业的选择,是由于相比较于Regisrty来讲,它具备不少的优点。nginx
一、提供分层传输机制,优化网络传输
Docker镜像是是分层的,而若是每次传输都使用全量文件(因此用FTP的方式并不适合),显然不经济。必须提供识别分层传输的机制,以层的UUID为标识,肯定传输的对象。git
二、提供WEB界面,优化用户体验
只用镜像的名字来进行上传下载显然很不方便,须要有一个用户界面能够支持登录、搜索功能,包括区分公有、私有镜像。github
三、支持水平扩展集群
当有用户对镜像的上传下载操做集中在某服务器,须要对相应的访问压力做分解。web
四、良好的安全机制
企业中的开发团队有不少不一样的职位,对于不一样的职位人员,分配不一样的权限,具备更好的安全性。sql
五、Harbor提供了基于角色的访问控制机制,并经过项目来对镜像进行组织和访问权限的控制。kubernetes中经过namespace来对资源进行隔离,在企业级应用场景中,经过将二者进行结合能够有效将kubernetes使用的镜像资源进行管理和访问控制,加强镜像使用的安全性。尤为是在多租户场景下,能够经过租户、namespace和项目相结合的方式来实现对多租户镜像资源的管理和访问控制。docker
harbor须要安装docker和docker-compose,client只须要安装dockerjson
docker-compose的安装:vim
yum install epel-release yum install -y python-pip pip install --upgrade pip pip install docker-compose
一、下载harbor
https://github.com/goharbor/harbor/releases
二、解压至/opt下
[root@ren8 kubernetes]# tar zxf harbor-offline-installer-v1.4.0.tgz [root@ren8 kubernetes]# ls bash k8s197.tar.gz ca.tar.gz kube-yunwei-197 harbor kube-yunwei-197.tar.gz harbor-offline-installer-v1.4.0.tgz scope.yaml image sock-shop image.tar.gz [root@ren8 kubernetes]# cp -r harbor /opt/ [root@ren8 kubernetes]# cd /opt/harbor/ [root@ren8 harbor]# ls -trl 总用量 805152 -rwxr-xr-x 1 root root 25791 2月 6 2018 prepare -rw-r--r-- 1 root root 482 2月 6 2018 NOTICE -rw-r--r-- 1 root root 10771 2月 6 2018 LICENSE -rwxr-xr-x 1 root root 5773 2月 6 2018 install.sh drwxr-xr-x 3 root root 156 2月 6 2018 ha -rw-r--r-- 1 root root 824398580 2月 6 2018 harbor.v1.4.0.tar.gz -rw-r--r-- 1 root root 1140 10月 23 15:11 docker-compose.clair.yml -rw-r--r-- 1 root root 1732 10月 23 15:12 docker-compose.notary.yml -rw-r--r-- 1 root root 3396 10月 23 15:13 docker-compose.yml drwxr-xr-x 4 root root 37 10月 23 15:17 common -rw-r--r-- 1 root root 5968 10月 24 15:57 harbor.cfg
三、修改配置文件
(1)建立harbor工做目录,并准备ca证书,移动到harbor工做目录下
[root@ren8 ~]# ls anaconda-ks.cfg cert.tar.gz k8saddons.tar.gz original-ks.cfg bin docker kubernetes token.sh bin.tar.gz k8saddons kubernetes.tar.gz yum-repo.sh [root@ren8 ~]# tar xf cert.tar.gz [root@ren8 ~]# mkdir -p /data/harbor [root@ren8 ~]# cp -r cert /data/harbor [root@ren8 ~]# cd /data/harbor/cert/ [root@ren8 cert]# ls -trl 总用量 24 -rw-r--r-- 1 root root 3272 9月 28 17:43 ca.key -rw-r--r-- 1 root root 2130 9月 28 17:43 ca.crt -rw-r--r-- 1 root root 3272 9月 28 17:49 harbor.key -rw-r--r-- 1 root root 1756 9月 28 17:49 harbor.csr -rw-r--r-- 1 root root 2013 9月 28 17:49 harbor.crt -rw-r--r-- 1 root root 17 9月 28 17:49 ca.srl
(2)修改harbor主配置文件harbor.cfg
[root@ren8 cert]# cd /opt/harbor/ [root@ren8 harbor]# ls common ha LICENSE docker-compose.clair.yml harbor.cfg NOTICE docker-compose.notary.yml harbor.v1.4.0.tar.gz prepare docker-compose.yml install.sh
[root@ren8 harbor]# vim harbor.cfg
###################修改以下参数##################### hostname = reg.yunwei.com ui_url_protocol = https ssl_cert = /data/harbor/cert/harbor.crt #ca证书名称必须与实践文件同名 ssl_cert_key = /data/harbor/cert/harbor.key # secretkey_path = /data/harbor #ca证书的目录
harbor_admin_password = admin
(3)修改 docker-compose.clair.yml 编排文件
/data/harbor/clair-db:/var/lib/postgresql/data:z
(4)修改 docker-compose.notary.yml 编排文件
/data/harbor/notary-db:/var/lib/mysql:z
(5)修改 docker-compose.yml 编排文件
/data/harbor/:/var/log/docker/:z /data/harbor/registry:/storage:z /data/harbor/database:/var/lib/mysql:z /data/harbor/config/:/etc/adminserver/config/:z /data/harbor/secretkey:/etc/adminserver/key:z /data/harbor/:/data/:z /data/harbor/secretkey:/etc/ui/key:z /data/harbor/ca_download/:/etc/ui/ca/:z /data/harbor/psc/:/etc/ui/token/:z /data/harbor/job_logs:/var/log/jobs:z /data/harbor/secretkey:/etc/jobservice/key:z
四、安装、启动harbor
执行./install.sh(sh install.sh)脚本便可。
[root@ren8 harbor]# ls common ha LICENSE docker-compose.clair.yml harbor.cfg NOTICE docker-compose.notary.yml harbor.v1.4.0.tar.gz prepare docker-compose.yml install.sh [root@ren8 harbor]# sh install.sh
验证harbor是否部署成功(必须在/opt/harbor/目录下执行)
[root@ren8 harbor]# docker-compose ps Name Command State Ports ------------------------------------------------------------------------ harbor-adminserver /harbor/start.sh Up harbor-db /usr/local/bin Up 3306/tcp /docker-entr ... harbor-jobservice /harbor/start.sh Up harbor-log /bin/sh -c Up 127.0.0.1:1514->1051 /usr/local/bin/ ... 4/tcp harbor-ui /harbor/start.sh Up nginx nginx -g daemon off; Up 0.0.0.0:443->443/tcp , 0.0.0.0:4443->4443 /tcp, 0.0.0.0:80->80/tcp registry /entrypoint.sh serve Up 5000/tcp /etc/ ...
五、各节点设置登陆harbor私有镜像仓库(为各节点分发ca证书)
(1)在每一个节点(包括harbor节点)的/etc/docker/目录下,建立certs.d/reg.yunwei.com/目录
[root@ren8 ~]# mkdir -p /etc/docker/certs.d/reg.yunwei.com/
(2)harbor节点上,将harbor的ca证书中的ca.crt拷贝到/etc/docker目录下
[root@ren8 ~]# cp /data/harbor/cert/ca.crt /etc/docker/certs.d/reg.yunwei.com/
(3)将harbor节点的ca.crt文件,分发给各节点的/etc/docker/certs.d/reg.yunwei.com/下
[root@ren8 ~]# scp /etc/docker/certs.d/reg.yunwei.com/ca.crt ren7:/etc/d ocker/certs.d/reg.yunwei.com/ [root@ren8 ~]# scp /etc/docker/certs.d/reg.yunwei.com/ca.crt ren6:/etc/d ocker/certs.d/reg.yunwei.com/ [root@ren8 ~]# scp /etc/docker/certs.d/reg.yunwei.com/ca.crt ren5:/etc/d ocker/certs.d/reg.yunwei.com/
(4)harbor镜像库登陆验证
1)命令行:各节点登录镜像库地址后,输入用户名/密码(admin/admin)后出现 Login Succeeded
[root@ren7 ~]# docker login reg.yunwei.com Username: admin Password: Login Succeeded
若是登陆不上,能够修改配置文件 /etc/docker/daemon.json
[root@ren8 ~]# cat /etc/docker/daemon.json { "registry-mirrors": ["http://cc83932c.m.daocloud.io"], "insecure-registries": ["192.168.11.7:5000"], "insecure-registries": ["192.168.11.8"], #添加harbor节点的ip的安全认证 "max-concurrent-downloads": 10, "log-driver": "json-file", "log-level": "warn", "log-opts": { "max-size": "10m", "max-file": "3" } }
[root@ren8 ~]# systemctl daemon-reload
[root@ren8 ~]# systemctl restart docker
一、本地镜像从新打tag
docker tag SOURCE_IMAGE[:TAG] reg.yunwei.com/learn/IMAGE[:TAG]
二、将从新打好tag的镜像上传到镜像库
若是在推送镜像时,被拒绝(denied: requested access to the resource is denied),是由于没有docker login 登录harbor镜像库。
docker push reg.yunwei.com/learn/IMAGE[:TAG]
三、其它节点配置好了ca证书的ca.crt文件后,即可执行以下命令下载镜像。在kubernetes集群中节点中启动pod时,会自动下载镜像
docker pull reg.yunwei.com/learn/busybox:latest
进入到harbor目录下,拥有docker-compose.yml的文件目录下执行以下的命令启动和关闭:
[root@ren8 harbor]# docker-compose start [root@ren8 harbor]# docker-compose restart [root@ren8 harbor]# docker-compose stop [root@ren8 harbor]# docker-compose rm
默认状况下,harbor运行起来后有以下容器:
[root@ren8 harbor]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d82eb9967cc3 vmware/harbor-jobservice:v1.4.0 "/harbor/start.sh" 46 hours ago Up 2 hours (healthy) harbor-jobservice 5e8849eaf757 vmware/nginx-photon:v1.4.0 "nginx -g 'daemon of…" 46 hours ago Up 2 hours 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp nginx 6e4a776103b5 vmware/harbor-ui:v1.4.0 "/harbor/start.sh" 46 hours ago Up 2 hours (healthy) harbor-ui eff0c2c84df6 vmware/harbor-adminserver:v1.4.0 "/harbor/start.sh" 46 hours ago Up 2 hours (healthy) harbor-adminserver ca862377182c vmware/registry-photon:v2.6.2-v1.4.0 "/entrypoint.sh serv…" 46 hours ago Up 2 hours (healthy) 5000/tcp registry f37bb2d03d39 vmware/harbor-db:v1.4.0 "/usr/local/bin/dock…" 46 hours ago Up 2 hours (healthy) 3306/tcp harbor-db d9f6ccc5d821 vmware/harbor-log:v1.4.0 "/bin/sh -c /usr/loc…" 46 hours ago Up 2 hours (healthy) 127.0.0.1:1514->10514/tcp harbor-log
分别为nginx,harbor-jobservice,harbor-ui,harbor-adminserver,registry,harbor-db,harbor-log,由上咱们能够得出下面的架构图:
Harbor是经过docker compose来部署的,这也是为何在装Harbor以前,须要安装docker-compose。各个模块的详细介绍以下:
一、Proxy:对应启动组件nginx,是一个nginx反向代理,Harbor的registry,UI,token services等组件,都处在一个反向代理后边,该代理负责未来自浏览器,docker clients的请求转发到后端服务上
二、Registry:对应启动组件registry.负责存储Docker镜像文件,以及处理Docker的push,pull等请求.Harbor对镜像进行强制的访问控制,Registry会将客户端的每一个pull,push请求转发到token服务来获取有效的token.
三、Core services:Harbor的核心功能,主要包括3个服务:UI,Job services和Log collector.
(1)UI:对应启动组件harbor-ui.以图像用户界面的方式,辅助用户管理镜像,我我的以为这样使得使用Harbor时,更加友好.
(2)Job services:对应启动组件harbor-jobservice,主要用于镜像复制,和registry通讯,本地镜像能够push到Harbor镜像仓库中,一样也能够从Harbor镜像仓库中pull到本地,同时记录job_log.
(3)Log collector:对应启动组件harbor-log.负责收集其余模块的日志到一个地方
四、Database:对应启动组件harbor-db.负责存储project,user,role,replication等的metadata数据.
五、adminserver:对应启动组件harbor-adminserver.是系统的配置管理中心,当ui和jobserver启动时,须要加载adminserver的配置