iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 27
0
Software Development

K8S - 30天從擦槍到提槍上陣學習筆記。系列 第 27

day27 Resource Quotas and Limit Ranges

Resource Quotas

K8s 會透過coontainer, pod 等對象發出資源請求或消費compute resources, 預設可使用的compute resources沒有限制, 目前支援CPUMEM的資源配置;CPU屬於可壓縮類型的資源, 可以按照需求收縮, MEM則屬於不可壓縮的資源, 壓縮可能會造成無法預期的錯誤。管理員可以在每個 Namespace 創建多個Resource Quotas, k8s cluster會隨時監控這些資源的使用狀況, 確保資源用量不超過限制。

  • Compute Resource Quota 支援的類型:

    k8s上的對象可以透過設定requests 屬性定義資源可用值, 確保在需要時有足夠的資源可以使用, 以及設定limits屬性用來限制資源的最大可用值

    • limits.cpu: 所有Pod總共能使用的CPU限額總量上限, 不能超過

    • limits.memory: 所有Pod總共能使用的MEM限額總量上限, 不能超過

    • requests.cpu: 所有Pod設定的CPU需求總量上限

    • requests.memory: 所有Pod設定的MEM需求總量上限

      • CPU: K8s 上一單位的CPU等於虛擬機上的一顆CPU的概念或是實體機上的一顆邏輯CPU, 它支援分數計量方式, 1 core 等於 1000 millicores的概念
      • MEM:k8s 上Mem的單位和平常使用的單位相同, 可以使用 E、T、P、G、M、K作為單位後綴
  • Storage Resource Quota 支援的類型:

    可以根據相關的Storage Class 進行限制。

    • requests.storage: 所有PVC總共能使用的總量上限, 不能超過
    • persistentvolumeclaims: Namespace底下允許存在的PVC數量總數
    • storage-class-name.storageclass.storage.k8s.* io/requests.storage: storage-class-name關聯的相關PV總共能使用的總量上限, 不能超過
    • storage-class-name.storageclass.storage.k8s.io/persistentvolumeclaims: Namespace底下storage-class-name關聯的相關PV允許存在的數量總數

根據 PriorityClass設置 Resource Quotas

Pod 配置YAML時可以使用字段scopeSelector制定Pod的資源使用優先順序, scopeSelector有三個設定可選:low, medium, high

  • 配置YAML範例官網範例
      apiVersion: v1
      kind: List
      items:
      - apiVersion: v1
        kind: ResourceQuota
        metadata:
          name: pods-high
        spec:
          hard:
            cpu: "1000"
            memory: 200Gi
            pods: "10"
          scopeSelector:
            matchExpressions:
            - operator : In
              scopeName: PriorityClass
              values: ["high"]
      - apiVersion: v1
        kind: ResourceQuota
        metadata:
          name: pods-medium
        spec:
          hard:
            cpu: "10"
            memory: 20Gi
            pods: "10"
          scopeSelector:
            matchExpressions:
            - operator : In
              scopeName: PriorityClass
              values: ["medium"]
      - apiVersion: v1
        kind: ResourceQuota
        metadata:
          name: pods-low
        spec:
          hard:
            cpu: "5"
            memory: 10Gi
            pods: "10"
          scopeSelector:
            matchExpressions:
            - operator : In
              scopeName: PriorityClass
              values: ["low"]
    

Limit Ranges

Limit Ranges 是在Namespace底下限制資源分配策略的對象, 提供的限制有

  • 針對每個Pod或Container限制最小和最大資源使用量
  • 針對PersistentVolumeClaim限制最大和最小儲存空間
  • 針對特定資源控制申請和限制的比例
  • 設定針對compute resources的預設值, 並主動在運行時將設定值注入到多個Container。

管理員在創建Namespace時可以給訂一個LimitRange, 用戶在Namespace底下創建或更新資源時一旦違反了LimitRange的限制, 則該次請求就會失敗; 當Namespace啟用了LimitRange對CPU 和MEM的限制, 用戶就必須指定對應的requestslimits, 若未指定也會造成請求失敗; LimitRange只會規範新創建的資源, 正在運行中資源則不受影響。

今日小結

今天就這樣。


上一篇
day 26 HELM
下一篇
day28 Scheduling Framework
系列文
K8S - 30天從擦槍到提槍上陣學習筆記。30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言