1. 程式人生 > >kubernetes資源管理

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對本機程序的資源控制,下節原理將會介紹這一部分的過程。

餘下文章,請關注公眾號,繼續閱讀哈