擁抱雲原生,如何將開源項目用k8s部署?

2021-01-09 51CTO

k8s以及雲原生相關概念近年來一直比較火熱,阿丸最近搞了個相關項目,小結一下。


本文將重點分享阿里開源項目otter適配k8s部署的改造過程,其中的改造過程和技巧應該適用於將大多數開源項目改造到k8s進行部署。

1.背景

otter是阿里開源的分布式資料庫同步系統,基於資料庫增量日誌解析,並準實時同步到本機房或異地機房的mysql/oracle資料庫(相關內容可以參考https://github.com/alibaba/otter,本文不做過多贅述)。

為了充分利用物理資源、快速擴容同步節點、擁抱雲原生,決定使用k8s部署otter。

otter的項目整體上自成一體,出於改造成本考慮,儘量在項目已有基礎上,做一些適配,不改動原始碼。

本文將重點分享對於otter適配k8s部署的改造過程,有不當之處,還請多多指教。

涉及到幾個核心內容:

otter基本架構 dockerfile編寫 deployment編寫 啟動腳本改造 K8s中固定ip/port訪問

2.otter的基本架構


典型管理系統架構,manager(web管理)+node(工作節點)

manager運行時推送同步配置到node節點 node節點將同步狀態反饋到manager上 基於zookeeper,解決分布式狀態調度的,允許多node節點之間協同工作 基於Canal開源產品,獲取資料庫增量日誌數據。當然,otter採用了canal的嵌入式模式,不是獨立的canal節點。

基於以上部署架構,我們只需要將otter-manager和otter-node部署到k8s上。

尤其是otter-node,需要利用k8s實現節點快速水平擴展、計算性能彈性擴縮容。

2.Dockerfile編寫

2.1 otter-manager的Dockerfile

otter-manager比較簡單,包括幾個步驟:

使用一個centos的基礎鏡像 設置時區 創建目錄 拷貝下載好的manager.deployer-4.2.18到指定目錄 使用啟動startup-new.sh腳本啟動(這裡對原本的啟動腳本做了一些改造,後文進行詳述)

具體如下所示:


2.2 otter-node的Dockerfile

otter-node稍微有所不同,根據官方文檔說明,需要安裝aria2來做文件傳輸。

注意注意,由於aria2安裝非常慢,因此,我們需要先安裝aria2作為一個新的基礎鏡像,然後在新的基礎鏡像上構建otter-node鏡像,能大大提高後續鏡像構建速度。

新的基礎鏡像如下,命名為 registry.xxx.com/xxx/otter-node-base:1.0。


然後在此基礎上構建新的otter-node鏡像。


注意,otter-node的配置方式比較特殊,需要先在otter-admin上獲取一個nid,然後才能運行一個otter-node。

所以,我們在dockerfile中以ARG 聲明一個nid,然後在後續構建鏡像的時候,通過 --docker-arg 傳入nid具體的值。

當然,如果把nid看作一個配置文件的話,也可以用下文提到的ConfigMap的形式在Deployment中掛載進去

3.Deployment編寫

什麼是Deployment?

k8s的一個Deployment控制器為 Pods 和 ReplicaSets 提供聲明式的更新能力。我們通過編寫Deployment描述期望的目標狀態,然後 Deployment 控制器更改Pods或者ReplicaSets的實際狀態, 使其變為期望狀態。

具體關於Deployment的知識不展開說明,可以參考k8s官方文檔。

我們需要部署測試環境與生產環境兩套集群,而無論是otter-manager還是otter-node,都依賴於讀取 conf/otter.properties 作為配置。

因此,我們需要根據環境,修改不同的otter.properties。

那麼,對於k8s部署來說,可以採用同一份鏡像,然後在不同環境(k8s的不同namespace)中將otter.properties作為ConfigMap寫入,最後通過volume的形式掛載到pod的指定路徑上。

這裡對幾個名詞做簡單介紹,詳細內容可以參考k8s官方文檔。

ConfigMap:一種 API 對象,用來將非機密性的數據保存到鍵值對中。使用時,Pods可以將其用作環境變量、命令行參數或者存儲卷中的配置文件。(如果想存儲的數據是機密的,可以使用 Secret,而不是ConfigMap) Volume:卷的核心是包含一些數據的一個目錄,Pod 中的容器可以訪問該目錄。所採用的特定的卷類型將決定該目錄如何形成的、使用何種介質保存數據以及目錄中存放 的內容。使用卷時, 在 .spec.volumes 欄位中設置為 Pod 提供的卷,並在 .spec.containers[*].volumeMounts 欄位中聲明卷在容器中的掛載位置。

所以,首先在指定環境(namespace中)創建configmap,以otter.properties作為key,以文件內容作為value。

具體命令如下

kubectl create configmap otter-manager-dev-config --from-file=otter.properties=conf/otter-dev.properties -n otter-system

在namespace為otter-system中創建一個名字為otter-manager-dev-config的ConfigMap,其中,以otter.properties作為key,以文件內容作為value。

產生的ConfigMap如下圖所示


最後,將這個ConfigMap在Deployment中用volume進行引用,然後通過volumeMounts掛載到指定目錄,Deployment具體如下所示。


這裡需要特別注意volumeMounts的路徑覆蓋問題,需要在volumeMounts中配置subPath為具體文件名。

4.啟動腳本改造

Otter包括兩個部分,管理控制臺manager和工作運行節點node,正常情況下都是用各自的啟動腳本startup.sh啟動的。

為了適配k8s,我們需要對啟動腳本做改造,本文以otter-manager的啟動腳本為例,otter-node也是類似。

將啟動腳本startup.sh改造為 startup-moon.sh,重點解決兩個問題

4.1 前臺進程保持運行

由於容器中用entrypoint啟動的進程為1號進程,一旦1號進程執行結束,容器就會退出了。

而原本的startup.sh中,用java啟動後,使用 「&」 將java進程轉換為後臺進程,所以startup.sh作為1號進程會很快執行結束,容器就會自動退出了。

所以我們需要將1號進程保持住,不要退出。

這裡考慮了兩個方案:

Startup.sh腳本中增加一個前臺進程進行保持,比如 tail -f /dev/null 命令 將「&」去掉,讓java啟動後就作為前臺進程一直保持

後來考慮了一下,還是選擇了方案二。主要原因是為了利用pod自動重啟的特性。

如果Java進程意外退出了,那麼方案二就能使得1號進程也結束,然後pod就能自動重啟了。而方案一的話,由於startup.sh腳本仍然在執行tail,所以即使java進程退出,1號進程也不會結束。

具體修改如下:


最終pod中的進程如圖所示


1號進程是啟動腳本 1號進程的子進程是otter的java應用進程(前臺進程)

4.2 虛擬機大小自定義配置

由於otter項目中,將jvm的啟動參數配置在了start.sh中,不方便進行手動配置。

因此,將start.sh的配置jvm參數的邏輯注釋掉,採用自己配置的環境變量JAVA_OPTIONS進行注入。


這個環境變量的注入方式也比較簡單,就是在Deployment中的env配置的(藍色框部分),方便以後手動修改jvm參數大小而不用修改鏡像。


5.k8s上固定IP/Port訪問

otter-node的部署中,有個比較特殊的地方。

不同於普通的微服務的無狀態擴展,otter-node的部署必須指定nid、ip、port,這種設計據說是為解決單機部署多實例而設計的,允許單機多node指定不同的埠(具體可以參考官方wiki,https://github.com/alibaba/otter/wiki/Node_Quickstart,這裡不展開說明)。

還是直接看看如何在k8s上進行適配吧。

這裡採用了k8s的NodePort進行處理。

NodePort 服務是引導外部流量到你的服務的最原始方式。NodePort,正如這個名字所示,在所有節點(虛擬機)上開放一個特定埠,任何發送到該埠的流量都被轉發到對應服務。如下圖所示。


在上面的配置中,可以使用IP1:3000 或者 IP2:3000 或者 IP3:3000 訪問service。

當然,為了保證不綁定特定KVM的IP,我們在前面掛一個SLB服務,通過訪問SLB的 虛擬IP:PORT 的形式訪問。

對於otter部署來說,otter-manager需要兩組 IP:PORT、每個node需要三組 IP:PORT。

注意,由於otter部署中,每個node需要暴露的port都是不同的,所以每次新增一個otter-node,都需要新增三組 IP:PORT。

我們以otter-node為例,來看下NodePort類型的Service的yml文件吧。


kind為service type為NodePort 配置了三組埠。port/targetport都是應用暴露埠,而nodePort是對外訪問埠。

6.總結

經過這樣的改造,我們就能用k8s的部署otter-manager和otter-node了,並且能夠快速擴容節點、彈性使用機器資源。

我們回顧一下其中的關鍵問題和技巧:

Dockerfile編寫中,可以把環境相關依賴打成一個新的基礎鏡像,提高後續應用鏡像的構建速度。 Dockerfile中,可以通過ARG定義一些構建過程中的變量,進行替換。 對於不同環境的配置文件,可以在不同環境(k8s的namespace)下配置不同的ConfigMap,然後在Deployment文件中通過volumeMounts的方式掛載進去。 對於後臺進程,需要改造為前臺進程使得pod能夠保持 對於一些特定的環境變量,可以在Deployment中通過env進行傳入。

其他開源項目如果有需要上k8s的,這些技巧應該都能用上。

【編輯推薦】

【責任編輯:

姜華

TEL:(010)68476606】

點讚 0

相關焦點

  • 企業級雲原生:TKEStack 騰訊雲原生開源實踐之路
    TKEStack 的開源思路 騰訊雲的思路是尋找雲原生的藍海,我們認為在未來,多雲以及硬體異構和硬體平臺異構是一個方向。 從 2009 年開始騰訊在容器技術方面有很多積累,內部業務在雲原生領域也有很多的積累。
  • 開源項目在GitHub上貢獻33.5W個Star!騰訊的十年「雲」答卷,請收好!
    這一路來,騰訊也貢獻了一份重要的力量,110+個開源項目,Github總Star數超過33.5W,「雲原生」產品API每日調用量更是超100億次,騰訊在2020 Techo開發者大會上交出開源十年的答卷! 2020年,雲原生(Cloud Native)的概念,火得一塌糊塗。
  • 智能計算、邊緣計算環境下的雲原生進化之路
    雲計算的發展,經歷了虛擬化、商業IaaS、商業PaaS,到開源IaaS、開源PaaS、雲原生等階段,核心組成部分也經歷了從伺服器到虛擬機再到容器的演變。控制層面由k8s master和kubeedge的cloudcore管理。每個線下門店的ARM伺服器上都安裝kubeedge的邊端組件:mqtt、edgecore服務等,管理pod的生命周期以及對應的終端管理。所有的應用都經過容器化改造,使用KubeEdge統一管理和下發。使用KubeEdge本身提供的能力,既能最大化發揮容器的快速部署的優勢,也能實現雲邊協同和邊緣自治的能力。
  • 青雲科技CEO黃允松:重新發明輪子,未來的應用都將是雲原生架構
    因為傳統應用不是為雲計算而開發的,導致遷移成本較高;就算遷移上雲了,如果只是用虛擬化和重新部署的方式遷移,無法發揮雲計算的彈性、高容錯和高並發處理等優點。重新發明輪子未來的軟體將生長於雲上怎樣才能降低成本,真正擁抱雲計算?用雲原生的方式把所有應用程式重寫一遍,讓開發的軟體和雲天然集成在一起,發揮出雲的最大價值。
  • 雲原生體系下的技海浮沉與理論探索
    結合可靠的自動化手段,雲原生技術使工程師能夠輕鬆地對系統作出頻繁和可預測的重大變更。雲原生計算基金會(CNCF)致力於培育和維護一個廠商中立的開源生態系統,來推廣雲原生技術。通過將最前沿的模式民主化,讓這些創新為大眾所用。
  • 「每日github」6:restful接口mock工具:json-server|K8s上榜等
    這個庫還是相當好用的,各種時間日期顯示操作功能齊全,且有多語言支持。這個庫建議大家收藏,你必然會用到的,到時候不需要自己重複造輪子。這也是我寫這一些列文章的初衷,避免重複造輪子。3,node這個項目就是nodeJs項目,這是之前的一個老項目地址。所以star數很多,但是沒用了,已經遷移了。
  • 雲原生背景下的運維價值思考與實踐
    積極擁抱公司開源協同的機制,通過集成現有優秀平臺或組件,如有河圖元數據管理平臺(CMDB)、藍鯨標準運維平臺、PCG-混沌工程實驗平臺、藍鯨服務流程管理平臺等等,避免重複性建設,結合我們的服務場景,發揮平臺服務效能最大化。思路上借鑑了「瑞士軍刀」,我們通過微服務的架構,將雲資產(CMDB)管理作為底座,也就是「刀把」。
  • 數據中臺的雲原生機會
    2017年4月,彭鋒開始研究如何將大數據平臺做成一個產品——這就是智領雲數據中臺產品的前身。相比國內眾多阿里基因的數據中臺廠商,智領雲的一個強標籤就是「雲原生」。從2018年9月推出雲原生架構的數據中臺產品至今,智領雲已服務了服裝定製平臺衣邦人、武漢市衛健委等數十家能源、教育、醫療健康、物聯網、金融領域的客戶,彭鋒稱復購率為100%。
  • ...中間件首次實現自研、開源、商用「三位一體」,技術飛輪效應顯現
    阿里雲在探索中一直存在的苦惱,是內部的自研體系、商業化的產品技術與開源的項目,三方的技術路線一直沒有機會融為一體。然而,就在今年阿里雲提出了"三位一體"理念,即將"自研技術"、"開源項目"、"商業產品"形成統一的技術體系,最大化技術的價值。隨著阿里自研體系的上雲,這個機遇終於到來了。
  • 數據中臺的雲原生機會 | 甲子光年
    2017年4月,彭鋒開始研究如何將大數據平臺做成一個產品——這就是智領雲數據中臺產品的前身。 相比國內眾多阿里基因的數據中臺廠商,智領雲的一個強標籤就是「雲原生」。 從2018年9月推出雲原生架構的數據中臺產品至今,智領雲已服務了服裝定製平臺衣邦人、武漢市衛健委等數十家能源、教育、醫療健康、物聯網、金融領域的客戶,彭鋒稱復購率為100%。
  • 每周開源點評:定義雲原生、拓展生態系統,以及更多的行業趨勢
    ,我的一部分職責是為產品營銷人員、經理和其他相關人定期發布有關開源社區、市場和業界發展趨勢的更新。 《隨著雲原生計算的興起,它和代碼一樣在改變文化》 文章連結 現在是圍繞一套雲原生計算的共同原則進行行業整合的時候了,因為許多企業已經意識到,他們最初進入雲計算的回報有限。
  • 沃趣科技魏興華:雲原生和資料庫的結合將成未來趨勢
    我們活下來了,活的還不錯  根據魏興華介紹,沃趣科技之所以做產品而不是做運維服務,主要是考慮到服務的可複製相對較差,過度的依賴專家,但產品不一樣,沃趣科技可以將數十年的資料庫經驗、系統經驗沉澱到產品中,實現可複製的價值。
  • CNCF公布中國雲原生調查報告:49%使用容器技術,Kubernetes 應用率...
    培訓不足和網絡則並列第三,佔比36%,與此同時,還有35%的受訪者將可靠性和監控性作為部署挑戰。有 36% 受訪者使用託管平臺作無伺服器,22% 使用可安裝軟體。對於那些使用託管平臺作為無伺服器工具的企業,排名前三的提供商是阿里雲功能計算(46%),AWS Lambda(34%)以及騰訊雲無伺服器雲功能和華為 FunctionStage 並列(12%)。
  • 加速雲原生落地 KubeSphere把簡單交給客戶,把複雜留給自己
    正如Gartner在報告中所預測的那樣:預計至2020年,全球約75%的全球化企業將在生產中使用容器化應用。不僅如此,K8s在2019年也成為容器、雲原生領域的必然趨勢,在技術界,人們已經不再糾結於用K8s還是用別的技術路線,而是在探尋如何用好K8s。這對於一開始就選定K8s為產品和技術發展路線的青雲QingCloud來說,無疑是「賭」對了。
  • 雲原生2.0時代,華為雲如何構建高效可信的持續交付能力?
    華為雲還發布雲原生2.0全景圖,其中,在應用敏捷層,華為雲將雲原生的全棧能力賦能客戶,幫助客戶應用敏捷、業務智能,安全可信,面向未來持續演進。在雲原生2.0時代,享受架構解耦與雲端彈性帶來便利的同時,雲原生對軟體研發與交付模式提出了更高的要求。
  • 部署效率提高17倍,開源Metaflow,真正以人為本的數據科學框架
    來源:Pexels開源是軟體發展的趨勢,越來越多的人投入到開源世界中去。我們可以從開源世界中獲得很多有益的東西,本著不重複造輪子的精神,我們可以充分利用這些開源項目的成果。因此,團隊將全力以赴,將精力完全集中在提高數據科學家的生產力上。如何改善數據科學家的生活質量?針對此問題,下圖提供了一些看法:數據科學家喜歡自由地為項目選擇最佳建模方法。他們知道特徵工程對於許多模型至關重要,希望能夠控制模型輸入和特徵工程邏輯。在許多情況下,數據科學家非常渴望在生產中擁有自己的模型,因為這樣能幫助他們更快地對模型進行故障排除和迭代。
  • UCloud優刻得容器Cube入選2020年度十大雲原生創新技術方案
    頂尖專家陣容 優質項目交鋒UCloud雲原生實力獲得認可此次極客邦科技、InfoQ主辦的「2020中國技術力量年度榜單評選」,歷經數月打磨,共有300+參評項目,100+入圍項目,10000+開發者公開票選,20+頂尖專家評審,10
  • 關注行業雲原生(5):雲原生應用的技術內涵
    容器化市場上容器產品非常多,可以簡單理解為Docker,是安裝在Linux上的一個軟體,可以用鏡像堆起來一個個應用,這就是容器技術。當一切就緒,平臺上發布了成百上千個服務,每個服務或微服務相互連接成網狀,如何讓這個網絡有序、有邏輯便非常重要,一來便於修改和維護,二來保證穩定和性能。如何讓網絡變得有序有邏輯呢?
  • 百度開源2020年度報告:兩大開源平臺、九個捐贈項目
    並向Apache基金會、Linux基金會、CNCF、開放原子基金會累計捐贈9個項目。」一、20個技術領域持續開源截止2020年底,在GitHub/Gitee百度官方組織下已經圍繞著安全、監控、知識圖譜、網絡與接入、視覺、量子計算、開發框架等20個技術領域開源了86個項目,其中自然語言處理、開發框架與前端領域的開源項目數佔比超過50%。
  • 雲原生到底意味著什麼?
    很多時候,圍繞雲原生的討論會直接進入技術選擇,如容器化和微服務。毫無疑問,這些都是雲原生項目的潛在組成部分,但肯定不是全部。在本系列文章中,我們將從幾個不同的角度探索雲原生,包括技術和基礎設施,還包括架構、設計,以及可能最容易被忽視的人員和流程。用最簡單的術語來說,雲原生不只是說要遷移到雲,而是要充分利用雲基礎設施和服務的獨特性來快速交付業務價值。