紅藍出 CP,OpenStack 和 Kubernetes 在一起會怎樣?
背景
從去年開始就想深入地學習 Kubernetes,首先想到是在 OpenStack 上能比較輕鬆地玩轉,所以去 嘗試了 Magnum ,但是結果令人失望。
不過隨著我搜尋到更多的內容,發現一個有趣的事情:
那就是相較於在 OpenStack 之上部署 Kubernetes,通過 Kubernetes 去部署 OpenStack 似乎更流行。
特別當我去研究最近比較熱門的邊緣計算,發現 OpenStack 社群的兩個相關專案,一個是 StarlingX,一個是 Airship,它們都是這樣做的:先搭建 Kubernetes 叢集,然後通過 OpenStack-Helm 部署容器化的 OpenStack。
但是這兩個專案都還挺複雜,直接去部署它們遇到了不少坑,做了很多的前置操作,涉及到很多指令碼程式碼,結果到搭建 K8s 步驟上還是卡住了。
於是我決定暫時先不管它們,直接跳到 OpenStack-Helm,至少讓我先體驗一下基於 Kubernetes 的 OpenStack 到底是啥樣。
這樣就又回到了起點:我得先有一套 Kubernetes 多節點叢集,但是現在只有一套 OpenStack 環境,所以我仍然得先解決在 OpenStack 上搭建 Kubernetes 的問題。
經過了一番摸索,踩了不少坑,最後終於完成了這次嘗試。
下面簡單地分享下最終的效果,其中的過程涉及較多,後續再擇機分享。
整個環境概況
![整個環境架構](https://i.iter01.com/images/06d852dd2f9b84d3c0a2b6a9a7107bc23542c82b08416ff2c1e91c09fca7d8fd.png)
最上層:一個普通的 OpenStack 環境
在上面的 OpenStack 中用 cirros 映象建立了一個虛機:
![image-20200608163640522](https://i.iter01.com/images/62cfd6a95d89be1d051c17859e17e0fc5dd7f04d5e967d61be7c6dcca02e79b0.png)
細心的你可能已經發現這裡的埠號不是預設的 80,而是比較奇怪的 32557,這是因為這個 openstack 環境是搭建在 Kubernetes 叢集上,而且通過 NodePort 暴露的服務。
在頁面上檢視 openstack 的系統資訊:
![image-20200608163959155](https://i.iter01.com/images/0635ab44f223a55e0109aacd92de003cdcef98498815d2c0832be2a005746c12.png)
各個服務的 endpoints URL 都是以 *.openstack.svc.cluster.local
域名的形式,熟悉 Kubernetes 的應該看上去有點眼熟。
OpenStack 在 Kubernetes 中的細節
下面詳細地看看 OpenStack 在叢集中是怎麼一回事:
Helm
全部使用 Helm 部署:
![helm list](https://i.iter01.com/images/b757b04d58c5a3aa998cddebed792a3b88160a5e1dd746a8b627d5961b992e4c.png)
Ingress
Public 介面是通過 Ingress
暴露的:
![ingress](https://i.iter01.com/images/f731a880cd3efa5aff4846c9b1367449350d43d91398f490ec502bb5d2fc2fb4.png)
Service
更多的內部介面則可以在 service
中看到:
![service](https://i.iter01.com/images/0050db0ee57a7bb47a2537749df02d16b10b806073877bd9d54b85b98ebcde60.png)
注意 horizon-int 對應的就是 Dashboard 服務,它的型別是 NodePort 而且對映的埠號是 32557
DaemonSet
各種 agent 包括計算節點、OVS、Libvirt 等,都是通過 DaemonSet
:
![daemonsets](https://i.iter01.com/images/3505668525687e13a29ca54817b459bb33110209c8e92c3871d0b4440ed26b3e.png)
StatefulSet
帶狀態的資料庫和訊息佇列,以 StatefulSet
的形式:
![statefulset](https://i.iter01.com/images/34a48ed6425212d4a872c66822aef4da121d823b8d0f26fd45a4c60cc6f3e570.png)
Job
還有部署過程中的各種任務,包括初始化資料庫,註冊 endpoint 等,都是以 job
方式執行的:
![job](https://i.iter01.com/images/20ae57899ec5a822db6411006eeb647ac2643863eb7958489e15cc1c0837e3a9.png)
Pod
最終所有這些 pod
構成了這個 openstack 環境:
![pod](https://i.iter01.com/images/5775ea675fae93799be0c65f71f0ba4bdebe8a163551224a756c4fa46bd81494.png)
PV 和 PVC
當然還要用到持久化的卷儲存,即 PersistentVolumeClaim
和 PersistentVolume
:
![pv and pvc](https://i.iter01.com/images/010f8dd8078a7312e6e266799bfa31f66c84298d83f60998b97fbb610ac01e4c.png)
Ceph
持久化儲存由 ceph
提供,它們同樣部署在當前叢集中 :
![ceph](https://i.iter01.com/images/057931d7ecc989d38c76016d61cb4eefb23b0db01dac62a596d46fb85cc34fee.png)
中間層:Kubernetes on OpenStack
這個 Kubernetes 叢集有 4 個節點,1 個 master 節點,3 個 worker 節點:
![nodes](https://i.iter01.com/images/817bab9bb4d16c388385b2db713c9cf4a7c4fb31299802902d240d4345b9dce8.png)
4 個節點都是底層 OpenStack 環境提供的虛機:
![vm 例項](https://i.iter01.com/images/84f8014f0402c77270c4697b19a462ae0155b1c69313769528fa4e2195b9c5b1.png)
在 openstack 中部署 Kubernetes 的方案很多,在嘗試了其中的一些(包括 magnum)之後,最終使用基於 Ansible 的 Kubespray 部署。為了簡化操作,這套 Kubernetes 叢集也並沒有對接底層的 OpenStack。
手動建立了虛機之後,完成這樣一套叢集大概需要 20 分鐘:
![kubespray playbook](https://i.iter01.com/images/8c314de9fe3cd7021a431a2528ef68802cde68c49345eb726e5142b9f211b683.png)
這裡最初的 node-4 不幸被折騰掛了,所以上面顯示的是後面新增的 node-5
最下層:基於 Kolla 的 OpenStack
最底層的 openstack 是搭建在一臺物理伺服器上的 All-In-One 環境,使用 Kolla 作為部署工具。
Kolla 使用容器來部署 OpenStack,所以可以通過 docker ps
檢視服務:
![openstack in docker](https://i.iter01.com/images/8cf059ac0e94331e66d7dba5f08855a1aaa972ed371944ad4620f14c89a50f4a.png)
總結和思考
OpenStack 和 Kubernetes 的關係
![紅藍組CP](https://i.iter01.com/images/374d034bbe5ddf636d4afad54fd7c3ba2406c32944e086655f607fe51489b219.png)
一直以來 OpenStack 作為 IaaS 層,用來管理底層計算資源,而 Kubernetes 則被視作 PaaS 層,來管理應用和容器。在通常的架構圖中,OpenStack 都是處在 Kubernetes 的下層,作為雲端計算平臺提供諸如持久卷、負載均衡等資源。
事實上,OpenStack 系統本身就是一個微服務的架構,使用容器化部署,進而使用 Kubernetes 來管理已經是大勢所趨。通過 Kubernetes 強大的容器編排能力,長久以來被詬病的 OpenStack 的部署難,升級難等問題可以得到有效解決。 在這次測試中,當中途遇到錯誤時,處理方式非常「簡單粗暴」,直接刪掉重來。管理面要求高可用?直接改 replicas 就行。Kubernetes 和 Helm 的強大功能令人印象深刻。
同時現在可以無縫引入雲原生社群強大生態,例如 Prometheus,ELK 等,想用的話基本就是一鍵部署和接入。
由於 Kubernetes 基於雲的設計,在私有云場景下,OpenStack 仍然是 Cloud Provider 的不二選擇。不僅可以提供可用於部署叢集的 Node 例項(虛機或裸金屬),也能補充底層網路/儲存資源的管理能力。
關於實際應用的思考
因為環境所限,這裡最上層 OpenStack 已經是二次虛擬化了,顯然沒有實用價值,實際應用中需要有所變化。
我能想到的可行方案:
以虛擬機器為主要工作負載的,容器作為補充的,可以考慮保留下面兩層,通過 OpenStack 提供基於虛機的 Kubernetes 叢集和容器服務。 以容器為主要工作負載的,可以考慮僅使用上面兩層,在裸機上部署 Kubernetes。這樣部署在上層的 OpenStack 就是一個用來供給虛機的服務,本質和部署一個網站沒啥區別。 結合我們前面介紹的裸金屬技術,保留所有三層,底層的 OpenStack 只負責提供裸金屬例項,這樣上面兩層的作用和上一個方案類似。
當然,顯而易見的,這樣一套架構最大的問題就是太過於複雜。同時引入兩套技術棧,對團隊的要求較高。如果非要二選一,大多數的小公司會作何選擇不言而喻。
你對 Kubernetes 和 OpenStack 之間關係有何想法,歡迎在評論區討論。
感謝你的閱讀,請繼續關注「雲端計算實驗室」
本文使用 mdnice 排版