摘要:簡(jiǎn)介社區(qū)中常見(jiàn)的做法是利用來(lái)提供容器中的資源可見(jiàn)性。從而使得應(yīng)用獲得正確的資源約束設(shè)定。阿里云服務(wù)全球首批通過(guò)一致性認(rèn)證,簡(jiǎn)化了集群生命周期管理,內(nèi)置了與阿里云產(chǎn)品集成,也將進(jìn)一步簡(jiǎn)化的開發(fā)者體驗(yàn),幫助用戶關(guān)注云端應(yīng)用價(jià)值創(chuàng)新。
摘要: 這是本系列的第2篇內(nèi)容,將介紹在Docker和Kubernetes環(huán)境中解決遺留應(yīng)用無(wú)法識(shí)別容器資源限制的問(wèn)題。
本系列文章記錄了企業(yè)客戶在應(yīng)用Kubernetes時(shí)的一些常見(jiàn)問(wèn)題
第一篇:Java應(yīng)用資源限制的迷思
第二篇:利用LXCFS提升容器資源可見(jiàn)性
第三篇:解決服務(wù)依賴
這是本系列的第2篇內(nèi)容,將介紹在Docker和Kubernetes環(huán)境中解決遺留應(yīng)用無(wú)法識(shí)別容器資源限制的問(wèn)題。
Linuxs利用Cgroup實(shí)現(xiàn)了對(duì)容器的資源限制,但在容器內(nèi)部依然缺省掛載了宿主機(jī)上的procfs的/proc目錄,其包含如:meminfo, cpuinfo,stat, uptime等資源信息。一些監(jiān)控工具如free/top或遺留應(yīng)用還依賴上述文件內(nèi)容獲取資源配置和使用情況。當(dāng)它們?cè)谌萜髦羞\(yùn)行時(shí),就會(huì)把宿主機(jī)的資源狀態(tài)讀取出來(lái),引起錯(cuò)誤和不便。
LXCFS簡(jiǎn)介
社區(qū)中常見(jiàn)的做法是利用 lxcfs來(lái)提供容器中的資源可見(jiàn)性。lxcfs 是一個(gè)開源的FUSE(用戶態(tài)文件系統(tǒng))實(shí)現(xiàn)來(lái)支持LXC容器,它也可以支持Docker容器。
LXCFS通過(guò)用戶態(tài)文件系統(tǒng),在容器中提供下列 procfs 的文件。
/proc/cpuinfo /proc/diskstats /proc/meminfo /proc/stat /proc/swaps /proc/uptime
LXCFS的示意圖如下
比如,把宿主機(jī)的 /var/lib/lxcfs/proc/memoinfo 文件掛載到Docker容器的/proc/meminfo位置后。容器中進(jìn)程讀取相應(yīng)文件內(nèi)容時(shí),LXCFS的FUSE實(shí)現(xiàn)會(huì)從容器對(duì)應(yīng)的Cgroup中讀取正確的內(nèi)存限制。從而使得應(yīng)用獲得正確的資源約束設(shè)定。
Docker環(huán)境下LXCFS使用
注:
本文采用CentOS 7.4作為測(cè)試環(huán)境,并已經(jīng)開啟FUSE模塊支持。
Docker for Mac/Minikube等開發(fā)環(huán)境由于采用高度剪裁過(guò)的操作系統(tǒng),無(wú)法支持FUSE,并運(yùn)行LXCFS進(jìn)行測(cè)試。
安裝 lxcfs 的RPM包
wget https://copr-be.cloud.fedoraproject.org/results/ganto/lxd/epel-7-x86_64/00486278-lxcfs/lxcfs-2.0.5-3.el7.centos.x86_64.rpm yum install lxcfs-2.0.5-3.el7.centos.x86_64.rpm
啟動(dòng) lxcfs
lxcfs /var/lib/lxcfs &
測(cè)試
$docker run -it -m 256m -v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw -v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw -v /var/lib/lxcfs/proc/stat:/proc/stat:rw -v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw -v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw ubuntu:16.04 /bin/bash root@f4a2a01e61cd:/# free total used free shared buff/cache available Mem: 262144 708 261436 2364 0 261436 Swap: 0 0 0
我們可以看到total的內(nèi)存為256MB,配置已經(jīng)生效。
lxcfs 的 Kubernetes實(shí)踐
一些同學(xué)問(wèn)過(guò)如何在Kubernetes集群環(huán)境中使用lxcfs,我們將給大家一個(gè)示例方法供參考。
首先我們要在集群節(jié)點(diǎn)上安裝并啟動(dòng)lxcfs,我們將用Kubernetes的方式,用利用容器和DaemonSet方式來(lái)運(yùn)行 lxcfs FUSE文件系統(tǒng)。
本文所有示例代碼可以通過(guò)以下地址從Github上獲得
git clone https://github.com/denverdino/lxcfs-initializer cd lxcfs-initializer
其manifest文件如下
apiVersion: apps/v1beta2 kind: DaemonSet metadata: name: lxcfs labels: app: lxcfs spec: selector: matchLabels: app: lxcfs template: metadata: labels: app: lxcfs spec: hostPID: true tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule containers: - name: lxcfs image: registry.cn-hangzhou.aliyuncs.com/denverdino/lxcfs:2.0.8 imagePullPolicy: Always securityContext: privileged: true volumeMounts: - name: rootfs mountPath: /host volumes: - name: rootfs hostPath: path: /
注: 由于 lxcfs FUSE需要共享系統(tǒng)的PID名空間以及需要特權(quán)模式,所有我們配置了相應(yīng)的容器啟動(dòng)參數(shù)。
可以通過(guò)如下命令在所有集群節(jié)點(diǎn)上自動(dòng)安裝、部署完成 lxcfs,是不是很簡(jiǎn)單?:-)
kubectl create -f lxcfs-daemonset.yaml
那么如何在Kubernetes中使用 lxcfs 呢?和上文一樣,我們可以在Pod的定義中添加對(duì) /proc 下面文件的 volume(文件卷)和對(duì) volumeMounts(文件卷掛載)定義。然而這就讓K8S的應(yīng)用部署文件變得比較復(fù)雜,有沒(méi)有辦法讓系統(tǒng)自動(dòng)完成相應(yīng)文件的掛載呢?
Kubernetes提供了 Initializer 擴(kuò)展機(jī)制,可以用于對(duì)資源創(chuàng)建進(jìn)行攔截和注入處理,我們可以借助它優(yōu)雅地完成對(duì)lxcfs文件的自動(dòng)化掛載。
注: 阿里云Kubernetes集群,已經(jīng)默認(rèn)開啟了對(duì) Initializer 的支持,如果是在自建集群上進(jìn)行測(cè)試請(qǐng)參見(jiàn)文檔開啟相應(yīng)功能
其 manifest 文件如下
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: lxcfs-initializer-default namespace: default rules: - apiGroups: ["*"] resources: ["deployments"] verbs: ["initialize", "patch", "watch", "list"] --- apiVersion: v1 kind: ServiceAccount metadata: name: lxcfs-initializer-service-account namespace: default --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: lxcfs-initializer-role-binding subjects: - kind: ServiceAccount name: lxcfs-initializer-service-account namespace: default roleRef: kind: ClusterRole name: lxcfs-initializer-default apiGroup: rbac.authorization.k8s.io --- apiVersion: apps/v1beta1 kind: Deployment metadata: initializers: pending: [] labels: app: lxcfs-initializer name: lxcfs-initializer spec: replicas: 1 template: metadata: labels: app: lxcfs-initializer name: lxcfs-initializer spec: serviceAccountName: lxcfs-initializer-service-account containers: - name: lxcfs-initializer image: registry.cn-hangzhou.aliyuncs.com/denverdino/lxcfs-initializer:0.0.2 imagePullPolicy: Always args: - "-annotation=initializer.kubernetes.io/lxcfs" - "-require-annotation=true" --- apiVersion: admissionregistration.k8s.io/v1alpha1 kind: InitializerConfiguration metadata: name: lxcfs.initializer initializers: - name: lxcfs.initializer.kubernetes.io rules: - apiGroups: - "*" apiVersions: - "*" resources: - deployments
注: 這是一個(gè)典型的 Initializer 部署描述,首先我們創(chuàng)建了service account lxcfs-initializer-service-account,并對(duì)其授權(quán)了 "deployments" 資源的查找、更改等權(quán)限。然后我們部署了一個(gè)名為 "lxcfs-initializer" 的Initializer,利用上述SA啟動(dòng)一個(gè)容器來(lái)處理對(duì) "deployments" 資源的創(chuàng)建,如果deployment中包含 initializer.kubernetes.io/lxcfs為true的注釋,就會(huì)對(duì)該應(yīng)用中容器進(jìn)行文件掛載
我們可以執(zhí)行如下命令,部署完成之后就可以愉快地玩耍了
kubectl apply -f lxcfs-initializer.yaml
下面我們部署一個(gè)簡(jiǎn)單的Apache應(yīng)用,為其分配256MB內(nèi)存,并且聲明了如下注釋 "initializer.kubernetes.io/lxcfs": "true"
其manifest文件如下
apiVersion: apps/v1beta1 kind: Deployment metadata: annotations: "initializer.kubernetes.io/lxcfs": "true" labels: app: web name: web spec: replicas: 1 template: metadata: labels: app: web name: web spec: containers: - name: web image: httpd:2 imagePullPolicy: Always resources: requests: memory: "256Mi" cpu: "500m" limits: memory: "256Mi" cpu: "500m"
我們可以用如下方式進(jìn)行部署和測(cè)試
$ kubectl create -f web.yaml deployment "web" created $ kubectl get pod NAME READY STATUS RESTARTS AGE web-7f6bc6797c-rb9sk 1/1 Running 0 32s $ kubectl exec web-7f6bc6797c-rb9sk free total used free shared buffers cached Mem: 262144 2876 259268 2292 0 304 -/+ buffers/cache: 2572 259572 Swap: 0 0 0
我們可以看到 free 命令返回的 total memory 就是我們?cè)O(shè)置的容器資源容量。
我們可以檢查上述Pod的配置,果然相關(guān)的 procfs 文件都已經(jīng)掛載正確
$ kubectl describe pod web-7f6bc6797c-rb9sk ... Mounts: /proc/cpuinfo from lxcfs-proc-cpuinfo (rw) /proc/diskstats from lxcfs-proc-diskstats (rw) /proc/meminfo from lxcfs-proc-meminfo (rw) /proc/stat from lxcfs-proc-stat (rw) ...
在Kubernetes中,還可以通過(guò) Preset 實(shí)現(xiàn)類似的功能,篇幅有限。本文不再贅述了。
總結(jié)
本文介紹了通過(guò) lxcfs 提供容器資源可見(jiàn)性的方法,可以幫助一些遺留系統(tǒng)更好的識(shí)別容器運(yùn)行時(shí)的資源限制。
同時(shí),在本文中我們介紹了利用容器和DaemonSet的方式部署lxcfs FUSE,這不但極大簡(jiǎn)化了部署。也可以方便地利用Kubernetes自身的容器管理能力,支持lxcfs進(jìn)程失效時(shí)自動(dòng)恢復(fù),在集群伸縮時(shí)也可以保證節(jié)點(diǎn)部署的一致性。這個(gè)技巧對(duì)于其他類似的監(jiān)控或者系統(tǒng)擴(kuò)展都是適用的。
另外我們介紹了利用Kubernetes的擴(kuò)展機(jī)制 Initializer,實(shí)現(xiàn)對(duì) lxcfs 文件的自動(dòng)化掛載。整個(gè)過(guò)程對(duì)于應(yīng)用部署人員是透明的,可以極大簡(jiǎn)化運(yùn)維復(fù)雜度。同時(shí)利用類似的方法,我們可以靈活地定制應(yīng)用部署的行為,滿足業(yè)務(wù)的特殊要求。
阿里云Kubernetes服務(wù) 全球首批通過(guò)Kubernetes一致性認(rèn)證,簡(jiǎn)化了Kubernetes集群生命周期管理,內(nèi)置了與阿里云產(chǎn)品集成,也將進(jìn)一步簡(jiǎn)化Kubernetes的開發(fā)者體驗(yàn),幫助用戶關(guān)注云端應(yīng)用價(jià)值創(chuàng)新。
原文鏈接
閱讀更多干貨好文,請(qǐng)關(guān)注掃描以下二維碼:
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/25233.html
摘要:大家好今天我分享的主題與游戲行業(yè)相關(guān),為大家介紹的是在騰訊游戲中的應(yīng)用實(shí)踐。隨著技術(shù)的興起,我們開始調(diào)研在游戲容器化方面的應(yīng)用。也就是說(shuō),將不同游戲業(yè)務(wù)部署到同一臺(tái)母機(jī),采用綁定核的方式。在母機(jī)上架部署時(shí),創(chuàng)建設(shè)備和設(shè)備并將它們進(jìn)行關(guān)聯(lián)。 今天小數(shù)的推送內(nèi)容來(lái)自騰訊互娛高級(jí)工程師黃惠波,讓我們一起來(lái)看看吧~~~ 黃惠波,騰訊互娛高級(jí)工程師目前主要負(fù)責(zé)游戲計(jì)算資源容器化平臺(tái)的研發(fā)工作,包...
摘要:本系列文章會(huì)記錄阿里云容器服務(wù)團(tuán)隊(duì)在支持客戶中的一些心得體會(huì)和最佳實(shí)踐。阿里云服務(wù)全球首批通過(guò)一致性認(rèn)證,簡(jiǎn)化了集群生命周期管理,內(nèi)置了與阿里云產(chǎn)品集成,也將進(jìn)一步簡(jiǎn)化的開發(fā)者體驗(yàn),幫助用戶關(guān)注云端應(yīng)用價(jià)值創(chuàng)新。 showImg(https://segmentfault.com/img/bV6FTH?w=740&h=296); 隨著容器技術(shù)的成熟,越來(lái)越多的企業(yè)客戶在企業(yè)中選擇Dock...
摘要:本系列文章會(huì)記錄阿里云容器服務(wù)團(tuán)隊(duì)在支持客戶中的一些心得體會(huì)和最佳實(shí)踐。阿里云服務(wù)全球首批通過(guò)一致性認(rèn)證,簡(jiǎn)化了集群生命周期管理,內(nèi)置了與阿里云產(chǎn)品集成,也將進(jìn)一步簡(jiǎn)化的開發(fā)者體驗(yàn),幫助用戶關(guān)注云端應(yīng)用價(jià)值創(chuàng)新。 showImg(https://segmentfault.com/img/bV6FTH?w=740&h=296); 隨著容器技術(shù)的成熟,越來(lái)越多的企業(yè)客戶在企業(yè)中選擇Dock...
摘要:八年時(shí)間,阿里集團(tuán)實(shí)現(xiàn)了內(nèi)部容器化鏡像化,經(jīng)歷了幾代演進(jìn)。容器技術(shù)在阿里的演進(jìn)過(guò)程伴隨著阿里技術(shù)架構(gòu)本身的演進(jìn)。 八年時(shí)間,阿里集團(tuán)實(shí)現(xiàn)了 100%內(nèi)部容器化鏡像化,經(jīng)歷了幾代演進(jìn)。本文將從最初的架構(gòu)開始,向大家介紹下阿里內(nèi)部的容器化演化過(guò)程。 PouchContainer 現(xiàn)在服務(wù)于阿里巴巴集團(tuán)和螞蟻金服集團(tuán)的絕大部分 BU, 包括交易&中間件,B2B/CBU/ICBU,搜索廣告數(shù)據(jù)...
摘要:有贊容器化方案我們的容器化方案基于和,下面介紹一下我們?cè)诟鱾€(gè)方面遇到的問(wèn)題以及解決方案。不過(guò)對(duì)于上線來(lái)說(shuō),需要整個(gè)運(yùn)維體系來(lái)適配容器化,比如監(jiān)控發(fā)布日志等等。 前言 容器化已經(jīng)成為一種趨勢(shì),它可以解決很多運(yùn)維中的痛點(diǎn),比如效率、成本、穩(wěn)定性等問(wèn)題,而接入容器的過(guò)程中往往也會(huì)碰到很多問(wèn)題和不便。在有贊最開始做容器化是為了快速交付開發(fā)測(cè)試環(huán)境,在容器化的過(guò)程中,我們碰到過(guò)容器技術(shù)、運(yùn)維體系...
閱讀 3936·2021-11-24 09:39
閱讀 3842·2021-11-22 12:07
閱讀 1181·2021-11-04 16:10
閱讀 921·2021-09-07 09:59
閱讀 1965·2019-08-30 15:55
閱讀 1008·2019-08-30 15:54
閱讀 794·2019-08-29 14:06
閱讀 2538·2019-08-27 10:54