蘇寧雲自動化部署統一平臺Hull
背景
現有解決方案思路
蘇寧雲是國內比較早使用Kubernetes和Openstack的公司,自動化部署1.0產品使用了比較傳統的安裝方式,主要的部署工具使用Puppet。現有的自動化部署統一平臺使用的是ansible為代表的KubeSpray以及Kolla-Ansible。
蘇寧雲有一套成熟的部署思路,所以,在設計方案的兼顧了,不破壞社群版本的程式碼基礎上,進行定製化開發,所有定製化的功能都是可插拔的。
統一平臺可以讓使用者的對整體機器資源一目瞭然;引數統一,使用者配置更加方便;同時加強了對部署過程中監控。
走近Kubernetes KubeSpray
KubeSpray整體介紹
KubeSpray是Kubenetes社群孵化的一個方案,現在已經開源,KubeSpray使用了Ansible-playbook進行了編排,依賴於Kubeadm,可以將Kubernetes部署在AWS、GCE、Azure、OpenStack、Vsphere、以及裸機。Kubenetes可以快速部署一個高可用Kubenetes叢集。可選的網路查件,KubeSpray支援的網路外掛非常多,包括Flannel、Contiv、Weave、Calico等。KubeSpray也支援主流的作業系統發現版。
KubeSpray定製開發非常簡單,如果需要增加步驟,只需要修改playbook的入口檔案即可,比如cluster.yaml
使用KubeSpray快速搭建Kubernetes平臺
是時候動手嘗試一下KubeSpray了,他將會改變你對手動部署Kubernetes的繁瑣的認識,特別是配置SSL認證。
(關於實驗環境,全部是在CentOS7上進行,後續不再說明。)
上一節說了,KubeSpray使用Ansible-Playbook編寫,首先安裝Ansible,版本大於2.4版本,使用最簡單的pip。
$ pip install ansible
Clone 程式碼
$ git clone https://github.com/kubernetes-incubator/kubespray.git
進入程式碼目錄
從requiremens.txt檔案中安裝依賴檔案
$ pip install -r requiremens.txt
複製資產檔案到自定義目錄
$ cp -rfp inventory/sample/* inventory/demo_cluster
複製後在demo_cluster結構如下:
在hosts.ini中配置機器資產;
在group_vars/all.yml 配置部署Kubernetes的通用引數
在group_vars/k8s-cluster.yml配置部署Kubernetes的版本,映象庫、埠、網路等。
開始部署Kubernetes
$ ansible-playbook -i inventory/demo_cluster/hosts.ini cluster.yml
以上就是快速部署Kubernetes的步驟,由此看出,KubeSpray上手非常簡單。
如果想深入研究KubeSpray,可以參照社群文件,優化all.yml和k8s-cluster.yml中的詳細引數。
理解OpenStack Kolla-Ansible
Kolla-Ansible介紹
Kolla-ansible的兩大特性,開箱即用以及允許完整定製化。這針對於缺少OpenStack自動化部署的操作者來說,可以快速的部署生產級別的OpenStack環境出來。
使用Kolla-Ansible快速搭建OpenStack平臺
下面我們就看看,使用Kolla-Ansible快速搭建一個3個控制節點OpenStack平臺。由於部署時分為研發除錯方式和生產方式,我們使用生產方式來部署OpenStack。
(關於實驗環境,全部是在CentOS7上進行,後續不再說明。)
本次實驗使用是一臺物理機,配置如下:
在正式安裝部署之前,假設您對ofollow,noindex" target="_blank">Ansible 和Docker 有了掌握和了解。
安裝依賴
- 安裝和升級最新版的pip工具
yum install epel-releaseyum install python-pip
pip install -U pip
- 安裝依賴
yum install python-devel \libffi-devel \gcc \openssl-devel \libselinux-python
- 安裝Ansible
yum install ansible
- 使用pip安裝或者升級最新版的Ansible
當前為了更好的相容kolla,Ansible版本要大於2.4
pip install -U ansible
安裝Kolla-ansible
- 更改Ansible預設的配置
[defaults] host_key_checking=Falsepipelining=Trueforks=100
- 使用pip安裝kolla-ansible
pip install kolla-ansible
另外一種方式,使用原始碼安裝kolla-ansible
git clonehttps://github.com/openstack/kolla-ansible.git cd kolla-ansible && python setup.py install
- 複製yml 和 passwords.yml to /etc/kolla 目錄,如果kolla目錄不存在,請手動建立。
cp -r /usr/share/kolla-ansible/etc_examples/kolla /etc/
- 複製all-in-one 和 multinode資產檔案到指定目錄
cp /usr/share/kolla-ansible/ansible/inventory/* /home/demo_cluster
準備初始化配置
資產配置
在Kolla-ansible中有兩個資產配置檔案,all-in-one和mutilnode,這兩個檔案不同之處是all-in-one在localhost部署單個節點OpenStack,multinode部署多節點OpenStack環境,也就是生產級別的OpenStack環境。
- 編輯mutilnode檔案
[control] 172.19.1.[10:12] ansible_user=root ansible_password=password ansible_become=true # Ansible supports syntax like [10:12] - that means 10, 11 and 12. # Become clause means "use sudo". [network:children] control # when you specify group_name:children, it will use contents of group specified. [compute] 172.19.1.[13:14] ansible_user=root ansible_password=password ansible_become=true [monitoring] 172.19.1.18 # This group is for monitoring node. # Fill it with one of the controllers' IP address or some others. [storage:children] compute [deployment] localhostansible_connection=local become=true # use localhost and sudo
- 生成密碼檔案,密碼檔案其實是一組key-value值檔案,用於各個元件認證的使用者名稱密碼。
密碼檔案預設儲存在/etc/kolla/kolla-passwords.yml中,直接執行。
kolla-genpwd
Kolla globals.yml配置
globals.yml是kolla-ansible非常重要的配置。下面是一些典型的配置選項:
使用哪種發行版的作業系統
kolla_base_distro: "centos"
使用哪種安裝包方式
kolla_install_type: "source"
source使用原始碼方式進行安裝,依賴於git
binary使用包方式進行依賴yum或者apt
指定OpenStack版本
openstack_release: "pike"
指定OpenStack版本分支
openstack_release: "master"
如果使用source安裝的話,可以指定分支。
- 配置網路
配置管理網
network_interface: "eth0"
配置業務網
neutron_external_interface: "eth1"
配置vip,用於keepalived提供高可用。
kolla_internal_vip_address: "10.1.0.250"
- 配置額外服務
比如是否啟用cinder
enable_cinder: "yes"
- 開始部署環境
一旦以上配置完成,我們就可以進行部署,首先我們要設定最基本的依賴,docker。
- Bootstrap server
kolla-ansible -i ./multinode bootstrap-servers
- 進行預檢查
kolla-ansible -i ./multinode prechecks
- 開始部署
kolla-ansible -i ./multinode deploy
以上就是部署一套多節點的OpenStack環境,過程比較簡單,當時在上文提到,globals.yaml檔案是非常重要的檔案,所以想要優化部署過程或者使用openstack更高階的功能,應該詳細研究每一個引數代表的含義。
生產級Kolla-Ansible
部署生產級別的OpenStack與上述步驟大致相同,但是設定的引數項會很多。
- 節點角色劃分,在生產中,要詳細劃分控制節點、網路節點、計算節點、儲存節點以及監控節點。
- 網路的配置,為了降低網路的延遲以及網路高可用,那麼設定不同的interface是非常重要的,比如network_interface、api_interface、storage_interface、cluster_interface等。
- Docker相關的配置,在實際過程中,要規劃好docker的儲存,預設使用devicemapper,所以在生產中要提前做好規劃和調研。另外一項是日誌,要規劃好日誌的目錄,防止日誌過多,導致root崩潰。
作為產品輸出
在1.0版本使用了Puppet工具,利用Puppet進行安裝,整個過程是流程化安裝。Puppet雖然滿足現有的部署架構,但是也存在一下缺點:
- Puppet工具本身的認證問題。
- Puppet的C/S架構,會對使用者機器有一定侵入。
- 如果考慮到升級維護,必須保留Puppet server。
- Puppet很難進行產品化,並且一旦部署過程變動,維護成本也比較高。
- Puppet本身學習成本比較高。
綜合Puppet一些劣勢,我們選擇了使用Ansible設計的KubeSpray以及Kolla-Ansible。
如果作為產品輸出,不是簡單的進行定製開發,產品化的終端使用者一定不是自家公司的運維工程師或者研發工程師,而是在大多數人看來,經過簡單培訓加以文件輔助,都可以完成IaaS設施的部署。
所以,我們將重新設計開發一個自動化部署產品,面向一般使用者,簡化部署流程,使用者只需要填入一些引數以及選擇不同的值,就可以完成自動化部署過程。過程不需要干預,並且對過程進行監控,發現問題,及時通知使用者。
蘇寧雲的產品化思路
- 依賴KubeSpray和Kolla-Ansible
- 設計標準的Restful API,將複雜的使用者引數配置以及命令執行,轉化為友好的API呼叫。
- 定義WorkFlow,WorkFlow的含義本身具有可編排,Hull定義了多種WorkFlow,使用者只需要選擇對應的WorkFlow,就可以啟動部署流程。
- 提供視覺化安裝,Hull將會提供一套完成的UI操作頁面,UI與API耦合度很低。
- 封裝Cobbler API,使用部署作業系統也加入到整個Hull過程中。
- 提供使用者管理,即一套平臺,可以部署多套IaaS設施。
- 同時加入Data Center、Cluster、Region等邏輯概念,更好的滿足使用者的部署需求。
蘇寧雲的解決方案
蘇寧雲新的自動化部署產品Hull給出的方案如下圖。

- 使用者首先進行基本資訊註冊
- 建立data center、region、cluster
- 啟動WorkFlow,有四種可以選擇:
- Install OpenStack Dev All-IN-ONE
- Install Kubernetes Dev All-IN-ONE
- Install OpenStack Pro
- Install Kubernetes Pro
- 控制平臺接到部署WorkFlow指令時,啟動對應的檢查。
- 接下來呼叫IPMI介面進行PXE啟動,引導至PXE安裝。
- Cobbler安裝basic OS,比如CentOS7或者Ubuntu16
- 安裝完成Basic OS後,Cobbler也啟動post script進行依賴包安裝、核心替換、bond配置、網絡卡製作等。
- 正式安裝部署OpenStack或者Kubernetes,接下來過程無需人工干預,在配置正確的前提下,可以自動化完成安裝部署。並且安裝過程中,會實時向manager平臺推送當前安裝的進度。
- 當安裝完畢後,啟動Heath-Checker,檢查當前安裝環境是否正常,比如建立一個虛擬機器或者一個pod,並且檢查虛擬機器的狀態或pod的狀態。
第三方如何整合蘇寧雲Hull
- 統一註冊部署管理方式
這種方式所有的整合商,將機器資源統一註冊到蘇寧雲部署管理平臺,使用者必須登入認證之後,方可操作其下的機器資源。有平臺下發部署指令,該種方式要求IPMI IP、物理機器訪問均可以被統一部署平臺訪問。
- 私有化部署方式
該種方式最為理想,架構類似於在每個客戶現場部署一套部署管理平臺。
機器啟動之後,向指定的manage註冊自己。之後由該平臺進行統一的指令下發以及部署狀態收集。
- 定製化開發
基於Hull定製化開發也很簡單,Hull有獨立的Restful API,任何整合商都可以在此產品的基礎上再次進行產品化。
作者簡介
王曉飛,現擔任蘇寧雲容器網路架構師職位,在針對Openstack、Kubernetes、swarm網路架構方面有著專業的研究和理解,在該領域擁有超過5年經驗,現在負責蘇寧雲容器網路架構、Openstack網路架構、容器叢集監控,主導容器雲監控系統開發、容器網路需求定製開發,自動化部署平臺,PaaS平臺。對DevOps理念有很深的掌握。
孫凱歌,蘇寧雲高階研發工程師,精通OpenStack,擅長Nova、Cinder、Keystone。