【技術】MediumKube- 快速部署容器雲的開發環境

{"type":"doc","content":[{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"前言","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"筆者在2020年年初加入了星環的雲開發部,在此之前接觸過最複雜的容器平臺就是docker swarm,並且也是一知半解,所以在工作的初期,對K8s的熟悉是一個必不可少的工作。然而K8s是一個具有一定複雜性的容器平臺,所以開發/學習環境的搭建也會比較複雜。在嘗試搭建完整版集羣失敗後又嘗試minikube,但是又發現minikube的諸多缺點,如功能的侷限,可配置性的低下。於是,在工作大半年,掌握一定基本知識後,着手開發本文所要介紹的MediumKube。初衷可能是爲了幫助剛加入星環的小夥伴們熟悉K8s,不過感覺需求不高,就不了了之了。對於我自己來說,這倒是成爲了快速搭建開發環境的一個實用工具。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這些年容器雲的技術已經滲入到我們日常開發的方方面面,不管是做一些企業應用的開發,還是個人網站的搭建。應用程序是否能在容器平臺上運行,並且利用容器平臺的特性去進行性能調優/成本管理確實是很難忽略的一個部分。而如今,有很多的應用完全基於雲平臺去開發,它們充分運用了雲平臺的能力,來做到諸如微服務化,服務網格化,彈性化等特點。然而一個完全基於雲平臺開發的應用也自然而然需要一個複雜的雲開發環境,不論是對應用本身的部署,還是對雲平臺API的利用,甚至是對雲平臺本身能力的擴展,都是有很大幫助的。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作爲開發環境,我們關注的點可能不同於生產環境。我在這裏列舉一些我個人對開發環境的期望","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"是否可以快速部署,刪除","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"功能性是否完整","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對於高級用戶是否提供豐富的配置項","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"開發者對環境底層組件的可見性","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作爲中國的開發者,是否能輕鬆地使用開源的軟件生態","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"現在市面上也有很多的免費軟件可以作爲容器雲的開發環境,比如傻瓜式的k8s發行版minikube,可應用於邊緣計算和資源受限環境的k8s,或者對於非k8s的使用者來說,docker swarm也是易於部署的容器雲環境之一。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本文介紹的MediumKube不同於以上這些產品化程度比較高的軟件,它基於libvirt和cloud-init提供了一個高度可定製化的方案。相比於純粹的kubernetes輕量化發行版,它更像是一個虛擬機管理工具,而它提供的一些能力使得它成爲部署kubernetes開發環境的一個實用的軟件。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"使用Cloud-Init快速初始化虛擬機實例","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Cloud-init是IaaS雲服務通用的一個標準,它的推行者就是大名鼎鼎的Canonical,也就是開發Ubuntu的那家公司。Cloud-init是Infrastructure as Code的一個例子。通過聲明式地編寫配置文件,我們就可以實現對雲實例的初始化。它是如此通用的一個標準,以至於我們可以將它集成到數百行代碼的微型項目中,來實現一個最簡化的IaaS服務。MediumKube使用了這個工具,使得它本身就是一個可定製化極高的虛擬機管理工具。當然,由於它的定位是快速部署Kubernetes,所以它也內置了一個默認Cloud-Init模板,和它的源代碼本身一起發行。","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/16/16168ac43e7aa3e869c18abdbd17c6ff.png","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上圖就是MediumKube內置模板的一部分。這個模板做了包括對用戶,軟件源,系統配置腳本,docker/kubernetes的安裝的相關工作,使得實例一旦部署完,就帶有相應的軟件環境,無需再做額外的配置","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"配置和模板引擎","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"MediumKube支持模板引擎。通過編寫全局的配置項,並且將它們使用在Cloud-Init模板中,用戶可以部署出高度自定義的虛擬機集羣。","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/b8/b84d4575980ade38c75b558a1a810eca.png","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上圖列出了MediumKube所支持的一些配置項。有些會影響虛擬機的屬性,而另一些,可以渲染到模板中。比如非常有用的HTTPProxy,對於中國用戶來說時非常實用的,因爲模板引擎的支持,用戶不再需要在多個零散的地方一遍遍地設置代理的配置,而是通過統一的配置文件去全局地設置。雖然配置項繁多,但是MediumKube對每一個都有推薦的默認值,這也在靈活性和易用性之間取得了一個平衡點。相信大家都有使用minikube時不知道去哪裏配置虛擬機的高級參數的困擾,所以兼顧入門用戶和高級用戶也是MediumKube的一個優點。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"使用mediumkubed維持穩定的網絡環境","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一個穩定的網絡環境對於開發環境來說也比較重要。MediumKube開發的前期就出現過由於網絡環境的變動,某些配置變得不再可用,比如監聽在宿主機上的代理。由於DHCP或者切換wifi,宿主機的IP經常變動,爲了解決這個問題,mediumkube會爲用戶維護一個虛擬網絡,並且這個虛擬網絡時非常易於配置的。用戶只需要聲明簡單的接口信息,mediumkube會自動進行配置iptables,dnsmasq等像信息。","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/d6/d65cd2ed0a4e1b5fd6e393fd31d6e161.png","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"下圖爲mediumkubed開發初期的拓撲結構,類似於Docker的Bridge網絡,非常簡潔,但同時也很實用。隨着開發,會有越來越多的功能被添加。","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/75/756da221c9eae98b797e24154ee2c30e.png","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Mediumkubed會被註冊爲systemd中的一個模塊,所以管理器來非常簡單。","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/cf/cf04d11a9c9de2ad0c0397c3600aa3b9.png","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"簡單易用的命令行工具","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在UI方面,mediumkube提供了簡單易用的命令行界面。比如用戶可以展示已部署的虛擬機,並管理它們的生命週期,如停止/啓動/刪除/部署","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/a5/a5813da70460ba26f662b304995fa454.png","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"同時,mediumkube也有快速的組建集羣,加入集羣,重置節點等命令,使得集羣的管理變得簡單。比如,如果用戶需要部署一個兩節點的集羣,只需要如下簡單的命令","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"$ mediumkube deploynode1 node2","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"$ mediumkube initnode1","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"$ mediumkube joinnode2 node1","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當然,如果用戶不滿足於這些簡單的命令,他們也可以通過shell命令來登入到虛擬機中進行操作。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/84/843dba1fdd1f52c5c267525935a3e1b8.png","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如上圖所示,用戶無需記憶任何IP地址,而且如果配置得當,也無需手動管理任何密鑰,直接可以對節點進行管理。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"MediumKube的未來","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"MediumKube是個很年輕也很小衆的項目。它解決了一部分人的痛點的同時,也有相當大的侷限性。比如在單機環境下的集羣部署會使得系統資源捉襟見肘,以及項目比較低的產品化程度,都會使的它只是在“理論上”比較實用。作爲MediumKube的開發者,自然也希望MediumKube越來越好用,下面談談我對它的規劃。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"集羣化","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上面也提到了,MediumKube在單機的環境下帶來了不小的侷限性,所以集羣化一定是一個未來的規劃。當然,引入複雜的元素,勢必會對系統的簡潔性帶來打擊,比如MediumKube會變得難以部署,甚至還不亞於部署一個K8S集羣,或者分佈式元素的加入可能會帶來更多的bug。很多問題說大也不大,不過確實是需要花時間去思考的。集羣化的mediumkube採用何種架構?虛擬機的部署如何進行調度?Overlay網絡用哪種技術做(上面的截圖好像暴露了我準備用flannel這個事實)?如何進行簡單卻靈活的分佈式部署?如果簡單地進行節點的規劃?是否需要圖形化的支持?要考慮的東西確實比較繁雜。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"穩定性和代碼質量","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作爲開發環境,穩定性的要求可能沒那麼強,不過在mediumkubed在早期確實也出現過佔用巨量內存的情況。而且作爲一個玩具項目和golang學習用例,mediumkube在代碼質量上也比較堪憂。比如文件傳輸模塊的代碼就非常糟糕,以至於上行和下行的速度有明顯的差距。希望在未來可以有所改善。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"說在最後","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最後希望技術可以真真正正地提升我們生活的便利性,並感謝CNCF,Canonical,libvirt,Google等組織和所有開源社區的開發者們給我們帶來這些好玩,易用,免費的優質軟件,也期待未來可以看到更多有意思的技術。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"right","origin":null},"content":[{"type":"text","text":"作者:聞雲路","attrs":{}}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章