本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

Kubernetes 1.25:本機儲存容量隔離功能達到 GA

本機暫時性儲存容量隔離在 Kubernetes 1.7 中作為 alpha 功能引入,並在 1.9 中進入 beta 階段。在 Kubernetes 1.25 中,我們很高興宣布此功能正式發布 (GA)。

Pod 使用暫時性本機儲存空間作為暫存空間、快取和日誌。本機暫時性儲存空間的生命週期不會超出個別 pod 的生命週期。它透過容器的可寫層、日誌目錄和 EmptyDir 卷公開給 pod。在此功能推出之前,存在與缺乏本機儲存空間計帳和隔離相關的問題,例如 Pod 不知道有多少本機儲存空間可用,並且無法請求保證的本機儲存空間。本機儲存空間是一種盡力而為的資源,並且 pod 可能由於其他 pod 填滿本機儲存空間而被驅逐。

本機儲存容量隔離功能允許使用者以管理 CPU 和記憶體的相同方式管理本機暫時性儲存空間。它提供 pod 之間共用儲存空間的容量隔離支援,以便可以硬性限制 pod 對共用資源的消耗,方法是如果 pod 對共用儲存空間的消耗超過該限制,則驅逐 Pod。它還允許為資源保留設定暫時性儲存空間請求。共用 ephemeral-storage 的限制和請求與記憶體和 CPU 消耗的限制和請求類似。

如何使用本機儲存容量隔離

本機暫時性儲存空間的典型配置是將所有不同種類的暫時性本機資料(emptyDir 卷、可寫層、容器映像、日誌)放入一個檔案系統中。通常,/var/lib/kubelet 和 /var/log 都位於系統的根檔案系統上。如果使用者以不同的方式配置本機儲存空間,kubelet 可能無法正確測量磁碟使用量並使用此功能。

設定本機暫時性儲存空間的請求和限制

您可以指定 ephemeral-storage 以管理本機暫時性儲存空間。Pod 的每個容器都可以指定以下一項或兩項

  • spec.containers[].resources.limits.ephemeral-storage
  • spec.containers[].resources.requests.ephemeral-storage

在以下範例中,Pod 有兩個容器。第一個容器請求 8GiB 的本機暫時性儲存空間,限制為 12GiB。第二個容器請求 2GiB 的本機儲存空間,但未設定限制。因此,Pod 總共請求 10GiB (8GiB+2GiB) 的本機暫時性儲存空間,並強制執行 12GiB 的本機暫時性儲存空間限制。它還將 emptyDir sizeLimit 設定為 5GiB。透過 pod spec 中的此設定,它將影響排程器如何決定排程 pod 以及 kubelet 如何驅逐 pod。

apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: app
    image: images.my-company.example/app:v4
    resources:
      requests:
        ephemeral-storage: "8Gi"
      limits:
        ephemeral-storage: "12Gi"
    volumeMounts:
    - name: ephemeral
      mountPath: "/tmp"
  - name: log-aggregator
    image: images.my-company.example/log-aggregator:v6
    resources:
      requests:
        ephemeral-storage: "2Gi"
    volumeMounts:
    - name: ephemeral
      mountPath: "/tmp"
  volumes:
    - name: ephemeral
      emptyDir: {}
        sizeLimit: 5Gi

首先,排程器確保排程容器的資源請求總和小於節點的容量。在這種情況下,只有當 pod 的可用暫時性儲存空間(可分配資源)超過 10GiB 時,才能將 pod 指派給節點。

其次,在容器層級,由於其中一個容器設定了資源限制,因此 kubelet 驅逐管理器將測量此容器的磁碟使用量,如果第一個容器的儲存空間使用量超過其限制 (12GiB),則驅逐 pod。在 pod 層級,kubelet 透過將該 Pod 中所有容器的限制加總來計算出整體 Pod 儲存空間限制。在本例中,pod 層級的總儲存空間使用量是所有容器的磁碟使用量加上 Pod 的 emptyDir 卷的總和。如果此總使用量超過整體 Pod 儲存空間限制 (12GiB),則 kubelet 也會將 Pod 標記為驅逐。

最後,在本範例中,emptyDir 卷將其 sizeLimit 設定為 5Gi。這表示如果此 pod 的 emptyDir 使用的本機儲存空間超過 5GiB,則 pod 將從節點中驅逐。

為本機暫時性儲存空間設定資源配額和 LimitRange

此功能為儲存空間新增了兩個資源配額。請求和限制設定了命名空間中所有容器的總請求/限制的約束。

  • requests.ephemeral-storage
  • limits.ephemeral-storage
apiVersion: v1
kind: ResourceQuota
metadata:
  name: storage-resources
spec:
  hard:
    requests.ephemeral-storage: "10Gi"
    limits.ephemeral-storage: "20Gi"

與 CPU 和記憶體類似,管理員可以使用 LimitRange 為命名空間設定預設容器的本機儲存空間請求/限制,和/或最小/最大資源約束。

apiVersion: v1
kind: LimitRange
metadata:
  name: storage-limit-range
spec:
  limits:
  - default:
      ephemeral-storage: 10Gi
    defaultRequest:
      ephemeral-storage: 5Gi
    type: Container

此外,可以指定 ephemeral-storage 以保留給 kubelet 或系統。例如,--system-reserved=[cpu=100m][,][memory=100Mi][,][ephemeral-storage=10Gi][,][pid=1000] --kube-reserved=[cpu=100m][,][memory=100Mi][,][ephemeral-storage=5Gi][,][pid=1000]。如果您的叢集節點根磁碟容量為 100Gi,在設定 system-reserved 和 kube-reserved 值後,可用的可分配暫時性儲存空間將變為 85Gi。排程器將使用此資訊根據每個節點的請求和可分配資源來指派 pod。驅逐管理器也將使用可分配資源來判斷 pod 驅逐。請參閱為系統守護進程保留計算資源以了解更多詳細資訊。

我該如何參與?

這個專案,就像所有 Kubernetes 專案一樣,是來自不同背景的眾多貢獻者共同努力的成果。

我們非常感謝 Kubernetes Storage SIG 和 CSI 社群中所有協助審查專案設計和實作的貢獻者,包括但不限於以下人員