国产欧美日韩第一页|日本一二三不卡视频|在线精品小视频,亚洲第一免费播放区,metcn人体亚洲一区,亚洲精品午夜视频

幫助中心 >  行業(yè)資訊 >  開(kāi)發(fā) >  C語(yǔ)言微服務(wù)在OpenShift上的部署

C語(yǔ)言微服務(wù)在OpenShift上的部署

2021-05-10 13:53:47 1897

一、C應(yīng)用的基礎(chǔ)鏡像

容器云上C很少,最大的原因是C語(yǔ)言是本地編譯的。今天,我們分析一下如何在容器云上運(yùn)行C應(yīng)用。

容器云上C應(yīng)用第一個(gè)需要考慮的點(diǎn)是基礎(chǔ)鏡像。紅帽提供基于RHEL的輕量級(jí)容器鏡像UBI,大小為幾十M。

談到這里,很多人會(huì)有一個(gè)樸素的疑問(wèn):如果開(kāi)發(fā)環(huán)境是SUSE,那應(yīng)用在上OpenShift的時(shí)候,使用紅帽基于RHEL提供的鏡像,運(yùn)行是否完全一致?

解決這個(gè)問(wèn)題不難,也就是說(shuō),對(duì)于C應(yīng)用容器化時(shí),我們使用比UBI更為基礎(chǔ)的容器鏡像,使用Alpine Linux。這樣我們將C的編譯和運(yùn)行的環(huán)境,做到容器鏡像里。

Alpine Linux是一個(gè)由社區(qū)開(kāi)發(fā)的基于musl和BusyBox的Linux操作系統(tǒng),該操作系統(tǒng)以安全為理念,面向x86路由器、防火墻、虛擬專用網(wǎng)、IP電話盒及服務(wù)器而設(shè)計(jì)。

我們查看Alpine Linux的版本和Linux Kernel。我們?cè)趯?xiě)dockerfile的時(shí)候,就得選對(duì)應(yīng)kernel版本的Alpine Linux。我們?cè)诤竺娴膶?shí)驗(yàn)使用Alpine 3.12。


1.jpg


Alpine的基礎(chǔ)層只有6MB的大小。Alpine使用BusyBox提供外殼程序,根據(jù)MUSL C庫(kù)而不是glibc構(gòu)建的。MUSL是一個(gè)最小的,符合POSIX的C標(biāo)準(zhǔn)庫(kù)。Alpine鏡像中有諸如cp和wget之類的命令可以正常工作。BusyBox有其自己的方式來(lái)執(zhí)行系統(tǒng)設(shè)置任務(wù),例如添加用戶和組。


2.jpg


Glibc glibc = GNU C Library
是GNU項(xiàng)(GNU Project)目,所實(shí)現(xiàn)的C語(yǔ)言標(biāo)準(zhǔn)庫(kù)(C standard library)。廣泛存在于目前最常見(jiàn)的桌面和服務(wù)器中的GNU/Linux類的系統(tǒng)中,都是用的這套C語(yǔ)言標(biāo)準(zhǔn)庫(kù)。它實(shí)現(xiàn)了常見(jiàn)的C庫(kù)的函數(shù),支持很多種系統(tǒng)平臺(tái),功能很全,但是也相對(duì)比較臃腫和龐大。如果出現(xiàn)漏洞也影響巨大,如 glibc 幽靈漏洞等。

Musl是一個(gè)輕量級(jí)的C標(biāo)準(zhǔn)庫(kù),設(shè)計(jì)作為GNU C library (glibc)、 uClibc或Android Bionic的替代用于嵌入式操作系統(tǒng)和移動(dòng)設(shè)備。它遵循POSIX 2008規(guī)格和 C99 標(biāo)準(zhǔn),采用MIT許可證授權(quán),使用Musl的Linux發(fā)行版和項(xiàng)目包括sabotage,bootstrap-linux,LightCube OS等等。

我們知道構(gòu)建容器涉及將某些依賴項(xiàng)導(dǎo)入到映像中。Alpine有自己的存儲(chǔ)庫(kù)和自己的安裝命令(apk add)。

需要注意的是,Alpine存儲(chǔ)庫(kù)中的某些庫(kù)是針對(duì)glibc構(gòu)建的,因此使用apk add會(huì)導(dǎo)入大量其他二進(jìn)制文件。但從源構(gòu)建大多數(shù)依賴關(guān)系要比從存儲(chǔ)庫(kù)導(dǎo)入更容易。

二、C應(yīng)用的測(cè)試程序

solunar_ws組件是基于REST的Web服務(wù),可在指定日期提供特定城市的日出和日落時(shí)間并設(shè)置信息。使用以下形式的URL通過(guò)CURL調(diào)用它:


3.png


solunar_ws是用C實(shí)現(xiàn)的基于REST的Web服務(wù)的demo,容器的總大小約為10Mb。此10Mb包括操作系統(tǒng)層、應(yīng)用程序二進(jìn)制文件和相關(guān)性,以及(在此特定情況下)完整的世界時(shí)區(qū)數(shù)據(jù)庫(kù)。即使在負(fù)載下,應(yīng)用程序在容器中使用的RAM也不會(huì)超過(guò)幾Mb。

solunar_ws組件只有兩個(gè)重要的依賴項(xiàng):libmicrohttpd和tzdata(全局時(shí)區(qū)數(shù)據(jù)庫(kù))。libmicrohttpd 是 GUN 下開(kāi)源的一個(gè)小型的 HTTP 庫(kù),能夠方便的嵌入到系統(tǒng)中。支持 HTTP 1.1 可以同時(shí)偵聽(tīng)多個(gè)端口,具有 select, poll, pthread, thread poo 等多種模式。tzdata軟件包,全稱time zone and daylight-saving time(DST) data,供各個(gè)Linux系統(tǒng)安裝以讀取Time Zone Database中數(shù)據(jù)。

三、Alpine使用注意事項(xiàng)

Alpine的核心應(yīng)用程序都與MUSL鏈接,而不是glibc,并且Alpine默認(rèn)不包含其他C庫(kù)。對(duì)于我們中的那些在Linux開(kāi)發(fā)中已經(jīng)習(xí)慣于glibc擴(kuò)展的人來(lái)說(shuō),使用MUSL會(huì)遇到一些問(wèn)題。讓我們僅舉幾個(gè)例子。首先,MUSL沒(méi)有與glibc qsort_r()函數(shù)等效的函數(shù),該函數(shù)用于對(duì)任意數(shù)據(jù)結(jié)構(gòu)進(jìn)行排序。老實(shí)說(shuō)。其次,MUSL在實(shí)現(xiàn)某些功能方面存在一些無(wú)法解釋的差距。例如,用于格式化時(shí)間數(shù)據(jù)的strftime()函數(shù)缺少glibc實(shí)現(xiàn)所具有的說(shuō)明符。

如果您需要對(duì)微服務(wù)的HTTP通信進(jìn)行加密,則需要決定是在OpenShift集群中還是僅在OpenShift集群中對(duì)HTTP通信進(jìn)行加密。加密到群集的流量很簡(jiǎn)單,因?yàn)槲覀兛梢耘渲肙penShift路由進(jìn)行邊緣終止。在此配置中,OpenShift路由器與微服務(wù)之間的內(nèi)部流量將為純文本。

另一方面,如果即使在OpenShift集群中也要對(duì)流量進(jìn)行加密,則需要為微服務(wù)提供自己的傳輸層安全性(TLS)支持。libmicrohttpd庫(kù)支持TLS,但是要啟用該支持,我們需要使用許多GNU TLS庫(kù)的開(kāi)發(fā)版本來(lái)構(gòu)建它。當(dāng)然,這些庫(kù)也必須在運(yùn)行時(shí)可用于容器。

此外,您需要提供服務(wù)器證書(shū),并為客戶的管理員提供一種獲取該證書(shū)的方法。您可以在OpenShift機(jī)密或ConfigMap中提供證書(shū),然后將其作為文件掛載到pod的文件系統(tǒng)中。這種技術(shù)相對(duì)普遍,與C一起使用與從Java或其他任何語(yǔ)言使用在原理上沒(méi)有什么不同。

四、運(yùn)行Alpine鏡像


4.png


查容器鏡像構(gòu)建過(guò)程:

[root@helper c]# docker build -t davidwei/capp:1.0 .

鏡像構(gòu)建成功后,可以通過(guò)podman -it運(yùn)行,則容器中會(huì)有一個(gè)交互式會(huì)話,可用于編輯和構(gòu)建代碼。當(dāng)然生產(chǎn)上我們不會(huì)用這種方式在容器云上開(kāi)發(fā)C應(yīng)用,意義不大。本小節(jié)只是驗(yàn)證我們可以基于alpine去做鏡像定制化。

五、編譯并實(shí)現(xiàn)C應(yīng)用的容器化

查看如下Dockerfile,我們將C應(yīng)用的編譯和容器化


image.png


1.第一階段構(gòu)建

基于Alpine 3.12這個(gè)base image下載libmicrohttpd的源代碼并進(jìn)行構(gòu)建,然后對(duì)solunar_ws進(jìn)行相同操作。這些來(lái)源來(lái)自不同的地方,但是它們都是以相同的方式編譯的。在此示例中,請(qǐng)注意,在構(gòu)建Web服務(wù)之前,我們必須先構(gòu)建libmicrohttpd。那是因?yàn)閃eb服務(wù)依賴它。

本階段鏡像構(gòu)建完以后,鏡像大小約為210MB。

2.第二階段構(gòu)建

第二階段從相同的Alpine 3.12基礎(chǔ)層開(kāi)始,僅安裝運(yùn)行時(shí)所需的軟件包,即tzdata。然后,它從先前的版本中復(fù)制容器在運(yùn)行時(shí)所需的兩個(gè)文件:二進(jìn)制solunar_ws和庫(kù)libmicrohttpd.so.12。

我們查看鏡像構(gòu)建過(guò)程:


image.png


7.jpg


可以使用如下命令本地運(yùn)行:

#docker run -d -p 8080:8080 davidwei/capp:1.0

# docker ps

CONTAINER ID   IMAGE               COMMAND         CREATED         STATUS         PORTS                                       NAMES

87c1cf607a10   davidwei/capp:1.0   "/solunar_ws"   9 seconds ago   Up 8 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   zealous_dhawan

六、在OpenShift上部署鏡像

在OCP中,我們可以:

1.從dockerfile部署應(yīng)用,自動(dòng)生成deployment。

2.部署容器鏡像,自動(dòng)生成deployment

3.手工書(shū)寫(xiě)deployment,部署容器鏡像。

如下圖所示,基于dockerfile部署應(yīng)用可以自動(dòng)生成deployment和route,這是第一種方法:


8.jpg


如果C應(yīng)用的源碼發(fā)生了變更,那么在OpenShift中就再次直接從dockerfile部署。本文我做手工docker build主要是為了方便讀者理解。

為了更好地控制,執(zhí)行oc create創(chuàng)建dc和service,如下所示(推送鏡像的步驟省略)。這是第三種方法:


image.png


為應(yīng)用創(chuàng)路由,并通過(guò)瀏覽器訪問(wèn)應(yīng)用:

http://www.tjdsmy.cn_name/day/london/jun%2020


10.jpg


七、總結(jié)

從本文我們可以看出,在OpenShift上運(yùn)行C應(yīng)用是安全沒(méi)問(wèn)題的。但是,由于C無(wú)法像java那樣實(shí)現(xiàn)外部構(gòu)建(mvn),因此我們不建議讓C應(yīng)用參與到OpenShift的CI/CD中。我們?cè)跁?shū)寫(xiě)dockerfile的時(shí)候,需要以alpin Linux為基礎(chǔ)鏡像,把C應(yīng)用編譯和運(yùn)行所依賴的環(huán)境都做到容器鏡像中。




提交成功!非常感謝您的反饋,我們會(huì)繼續(xù)努力做到更好!

這條文檔是否有幫助解決問(wèn)題?

非常抱歉未能幫助到您。為了給您提供更好的服務(wù),我們很需要您進(jìn)一步的反饋信息:

在文檔使用中是否遇到以下問(wèn)題: