题图摄于西温哥华的港湾(Harbor)
本文转自Harbor的合作伙伴才云Caicloud,介绍了在Kubernetes上部署Harbor容器registry的方法。感谢才云对开源社区的贡献,相关代码可从Harbor的Github项目下载https://github.com/vmware/harbor。在本月21日的Kubernetes活动中,将有详细介绍,参与方式见文末。
Harbor项目
Harbor项目旨在提供企业级镜像服务,它基于开源的Docker Registry server,在其基础上增加了很多企业需要的功能。Harbor设计针对私有云环境。私有镜像,企业会很关注安全问题。此外,私有镜像不需要从公共网络去下载镜像,从而提高了研发生产力。这对于没有很好网络的容器开发使用者也提供了很大帮助。
Harbor项目功能
Role Based Access Control (基于角色的准入控制): 用户和docker代码库通过“项目”的形式来组织,在同一个namespace下,一个用户对镜像可以有不同的permission
Graphical user portal (UI入口): 用户可以轻松浏览、搜索docker的代码库,管理项目和namespaces
AD/LDAP support (AD/LDAP支持): Harbor接入企业用户认证和管理已有的AD/LDAP
Auditing(审计): 所有代码库操作都会被追踪且可以用于审计目的
Internationalization (国际化): 提供中英文便于本土化
RESTful API: 用来给大多对Harbor的管理操作,无需用到管理软件整合,很便利。
实现Harbor与Kubernetes对接
作为一个Docker Registry,Harbor原生态地支持通过Docker的方式部署,然而直接通过Docker或者Docker Compose无法很好的做到容错、扩容、检测等等工作。Kubernetes作为一个容器管理平台就能够很好解决上述问题。
要将Harbor部署到Kubernetes上,首先需要将Harbor的组件全部容器化。因为Harbor已经支持使用容器部署,所以大部分的容器化工作已经完成。
但在Kubernetes下的环境和本机的环境不同,所以在原有镜像的基础上我们还需要处理以下几个问题:
1. 配置文件。在本地环境下配置文件是临时加载的,但是这样在网络环境下并不容易扩展。因为如果一台机器宕机了之后就很难保证相同的配置文件能够一起被转移到其他机器上。所以我们需要将之前预设好的配置文件一起存放到Docker镜像当中,比如对于registry的镜像我们要进一步封装为:
FROM library/registry:2.3.0 ADD ./config/registry/ /etc/registry/ ADD./kubernetes/dockerfiles/registry-config.yml /etc/registry/config.yml CMD ["/etc/registry/config.yml"]
2. Docker Registry一个很重要的配置信息就是Registry的Host。一方面,要将Harbor部署到Kubernetes上,那么这个配置信息在编译镜像之前就需要确定;另一方面,在还没有真正运行起来之前Kubernetes是不会预先给服务分配IP的。这就形成了一个死循环!要解决这个死循环有两个办法:
a)先启动Registry的Service得到一个IP,然后根据IP编译完镜像之后再启动Replica Controller。
b)使用DNS。在配置镜像的时候把Registry Host配置成DNS name,这样当服务在kubernetes中起来之后我们可以再通过配置DNS的方式使得这个DNS指向正确的IP。
当所有镜像都编译好之后,我们就可以通过kubectl来启动Harbor的所有组件了。 在kubernetes上启动Harbor的所有yaml文件都在:https://github.com/vmware/harbor/tree/master/Deploy/kubernetes
当所有服务都建立成功之后,我们就可以通过配置好的DNS或者Service IP来访问Harbor的网站了。但是如果要存储镜像,我们还需要配置证书(Certificate)。因为Docker Registry都是采用的https。如果没有证书,会得到类似下面的错误:
Error response from daemon: invalid registryendpoint https://{HOST}/v0/: unable to ping registry endpointhttps://{HOST}/v0/
v2 ping attempt failed with error: Gethttps://{HOST}/v2/: EOF
v1 ping attempt failed with error: Get https://{HOST}/v1/_ping:EOF. If this private registry supports only HTTP or HTTPS with an unknown CAcertificate, please add `--insecure-registry {HOST}` to the daemon's arguments.In the case of HTTPS, if you have access to the registry's CA certificate, noneed for the flag; simply place the CA certificate at/etc/docker/certs.d/{HOST}/ca.crt
获取证书比较麻烦,有一个方法可以使得这个部署好的Harbor先用起来:
1. 先打开/etc/default/docker文件:
sudo vi /etc/default/docker
2. 在DOCKER_OPTS中把DNS或者IP加到 insecure-registry列表里:
DOCKER_OPTS="$DOCKER_OPTS–insecure-registry={HOST}"
3. 重启docker daemon:
sudo service docker restart
结束语
VMware开源项目Harbor作为Docker私有镜像库,跑在Kubernetes上之后,能享受到Kubernetes作为容器管理平台。但如何能轻松部署Kubernetes集群呢?Caicloud在5月初推出基于Kubernetes容器集群云平台beta版,敬请期待!
Kubernetes活动预告
2016年5月21日举行上海Kubernetes Meetup 活动。本次活动将包括Harbor项目组架构师姜坦主讲的《企业级开源Registry项目Harbor和Kubernetes的结合》,欢迎参加。
时间:2016年5月21日 下午1:30-5:30
地点:上海市杨浦区淞沪路333号创智天地三期12号楼10层 VMware研发中心
活动议题:
本活动由Caicloud主办,VMware研发中心协办,请点击文章底部“阅读原文”报名参加上海Kubernetes meetup!