本文將解讀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) 查找或提交你的問題。