联通云数据的容器离线部署实践
RancherLabs2018-09-29
1Rancher技术架构
自从2017年底开始,开源容器云管理平台Rancher从原有的1.6版本全面升级到2.0版本,目前最新推广的是2.0.8版本。不仅仅是功能的更新,而且在整体架构方面也做了重大的调整。从原先的1.6版本支持Cattle、Kubernetes、Mesos等多种管理环境,转变为全面支持Kubernetes。同时在部署方式上也提供了RKE等多种部署方式,其总体技术架构如下图所示【1】:
图1 Rancher2.0总体技术架构
Rancher 2.0主要软件都运行在Rancher Server上,Rancher Server包含了用于管理部署Rancher集群的软件组件。
Rancher API Server
Rancher API Server是构建在嵌入式Kubernetes API Server和etcd数据库之上,实现了以下功能:
- 用户管理
Rancher API服务器管理与外部身份验证提供程序(如Active Directory或GitHub)对应的用户身份。 - 授权
Rancher API Server管理访问控制和安全策略。 - 项目
项目是集群中一组多个命名空间和访问控制策略的集合。 - 节点
Rancher API Server跟踪所有集群的所有节点的标识。
Cluster Controller and Agents
集群控制器和集群代理实现管理Kubernetes集群所需要的业务逻辑。
- 集群控制器实现全局Rancher安装的逻辑需求,它执行以下操作:
① 为集群和项目配置访问控制策略
② 通过调用来配置集群:
ⅰ 所需的Docker 机器驱动程序;
ⅱ Kubernetes引擎,如:RKE【2】和GKE【3】
- 独立的集群代理实例实现相应集群所需的逻辑。 它执行以下活动:
① 工作负载管理,例如每个群集中的pod创建和部署。
② 在每一个集群的全局策略中定义应用角色和绑定。
③ 集群与Rancher API Server之间的通信:事件、统计信息、节点信息和健康检查。
Authentication Proxy
Authentication Proxy转发所有Kubernetes API调用。它集成了身份验证服务,如本地身份验证、Active Directory和Github。在每个Kubernetes API调用中,Authentication Proxy会对调用方进行身份验证,并在将调用转发给Kubernetes主节点之前设置正确的Kubernetes标识头。Rancher使服务账号与Kubernetes集群进行通信。
2部署拓扑图
依据上述Rancher2.0的技术架构,在部署Rancher集群过程中,选取一台服务器作为Rancher Server,一台服务器作为私有镜像仓库,其他服务器作为Node节点。其具体信息如下所示:
服务器 | INSIZE:5台; DMZ:5台 |
硬件 | HP BL685C |
操作系统 | CentOS 7.0.4 |
DOcker版本 | 1.12.6 |
其拓扑图如下图所示:
图2 部署拓扑图
依据上述拓扑图,考虑到安全和访问性能等问题,在部署过程中将Rancher平台的核心组件放到INSIDE区,保证其安全性;而将业务节点以及Harbor(单节点)部署到DMZ区,以方便外部访问。
两侧区域通过防火墙进行了打通,根据Rancher集群的访问策略实现了有限端口的开通和目的IP地址可达。从而在安全性方面最大程度保证INSIDE区的核心业务系统和数据库系统免受攻击。而在业务性能方面,在后期的Rancher平台业务部署策略方面(两侧分配的IP地址属于不同的地址段),将应用型和前端型平台部署到DMZ区,以方便外部用户访问。
3私有镜像库部署
考虑面向内部环境的平台和容器部署,尤其是生产系统环境下网络和外部是完全隔离的情况,以及从DockerHub上下载镜像所消耗的时间会是一个比较漫长的过程,因此在内网环境下部署私有镜像库。私有镜像库的部署还是采用目前比较流行的开源解决方案Harbor来实现。
Harbor的部署分为Harbor单节点部署和Harbor HA来实现,因为考虑到本身资源有限和目前镜像存储容量较小等情况采用的是单节点方式来部署;而HA的方式主要是多节点Harbor实现负载均衡,同时指向共享存储(Ceph或者Swift)等方式来实现。
Harbor单节点安装
1、环境准备
依据Harbor部署所需要软件环境,需要Python2.7版本以上,Docker等,在此就不再赘述。
其中由于开源的Harbor是基于Docker-compose来启动的,因此需要下载安装Docker-compose。其安装部署是基于python-pip来实现的,具体可以参考文献【4】。
Python-pip安装:
Docker-compose安装:
2、Harbor软件包下载
可以通过Harbor在Github下载页面下载离线文件包,具体的下载链接如下所示:
选择相应的版本下载。并通过以下命令进行解压缩:
tar zxvf harbor-< version >.tar.gz
3、修改配置文件
解压压缩包会得到harbor文件夹,harbor.cfg配置文件位于文件夹根目录。在harbor.cfg中有两类参数,必需参数和可选参数。
- 必需参数:需要在配置文件中设置这些参数。如果用户更新harbor.cfg并运行install.sh脚本以重新安装Harbor,更改的参数将生效;
- 可选参数:这些参数对于更新是可选的,即用户可以将它们保留为默认值,并在启动Harbor后在Web UI上更新它们。如果已经配置harbor.cfg,这些参数只会在首次启动Harbor时生效。harbor.cfg将忽略对这些参数的后续修改。
必需参数
- hostname:目标主机的主机名,用于访问UI和Harbor服务。它应该是目标计算机的IP地址或域名(FQDN),例如,
192.168.1.10
或reg.yourdomain.com
。不要使用localhost或127.0.0.1作为主机名,因为外部客户端需要访问Harbor服务! - ui_url_protocol :( http或https。默认为http)用于访问UI和令牌/通知服务的协议。如果启用了公证,则此参数必须为*https*。默认情况下,这是*http*。要设置https协议,请参阅使用HTTPS访问配置Harbor。
- db_password:用于db_auth的MySQL数据库的root密码。
生产环境请修改此密码
- max_job_workers :(默认值为3)作业服务中的最大复制工作数。对于每个镜像复制作业,程序将存储库的所有标记同步到远程目标。增加此数量可以在系统中实现更多并发复制作业。但是,由于每个复制进程都消耗一定的网络/CPU/IO资源,
请根据主机的硬件资源仔细选择该参数的值
。 - customize_crt:(on或off,默认为on),如果此属性on,准备脚本创建私钥和根证书,用于生成/验证
registry
的令牌。当外部源提供密钥和根证书时,将此属性设置为off。有关详细信息,请参阅自定义密钥和harbor令牌服务证书。 - ssl_cert:SSL证书的路径,仅在协议设置为https时应用
- ssl_cert_key:SSL密钥的路径,仅在协议设置为https时应用
- secretkey_path:用于加密或解密复制策略中远程Harbor密码的密钥路径。
- log_rotate_count:日志文件在被删除之前会被轮转log_rotate_count次。如果count为0,则删除旧版本而不是轮转。
- log_rotate_size:仅当日志文件大于log_rotate_size字节时才会轮转日志文件。如果大小后跟k,则假定大小以千字节为单位。如果使用M,则大小以兆字节为单位,如果使用G,则大小为千兆字节。尺寸100,尺寸100k,尺寸100M和尺寸100G都是有效的。
可选参数
- Email settings:Harbor需要这些参数才能向用户发送“密码重置”电子邮件,并且仅在需要该功能时才做配置。另外,请注意,在默认情况下SSL连接
没有启用
,如果你的SMTP服务器需要SSL,那么你应该通过设置email_ssl = TRUE
参数来启用SSL,但不支持STARTTLS
。如果电子邮件服务器使用自签名证书或不受信任证书,则需要设置email_insecure = true
。有关email_identity
的详细说明,请参阅rfc2595 - harbor_admin_password:管理员的初始密码。此密码仅在Harbor首次启动时生效。之后将忽略此设置,并且应在UI中设置管理员密码。请注意:默认用户名/密码为
admin/Harbor12345
- auth_mode:使用的身份验证类型。默认情况下,它是db_auth,即凭据存储在数据库中。对于LDAP身份验证,请将其设置为ldap_auth。
重要信息:从现有Harbor实例升级时,必须确保在启动新版本的Harbor之前,harbor.cfg
配置文件中auth_mode相同。否则,用户可能无法在升级后登录。 - ldap_url:LDAP连接URL(例如
ldaps://ldap.mydomain.com
)。仅在**auth_mode**设置为ldap_auth时使用
。 - ldap_searchdn:具有搜索LDAP/AD服务器权限的用户的DN(例如
uid=admin,ou=people,dc=mydomain,dc=com
)。 - ldap_search_pwd:ldap_searchdn指定的用户密码。
- ldap_basedn:查找用户的基本DN,例如
ou=people,dc=mydomain,dc=com
。仅在**auth_mode**设置为ldap_auth时使用。
- ldap_filter:用于查找用户的搜索过滤器,例如
(objectClass=person)
。 - ldap_uid:用于在LDAP搜索期间匹配用户的属性,它可以是uid,cn,email或其他属性。
- ldap_scope:搜索用户的范围,0-LDAP_SCOPE_BASE,1-LDAP_SCOPE_ONELEVEL,2-LDAP_SCOPE_SUBTREE。默认值为2。
- self_registration :( on或off。默认on)启用/禁用用户自助注册功能。禁用时,新用户只能由管理员用户创建,只有管理员可以在Harbor中创建新用户。 *注意:当auth_mode设置为ldap_auth时,始终*禁用自助注册功能,并忽略此设置。
- token_expiration:令牌服务创建的令牌到期时间(以分钟为单位),默认为30分钟。
- project_creation_restriction:用于控制用户有权创建项目的设置。默认情况下,每个人都可以创建一个项目,设置为“adminonly”,只有管理员才能创建项目。
4、参数修改
针对harbor.cfg的必需参数,需要根据现有的部署情况这是hostname,比如本次harbor部署在10.10.13.1的服务器上,那么hostname的设置为:
hostname = 10.10.13.1
如果有域名的话,可以将IP直接换成域名。这样harbor启动以后可以直接按照域名方式来访问。
【注意】
由于节点访问镜像仓库是默认按照5000端口来进行访问,而源代码文件中的docker-compose.yml文件并未将此端口暴露出来,从而会造成外部访问失败,其具体的配置位置如下图所示:
针对此部分在官网的文献中并没有体现,导致后续节点访问镜像仓库时一直出现访问被拒绝的情况。如下图所示:
查看harbor进程会发现,5000端口未暴露出来:
当在docker-compose.yml文件中添加port暴露,再重新启动harbor,再次检查进程会发现如下图所示:
从上图可以看出,仓库的端口已经暴露。
4、节点Docker引擎修改
由于Docker引擎默认是基于HTTPS进行访问的,因此在访问私有镜像仓库下载镜像时会提示安全被拒绝。需要在节点的Docker配置脚本上增加安全访问策略参数,即--insecure-registry.
不同的操作系统可能docker引擎的配置脚本文件所在的位置可能有所不同,本文仅以CentOS7.0.4为例进行阐述。参考文献【5】的指导,在CentOS7系统中,默认安装的docker引擎,在其下文件系统中存在如下文件:
cd /usr/lib/systemd/system
vim ./docker.service
其文件内容如下所示:
其中在变量ExecStart后面增加:--insecure-registry 10.10.13.1:5000
强制将私有镜像仓库设置为安全访问端口。
4、Harbor安装
经过上述环境部署和参数修改,在Harbor源文件的根目录下面有install.sh脚本,执行该脚本就可以镜像Harbor安装。请注意,在线安装需要一段时间从Docker hub下载Harbor镜像,具体根据实际网络情况。也可以打包下载镜像包导入到本地服务器上进行安装。
Harbor安装提供了三种模式:
⑴ 默认安装(没有Notary/Clair)
sudo ./install.sh
该模式属于普通安装模式,不带有漏洞扫描,因此默认不安装其他服务
⑵ 使用Notary安装
sudo ./install.sh --with-notary
该模式安装,需要配置参数ui_url_protocol为“https”.
⑶ 使用Clair安装
sudo ./install.sh --with-clair
本文采用默认安装方式操作。其具体界面如下所示:
访问UI地址,即可展现Harbor的界面:
至此,单节点的私有镜像仓库部署完成。剩下的工作就是在镜像仓库中创建项目以及导入镜像的过程。相关的步骤就在安装部署过程中进一步阐述。
4Rancher离线部署(生产系统)
由于Rancher全程都是镜像方式安装,因此从Rancher Server到Rancher Agent都是镜像,如果需要离线部署Rancher,需要事先将Rancher集群的相关集群都从Docker上下载下来,并且导入到事先搭建好的镜像库中。依据参考文档【6】下载Rancher离线安装包。其安装过程如下图所示:
其中离线安装包包括如下几个文件:
- rancher-save-images.sh:该脚本主要负责从Docker Hub中下载Rancher所有相关的镜像,并且打包成一个本地压缩包(rancher-images.tar.gz)
- rancher-load-images.sh:负责将本地镜像压缩包(rancher-images.tar.gz)导入所有镜像库中
在导入本地镜像时,由于镜像专属的项目,本文以limx59为名创建镜像库。如图所示:
由于本地私有镜像库的地址为:10.10.13.1:5000
因此在执行脚本时,需要将私有镜像库的地址作为参数传入到脚本中,具体执行命令如下所示:
sudo ./rancher-load-images.sh 10.10.13.1:5000/limx59
注意:需要将本地镜像压缩包和上传脚本放在同一个目录下面。
1、Rancher Server安装
依据前述的部署拓扑图,在Rancher Server服务器上执行,docker命令,从私有镜像库中拉起Rancher Server,其具体的执行脚本如下所示:
sudo docker run -d --restart=unless-stopped \
-p 80:80 -p 443:443 \
10.10.13.1:5000/limx59/rancher/rancher:latest
经过上述执行命令,可以在Server上拉起Rancher Server容器进程。登录界面可以访问UI界面:
2、创建集群
当建立Rancher Server以后,后续的集群创建就简单的多了,基本上就可以通过图形化的界面来一步步操作了。具体的各种参数配置自然也可以中文提示进行相关的修改和配置。
不过由于是在离线环境下进行集群部署,因此在部署集群前需要将原先我们创建的私有镜像库的地址配置到Rancher Server里面去,也就是需要给参数system-default-registry进行赋值。
有两种方式将该值传递给Rancher-Server,一种方式是在执行Rancher-Server拉起的过程时,通过外部参数进行传递,即如下命令:
sudo docker run -d --restart=unless-stopped \
-p 80:80 -p 443:443 \
CATTLE_SYSTEM_DEFAULT_REGISTRY 10.10.13.1:50000 \
10.10.13.1:5000/limx59/rancher/rancher:latest
从而可以将参数传入到server中。另一种图形化方式配置就是如下图所示:
在Rancher的全局变量下面,有一个“系统设置”,进去以后可以找到一个变量“system-default-registry”,如下图所示:
即可设置成私有镜像仓库地址。
3、节点添加
当在Racher-Server环境下创建集群以后,通过编辑集群可以添加节点,如下图所示:
依据上图所示,在配置好集群的环境参数等以后,在下方的自行添加节点方面,为主机角色提供了三种模式,etcd、Control、Worker等。根据不同的角色选择,会在下面的执行命令自动添加不同的参数,并在后续执行过程中,拉起相关的容器。一般部署集群时可以设置两个etcd,一个control,其他的节点作为worker。至于为什么?笔者没试过,大家可以多试一下。当设置好参数后,需要将黑框中的命令复制下来,在对应的节点系统执行该命令。从该命令中可以看出,镜像名称已经改成私有仓库的镜像了。
经过节点添加,可以顺利拉起相关的镜像,因为离线环境下下载量较小,因此创建集群的速度还是挺快的。原来在公网环境下创建一个集群可能需要一晚上的时间,在离线环境下,不一会儿就创建完成。
从集群中可以看见每一个主机节点的角色是什么。也可以从全管检查主机运行状况。
经过上述操作,一个离线环境下的Rancher集群基本上已经搭建完成了。后续的主要是配置应用商店对接离线环境下的部署。用户可以基于Rancher的可视化界面搭建属于自己的应用平台。
5后续工作
经过前期的离线部署Rancher,最让笔者眼前一亮的是Rancher全新的界面风格,比较小清新。另外,在部署过程中也着实趟过不少坑。不过毕竟是开源的项目,因此也不断和其他爱好者交流,包括在社区里面查询相关问题,解决相关问题并进行提案。
接下来的工作,主要是围绕容器平台的能力功能完善,基于容器平台的能力开放以及离线环境下来的镜像仓库、应用商店构建等持续推进。主要围绕:
– 围绕Rancher平台功能的完善,进行提案
– 实现私有镜像库的HA,构建分布式镜像仓库,搭建Ceph实现共享存储;
– 构建基于Rancher的机器学习能力平台
6参考文献
【1】Rancher技术架构:
https://rancher.com/docs/rancher/v2.x/en/overview/architecture/
【2】使用Rancher的RKE快速部署Kubernetes集群:
http://blog.51cto.com/10321203/2071662
【3】基于谷歌GKE使用Kubernetes:
【4】CentOS7下安装Dockers-Compose:
【5】在RHEL7上如何搭建本地私有的docker registry:
【6】Rancher离线安装: