問題:
????openstack與k8s組合一直是個頭疼的問題酪呻,特別是利用k8s去部署openstack環(huán)境挑胸。由于openstack是一套iaas杖们,與服務(wù)器硬件、系統(tǒng)軟件交互較多袜腥,本身的部署也要花大量的心思去設(shè)計一套方案见擦,拿社區(qū)的部署工具,即使是fuel羹令,也無法滿足真正的生產(chǎn)需求锡宋。如何將openstack服務(wù)容器化,利用k8s真正做到快速部署特恬,一直是個難題。
難點解決:
? ? Q1:如何完成openstack依賴組件(如mysql徐钠、rabbitmq)的部署癌刽?? A:建議在沒有專業(yè)團(tuán)隊維護(hù)的情況下,還是不要容器化尝丐,這些服務(wù)內(nèi)部有自身高可用設(shè)計显拜,且為非無狀態(tài)服務(wù),暴力不可取爹袁。
? ? Q2:如何規(guī)劃k8s網(wǎng)絡(luò)插件及node間組網(wǎng)远荠? A:由于生產(chǎn)環(huán)境的openstack也有sdn,網(wǎng)絡(luò)復(fù)雜失息,最簡單的方法譬淳,就是不依靠插件,完全使用hostnet的方法盹兢。暴露物理機(jī)網(wǎng)絡(luò)給pod邻梆,以便服務(wù)能夠訪問管理、業(yè)務(wù)绎秒、存儲三個網(wǎng)絡(luò)浦妄。
????Q3:服務(wù)負(fù)載均衡設(shè)計? A:負(fù)載均衡不依賴K8S见芹,還是繼續(xù)使用HAProxy+KeepAlived的方案剂娄。與web pod服務(wù)不用,生產(chǎn)環(huán)境會詳細(xì)規(guī)劃方案玄呛,具體服務(wù)落到哪些節(jié)點都是固定的阅懦。另外不用service,減輕網(wǎng)絡(luò)插件帶來的不穩(wěn)定性把鉴。
? ? Q4:如何同步數(shù)據(jù)庫和創(chuàng)建keystone中的認(rèn)證信息故黑? A:這里利用一個restartPolicy為Never的POD(取名為bootstrap)儿咱,啟動后執(zhí)行腳本完成操作。
????Q5:需要使用的POD的kind類型场晶? A:api服務(wù)使用daemonset混埠,保證落到對應(yīng)的標(biāo)簽;rpc服務(wù)使用deployment诗轻,方便伸縮钳宪;nova-compute、ironic-conductor這種依賴hostname服務(wù)扳炬,也應(yīng)該使用daemonset吏颖。
? ? Q6:服務(wù)運行日志怎么辦? A:日志一律掛在主機(jī)的/var/log/openstack下恨樟,方便查看和ELK分析半醉。
? ??Q7:openstack配置文件怎么修改? A:由于同一pod不同node下的容器組件配置文件可能還是不同的劝术,設(shè)計了一個config節(jié)點缩多,容器啟動后利用腳本拉取conf文件模板,并進(jìn)行修改养晋。
設(shè)計:
K8S YAML設(shè)計(以具有代表性的cinder為例) :
cinder-bootstrap.yaml
bootstrap服務(wù)用于同步數(shù)據(jù)庫及創(chuàng)建endpoint衬吆,需要與管理網(wǎng)通信,label選擇只有管理網(wǎng)的core绳泉,運行一次即可逊抡。
cinder-api.yaml
cinder-api服務(wù)需要與管理網(wǎng)通信,label選擇有管理網(wǎng)的core零酪,使用DaemonSet冒嫡。
cinder-volume.yaml
cinder-volume服務(wù)與存儲網(wǎng)通信,label選擇有管理四苇、業(yè)務(wù)灯谣、存儲三網(wǎng)的business,使用Deployment蛔琅。
DockerFile設(shè)計(和上述cinder對應(yīng)):
cinder-bootstrap/Dockerfile:
cinder-bootstrap.sh即為拉取配置模板胎许,同步數(shù)據(jù)庫,創(chuàng)建keystone信息的腳本罗售,不展示了辜窑,點到為止。
cinder-api/Dockerfile:
cinder-api.sh即為拉取配置模板寨躁,改修配置文件穆碎,執(zhí)行cinder-api命令的腳本。
生產(chǎn)環(huán)境設(shè)計:
????這是一個ironic環(huán)境的方案(部分線段沒有畫完)职恳∷鳎可以看到方面,k8s-api周圍是部署時所需的網(wǎng)絡(luò)(電口),生產(chǎn)環(huán)境運行是可以去掉的色徘,即整個openstack環(huán)境不依賴該k8s節(jié)點是否正常恭金。
總結(jié):
設(shè)計優(yōu)勢
1.?部署、恢復(fù)速度快:準(zhǔn)備好非openstack組件外(mysql褂策、rabbitmq横腿、haproxy、keepalived等)斤寂,使用k8s的pod耿焊、deployment、daemonset實現(xiàn)自動化部署和高速回溯遍搞。
2.?服務(wù)及主機(jī)監(jiān)控:主機(jī)信息(cpu罗侯、內(nèi)存、文件系統(tǒng)溪猿、網(wǎng)絡(luò))使用kubelet的cAdvisor監(jiān)控歇父,通過web展示;openstack服務(wù)使用heapster監(jiān)控再愈,通過k8s dashboard展示,方便運維护戳。
3. 服務(wù)高可用翎冲、彈性伸縮、快速擴(kuò)容:openstack進(jìn)程服務(wù)使用k8s的failover機(jī)制(包括容器異常重啟及故障遷移)媳荒,彈性伸縮改進(jìn)了例如nova-scheduler抗悍、cinder-volume這些依賴rpc服務(wù)的高可用方式,daemonset負(fù)責(zé)API節(jié)點以及nova-compute钳枕、ironic-conductor節(jié)點的快速擴(kuò)容缴渊。
4.?可視化容器倉庫及滾動升級:使用harbor作為容器提供,提供portal界面鱼炒;k8s的滾動升級能夠在盡可能保證服務(wù)的情況下衔沼,逐步升級版本。
5. Config配置文件節(jié)點:所有配置文件放在同一目錄下昔瞧,使用git控制版本指蚁,k8s重建服務(wù)即可更新配置。
6.?日志分析:所有openstack日志都放在控制節(jié)點的/var/log/openstack下自晰,使用logstash的daemonset凝化,配合es、kibana分析酬荞,快速定位問題搓劫。
7.?CICD:修改配置文件{通過修改config節(jié)點配置文件->git commit->k8s重建服務(wù)}瞧哟;版本升級{新版本rpm包更新至源->運維節(jié)點生成最新容器鏡像、打tag枪向、上傳至harbor倉庫->k8s滾動升級}勤揩;錯誤回退{(lán)k8s能夠滾動回退到歷史版本}。
缺點
比較適合生產(chǎn)環(huán)境遣疯,測試環(huán)境調(diào)試代碼比較繁瑣雄可。