本文将解读Rainbond集群的安装和运维的原理,使用户基本了解Rainbond的安装机制和运维重点,便于用户搭建大型Rainbond集群。node
属性 | 类型 | 说明 |
---|---|---|
manage | 管理节点 | 集结平台自身组件,提供应用构建、调度、管理等功能,提供数据中心基础服务与API接口,充当控制集群的角色。 |
gateway | 网关节点 | 集群内应用被外网访问的流量入口和负载均衡器,提供HTTP, HTTPs路由, TCP/UDP服务, 负载均衡器, 高级路由(A/B测试, 灰度发布)等功能。 |
compute | 计算节点 | 提供应用运行的计算资源,N个计算节点组成计算资源池供给管理节点灵活调度。 |
角色 | 组件 | 说明 |
---|---|---|
rbd-dns | 提供本地dns服务,服务于集群内应用的DNS解析。 | |
etcd | 管理节点etcd | |
kube-controller-manager | Kubernetes管理组件之一, Pod编排器 | |
rbd-webcli | 提供应用web方式进入容器命令行的服务 | |
nfs_server | 远程存储挂载 | |
rbd-hub | 基于Docker Registry封装,提供Docker镜像存储服务,服务于数据中心内部 | |
kube-scheduler | Kubernetes管理组件之一,Pod调度器 | |
docker | 应用容器引擎 | |
rbd-mq | 消息队列服务 | |
calico | 集群SDN服务,为应用提供网络支持 | |
rbd-chaos | 应用构建服务,提供源码,Docker镜像等方式持续构建应用。 | |
rbd-worker | 应用运行控制器 | |
kube-apiserver | Kubernetes管理组件之一, 提供API服务 | |
rbd-eventlog | Rainbond 事件处理与日志汇聚服务 | |
rbd-monitor | Rainbond 监控管理服务,基于Prometheus封装 | |
rbd-api | Rainbond API服务,数据中心控制层面的入口。 | |
rbd-db | Rainbond 数据库服务,支持MySQL,Tidb与CockroachDB | |
rbd-app-ui | 应用控制台web服务 | |
rbd-repo | 源码构建仓库服务,基于Artifactory OSS封装 | |
node | Rainbond 集群和节点控制器服务 | |
etcd-proxy | 计算节点etcd-proxy | |
rbd-dns | Rainbond内部dns服务,与管理节点DNS服务共同对当前节点的应用提供DNS解析 | |
kubelet | Kubernetes 计算负载节点组件 | |
docker | 应用容器引擎 | |
calico | 集群SDN服务,为应用提供网络支持 | |
node | Rainbond节点控制器,提供服务守护、自动运维、日志收集、服务发现等服务。 | |
网关节点 | docker | 应用容器引擎 |
calico | 集群SDN服务,为应用提供网络支持 | |
rbd-dns | Rainbond内部dns服务,可做为集群dns服务使用 | |
rbd-gateway |
一个完整的Rainbond集群中必须包含manage、gateway、compute角色的节点和暂不做为Rainbond安装支持的存储节点,固然三种属性能够在同一个节点上组成单节点的Rainbond集群。安装Rainbond以前须要根据企业自身需求合理的规划计算资源,这里主要是指物理机或虚拟机节点。python
从上文中列举的主要Rainbond服务组件来综合分析,管理节点的合理规划是关键。mysql
Rainbond的主要数据存储组件是:git
根据Etcd集群组建特性,其必须部署为1,3,5奇数节点。github
Mysql数据库的部署模式主要有主从、多主等模式,web
Prometheus具备单机自治特性,所以每个Rbd-monitor节点都是独立的数据采集和存储,基本上能够认为多节点数据是一致的。sql
Rainbond安装脚本对Etcd,Rbd-monitor作了较好的自动安装支持,对于Mysql数据库,咱们更建议用户独立安装Mysql数据库并提供给Rainbond安装脚本。管理节点其余的组件基本上能够认为是无状态的,或有状态的组件都自身实现了良好的工做节点选举。对部署节点数无关键要求。所以咱们推荐的管理节点数量是3个及以上。docker
网关节点处理流量入口,每个Rainbond节点目前都独立提供了全部访问策略的支持,所以上层能够采用4层负载均衡策略或VIP策略,所以咱们推荐的节点数量是2个及以上。shell
计算节点提供计算负载,节点越多,集群计算容量越大,所以计算节点的规划取决于集群须要运行的应用数量,随时能够增长或下线节点。所以咱们推荐的节点数量是2个及以上。数据库
Rainbond-Ansible 项目是Rainbond子项目之一,提供Rainbond集群便捷的安装支持,采用Ansible自动化部署框架实现。其具备安装简单、工做原理简单、模块化、生态完善等特色。
早期咱们采用了 SaltStack 实现,其工做模式复杂,不透明的节点通讯机制。Rainbond安装过程受限于SaltStack的稳定性,所以咱们从5.0版本后对安装脚本进行了重构。
. ├── callback_plugins # 任务失败时打印帮助消息回调插件 │ └── help.py # 回调插件示例 ├── hack # 部署本地资源文件目录 │ ├── chinaos # 操做系统的安装包源 │ │ ├── CentOS-Base.repo # CentOS的源 │ │ ├── centos-release # CentOS的全局配置 │ │ ├── sources.list # Ubuntu的源 │ │ ├── ubuntu-lsb-release # Ubuntu的版本配置 │ │ └── ubuntu-release # Ubuntu的全局配置 │ ├── docker # Docker部署资源文件目录 │ │ ├── get-docker.sh # 快速部署Docker脚本 │ │ └── rainspray.list # 快速部署Docker的Ubuntu源 │ ├── files # 好雨工具包 │ │ ├── bin # grctl的二进制文件 │ │ ├── health # 健康监测脚本 │ │ ├── ssh # ssh配置脚本 │ │ └── ssl # 好雨加密证书 │ ├── manifests # 应用配置文件 │ │ ├── dashboard # 仪表盘-配置 │ │ ├── efk # efk-配置 │ │ ├── es-cluster # es集群-配置 │ │ ├── heapster # heapster-配置 │ │ ├── ingress # ingress-配置 │ │ ├── jenkins # jenkins-配置 │ │ ├── metrics-server # metrics-配置 │ │ ├── prometheus # prometheus-配置 │ │ └── storage # storage-配置 │ ├── step # Ansible安装步骤剧本 │ │ ├── 00.prepare.yml # 安装前检测 │ │ ├── 01.docker.yml # docker-配置 │ │ ├── 02.image.yml # image-配置 │ │ ├── 10.etcd.yml # etcd-配置 │ │ ├── 11.kube-master.yml # kube-master-配置 │ │ ├── 12.kube-worker.yml # kube-worker-配置 │ │ ├── 13.network.yml # network-配置 │ │ ├── 20.db.yml # database-配置 │ │ ├── 21.storage.yml # storage-配置 │ │ ├── 22.lb.yml # lb-配置 │ │ ├── 23.node.yml # node-配置 │ │ └── 90.setup.yml # setup-配置 │ ├── thirdparty # 第三方服务对接 │ │ ├── addmaster.yml # 增长master-role │ │ ├── addnode.yml # 增长node-role │ │ └── setup.yaml # 配置安装 │ ├── tools # 工具包目录 │ │ ├── get_images.sh # 拉取docker镜像 │ │ ├── update-domain.sh # 更换域名 │ │ └── yc-ssh-key-copy.sh # 批量部署服务器ssh-key │ ├── upgrade # 升级配置目录 │ │ └── upgrade.yml # 升级配置文件 │ ├── vagrant # vagrant服务配置目录 │ │ ├── README.md # 说明文件 │ │ ├── Vagrantfile # ruby获取系统信息 │ │ ├── install.sh # 安装文件 │ │ └── setup.sh # 配置文件 │ └── windows # windows节点配置目录 │ ├── cni # 配置文件目录 │ ├── scripts # 脚本目录 │ │ ├── helper.psm1 # 帮助信息脚本 │ │ ├── hns.psm1 # hns配置脚本 │ │ ├── start-flannel. # 开启flannel脚本 │ │ ├── start-kubelet. # 开始kubelet脚本 │ │ └── start-node.ps1 # 开始node服务脚本 │ ├── README.md # 说明文件 │ ├── daemon.json # 域名配置 │ ├── net-conf.json # 网络配置 │ └── win.yaml # Windows配置 ├── inventory # Ansible剧本执行主机 │ ├── hosts.all # 主机模版 │ └── hosts.master # 主机模版 ├── log # 日志文件目录 ├── offline # 离线安装配置文件目录 │ ├── image # 离线包制做脚本目录 │ │ ├── download.sh # 缓存docker离线镜像脚本 │ │ ├── image.txt # rainbond镜像列表 │ │ ├── load.sh # 加载离线缓存镜像包脚本 │ │ └── offimage.sh # 压缩理想缓存镜像包脚本 │ └── pkgs # 离线包存储目录 │ ├── Dockerfile.centos # 构建离线CentOS镜像 │ ├── Makefile # 构建离线CentOS镜像 │ ├── README.md # 说明文档 │ ├── download.centos # 建立本地CentOS源 │ └── rbd.repo # Centos源 ├── scripts # 部署脚本存放目录 │ ├── installer # 安装脚本目录 │ │ ├── default.sh # 默认网络配置脚本 │ │ ├── functions.sh # 安装的示例库脚本 │ │ └── global.sh.example # 全局变量示例脚本 │ ├── op # 网络配置目录 │ │ ├── README.md # 说明文件 │ │ ├── lb.sh # 配置lb服务脚本 │ │ └── network.sh # 配置网络脚本 │ ├── upgrade # 升级脚本目录 │ │ └── upgrade.sh # 升级脚本文件 │ ├── yaml # 网络配置剧本目录 │ │ ├── init_network.yaml # 初始化网络剧本 │ │ └── reset_network.yaml # 重置网络剧本 │ └── node.sh # 用于管理节点脚本 ├── test # 测试剧本语法脚本目录 │ ├── hosts.ini # 主机配置信息 │ ├── k8s-master.role.1.j2 # k8s-master配置信息 │ ├── k8s-worker.role.1.j2 # k8s-worker配置信息 │ ├── kubelet.sh.1.j2 # kubelet配置信息 │ └── test.sh # 检测Ansible剧本语法脚本 ├── roles # Ansible部署规则配置文件目录 │ ├── bootstrap # bootstrap服务规则配置 │ ├── db # database服务规则配置 │ ├── docker # docker服务规则配置 │ ├── etcd # etcd服务规则配置 │ ├── k8s # k8s服务规则配置 │ ├── lb # lb服务规则配置 │ ├── monitor # monitor服务规则配置 │ ├── network_plugin # network_plugin服务规则配置 │ ├── node # node服务规则配置 │ ├── prepare # prepare服务规则配置 │ ├── rainvar # rainvar服务规则配置 │ ├── storage # storage服务规则配置 │ ├── thirdparty # thirdparty服务规则配置 │ └── upgrade # upgrade服务规则配置 ├── docs # 说明文档文件夹 ├── CHANGELOG.md # 版本迭代说明 ├── Dockerfile # 建立rainbond-ansible的Ubuntu镜像源 ├── LICENSE # 开发协议 ├── Makefile # 语法检测配置 ├── README.md # 说明文件 ├── addmaster.yml # 增长master节点剧本 ├── addnode.yml # 增长node节点剧本 ├── ansible.cfg # Ansible程序配置优化 ├── lb.yml # 增长lb节点剧本 ├── setup.sh # 主安装脚本入口 ├── setup.yml # Ansible本地安装剧本 ├── upgrade.yml # Ansible升级剧本 └── version # 安装包版本
角色 | 剧本 | 说明 |
---|---|---|
manage | rainvar | 初始化私有数据中心的一些默认配置(数据库、端口、安装路径、安装版本等) |
bootstrap | 对本节点的内核进行优化(tcp_tw_recycle、core.somaxconn、syncookies、file-max等) | |
prepare | 对本节点安装条件进行检查(系统版本、CPU、内存、磁盘、内核等) | |
storage/nfs/client | 以nfs方式挂载本节点的存储卷 | |
storage/nas | 以nas方式挂载本节点的存储卷 | |
storage/gfs | 以gfs方式挂载本节点的存储卷 | |
docker/install | 在本节点上安装Docker服务 | |
k8s/manage | 在本节点上安装k8s服务的管理端 | |
etcd/manage | 在本节点上安装etcd服务的管理端 | |
gateway | 在本节点上安装负载均衡组件 | |
monitor | 在本节点上安装监控组件 | |
network_plugin/calico | 切换docker网络为calico | |
network_plugin/flannel | 切换docker网络为flannel | |
node/exm | 安装基础依赖包(python-pip、ansible) | |
node/core | 在本节点安装node核心组件 | |
gateway | rainvar | 初始化私有数据中心的一些默认配置(数据库、端口、安装路径、安装版本等) |
bootstrap | 对本节点的内核进行优化(tcp_tw_recycle、core.somaxconn、syncookies、file-max等) | |
prepare | 对本节点安装条件进行检查(系统版本、CPU、内存、磁盘、内核等) | |
storage/nfs/client | 以nfs方式挂载本节点的存储卷 | |
storage/nas | 以nas方式挂载本节点的存储卷 | |
storage/gfs | 以gfs方式挂载本节点的存储卷 | |
docker/install | 在本节点上安装Docker服务 | |
network_plugin/calico | 切换docker网络为calico | |
network_plugin/flannel | 切换docker网络为flannel | |
gateway | 在本节点上安装负载均衡组件 | |
node/exlb | 在本节点安装node负载组件 | |
compute | rainvar | 初始化私有数据中心的一些默认配置(数据库、端口、安装路径、安装版本等) |
bootstrap | 对本节点的内核进行优化(tcp_tw_recycle、core.somaxconn、syncookies、file-max等) | |
prepare | 对本节点安装条件进行检查(系统版本、CPU、内存、磁盘、内核等) | |
storage/nfs/client | 以nfs方式挂载本节点的存储卷 | |
storage/nas | 以nas方式挂载本节点的存储卷 | |
storage/gfs | 以gfs方式挂载本节点的存储卷 | |
docker/install | 在本节点上安装Docker服务 | |
k8s/compute | 在本节点上安装k8s服务的客户端 | |
etcd/compute | 在本节点上安装etcd服务的客户端 | |
network_plugin/calico | 切换docker网络为calico | |
network_plugin/flannel | 切换docker网络为flannel | |
gateway | 在本节点上安装负载均衡组件 | |
node/core | 在本节点安装node核心组件 |
集群初始化包括三个重要步骤,安装脚本获取、安装环境构建和第一个节点的安装。
./grctl init 各类参数
grctl init 命令从github仓库获取指定版本的ansible代码,若是离线安装没有此步骤。
安装环境构建
grctl init 命令根据用户指定的参数和默认值生成ansible global.sh 全局配置文件。
主要配置:
这里的参数主要是指定Rainbond集群在存储、网络、安装模式等关键参数。
单一节点的安装根据传入role角色属性,传递属性给主安装脚本setup.sh
主安装脚本在进行本地节点系统优化以后调用ansible-playbook使用setup.yml
剧本进行第一个节点部署
剧本主要根据master主机组的role进行配置装机(系统优化、组件部署)
setup.sh
主安装脚本在进行远程节点系统优化以后调用ansible-playbook使用角色对应的剧本进行部署
addmaster.yml
addnode.yml
gateway.yml
剧本主要根据主机组所使用的role进行配置装机(系统优化、组件部署)
graph LR subgraph 初始化过程 id1(grctl)==>id2(setup.sh) id2(setup.sh)==>id3(ansible-playbook) end
grctl init
命令首先获取安装包,而后根据传入的参数以键值对的方式转换为shell脚本变量,以全局变量的方式对后续操做进行参数的传递,后续步骤读取全局变量,达到安装过程当中对可变因素的掌控。
在将来的版本中,grctl命令行进一步控制ansible的主机列表,准确的为ansible提供集群主机序列。
grctl 命令完成参数配置后调用安装脚本/opt/rainbond/rainbond-ansible/setup.sh
进行第一个节点初始化。
脚本首先会对操做系统进行优化。这里是安装过程使用网络的主要点,在线安装模式下,操做系统的更新和配置,安装包的下载经过网络进行。离线安装模式下使用事先准备的本地安装源对操做系统进行基础环境安装,而后使用事先下载好的安装包。后续的节点安装过程将再也不使用网络。
最后会调取ansible-play使用setup.yml
剧本进行初始化安装。
ansible-playbook使用setup.yml
进行初始化,首先会找到当前主机所在的主机组,以后根据role的设定到不一样的组件文件夹中根据pre_task -> roles -> tasks -> post-tasks 的顺序依次执行文件夹下面的main.yml
达到组件安装的做用
grctl node add --host <计算节点主机名> --iip <计算节点内网ip> --root-pass <计算节点root密码> --role gateway,compute
指定新增节点的主机名、内网地址、链接密码、角色
, grctl命令行首先将节点数据加入集群元数据。经过grctl node list
命令便可查询节点状态。grctl node install host-uuid
命令安装节点,grclt从API中读取相应的主机信息传递给node.sh
脚本进行节点的安装。node.sh
在script/node.sh
中,主要获取如下几个参数:
node.sh
脚本首先会判断node_role
中传递的角色属性,循环角色属性判断inventory/hosts
中相应的主机组中是否存在对应的主机,没有根据不一样的角色属性加入到相应的主机组中进行装机,在维护inventory/hosts
以后会进行链接检测经过login_type、login_key、node_uuid、node_ip、node_hostname
参数进行主机链接检测、经过以后会调用ansible-playbook -i inventory/hosts -e $node_role role.yml
进行不一样角色的装机:
grctl
传递给setup.sh
的node_role
参数传递给ansible-playbook
生成对应的node组件角色配置文件
role.yml 不一样角色对应不一样的yml配置文件
在5.1.6版本中hosts文件的维护将移交到grctl命令行工具中,根据集群节点状态实时生成。
Rainbond集群安装的全部组件有两种运行方式: node组件和docker组件是直接二进制运行,其余组件所有采用容器化运行。两种运行方式都是直接采用systemd守护进程进行守护。所以可以安装Rainbond的操做系统必须具备systemd。
在集群自动化运维的需求下,咱们须要对节点(特别是计算节点)进行实时全面的健康检查,以确认节点是否可用。这个工做由node服务进行,它会根据/opt/rainbond/conf
目录下配置对当前节点的配置检查项进行监控,若是出现故障汇报到集群管理端,若是是计算节点则会由集群管理端决策是否暂时禁止调度或下线该节点。
graph LR subgraph 服务运维流程 id1(systemd)==>id2(node.service) id2(node.service)==>id3(健康检测) id2(node.service)==>id4(守护进程) end
/etc/systemd/system/node.service
目录下生成node.service
的配置文件,node
服务在systemd
中以守护进程方式启动运行。node服务启动后将读取/opt/rainbond/conf
目录下的配置生成每个须要启动服务的systemd配置文件并调用systemctl工具启动服务。
配置文件分为需求启动服务和只是健康检查项目,好比如下配置:
- name: rbd-mq endpoints: - name: MQ_ENDPOINTS protocol: http
health: name: rbd-mq model: http address: 127.0.0.1:6301/health max_errors_num: 3 time_interval: 5 after: - docker type: simple pre_start: docker rm rbd-mq start: >- docker run --name rbd-mq --network host -i goodrain.me/rbd-mq:V5.1-dev --log-level=debug --etcd-endpoints=${ETCD_ENDPOINTS} --hostIP=192.168.195.1 stop: docker stop rbd-mq restart_policy: always restart_sec: 10
该文件配置了rbd-mq服务的启动方式、健康检查方式和服务注册信息。 ### 4.2 node组件的健康检测机制 每个安装服务的健康检查配置见文档: [详细配置](https://www.rainbond.com/docs/user-operations/monitor/monitor-alter-items/) 若某项检查项目标识为不健康状态,当前节点将被标识为不健康状态。 - 对于不健康的节点Rainbond提供两级自动处理机制: - 检测到异常的服务一段时间依然未恢复(取决于配置的时间段)将自动重启服务。 - 若计算节点被标注为不健康,节点控制器将会自动将其禁止应用调度直到节点恢复健康。 - 配置文件: `/opt/rainbond/conf/health.yaml` - name # 须要检测的服务名称 - model # 以什么方式检测(tcp/http/cmd) - address # 被检测服务的地址 - max_errors_num # 最大错误次数 - time_interval # 每次检测次数 - 目前检测方式有3种 - cmd # 使用脚本或者命令行 - tcp # 使用ip:port模式 - http # 使用http协议检测 ### 4.3 集群故障查询和处理 根据整个集群节点的健康检查机制,用户在管理节点经过`grctl cluster` 命令便可查询整个集群的故障点,或使用监控报警系统及时发现集群故障。当集群某个节点出现问题时首先定位故障的服务,并查看其运行日志处理故障。若是有未完善的健康检测项目,用户能够经过上诉节点健康检测配置方式自定义检测项目。 ## 5. 常见安装问题解决思路 - 端口被占用没法安装 > Rainbond是一个完整的PaaS平台解决方案,因此强烈建议使用干净的物理机或虚拟机安装Rainbond。 Rainbond网关节点直接承接应用访问流量,所以其默认占用80\443等关键端口。另外Rainbond安装Ansible默认使用的SSH端口是22,严格运维时须要设置。 - 数据库安装初始化失败 > Rainbond 5.1.5及以前版本默认安装的mysql数据库版本是mariadb 10,其所需的内存资源是较大的。若是你的机器资源有限很大可能致使安装失败。后续的版本中咱们将默认安装的数据库版本升级到Mysql 5.7系列。 - 高可用安装怎么作 > 本文主要描述了整个安装原理,所以你阅读本文应该能够总结出Rainbond高可用安装的关键,咱们近期也会再次更新高可用安装操做指南。 - Rainbond可否安装在Mac或Windows系统 > Rainbond计算节点能够支持Windows操做系统来运行Windows应用,目前Windows的支持是企业版功能之一,所以开源安装脚本暂不支持Windows 节点的快速安装。Mac操做系统不适合安装Rainbond。开发者能够将部分组件运行在Mac下运行开发。 - 遇到其余安装问题怎么办? > 移步 [<https://github.com/goodrain/rainbond-ansible/issues>](https://github.com/goodrain/rainbond-ansible/issues) 查找或提交你的问题。