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

2021-01-08 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

相關焦點

  • 騰訊雲十年新風向:雲原生與開源的未來
    自研上雲的過程,實質是驗證雲原生架構、部分甚至全部擁抱雲原生體系的過程。雷鋒網所看到的是,從技術角度講,無論通過容器交付業務,還是基於微服務框架研發升級,自研上雲其實也就是需要將業務切換成基於公有雲模式研發,同時將配套的一些列組件框架上雲,成為雲服務的一部分。最後,通過客戶(包括內部QQ、微信等團隊,以及外部客戶)的不斷POC過程中,形成一套騰訊雲原生賦能的方法論。
  • 騰訊雲十年新風向:雲原生與開源的未來
    自研上雲的過程,實質是驗證雲原生架構、部分甚至全部擁抱雲原生體系的過程。雷鋒網所看到的是,從技術角度講,無論通過容器交付業務,還是基於微服務框架研發升級,自研上雲其實也就是需要將業務切換成基於公有雲模式研發,同時將配套的一些列組件框架上雲,成為雲服務的一部分。
  • 如何基於標準k8s打造邊緣計算雲原生基礎設施?
    12月3日,在邊緣計算社區社群上,阿里雲高級技術專家黃玉奇做了《雲邊一體——如何基於標準k8s打造邊緣計算雲原生基礎設施》主題分享,黃老師在阿里雲做容器服務,近幾年一直從事雲原生相關領域工作。本文根據黃老師分享整理,一共6300字,乾貨滿滿,預計閱讀19分鐘!引言云原生的理念如今正如火如荼。
  • 堅持開源,KubeSphere加速中國企業向雲原生邁進
    提起開源項目,熱愛IT技術的人難免心頭一熱,許多人提起做開源的企業內心也滿是崇敬之情。現如今,國內的開源熱情似乎比以往更高了些,開源項目是企業彰顯技術自信的行為,並不是商業利益驅動的行為,就憑這點,值得為真正做開源的企業點讚。
  • 阿里雲全面擁抱雲原生,或將重構雲計算的發展方向
    擁抱開源助推阿里云云原生的發展與其他企業級技術不同,雲原生天然就與開源文化結緣,比如 K8S 的流行,就離不開整個開源社區的努力。基於開源社區,全球無數個開發者、企業和組織通過各種形式為社區貢獻原始碼、文檔等,共同推動 K8S 等各個雲原生產品的迭代。
  • 雲原生時代逼近 微軟K8S服務的優勢在哪裡?
    不論你是否還想爭辯一番,未來將無可爭議地進入雲原生時代。無論是哪個國家的雲服務提供商都做好了服務雲原生時代的準備,並把雲原生當成新的戰略,並推出各種工具來幫助你提早享受雲原生所帶來的更低成本、更高效率還可以減少企業運維負擔的好處。
  • 聊聊雲原生的那些事
    2010年,在當時 Paul Fremantle 的一篇博客中被提及,他主要將其描述為一種和雲一樣的系統行為的應用的編寫,比如分布式的、鬆散的、自服務的、持續部署與測試的。隨後,2008 年,通過將 Cgroups 的資源管理能力和 Linux Namespace 的視圖隔離能力組合在一起,LXC 完整的容器技術出現在 Linux 內核中,並且可以在單個 Linux 內核上運行而無需任何補丁。隨後2010年7月,NASA和Rackspace共同發布了著名的開源項目Openstack,Openstack的開源標誌著開源領域真正具有一個成熟的雲計算解決方案。
  • 從基礎設施到雲原生應用,全方位解讀阿里雲原生新銳開源項目
    2020年11月19日,由 InfoQ 主辦的「2020中國技術力量年度榜單盛典」隆重召開,並正式揭曉了「開源傑出貢獻人物」、「開源新銳項目」和「雲原生行業落地典範」三大重量級獎項。在此前的入圍賽中,僅「開源新銳項目」單項,阿里雲原生就入圍了10多個開源項目,在創新能力、社區成就和用戶反饋等多項指標中一騎絕塵,佔據了參評項目整體近五分之一。
  • Fluid: 讓大數據和 AI 擁抱雲原生的一塊重要拼圖
    、敏捷迭代,以及雲計算在資源成本和彈性擴展方面的天然優勢,以 Kubernetes 為代表的雲原生編排框架吸引著越來越多的 AI 與大數據應用在其上部署和運行。為系統化解決相關問題,學術界和工業界密切合作,南京大學 PASALab 副研究員顧榮博士、阿里雲容器服務高級技術專家車漾、Alluxio 項目創始成員範斌博士聯合推動發起了 Fluid開源合作項目。Fluid 是什麼?
  • k8s三部曲第一章第2節 雲架構&雲原生
    1)雲和k8s是什麼關係 * 雲就是使用容器構件的一套服務集群網絡,雲由很多的大量的容器過程 * k8s就是用來管理雲中的容器2)雲架構 * iaas 基礎設施即服務* 用戶: 租用(購買|分配權限) 雲主機,用戶不需要考慮網絡,DNS,存儲,硬體環境方面的問題* 運營商:提供網絡,存儲,DNS這樣的服務就叫做基礎設置服務
  • 基於雲原生的邊緣計算開源框架研究
    通過將渲染平臺部署到邊緣,實現渲染計算資源在邊緣完成回傳給用戶,減少了網絡傳輸時延,實現業務的穩定。把 Kubernetes 從雲端延伸到邊緣,目前有三個開源項目討論較多,分別是OpenYurt、 KubeEdge 和 K3S,下面將詳細介紹這三個開源框架。
  • 手把手帶你玩轉k8s-一鍵部署springboot項目
    前言本文的一鍵部署,其實就是將部署流程化的命令轉成shell腳本,當然,因為是發布到k8s集群上,所以發布的命令和需要的東西會有些不一樣。本文的一鍵部署腳本是基於 打造一款適合自己的快速開發框架-持續部署之一鍵發布腳本設計與實現這篇文章進行改造的。所以建議大家先把該篇文章先看一篇。
  • OpenYurt:阿里巴巴第一個雲原生的邊緣計算開源項目
    OpenYurt是阿里巴巴的第一個開源,雲原生邊緣計算項目,匯集了阿里巴巴集團眾多邊緣計算團隊的深厚技術積累,並探討了對邊緣計算雲原生實施的需求。自2018年以來,OpenYurt已成為ACK @ Edge的核心框架,並已應用於內容交付網絡(CDN),ApsaraVideo Live,IoT平臺,物流,工業頭腦和城市頭腦。
  • 螞蟻開源KubeTEE:讓機密計算支持大規模k8s集群
    9月25日,在上海外灘大會可信原生技術論壇上,螞蟻宣布開源KubeTEE,一個雲原生大規模集群化機密計算框架,解決在雲原生環境中TEE可信執行環境技術特有的從開發、部署到運維整體流程中的相關問題。
  • 國內首發,騰訊開源Serverless 雲原生一體化部署工具:雲開發 Cloud...
    12 月 19 日,騰訊在 2020 Techo Park 開發者大會上集中發布了三大開源項目。其中, 雲開發CloudBase Framework 作為騰訊開源的國內首個基於 Serverless 架構的雲原生一體化部署工具,引起了眾多開發者的關注。
  • 到底什麼是「雲原生」?
    在Google和Redhat發布了Kubernetes之後,這個項目的發展速度非常之快。2015年,由Google、Redhat以及微軟等大型雲計算廠商以及一些開源公司共同牽頭成立了CNCF雲原生基金會。CNCF成立之初,就有22個創始會員,而且Kubernetes也成為了CNCF託管的第一個開源項目。
  • 騰訊開源雲原生一體化部署工具 CloudBase Framework
    近日,騰訊宣布開源一款雲原生一體化部署工具 CloudBase Framework,用於幫助開發者快速將應用無縫部署在 Serverless 架構的雲開發(FaaS + CaaS + BaaS
  • 如何理解Eating這個詞?雲原生與微服務專場介紹
    對於需要大規模資源管理和部署的伺服器端AI應用程式,這個問題尤其嚴重。在本演講中,我們將討論Rust和WebAssembly如何為AI應用程式提供高性能且安全的微服務。如何充分利用生態中眾多項目的能力?如何讓雲原生快速發揮業務價值?一直是廣大開發者群體面臨的難題。本次演講將聚焦開發者、聚焦雲原生應用的構建,介紹如何使用OAM模型構建可擴展的雲原生應用管理引擎。通過OAM構建的引擎,將雲原生生態中的眾多開源項目通過可插拔的方式納管進來,成為應用發布、彈性擴縮、監控報警、權限管理、流量管理等一系列核心能力,破除開發者和雲原生技術之間的壁壘。
  • 「騰訊開源十年圖譜」發布,覆蓋雲原生等五大技術領域
    此次新發布的開源項目聚焦前沿技術領域,分別是雲原生一體化部署開源工具Cloudbase Framework、邊緣計算開源項目SuperEdge、以及定製化高性能開源KV資料庫Tendis。據單致豪介紹,「騰訊開源十年圖譜」是對騰訊過去十年開源探索的整體盤點,集中展示了十年來騰訊是如何通過內外部開放原始碼等方式積極參與「全球科技共同體」的共建,將自身技術能力以及技術成果與全世界開發者共享。目前,騰訊已經成為全球開源貢獻最大的科技公司之一。
  • CNCF接納Rancher Longhorn為沙箱項目,K8S存儲開源了
    當前,CNCF擁有20個沙箱項目。被CNCF接受為沙箱項目,充分表明了Longhorn作為新一代的容器化分布式存儲項目,為雲原生生態系統帶來的獨特價值。Rancher將Longhorn捐贈給CNCF,證明了Rancher始終如一的、致力於加速企業採用雲原生技術的願景和承諾。