關(guān)于將SAP ABAP應(yīng)用服務(wù)器組件容器化和在Kubernetes中部署它們,我們?cè)赟PA LinuxLab中做了概念驗(yàn)證(PoC),本文將介紹一些我們的發(fā)現(xiàn)和經(jīng)驗(yàn)。本文會(huì)也會(huì)指出這項(xiàng)工作的一些潛在的收益和挑戰(zhàn)。
作者:Richard Treu, Henning Sackewitz
英文原文:Proof of Concept: Deploying ABAP in Kubernetes
本文鏈接:https:////www.cnblogs.com/hhelibeb/p/12320295.html
請(qǐng)注意,本文檔并非完整解決方案,當(dāng)前不提供任何產(chǎn)品或開發(fā)內(nèi)容。
參考 SAP note 1122387,可以獲取有關(guān)當(dāng)前ABAP應(yīng)用服務(wù)器在容器(-orchestration)中運(yùn)行的支持文檔。
請(qǐng)隨意評(píng)論和分享本文。
每個(gè)ABAP系統(tǒng)都由三層組成:包含數(shù)據(jù)和程序的數(shù)據(jù)庫,應(yīng)用服務(wù)器和客戶端。 此PoC的范圍是ABAP應(yīng)用服務(wù)器。
SAP NetWeaver Application Server ABAP可以分解為多個(gè)組件,因此它是容器化的主題。 容器化的第一個(gè)自然選擇是應(yīng)用服務(wù)器實(shí)例(AS),因?yàn)樗鼈兪嵌褩V凶顭o狀態(tài)的部分,并且可以相對(duì)輕松地進(jìn)行擴(kuò)展。盡管如此,我們選擇部署ABAP Central Services的強(qiáng)制性組件,即消息服務(wù)器(Message Server)和隊(duì)列服務(wù)器(Enqueue Server
)。 最后,我們還將可選的SAP Web Dispatcher和SAProuter添加到設(shè)置中。
底層SAP HANA數(shù)據(jù)庫不在我們的PoC范圍之內(nèi)——它被視為給定的外部資源,可以通過安全存儲(chǔ)證書連接。
我們的嘗試是上面的組件放到單獨(dú)的容器鏡像里,把它們映射到合適的Kubernetes對(duì)象并通過某種方式關(guān)聯(lián)到一起,使之可以良好的發(fā)揮Kubernetes的特性。
創(chuàng)建一個(gè)通用的ABAP Kubernetes部署,可以集成到任何Kubernetes環(huán)境,無論它是on-premise, self-managed的k8s產(chǎn)品(比如CaasP, OpenShift)還是作為公有云服務(wù)的k8s產(chǎn)品(比如,GKE)。
在Kubernetes中,應(yīng)用通過預(yù)構(gòu)建的容器鏡像和Kubernetes YAML部署文件分發(fā)。
我們的目標(biāo)是構(gòu)建通用ABAP鏡像??梢?span id="fu8ihs5fyo3" class="tlid-translation translation" lang="zh-CN">使用特定于環(huán)境的輸入?yún)?shù)來自定義ABAP鏡像,輸入?yún)?shù)可以通過Kubernetes YAML文件配置。 在部署時(shí),參數(shù)被注入到Kubernetes環(huán)境中。 例如,HANA數(shù)據(jù)庫連接參數(shù)將作為Kubernetes密鑰注入。
一些屬性是靜態(tài)的、不可變的值,不能在此PoC中配置:
另外,我們選擇了最新的、向后兼容的SAP內(nèi)核,可以與大多數(shù)NetWeaver和S/4 HANA版本一起工作。
ABAP系統(tǒng)中的實(shí)際工作負(fù)載是在服務(wù)器端會(huì)話中的應(yīng)用服務(wù)器上執(zhí)行的。 除了數(shù)據(jù)庫,這是消耗大部分內(nèi)存和處理能力的地方,因此這是最需要根據(jù)工作負(fù)載使用Kubernetes伸縮的實(shí)體。
隨著工作負(fù)載的增加,擴(kuò)展應(yīng)用程序服務(wù)器Pod非常容易,但是如果隨意銷毀Pod,可能導(dǎo)致系統(tǒng)中的用戶會(huì)話中斷。
我們將應(yīng)用程序服務(wù)器放置在具有一個(gè)初始副本的Deployment中。 可以按用戶控制的順序按比例縮小Deployment的大小。和StatefulSet不同,無論實(shí)際的用戶會(huì)話負(fù)載如何,StatefulSet都只能按相反順序的縮減Pod。
-----------------------------------
名詞解釋:
Pod:https://www.kubernetes.org.cn/kubernetes-pod
StatefulSet: https://www.kubernetes.org.cn/statefulset
Deployment: https://www.kubernetes.org.cn/deployment
-----------------------------------
我們通過“Pod水平自動(dòng)伸縮”(Horizontal Pod Autoscaler
)邏輯解決了硬關(guān)閉問題:根據(jù)當(dāng)前的會(huì)話負(fù)載給Pod分配優(yōu)先級(jí)注解。當(dāng)執(zhí)行縮減的時(shí)候,具有最低優(yōu)先級(jí)的服務(wù)器會(huì)接收到軟關(guān)機(jī)指令,會(huì)話會(huì)逐漸從該P(yáng)od結(jié)束。
應(yīng)用工作進(jìn)程會(huì)產(chǎn)生多個(gè)日志文件,sidecar container用于拉日志并把它們轉(zhuǎn)發(fā)到每個(gè)應(yīng)用服務(wù)器Pod的相應(yīng)位置。因此日志文件可以持久化,用于分析工作進(jìn)程失敗和隨之而來的容器重啟。
根據(jù)設(shè)計(jì),消息服務(wù)器是一個(gè)單例,隊(duì)列服務(wù)器也是。為了更加靈活,我們?yōu)樗鼈儎?chuàng)建了單獨(dú)的容器鏡像,但是把它們放在了同一個(gè)Pod里,Pod的名字是ASCS(ABAP SAP Central Services)。
應(yīng)用服務(wù)器需要通過靜態(tài)DNS名訪問消息服務(wù)器,我們將ASCS Pod放到了一個(gè)StatefulSet中,解決了這個(gè)問題。
消息服務(wù)器基本上無狀態(tài),因此容器重啟并不重要。隊(duì)列服務(wù)器會(huì)保持對(duì)表的鎖,所以它不是完全無狀態(tài)的。為了實(shí)現(xiàn)隊(duì)列服務(wù)器的高可用,建議啟用二級(jí)鎖服務(wù)器,來保持一個(gè)鎖表的副本。這被稱為隊(duì)列復(fù)制,可以通過創(chuàng)建另一個(gè)單例Pod實(shí)現(xiàn)。然而,這已經(jīng)不在Poc的范圍內(nèi)了。
為了通過GUI訪問系統(tǒng),SAProuter可以做到將客戶端連接到正確的應(yīng)用服務(wù)器。和Kubernetes負(fù)載均衡器相比,SAProuter擁有專有的SAP DIAG協(xié)議,可以把連接轉(zhuǎn)發(fā)給相應(yīng)的會(huì)話。SAProuter是無狀態(tài)的,可以按需輕松伸縮。它可以被部署為Pod, DaemonSet或Deployment。
最后一個(gè)組件是Web Dispatcher,它是一個(gè)包含了專有安全特性和端點(diǎn)控制的負(fù)載均衡器。它同樣是無狀態(tài)的,可以按需伸縮。因?yàn)槲覀冊(cè)赑oC中只需要一個(gè)Web Dispatcher實(shí)例,我們把它和消息服務(wù)器、隊(duì)列服務(wù)器綁到一個(gè)Pod中。
注意:可以跳過Web Dispatcher,使用Kubernetes負(fù)載均衡器直接連接應(yīng)用服務(wù)器容器的ICM(Internet Communication Manager)進(jìn)程。但是從安全角度來考慮,這么做可能有問題,并且會(huì)形成一個(gè)非標(biāo)準(zhǔn)的SAP安裝。
在全部的SAP組件都被組織成為Kubernetes Pod之后,我們必須確定它們彼此間、和外部客戶端之間都可以正常通信。
同一個(gè)Kubernetes集群中的Pod之間通過服務(wù)(Service)通信。由于Kubernetes會(huì)在節(jié)點(diǎn)(Node)進(jìn)行自動(dòng)的端口映射,不同的Pod會(huì)通過不同的端口暴露,這允許SAP應(yīng)用服務(wù)器在單一節(jié)點(diǎn)擴(kuò)展時(shí)不產(chǎn)生端口沖突。
-----------------------------------
名詞解釋:
Service: https://www.kubernetes.org.cn/kubernetes-services
-----------------------------------
應(yīng)用服務(wù)器Deployment和ASCS StatefulSet都會(huì)封裝到Kubernetes服務(wù)中。
外部客戶端(SAP GUI,Web瀏覽器)與服務(wù)的連接是通過外部負(fù)載均衡器完成的。 負(fù)載均衡器類型取決于運(yùn)行Kubernetes的底層基礎(chǔ)架構(gòu)。 對(duì)于本PoC,我們將OpenStack與HAProxy負(fù)載平衡器以及裸機(jī)基礎(chǔ)結(jié)構(gòu)一起使用。 部署負(fù)載均衡器需要對(duì)IaaS層進(jìn)行API調(diào)用,因此必須配置IaaS-specific Kubernetes Cloud Provider Interface(CPI)。 為簡(jiǎn)單起見,最后我們使用MetalLB作為負(fù)載均衡器。 我們還成功測(cè)試了HAProxy和硬件負(fù)載均衡器。
外部負(fù)載平衡器IP(其DNS可解析的主機(jī)名)是所有客戶端通信的單一入口點(diǎn)。
負(fù)載均衡器實(shí)際上并不像其名稱所表示的那樣工作。 在此設(shè)置中,它僅用作外部通信入口點(diǎn)。 實(shí)際上,負(fù)載是由Web Dispatcher和消息服務(wù)器使用SAP登錄組(SAP Logon Groups)來分配的。
最后,我們將所有SAP Kubernetes對(duì)象組織在專用的Kubernetes命名空間“sap”中,以便與其它集群進(jìn)行邏輯分離。
此外,可以通過將多個(gè)SAP實(shí)例分配到單獨(dú)的命名空間(例如, “ sapqa”,“ sapdev”,“ sapprod”)來將它們部署在單個(gè)集群上。
下圖展示了所有這些東西是如何結(jié)合到一起的,
原則上,可以在Kubernetes環(huán)境中運(yùn)行ABAP。 它允許快速,靈活地部署,尤其是針對(duì)測(cè)試、開發(fā)和培訓(xùn)系統(tǒng)。 由于ABAP應(yīng)用程序服務(wù)器組件的綜合架構(gòu),會(huì)存在一些挑戰(zhàn)和與Kubernetes功能的重疊之處,因此必須有對(duì)應(yīng)地解決(例如負(fù)載均衡、名稱解析、生命周期)。
另一個(gè)好處是可以在同一環(huán)境中簡(jiǎn)單快速地部署多個(gè)ABAP實(shí)例。 可以在單個(gè)Kubernetes集群中啟動(dòng)ABAP實(shí)例,也可以與多個(gè)ABAP實(shí)例共享Kubernetes集群。 所有ABAP實(shí)例都可以通過基礎(chǔ)架構(gòu)(on-premise/self-managed或公有云)提供的負(fù)載平衡器地址使用。 Kubernetes還負(fù)責(zé)端口映射,并通過分配唯一的中間端口來避免在同一節(jié)點(diǎn)上具有相同端口的SAP實(shí)例之間的沖突。
ABAP體系結(jié)構(gòu)在整個(gè)用戶會(huì)話期間將用戶會(huì)話上下文保留在一臺(tái)特定的Dialog實(shí)例服務(wù)器上,直到用戶注銷或會(huì)話達(dá)到超時(shí)為止??s小Dialog實(shí)例服務(wù)器的規(guī)??赡軐?dǎo)致終止用戶會(huì)話。
此外,批處理(也存在于Dialog實(shí)例服務(wù)器上)也不應(yīng)該被終止。在這個(gè)的PoC中,我們通過優(yōu)先級(jí)機(jī)制確定可以終止哪個(gè)容器,從而解決了這一問題。
Kubernetes的優(yōu)點(diǎn)之一是在工作節(jié)點(diǎn)之間的內(nèi)置均衡平衡。但是,ABAP根據(jù)使用的訪問方法(SAP GUI,Web GUI,RFC等)提供了自己的負(fù)載平衡和排隊(duì)機(jī)制。因此,存在功能重疊,所以Kubernetes負(fù)載均衡只能以受限的方式使用。
容器化和基礎(chǔ)架構(gòu)平臺(tái)增加了多個(gè)網(wǎng)絡(luò)層,因此從客戶端(SAP GUI,瀏覽器)訪問SAP系統(tǒng)比訪問裸機(jī)系統(tǒng)更為復(fù)雜。另一方面,Kubernetes工具提供了持久性地檢查系統(tǒng)可用性和網(wǎng)絡(luò)性能以發(fā)現(xiàn)問題的能力。
數(shù)據(jù)庫包含ABAP程序,所有業(yè)務(wù)邏輯和所有客戶數(shù)據(jù)。要將容器化的ABAP系統(tǒng)與特定內(nèi)核連接,需要兼容的SAP HANA數(shù)據(jù)庫,其中包含正確的初始數(shù)據(jù)庫載荷。
我們假設(shè)SAP應(yīng)用服務(wù)器及其ABAP應(yīng)用可能有其他要求,例如web service端點(diǎn),遠(yuǎn)程系統(tǒng)連接或移動(dòng)應(yīng)用程序連接。對(duì)于基礎(chǔ)架構(gòu)也可能有一些隱含的假設(shè),例如SAP許可證key的硬件ID; Linux內(nèi)核參數(shù)值等。
聯(lián)系客服