本文針對Kubernetes內最基本的資源(cpu, ram, disk)的計算單位與一些實務操作,分享給自已與大家做參考。
分成以下幾點進行說明:
最基本的計算資源與計算單位如下:
註:設定Pod Spec時可以指定每個container需要多少計算資源,K8S就會在硬體資源OK的情境下,自動分配資源
並且可以透過以下方式進行限制:
spec.containers[].resources.limits.cpu
spec.containers[].resources.limits.memory
spec.containers[].resources.requests.cpu
spec.containers[].resources.requests.memory
註:這裡要注意resource limit只能套用在container不能直接套用到
接下來是最重要的計算方式,CPU比較特別:
單位:m (ex: 1000m = 1 vCore;0.5 = 500m;0.3 = 300m 依此類推)
Memory相對簡單,如下說明:
最低從byte開始,可以使用E, P, T, G, M, K or Ei, Pi, Ti, Gi, Mi, Ki
(1) 帶有resource request的Pod如何被指派資源?
每個worker node都有其cpu & memory上限,故每個Pod是怎麼被指派到特定的worker上運行的原則如下:
(2) 帶有resource limit的pod如何運作
最底層的container不是由k8s負責的
,資源限制 & 使用只能靠各個container runtime (ex. cri-o, docker....)
spec.containers[].resources.requests.cpu
的值在除1024之後,轉成core value再傳給docker,這就是docker run --cpu-shares
的效果spec.containers[].resources.limits.memory
類似在docker run --memory
的效果spec.containers[].resources.limits.cpu
的值會在除100之後,出來的結果就是container在每100ms cpu time中使用多少cpu time
(註:k8s 預設使用的quota period為100ms,最低實際可到1ms)
若resource使用額度爆掉或是已經資源不足的情況,k8S會照以下準則處理:
memory limit
,可能就會被終止;如果可以重啟,K8S就會將其重啟memory request
,當運行的worker node碰到記憶體不足就會整個pod一起趕走
cpu使用額度
,不一定會被終止(但因為有cgroup限制,實際不會超過多少)出現無法被分派到任一個worker
(1.8版本後就可以針對ephemeral storage限制空間使用)
一般ephemeral storage會使用以下二個路徑:
只要在Pod內定義emptyDir就會用到以上路徑的空間。
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
# 整個Pod一共要求4G ephemeral storage
# 空間限制8G
containers:
- name: db
image: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "password"
resources:
# DB要求 2G
requests:
ephemeral-storage: "2Gi"
# db限制 4G
limits:
ephemeral-storage: "4Gi"
- nmae: wp
image: wordpress
resources:
# wp要求 2G
requests:
ephemeral-storage: "2Gi"
# wp限制 4g
limits:
ephemeral-storage: "4Gi"apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
# 整個Pod一共要求4G ephemeral storage
# 空間限制8G
containers:
- name: db
image: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "password"
resources:
# DB要求 2G
requests:
ephemeral-storage: "2Gi"
# db限制 4G
limits:
ephemeral-storage: "4Gi"
- nmae: wp
image: wordpress
resources:
# wp要求 2G
requests:
ephemeral-storage: "2Gi"
# wp限制 4g
limits:
ephemeral-storage: "4Gi"
Q1: 帶有ephemeral-storage request的Pod要怎麼分派?
A: 每個node上的ephemeral storage可透過kubectl describe node/xxxx查詢,並找到Allocatable > ephemeral-storage即可知道有多少空間可用
Q2:帶有ephemeral-storage limit的Pod是怎麼運作的?
A: 因為帶有limit,故k8s會持續監控pod中的container磁碟使用狀況是否有超過設定限制,有的話就會被趕走
Q3:Pod一直無法成功分派出去
A: 透過kubectl describe pod/XXX,發現有PodExceedsFreeCPU or PodExceedsFreeMemory等關鍵字。
可以透過以下方式處理:可以透過以下方式處理:
* 新增資源較充足的worker node
* 砍掉不需要的pod
* 確認pod中的container所要求的資源沒有超過目前worker node所能提供的
Q4:Pod不斷被重啟,也不是App本身造成,就是資源不足所造成
A: kubectl get pod -o json => 確認是否有terminated:map & reason關鍵字
結論:
規劃整座Cluster要多少資源或是能運行多少應用服務時,了解Kubernetes的資源計算方式是必須具備的,不管是在地端私有或是使用公有雲都非常重要,尤其是公有雲,所有的資源都直接與$正相關。
當然Kubernetes的資源不會只有這樣而已,本篇是我從最基本的開始說起,畢竟大家轉進容器世界之後還是會有CPU/RAM/Disk嘛~ (笑)
最後還是感謝大家收看,您的任何回饋都會是我繼續分享的動力!