kubernetes資源管理
週末和友人聊天,友人問及“搜尋是計算密集型”,如果使用docker技術,如何資源管理?
本文來解釋一下如何使用kubernetes來進行資源分配(主要包括cpu和mem)
可能很多人還不瞭解資源設定的意義在哪,為什麼要進行資源設定?
假設有A容器和B容器分配在同一臺物理機上,兩個容器是會互相影響搶佔同一份資源的,現在經過上面簡單配置後,A容器和B容器不可能超過資源的上限閾值,也就杜絕了相互干擾。
01 如何配置
首先要明白一個過程:資源配置引數是通過kubernetes介面注入的。kubernetes會將此配置項傳遞給docker(假設kubernetes是用docker容器化技術)。docker接收配置項,並注入到linux的cgroup中。那麼這個配置項的流程就是:
kubernetes 介面設定 ----> docker 配置 ---> linux cgroup 生效
首先來看kubernetes是如何配置的。
kubernetes提供了友好簡單的配置介面,主需要在deployment的yaml中進行容器配置即可(高版本這個配置項是必須的!!),配置部分為:
Limits:
cpu: 16
memory: 20Gi
Requests:
cpu: 10m
memory: 10Mi
具體的意義本文不作詳細解釋,讀者自行Google吧。這裡只簡單說一下,limit限制了資源的上限,也就是cpu最大佔據16核,mem最大20G,request是下限,暫時理解為分配的時候需要機器至少有這個預留才能分配過去(具體後面有解釋)。
然後看轉換成docker的配置是怎樣的。
檢視docker內部引數: 命令: docker inspect 9d0e94345b74
"Isolation": "",
"CpuShares": 10,
"Memory": 21474836480,
"CgroupParent": "kubepods-burstable-pod9eb489d2_d1b6_11e8_997b_9cb654b19640.slice",
"BlkioWeight": 0,
"BlkioWeightDevice": null,
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 100000,
"CpuQuota": 1600000,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DiskQuota": 0,
"KernelMemory": 0,
"MemoryReservation": 0,
"MemorySwap": 21474836480,
"MemorySwappiness": -1,
"OomKillDisable": false,
"PidsLimit": 0,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0
上面加黑處就是轉換過去的引數。k8s到docker 如何轉換,檢視原始碼後能總結出以下的邏輯?
request 被轉化為 —cpu-share 引數
-
如果request=0 && limit !=0, —cpu-shares=limit;
-
如果 request != 0, —cpu-shares=request.
limit 被轉化為 –cpu-quota 引數
-
–cpu-preiod被強制設定為100毫秒;
-
–cpu-quota = Limit * 100毫秒,但是最小為1毫秒.
docker的引數主要有:
v1.13以後
-
–cpus 指定容器所需的cpu核數;其實現方式只是指定的對應cpu核心數相對的資源總量,容器可能會在多個核心上執行,可能涉及到上下文切換的消耗;
-
–cpu-shares 指定多個容器搶佔有限的資源時能夠分配到cpu資源的權重;需要搭配著其他兩個命令一起使用,單純使用該命令,或在沒有資源搶佔的情況下使用該命令沒有意義;
-
–cpuset-cpus 指定容器繫結到具體哪些cpu核上執行;資源隔離相對較好,但也可能存在多個容器同時被繫結到同一個核上的情況。 宿主機上有4core:
v1.13之前
--cpu-period 用來指定容器對CPU的使用要在多長時間內做一次重新分配;
理解為cpu執行的時間週期,當某個程序佔用的cpu時間=2*cpu-period ,則這個程序佔用200%cpu
--cpu-quota 用來指定在這個週期內,最多可以有多少時間用來跑這個容器。跟–cpu-shares不同的是這種配置是指定一個絕對值,而且沒有彈性在裡面,容器對CPU資源的使用絕對不會超過配置的值。
最終docker會將此引數轉換到linux內部的配置,也就是linux對本機程序的資源控制,下節原理將會介紹這一部分的過程。
餘下文章,請關注公眾號,繼續閱讀哈