1 Rancher 技术架构
自从 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 节点。其具体信息如下所示:
其拓扑图如下图所示:
图 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
的详细说明,请参阅 rfc2595harbor_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”,只有管理员才能创建项目。
3、参数修改
针对 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 的界面:
至此,单节点的私有镜像仓库部署完成。剩下的工作就是在镜像仓库中创建项目以及导入镜像的过程。相关的步骤就在安装部署过程中进一步阐述。
4 Rancher 离线部署(生产系统)
由于 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:
https://blog.csdn.net/karamos/article/details/80122332
【4】CentOS7 下安装 Dockers-Compose:
https://www.cnblogs.com/YatHo/p/7815400.html
【5】在 RHEL7 上如何搭建本地私有的 docker registry:
https://blog.csdn.net/zhangli_perdue/article/details/50460855
【6】Rancher 离线安装:
评论