本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
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 來嚴格限制其對共享資源的消耗。它還允許為資源預留設定臨時儲存請求。共享的 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 規約中的此設定將影響排程器如何做出排程 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
首先,排程器確保被排程容器的資源請求總和小於節點容量。在這種情況下,只有當節點可用的臨時儲存(可分配資源)超過 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 社群中所有幫助審查該專案設計和實現的貢獻者,包括但不限於以下人員: