這是 TCP CLOUD 聯合創始人 & 前 CTO Jakub Pavlik 於 2017 年 7 月 9 日發佈於 www.mirantis.com 的文章。本文主要介紹了 Virtlet 及其將來與 Kubernetes 相結合的一些想法。感謝文森特翻譯和才雲 CTO 鄧德源校對。node
不久前,我和一位潛在客戶(非通訊行業)開了一次會。該公司剛剛宣佈了一個計劃,意在取代現有的 OpenStack 發行版。當咱們開始討論在 Stackalytics 中找到 OpenStack 的最大貢獻者時,咱們發現了問題的根本,並意識到他們並不須要從最大供應商那邊找到 OpenStack 發行版。git
他們須要在大規模生產中運行單個應用負載。github
換句話說,他們不須要多租戶,自管理服務,Murano,Trove 等功能或項目。客戶甚至都不想使用 OpenStack,由於經過 OpenStack 來經過不可變虛擬機鏡像發佈應用的方式太過複雜。docker
另外一方面,使用 Kubernetes 來代替 OpenStack 也不是正確的方式,由於它們的應用還不能微服務化,就算要作,也至少須要 6 個月的時間來重寫,從新測試和驗證全部的工具。服務器
當時我意識到在 Kubernetes 中使用標準虛擬機,並與 OpenStack SDN 相結合會有多麼強大。經過這兩個平臺的優點,咱們能夠想象如何簡化控制平面堆棧,去適用於諸如邊緣計算,視頻流等功能;這些功能目前都是以虛擬機的方式部署。這甚至可能幫 NFV 找到一個新方向。網絡
什麼是 Virtlet?架構
正如我上一篇博客所說,以前的真實例子證明了咱們的客戶暫時還沒準備好進入真實的微服務世界。爲了解決這個問題,咱們在 Mirantis Cloud Platform 上增長了一個名爲 Virtlet 的新功能。Virtlet 是 Kubernetes 一個運行時服務,可以根據 QCOW2 映像運行 VM 工做負載。app
Virtlet 是 Mirantis K8S 的夥伴們在一年前啓動的項目,第一個版本經過 Flannel 實現。換句話說,Virtlet 是一個 Kubernetes CRI (Container Runtime Interface) 的實現,可以在 Kubernetes 集羣上運行基於虛擬機的 Pods。(CRI 可以令 Kubernetes 運行非 Docker 的容器,例如 Rkt)微服務
爲了簡化部署,Virtlet 自己做爲 DaemonSet 運行,充當管理程序使 CRI 代理服務器可用於運行虛擬機,實現 Docker 和非 Docker pods 在同一個節點上運行。工具
下圖展現了 Virtlet 的結構:
Virtlet 包含了下列的組成部分:
Virtlet manager:實現虛擬化和鏡像處理的 CRI 接口
Libvirt:標準 libvirt 庫
Vmwrapper:爲模擬器準備環境
Emulator:qemu 結合 KVM 實現的模擬器(能夠禁用 KVM 嵌套虛擬化測試)
CRI proxy:提供在同一 K8S node 上混合部署 docker-shim 和基於 VM 的工做負載
你能夠在 github docs(https://github.com/Mirantis/v...)上找到更多詳細信息,但在最新的發佈中,Virtlet 支持如下功能:
Volumes:Virtlet 使用自定義的 FlexVolume (virtlet/flexvolume_driver) (https://github.com/kubernetes...)驅動來指定虛擬機的塊設備,它支持:
qcow2 ephemeral volumes
raw devices
Ceph RBD
files stored in secrets or config maps
環境變量:你能夠爲你的 pods 定義環境變量,當虛擬機啓動時,virtlet 使用 cloud-init 將這些值寫入 / etc / cloud / environment 文件。
演示 Lab 架構
爲了演示全部的功能是如何運轉,咱們建立了一個 lab 包含了:
3 個運行在 HA 模式中的 OpenContainer 3.1.1.x 的控制器
3 個 Kubernetes master 或 minion nodes
2 個 Kubernetes minion nodes
Kubernetes 採用 1.6 版本,使用 OpenContrail Container Network Interface (CNI) 。爲了演示 Virtlet 的功能,咱們同時部署基於 Ubuntu VM 的 Pod 以及基於標準容器環境的 Nginx Pod。
最終,咱們在同一個 Kubernetes 集羣上運行容器和虛擬機,並運行在同一個 OpenContrail 虛擬網絡上。
整體而言,整個過程呈現以下:
創建包括 k8s masters, minions 以及一個 OpenContrail controllers 的基礎架構。運行 Virtlet DaemonSet 的節點有特定的標籤。咱們使用了extraRuntime = virtlet。(以後咱們會須要)
爲虛擬機建立一個 pod,在 nodeAffinity 參數中指定 extraRuntime 鍵,以便其在具備 Virtlet DaemonSet 的節點上運行
完成,沒有第三步了。
結論
因此咱們如今已經有了基本認知,咱們對於如何在將來作有關 Virtlet 和 OpenContrail Kubernetes 的集成有了幾個大體的想法,例如:
在 Kubernetes 中對虛擬機進行性能驗證,例如將 OpenStack 上的容器化虛擬機與標準虛擬機進行比較
支持基於 iSCSI 磁盤儲存
啓用 OpenContrail vRouter DPDK 和 SR-IOV,擴展 OpenContrail CNI,使其能夠建立先進的 NFV 集成
Virtlet 的 CPU pinning 和 NUMA
優化資源處理,例如內存的硬限制和 qemu 線程的限制
Callico 技術支持
正如你所看到的,Mirantis 正在專一於解決實際問題,並將這些解決方案推回到社區,而不是隨機的貢獻代碼。我也想要特別感謝 Ivan Shvedunov,Dmitry Shulyak 及全部 Mirantis Kubernetes 團隊,他們在此次整合中出色地完成了工做。