在 Kubernetes 上部署 OpenStack 是什麼體驗

DavyCloud發表於2020-09-29

紅藍出 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 的問題。

經過了一番摸索,踩了不少坑,最後終於完成了這次嘗試。

下面簡單地分享下最終的效果,其中的過程涉及較多,後續再擇機分享。

整個環境概況

整個環境架構
整個環境架構

最上層:一個普通的 OpenStack 環境

在上面的 OpenStack 中用 cirros 映象建立了一個虛機:

image-20200608163640522
image-20200608163640522

細心的你可能已經發現這裡的埠號不是預設的 80,而是比較奇怪的 32557,這是因為這個 openstack 環境是搭建在 Kubernetes 叢集上,而且通過 NodePort 暴露的服務。

在頁面上檢視 openstack 的系統資訊:

image-20200608163959155
image-20200608163959155

各個服務的 endpoints URL 都是以 *.openstack.svc.cluster.local 域名的形式,熟悉 Kubernetes 的應該看上去有點眼熟。

OpenStack 在 Kubernetes 中的細節

下面詳細地看看 OpenStack 在叢集中是怎麼一回事:

Helm

全部使用 Helm 部署:

helm list
helm list

Ingress

Public 介面是通過 Ingress 暴露的:

ingress
ingress

Service

更多的內部介面則可以在 service 中看到:

service
service

注意 horizon-int 對應的就是 Dashboard 服務,它的型別是 NodePort 而且對映的埠號是 32557

DaemonSet

各種 agent 包括計算節點、OVS、Libvirt 等,都是通過 DaemonSet :

daemonsets
daemonsets

StatefulSet

帶狀態的資料庫和訊息佇列,以 StatefulSet 的形式:

statefulset
statefulset

Job

還有部署過程中的各種任務,包括初始化資料庫,註冊 endpoint 等,都是以 job 方式執行的:

job
job

Pod

最終所有這些 pod 構成了這個 openstack 環境:

pod
pod

PV 和 PVC

當然還要用到持久化的卷儲存,即 PersistentVolumeClaimPersistentVolume

pv and pvc
pv and pvc

Ceph

持久化儲存由 ceph 提供,它們同樣部署在當前叢集中 :

ceph
ceph

中間層:Kubernetes on OpenStack

這個 Kubernetes 叢集有 4 個節點,1 個 master 節點,3 個 worker 節點:

nodes
nodes

4 個節點都是底層 OpenStack 環境提供的虛機:

vm 例項
vm 例項

在 openstack 中部署 Kubernetes 的方案很多,在嘗試了其中的一些(包括 magnum)之後,最終使用基於 Ansible 的 Kubespray 部署。為了簡化操作,這套 Kubernetes 叢集也並沒有對接底層的 OpenStack。

手動建立了虛機之後,完成這樣一套叢集大概需要 20 分鐘:

kubespray playbook
kubespray playbook

這裡最初的 node-4 不幸被折騰掛了,所以上面顯示的是後面新增的 node-5

最下層:基於 Kolla 的 OpenStack

最底層的 openstack 是搭建在一臺物理伺服器上的 All-In-One 環境,使用 Kolla 作為部署工具。

Kolla 使用容器來部署 OpenStack,所以可以通過 docker ps 檢視服務:

openstack in docker
openstack in docker

總結和思考

OpenStack 和 Kubernetes 的關係

紅藍組CP
紅藍組CP

一直以來 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 排版

相關文章