Rainbond集群安装和运维原理解读

本文将解读 Rainbond 集群的安装和运维的原理,使用户基本了解 Rainbond 的安装机制和运维重点,便于用户搭建大型 Rainbond 集群。

1.Rainbond 集群节点概述

1.1 节点分类

属性 类型 说明
manage 管理节点 集结平台自身组件,提供应用构建、调度、管理等功能,提供数据中心基础服务与 API 接口,充当控制集群的角色。
gateway 网关节点 集群内应用被外网访问的流量入口和负载均衡器,提供 HTTP, HTTPs 路由, TCP/UDP 服务, 负载均衡器, 高级路由(A/B 测试, 灰度发布)等功能
compute 计算节点 提供应用运行的计算资源,N 个计算节点组成计算资源池供给管理节点灵活调度。

1.2 节点部署主要服务组件概述

角色 组件 说明
manage 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 集群和节点控制器服务
compute 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

1.3 节点规划

一个完整的 Rainbond 集群中必须包含 manage、gateway、compute 角色的节点和暂不作为 Rainbond 安装支持的存储节点,当然三种属性可以在同一个节点上组成单节点的 Rainbond 集群。安装 Rainbond 之前需要根据企业自身需求合理的规划计算资源,这里主要是指物理机或虚拟机节点。

从上文中列举的主要 Rainbond 服务组件来综合分析,管理节点的合理规划是关键。

Rainbond 的主要数据存储组件是:

  • Etcd

根据 Etcd 集群组建特性,其必须部署为 1,3,5 奇数节点。

  • Mysql

Mysql 数据库的部署模式主要有主从、多主等模式,

  • Rbd-monitor(Prometheus)

Prometheus 具有单机自治特性,因此每一个 Rbd-monitor 节点都是独立的数据采集和存储,基本上可以认为多节点数据是一致的。

Rainbond 安装脚本对 Etcd,Rbd-monitor 做了较好的自动安装支持,对于 Mysql 数据库,我们更建议用户独立安装 Mysql 数据库并提供给 Rainbond 安装脚本。管理节点其他的组件基本上可以认为是无状态的,或有状态的组件都自身实现了良好的工作节点选举。对部署节点数无关键要求。因此我们推荐的管理节点数量是 3 个及以上。

网关节点处理流量入口,每一个 Rainbond 节点目前都独立提供了所有访问策略的支持,因此上层可以采用 4 层负载均衡策略或 VIP 策略,因此我们推荐的节点数量是 2 个及以上。

计算节点提供计算负载,节点越多,集群计算容量越大,因此计算节点的规划取决于集群需要运行的应用数量,随时可以增加或下线节点。因此我们推荐的节点数量是 2 个及以上。

2. 安装原理说明

Rainbond-Ansible 项目是 Rainbond 子项目之一,提供 Rainbond 集群便捷的安装支持,采用 Ansible 自动化部署框架实现。其具有安装简单、工作原理简单、模块化、生态完善等特点。

早期我们采用了SaltStack 实现,其工作模式复杂,不透明的节点通信机制。Rainbond 安装过程受限于 SaltStack 的稳定性,因此我们从 5.0 版本后对安装脚本进行了重构。

2.1 安装脚本结构

.
├── 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                           # 安装包版本

2.2 ansible-playbook 各角色剧本

角色 剧本 说明
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 核心组件

2.3 安装脚本部署流程

2.3.1 集群初始化

集群初始化包括三个重要步骤,安装脚本获取、安装环境构建和第一个节点的安装。

./grctl init 各种参数
  • 安装脚本获取

grctl init 命令从 github 仓库获取指定版本的 ansible 代码,如果离线安装没有此步骤。

  • 安装环境构建

grctl init 命令根据用户指定的参数和默认值生成 ansible global.sh 全局配置文件。

  • 配置文件: /opt/rainbond/rainbond-ansible/scripts/installer/global.sh
  • 主要配置:
    • INSTALL_TYPE # 安装类型(离线/联网)
    • DEPLOY_TYPE # 节点类型
    • DOMAIN # 域名
    • VERSION # 版本
    • STORAGE # 存储类型
    • STORAGE_ARGS # 挂载参数
    • NETWORK_TYPE # 网络类型
    • ROLE # 第一个节点角色(默认 manage、gateway、compute)

这里的参数主要是指定 Rainbond 集群在存储、网络、安装模式等关键参数。

  • 第一个节点安装

单一节点的安装根据传入 role 角色属性,传递属性给主安装脚本setup.sh

主安装脚本在进行本地节点系统优化之后调用 ansible-playbook 使用setup.yml剧本进行第一个节点部署

剧本主要根据 master 主机组的 role 进行配置装机(系统优化、组件部署)

2.3.2 compute、gateway 节点扩容安装

  1. 传入需要安装的 role 角色属性(compute,gateway),传递给主安装脚本setup.sh
  2. 主安装脚本在进行远程节点系统优化之后调用 ansible-playbook 使用角色对应的剧本进行部署
    • manage 角色属性调用 addmaster.yml
    • compute 角色属性调用 addnode.yml
    • gateway 角色属性调用 gateway.yml
  3. 剧本主要根据主机组所使用的 role 进行配置装机(系统优化、组件部署)

3. 集群安装流程

graph LR
    subgraph 初始化过程
        id1(grctl)==>id2(setup.sh)
        id2(setup.sh)==>id3(ansible-playbook)
    end

3.1 grctl init 初始化过程

grctl init 命令首先获取安装包,然后根据传入的参数以键值对的方式转换为 shell 脚本变量,以全局变量的方式对后续操作进行参数的传递,后续步骤读取全局变量,达到安装过程中对可变因素的掌控。

在未来的版本中,grctl 命令行进一步控制 ansible 的主机列表,准确的为 ansible 提供集群主机序列。

3.2 shell 初始化过程

grctl 命令完成参数配置后调用安装脚本/opt/rainbond/rainbond-ansible/setup.sh 进行第一个节点初始化。

脚本首先会对操作系统进行优化。这里是安装过程使用网络的主要点,在线安装模式下,操作系统的更新和配置,安装包的下载通过网络进行。离线安装模式下使用事先准备的本地安装源对操作系统进行基础环境安装,然后使用事先下载好的安装包。后续的节点安装过程将不再使用网络。

最后会调取 ansible-play 使用setup.yml剧本进行初始化安装。

3.3 ansible-playbook 初始化过程

ansible-playbook 使用setup.yml进行初始化,首先会找到当前主机所在的主机组,之后根据 role 的设定到不同的组件文件夹中根据 pre_task -> roles -> tasks -> post-tasks 的顺序依次执行文件夹下面的main.yml达到组件安装的作用

3.4 其他角色节点扩容安装

  1. grctl node add --iip <计算节点内网ip> --root-pass <计算节点root密码> --role gateway,compute指定新增节点的主机名、内网地址、连接密码、角色 , grctl 命令行首先将节点数据加入集群元数据。通过grctl node list命令即可查询节点状态。

  2. 使用grctl node install host-uuid命令安装节点,grclt 从 API 中读取相应的主机信息传递给node.sh脚本进行节点的安装。

  3. node.shscript/node.sh中,主要获取以下几个参数:

    • node_role # 新增节点的角色
    • node_hostname # 新增节点的主机名
    • node_ip # 新增节点的网络地址
    • login_type # 新增节点的登陆方式
    • login_key # 新增节点的连接密码
    • node_uuid # 新增节点的 uuid
  4. 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进行不同角色的装机:

    • -i 指定装机主机

    • -e 将grctl传递给setup.shnode_role参数传递给ansible-playbook生成对应的node组件角色配置文件

    • role.yml 不同角色对应不同的 yml 配置文件

      • addmaster.yml # master role
      • addnode.yml # compute role
      • gateway.yml # gateway role

在 5.1.6 版本中 hosts 文件的维护将移交到 grctl 命令行工具中,根据集群节点状态实时生成。

4. 节点服务运维

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

4.1 systemd 的配置文件生成(node.service)

  • 在集群初始化完成之后 ansible 会在/etc/systemd/system/node.service目录下生成node.service的配置文件,node服务在systemd中以守护进程方式启动运行。

  • node 服务启动后将读取/opt/rainbond/conf目录下的配置生成每一个需要启动服务的 systemd 配置文件并调用 systemctl 工具启动服务。

配置文件分为需求启动服务和只是健康检查项目,比如以下配置:

  - name: rbd-mq
    endpoints:
    - name: MQ_ENDPOINTS
      protocol: http
      port: 6301
    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 组件的健康检测机制

每一个安装服务的健康检查配置见文档: 详细配置

若某项检查项目标识为不健康状态,当前节点将被标识为不健康状态。

  • 对于不健康的节点 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 查找或提交你的问题。

本文作者: Rainbond 开发者:魏美龙