k8s篇-POD资源管理
一、資源管理
當我們創建Pod時,可以對POD使用的資源做一些限制,比如CPU、Memory等。也可以從namespace維度,來對整個namespace的資源使用限制。
1、POD資源限制
通過pods.spec.containers.resources中limits和requests字段來控制Pod容器的資源分配。
requests定義Pod容器需要的最小資源量,limits定義Pod容器最大可用的資源上限。
在調度時,kube-scheduler只會按照requests的值進行計算。而在真正設置Cgroups限制時,kubelet則會按照limits的值來進行設置。
支持限制的資源類型:?
- CPU(單位為millicore,1Core=1000millicore)
- Memory(單位為Byte)
- Ephemeral storage(臨時存儲,單位為Byte)
- 自定義資源: 配置時必須為整數
示例:
# pod-demo.yaml apiVersion: v1 kind: Pod metadata:name: pod-demonamespace: zjmns spec:containers:- image: 'test.registry.com/myns/nginx:1.7.9'name: mywebresources:requests:cpu: 100mmemory: 200Miephemeral-storage: "2Gi"limits:cpu: 150mmemory: 200Miephemeral-storage: "4Gi"# kubectl create -f pod-demo.yaml2、Pod服務質量(QoS)配置
不同的requests和limits的設置方式,會將這個Pod劃分到不同的QoS類別當中,共有三種類別: Guaranteed, Burstable, BestEffort。
QOS劃分作用是: 當節點主機資源緊張或不足時,kubelet會把一些低優先級的,或者說服務質量要求不高的Pod優先刪除掉。
按Qos類別刪除順序是:BestEffort > Burstable > Guaranteed。若Pod的QoS類別相同時,還要根據Pod的優先級來做進一步的排序和選擇。
根據不同業務的要求和屬性來配置資源的Limits和Request,做到合理的規劃Qos Class。因為當內存不足時,BestEffort Pod會最先被kill掉,當節點發生eviction時,也會優先考慮驅逐 BestEffort的pod。
Guaranteed:?
Pod里的每一個Container都同時設置了requests和limits,且requests和limits值相等時,這個Pod就屬于Guaranteed類別。
當Pod僅設置了limits而未設置requests時,Kubernetes會自動為它設置與limits相同的requests值,所以這也屬于Guaranteed情況。
Burstable:?
Pod不滿足Guaranteed的條件(只要requests與limits中的CPU/Memory值不相等),但至少有一個Container設置了requests,這個Pod會被劃分到Burstable類別。
apiVersion: v1 kind: Pod metadata:name: pod-demo-burstablenamespace: zjmns spec:containers:- name: mywebimage: nginxresources:requests:memory: "200Mi"limits:memory: "100Mi"BestEffort:?
一個Pod既沒有設置requests,也沒有設置limits,則這個Pod的QoS類別就是BestEffort。
apiVersion: v1 kind: Pod metadata:name: test-demo-BestEffortnamespace: zjmns spec:containers:- name: mywebimage: nginx3、CPU管理策略
是指把Pod容器綁定到某個CPU的核上運行。能減少系統在CPU之間進行上下文切換的次數,從而提升容器里應用的性能。
條件是Pod必須是Guaranteed的QoS類型,并需要將requests和limits中的cpu設置為相同的值,且requests是一個整數值。
而非整數的Guaranteed/Burstable/BestEffort,它們的CPU會放在一塊,組成一個CPU share pool,然后共享,不會綁定到CPU的某個核上。
比如一個節點的CPU有8個核,有一個Guaranteed Pod的requests設置為2,則kubelet會將CPU0和CPU1分配給Guaranteed Pod去綁定,而剩下的6個核CPU2~CPU7,會被非整數的Guaranteed/Burstable/BestEffort共享,然后它們會根據不同的權重劃分時間片來使用這6個核的CPU。
示例:該Pod就會被綁定在2個獨占的CPU核上,具體是哪兩個CPU核,是由kubelet自動分配的。
apiVersion: v1 kind: Pod metadata:name: pod-demo-cpusetnamespace: zjmns spec:containers:- name: mywebimage: nginxresources:limits:memory: "200Mi"cpu: "2"requests:memory: "200Mi"cpu: "2"4、Resource Quota
ResourceQuota用于限制每個namespace的資源使用量。當K8S集群上有多個NameSapce時,很容易出現namespace之間的資源搶占。
或者說,當多用戶或團隊共享一個K8S系統時,一個用戶對應一個namsespace,那管理員可通過設置ResourceQuota來防止用戶之間的資源搶占。
當用戶超過了資源使用量,在創建資源時,會提示403 FORBIDDEN。
可針對namespace下各種資源進行設置配額,如計算資源(cpu、memory),存儲資源(pvc),對象數量(services、pods等)。
示例:
# rquota-demo.yaml apiVersion: v1 kind: ResourceQuota metadata:name: ns-quota-demonamespace: zjmns spec:hard:configmaps: "100" #最大配置文件數量限制limits.cpu: "4" #最大CPU數量限制limits.memory: 2G #最大內存限制requests.storage: 100M #最大存儲空間限制persistentvolumeclaims: "4" #最大PV數量限制pods: "4" #最大Pod數量限制secrets: "4" #最大保密字典數量限制services: "4" #最大服務數量限制services.loadbalancers: "4" #最大負載均衡型服務數量限制# kubectl create -f rquota-demo.yaml # 字段解析可參考官網:https://kubernetes.io/docs/concepts/policy/resource-quotas/Quota Scopes: 也可以為某個Quota定義一個Scope,即作用域,定義后這個Quota只會對作用域內的資源生效。
示例:
apiVersion: v1 kind: ResourceQuota metadata:name: user1-quotanamespace: user1 spec:hard:cpu: "10"memory: 20Gipods: "10"scopeSelector:matchExpressions:- operator : ExistsscopeName: NotBestEffort# 參數說明: # operator: 若scopeSelector有定義時,且scopeName值為Terminating/NotTerminating/BestEffort/NotBestEffort,則operator的值只能定義為Exists。 # scopeName:值為NotBestEffort,表示匹配所有Qos不是BestEffort的Pod。# 示例說明: # 這個ResourceQuota意思是,限制user1 namespace下的非BestEffort的Pod:cpu只能用10個核,memory只能用20G,pods只能創建10個。# 查看ResourceQuota定義了哪些限制規則 kubectl get quota -n zjmns kubectl describe quota ns-quota-demo -n zjmns# 查看某個命名空間定義了哪些ResourceQuota(一個命名空間能有多個,但只有第一個才會起作用) kubectl describe ns zjmns二、總結(如何滿足Pod資源要求)
Pod要配置合理的資源要求,包括:CPU/Memory/EphemeralStorage/GPU
通過Request和Limit來為不同業務特點的Pod選擇不同的QoS:
Guaranteed:敏感型,需要業務保障
Burstable:次敏感型,需要彈性業務
BestEffort:可容忍性業務
為每個NameSpace配置ResourceQuota來防止過量使用,保障其他人的資源可用
總結
以上是生活随笔為你收集整理的k8s篇-POD资源管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么叫工业交换机?
- 下一篇: 机器视觉光源之颜色选择攻略