一 為啥需要為名稱空間裡面新增pod新增預設的requests和limits?
通過前面的學習我們已經知道,如果節點上面的pod沒有設定requests和limits,這些容器就會受那些設定了的控制,一旦出現節點記憶體資源超賣,這些未被設定的pod則會優先被kubernetes清除,所以對於每個pod而言,都應當給設定requests和limits值是個不錯的選擇。
1.1 介紹limitRange資源
limitRange不僅支援使用者給名稱空間裡面的pod每種資源配置最大最小值,甚至還會在沒有顯性的申明下,還會給容器新增系統的預設配值,更詳細的描述如圖所示
- 圖中很好的顯示了,當建立podA的時候,由於裡面的requests和Limits值超過了LimitRange的預設定,所以無法成功的建立
- 而在建立pod B的時候由於沒有設定預設的requests和limits的值在,則准入外掛會根據預設值為它新增這2項
- 如果名稱空間裡面沒有LimitRange的話,當pod申請的資源大於節點的資源的時候API伺服器還是會接收這個請求,但是卻無法進行排程
- limitRange資源引數limit的作用物件始終是每個獨立的pod,容器或者是其他型別物件,始終不會是某個名稱空間的limits總和,實際上總和是由ResourceQuota物件來指定
1.2 建立一個LimitRange物件
apiVersion: v1 kind: LimitRange metadata: name: example spec: limits: - type: Pod min: cpu: 50m memory: 5Mi max: cpu: 1 memory: 1Gi - type: Container defaultRequest: cpu: 100m memory: 10Mi default: cpu: 200m memory: 100Mi min: cpu: 50m memory: 5Mi max: cpu: 1 memory: 1Gi maxLimitRequestRatio: cpu: 4 memory: 10 - type: PersistentVolumeClaim min: storage: 1Gi max: storage: 10Gi
- LimitRange中以type為分類可以限制各種各種型別的資源,第一項限制了pod中容器requests和limits之和最大值和最小值區間
- 第二項設定了pod中每個容器在沒有配置的時候預設新增的requests和limits的值以及每個容器的記憶體以及cpu最小最大值,和最大值與最小值的比值限制等
- 並且可以限制pvc的最大值以及最小值
- 也可以單獨的將這些type進行拆分,之後pod在通過API的准入外掛的時候,會將所有的這些type合併起來
- 如果在修改了LimitRange之後,之前叢集已經建立的pod規則不會收到影響(這裡有個疑問,如果pod在LimitRange資源建立之前就已經好了,後來由於某種原因需要重新排程,並且還是沿用之前pod的requests和limits,我覺得還是會受到影響)