iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0
DevOps

今天不學遺傳學,跟著Kubernetes種豌豆系列 第 8

Day8. 環境資源有限,據理分配

  • 分享至 

  • xImage
  •  

🏞️ K8s的叢集,像是大自然的生態系統,資源有其極限,可能有多個團隊(不同namespace)共享叢集資源,也可能某顆肥貓Pod增長過頭,為了適當限制使用量,設計有不同層級的資源限制方法處理

資源配額 Resource Quotas

此物件讓管理員能根據namespace分配資源量,當超過資源使用量時,將會回傳403訊息說明違反的限制為何,若有設定關於運算資源的欄位(cpu, memory),則新建立的Pod需同步做明確的資源設定,否則可能會被駁回請求 (能用LimitRange做資源預設),設定時可以針對整個namespace或是特定object。

在大部分的K8s版本預設啟用資源配額功能,可從API server的參數查看( --enable-admission-plugins= ResourceQuota),另外需注意不同版本的K8s新增的資源限制功能

幾種不同資源配額方式

  • 運算資源: 限制特定的namespace使用總量
    • lmit.cpu或memory
    • request.cpu或memory
    • hugepages-
    • cpu
    • memory
  • 儲存資源: 限制儲存物件(storage resources)在特定namespace的使用量
    • request.storage
    • persistentvolumeclaims
    • .storageclass.storage.k8s.io/requests.storage
    • .storageclass.storage.k8s.io/persistentvolumeclaims
  • object資源: 可以針對特定物件做數量限制,格式大致為
    • count/.: 非核心類群
      • count/deployments.apps
      • count/replicasets.apps
      • count/statefulsets.apps
      • count/jobs.batch
      • count/cronjobs.batch
    • count/: 核心類群
      • count/persistentvolumeclaims
      • count/services
      • count/secrets
      • count/configmaps
      • count/replicationcontrollers
  • 範圍(scope):
    • Terminating
    • NotTerminating
    • BestEffort: 僅用於pod
    • NotBestEffort
    • PriorityClass
apiVersion: v1
kind: ResourceQuota
metadata:
name: pods-medium
spec:
hard:
  cpu: "10"
  memory: 20Gi
  pods: "10"
scopeSelector:
  matchExpressions:
  - operator : In
    scopeName: PriorityClass
    values: ["medium"]

另外還可以限制pod跨namespace的node親和性

apiVersion: v1
kind: ResourceQuota
metadata:
  name: disable-cross-namespace-affinity
  namespace: foo-ns
spec:
  hard: # 設定為0
    pods: "0"
  scopeSelector:
    matchExpressions: # 加上此scope name
    - scopeName: CrossNamespacePodAffinity
      operator: Exists

Resource requirement

預設無限制各pod使用的cpu和memoery,因此可能讓node上面的其它pod或processes卡住,可以設定請求量(request),保底資源可用量,及閾值(limit),限制不可超出的使用量,

apiVersion: v1
kind: Pod
metadata:
  name: ithome-test
spec:
  containers:
  - name: app
    image: image.rubato/master-container:v1
    resources: # resource欄位,設定requests及limits
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
  - name: log-aggregator
    image: image.rubato/helper-container:v1
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

https://ithelp.ithome.com.tw/upload/images/20240812/20168178enO9WUMPUR.png
從pod的 "State" 可以查看資源設定

Memory的單位 bytes
1G(Gigabyte) = 1 * 10^9 bytes
1M(Megabyte) = 1 * 10^6 bytes
1K(Kilobyte) = 1 * 10^3 bytes

1Gi(Gibibyte) = 2^30 bytes
1Mi(Mebibyte) = 2^20 bytes
1Ki(Kibibyte) = 2^10 bytes

CPU的單位: vCore,對應實體core或虛擬core
1 vCore = 1000m vCore


📢 當超出設定值會發生的事

  • cpu: 超過就是不能用
  • memory: OOM(out of memory), 將會導致pod終止

https://ithelp.ithome.com.tw/upload/images/20240812/20168178wS7N1ErFHl.png

資源規劃 組合1 組合2 組合3 組合4
Requests X X O O
Limits X O O X
說明 可能會資源不足,超出node負荷 資源限制,具空閒資源 資源限制,具空閒資源 確保資源用量,並加以運用資源

resourceQuota 操作指令

# 取得說明
kubectl get quota
kubectl describe quota
# 建立
kubectl create -f ./compute-resources.yaml

上一篇
Day7. hashtag怎麼下?找object不求人
下一篇
Day9. I am watching you 👀
系列文
今天不學遺傳學,跟著Kubernetes種豌豆30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言