本文轉(zhuǎn)載自公眾號(hào):EAWorld,,點(diǎn)擊查看原文,。 一些公共服務(wù)組件在追求性能過(guò)程中,與業(yè)務(wù)耦合太緊,,造成在制作基礎(chǔ)鏡像時(shí),,都會(huì)把這些基礎(chǔ)組件都打包進(jìn)去,因此當(dāng)業(yè)務(wù)鏡像啟動(dòng)后,,容器里面一大堆進(jìn)程,,這讓Kubernetes對(duì)Pod的管理存在很大隱患。為了讓業(yè)務(wù)容器瘦身,,更是為了基礎(chǔ)組件自身的管理更獨(dú)立和方便,,將基礎(chǔ)組件從業(yè)務(wù)鏡像中剝離并DaemonSet容器化部署。然而一些基礎(chǔ)組件Agent與業(yè)務(wù)Pod之間通過(guò)共享內(nèi)存的方式進(jìn)行通信,,同一Node中跨Pod的共享內(nèi)存方案是首先要解決的問(wèn)題,。為什么要將公共基礎(chǔ)組件Agent進(jìn)行DaemonSet部署自研的公共基礎(chǔ)組件,比如服務(wù)路由組件,、安全組件等,,通常以進(jìn)程方式部署在Node上并同時(shí)為Node上所有的業(yè)務(wù)提供服務(wù),微服務(wù)及容器化之后,,服務(wù)數(shù)量成百上千的增長(zhǎng),,如果以sidecar或者打包到業(yè)務(wù)Image中繼續(xù)Per Pod Per Agent的方式部署, 那么基礎(chǔ)組件的Server端的壓力可能也會(huì)成百上千的增長(zhǎng),風(fēng)險(xiǎn)是很大的,。因此,,我們希望能以DaemonSet方式部署這些組件的Agents。 先說(shuō)說(shuō)Kubernetes大行其道的今天,,如果不將這些基礎(chǔ)組件從業(yè)務(wù)Pod中剝離,,存在哪些問(wèn)題:
將基礎(chǔ)組件Agents從業(yè)務(wù)Pod中剝離,,以上的問(wèn)題都能解決了,,架構(gòu)上的解耦帶來(lái)的好處無(wú)需多言,。而且我們可以通過(guò)Kubernetes管理這些基礎(chǔ)組件Agents了,享受其自愈,、滾動(dòng)升級(jí)等好處,。 Linux共享內(nèi)存機(jī)制然而,理想很美好,,現(xiàn)實(shí)很殘酷,。首先要解決的問(wèn)題是,有些組件Agent與業(yè)務(wù)Pod之間是通過(guò)共享內(nèi)存通信的,,這跟Kubernetes&微服務(wù)的最佳實(shí)踐背道而馳,。 大家都知道,Kubernetes單個(gè)Pod內(nèi)是共享IPC的,,并且可以通過(guò)掛載Medium為Memory的EmptyDir Volume共享同一塊內(nèi)存Volume,。 首先我們來(lái)了解一下Linux共享內(nèi)存的兩種機(jī)制:
其中,System V共享內(nèi)存歷史悠久,,一般的UNIX系統(tǒng)上都有這套機(jī)制,;而POSIX共享內(nèi)存機(jī)制接口更加方便易用,一般是結(jié)合內(nèi)存映射mmap使用,。 mmap和System V共享內(nèi)存的主要區(qū)別在于:
POSIX共享內(nèi)存是基于tmpfs來(lái)實(shí)現(xiàn)的,。實(shí)際上,更進(jìn)一步,,不僅PSM(POSIX shared memory),,而且SSM(System V shared memory)在內(nèi)核也是基于tmpfs實(shí)現(xiàn)的。 從這里可以看到tmpfs主要有兩個(gè)作用:
雖然System V與POSIX共享內(nèi)存都是通過(guò)tmpfs實(shí)現(xiàn),,但是受的限制卻不相同。也就是說(shuō) /proc/sys/kernel/shmmax只會(huì)影響SYS V共享內(nèi)存,,/dev/shm只會(huì)影響Posix共享內(nèi)存 ,。實(shí)際上,System V與Posix共享內(nèi)存本來(lái)就是使用的兩個(gè)不同的tmpfs實(shí)例(instance),。 SYS V共享內(nèi)存能夠使用的內(nèi)存空間只受/proc/sys/kernel/shmmax限制,;而用戶通過(guò)掛載的/dev/shm,默認(rèn)為物理內(nèi)存的1/2,。 概括一下:
同一Node上夸Pod的共享內(nèi)存方案基礎(chǔ)組件Agents DaemonSet部署后,,Agents和業(yè)務(wù)Pod分別在同一個(gè)Node上不同的Pod,,那么Kubernetes該如何支持這兩種類型的共享內(nèi)存機(jī)制呢? 當(dāng)然,,安全性上做出了犧牲,,但在非容器化之前IPC的隔離也是沒(méi)有的,所以這一點(diǎn)是可以接受的,。 灰度上線對(duì)于集群中的存量業(yè)務(wù),,之前都是將Agents與業(yè)務(wù)打包在同一個(gè)docker image,因此需要有灰度上線方案,,以保證存量業(yè)務(wù)不受影響,。 首先創(chuàng)建好對(duì)應(yīng)的Kubernetes ClusterRole, SA, ClusterRoleBinding, PSP Object。關(guān)于PSP 的內(nèi)容,,請(qǐng)參考官方文檔介紹pod-security-policy(https:///docs/concepts/policy/pod-security-policy/),。 在集群中任意選擇部分Node,給Node打上Label(AgentsDaemonSet:YES)和Taint(AgentsDaemonSet=YES:NoSchedule),。
部署Agent對(duì)應(yīng)的DaemonSet(注意DaemonSet需要加上對(duì)應(yīng)的NodeSelector和Toleration,,Critical Pod Annotations),,Sample as follows:
在該Node上部署不包含基礎(chǔ)組件Agent的業(yè)務(wù)Pod,,檢查所有基礎(chǔ)組件和業(yè)務(wù)是否正常工作,如果正常,再分批次選擇剩余Nodes,,加上Label(AgentsDaemonSet:YES)和Taint(AgentsDaemonSet=YES:NoSchedule),,DaemonSet Controller會(huì)自動(dòng)在這些Nodes創(chuàng)建這些DaemonSet Agents Pod。如此逐批次完成集群中基礎(chǔ)組件Agents的灰度上線,。 總結(jié)在高并發(fā)業(yè)務(wù)下,,尤其還是以C/C++代碼實(shí)現(xiàn)的基礎(chǔ)組件,經(jīng)常會(huì)使用共享內(nèi)存通信機(jī)制來(lái)追求高性能,,本文給出了Kubernetes Pod間Posix/SystemV共享內(nèi)存方式的折中方案,,以犧牲一定的安全性為代價(jià),請(qǐng)知悉,。當(dāng)然,,如果微服務(wù)/容器化改造后,基礎(chǔ)服務(wù)的Server端確定不會(huì)有壓力,,那么建議以SideCar Container方式將基礎(chǔ)服務(wù)的Agents與業(yè)務(wù)Container部署在同一Pod中,,利用Pod的共享IPC特性及Memory Medium EmptyDir Volume方式共享內(nèi)存。 作者:王濤,,騰訊云高級(jí)工程師,,西安電子科大碩士畢業(yè),持續(xù)深耕云計(jì)算領(lǐng)域七年,,目前在騰訊基于TKE(Tencent Kubernetes Engine)構(gòu)建DevOps平臺(tái),,幫助集團(tuán)自研業(yè)務(wù)上云,曾在華為,、唯品會(huì),、vivo從事企業(yè)私有云平臺(tái)的建設(shè)工作,2014年開(kāi)始專注于Kubernetes/Docker等容器技術(shù)棧在DevOps,、AI Platform方向的應(yīng)用,,積累了大量生產(chǎn)經(jīng)驗(yàn)。 基于Kubernetes的DevOps實(shí)戰(zhàn)培訓(xùn)基于Kubernetes的DevOps實(shí)戰(zhàn)培訓(xùn)將于7月26日在上海開(kāi)課,,3天時(shí)間帶你系統(tǒng)掌握Kubernetes,,學(xué)習(xí)效果不好可以繼續(xù)學(xué)習(xí)。本次培訓(xùn)包括:容器特性,、鏡像,、網(wǎng)絡(luò);Kubernetes架構(gòu),、核心組件,、基本功能;Kubernetes設(shè)計(jì)理念,、架構(gòu)設(shè)計(jì),、基本功能、常用對(duì)象、設(shè)計(jì)原則,;Kubernetes的數(shù)據(jù)庫(kù),、運(yùn)行時(shí)、網(wǎng)絡(luò),、插件已經(jīng)落地經(jīng)驗(yàn),;微服務(wù)架構(gòu)、組件,、監(jiān)控方案等 |
|
來(lái)自: 碼農(nóng)書館 > 《kubernetes 》