探索Kubernetes v1.30:激動人心的新功能和升級!
共 8884字,需瀏覽 18分鐘
·
2024-04-07 12:01
興奮不?我們不都是嗎?
Kubernetes v1.30 版本帶來了一系列令人期待的更新,包括動態(tài)資源分配(DRA)的結(jié)構(gòu)化參數(shù)和節(jié)點交換內(nèi)存 SWAP 支持的改進。動態(tài)資源分配的結(jié)構(gòu)化參數(shù)增加了資源管理的透明度和效率,而節(jié)點交換內(nèi)存的改進則提高了系統(tǒng)穩(wěn)定性。
現(xiàn)在讓我們探討一下將 Kubernetes 1.30 提升到新版本的主要功能。
Kubernetes v1.30 的主要變化
1. 動態(tài)資源分配(DRA)的結(jié)構(gòu)化參數(shù) (KEP-4381[1])
動態(tài)資源分配(DRA)[2] 在 Kubernetes v1.26 中作為 alpha 特性添加。
它定義了一種替代傳統(tǒng)設(shè)備插件 device plugin API 的方式,用于請求訪問第三方資源。在設(shè)計上,動態(tài)資源分配(DRA)使用的資源參數(shù)對于核心 Kubernetes 完全不透明。這種方法對于集群自動縮放器(CA)或任何需要為一組 Pod 做決策的高級控制器(例如作業(yè)調(diào)度器)都會帶來問題。這一設(shè)計無法模擬在不同時間分配或釋放請求的效果。只有第三方 DRA 驅(qū)動程序才擁有信息來做到這一點。
動態(tài)資源分配(DRA)的結(jié)構(gòu)化參數(shù)是對原始實現(xiàn)的擴展,它通過構(gòu)建一個框架來支持增加請求參數(shù)的透明度來解決這個問題。 驅(qū)動程序不再需要自己處理所有請求參數(shù)的語義,而是可以使用 Kubernetes 預(yù)定義的特定“結(jié)構(gòu)化模型”來管理和描述資源。這一設(shè)計允許了解這個“結(jié)構(gòu)化規(guī)范”的組件做出關(guān)于這些資源的決策,而不再將它們外包給某些第三方控制器。例如,調(diào)度器可以在不與動態(tài)資源分配(DRA)驅(qū)動程序反復(fù)通信的前提下快速完成分配請求。這個版本的工作重點是定義一個框架來支持不同的“結(jié)構(gòu)化模型”,并實現(xiàn)“命名資源”模型。此模型允許列出各個資源實例,同時,與傳統(tǒng)的設(shè)備插件 API 相比,模型增加了通過屬性逐一選擇實例的能力。
示例:動態(tài)資源分配
結(jié)構(gòu)化參數(shù)增加了 Pod 資源分配的靈活性。通過更精確地定義資源請求和限制,開發(fā)人員可以優(yōu)化可用資源的使用。
在這種情況下,Pod 對一個 GPU 資源發(fā)出最小和最大請求(nvidia.com/gpu )。它還使用標(biāo)準(zhǔn)內(nèi)存資源定義來請求8GB內(nèi)存。
apiVersion: v1
kind: Pod
metadata:
name: my-gpu-app
spec:
containers:
- name: gpu-container
resources:
requests:
resource.k8s.io/nvidia.com/gpu:
type: Resource
minimum: 1
maximum: 1
resource.k8s.io/memory:
type: Resource
requests:
memory: "8Gi"
Kubernetes 1.30 中的 DRA 以其結(jié)構(gòu)化參數(shù)打開了通向更加動態(tài)和有效的資源管理環(huán)境的大門。隨著該功能的發(fā)展,我們應(yīng)該預(yù)期會有更廣泛的受眾,以及滿足各種應(yīng)用程序需求的充滿活力的第三方資源驅(qū)動程序生態(tài)系統(tǒng)的出現(xiàn)。
2. 節(jié)點交換內(nèi)存 SWAP 支持 (KEP-2400[3])
在 Kubernetes v1.30 中,Linux 節(jié)點上的交換內(nèi)存支持機制有了重大改進,其重點是提高系統(tǒng)的穩(wěn)定性。 以前的 Kubernetes 版本默認(rèn)情況下禁用了 NodeSwap 特性門控。當(dāng)門控被啟用時,UnlimitedSwap 行為被作為默認(rèn)行為。為了提高穩(wěn)定性,UnlimitedSwap 行為(可能會影響節(jié)點的穩(wěn)定性)將在 v1.30 中被移除。
更新后的 Linux 節(jié)點上的交換內(nèi)存支持仍然是 beta 級別,并且默認(rèn)情況下開啟。 然而,節(jié)點默認(rèn)行為是使用 NoSwap(而不是 UnlimitedSwap)模式。在 NoSwap 模式下,kubelet 支持在啟用了磁盤交換空間的節(jié)點上運行,但 Pod 不會使用頁面文件(pagefile)。你仍然需要為 kubelet 設(shè)置 --fail-swap-on=false 才能讓 kubelet 在該節(jié)點上運行。 特性的另一個重大變化是針對另一種模式:LimitedSwap。在 LimitedSwap 模式下,kubelet 會實際使用節(jié)點上的頁面文件,并允許 Pod 的一些虛擬內(nèi)存被換頁出去。 容器(及其父 Pod)訪問交換內(nèi)存空間不可超出其內(nèi)存限制,但系統(tǒng)的確可以使用可用的交換空間。
Kubernetes 的 SIG Node 小組還將根據(jù)最終用戶、貢獻者和更廣泛的 Kubernetes 社區(qū)的反饋更新文檔, 以幫助你了解如何使用經(jīng)過修訂的實現(xiàn)。
閱讀之前的Kubernetes 1.28:在 Linux 上使用交換內(nèi)存的 Beta 支持[4]或交換內(nèi)存管理文檔[5]以獲取有關(guān) Kubernetes 中 Linux 節(jié)點交換支持的更多詳細(xì)信息。
示例:節(jié)點內(nèi)存交換
Kubernetes 1.30 現(xiàn)在支持節(jié)點內(nèi)存交換。通過允許內(nèi)核使用節(jié)點上的交換空間進行內(nèi)存管理,這可以在施加內(nèi)存壓力時增強系統(tǒng)穩(wěn)定性。
在 Kubernetes 1.30 中,節(jié)點內(nèi)存交換功能經(jīng)過重新設(shè)計,優(yōu)先考慮穩(wěn)定性,同時提供更多控制。通過引入 LimitedSwap 代替 UnlimitedSwap,Kubernetes 提供了一種更加可控和可預(yù)測的方法來處理 Linux 節(jié)點上的交換使用情況。不要忘記在激活交換之前評估您的獨特需求并制定適當(dāng)?shù)谋O(jiān)控程序。
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
# ... other kubelet configurations
featureGates:
NodeSwap: "true"
memorySwap:
swapBehavior: LimitedSwap
3. 支持 Pod 運行在用戶命名空間 (KEP-127[6])
用戶命名空間[7] 是一個僅在 Linux 上可用的特性,它更好地隔離 Pod, 以防止或減輕幾個高/嚴(yán)重級別的 CVE,包括 2024 年 1 月發(fā)布的 CVE-2024-21626[8]。在 Kubernetes 1.30 中,對用戶命名空間的支持正在遷移到 beta,并且現(xiàn)在支持帶有和不帶有卷的 Pod,自定義 UID/GID 范圍等等!
示例:用戶命名空間可實現(xiàn)更好的 Pod 隔離 [Beta版本]
這一突破性的功能使 Pod 內(nèi)的用戶能夠?qū)ζ渖矸葸M行細(xì)粒度的控制;它將在 1.30 升級到Beta版本。它允許將主機系統(tǒng)上的各種值映射到 Pod 內(nèi)使用的 UID(用戶 ID)和 GID(組 ID)。通過大幅降低攻擊面,這種隔離方法使受感染的容器更難濫用底層主機上的特權(quán)。
apiVersion: v1
kind: Pod
metadata:
name: my-secure-pod
spec:
securityContext:
userNamespace: true
containers:
- name: my-app
image: my-secure-image:latest
4. 結(jié)構(gòu)化鑒權(quán)配置(KEP-3221[9])
對結(jié)構(gòu)化鑒權(quán)配置[10]的支持正在晉級到 Beta 版本,并將默認(rèn)啟用。 這個特性支持創(chuàng)建具有明確參數(shù)定義的多個 Webhook 所構(gòu)成的鑒權(quán)鏈;這些 Webhook 按特定順序驗證請求, 并允許進行細(xì)粒度的控制,例如在失敗時明確拒絕。配置文件方法甚至允許你指定 CEL[11] 規(guī)則,以在將請求分派到 Webhook 之前對其進行預(yù)過濾,幫助你防止不必要的調(diào)用。當(dāng)配置文件被修改時,API 服務(wù)器還會自動重新加載鑒權(quán)鏈。
你必須使用 --authorization-config 命令行參數(shù)指定鑒權(quán)配置的路徑。如果你想繼續(xù)使用命令行標(biāo)志而不是配置文件,命令行方式?jīng)]有變化。要訪問新的 Webhook 功能,例如多 Webhook 支持、失敗策略和預(yù)過濾規(guī)則,需要切換到將選項放在 --authorization-config 文件中。從 Kubernetes 1.30 開始,配置文件格式約定是 beta 級別的,只需要指定 --authorization-config,因為特性門控默認(rèn)啟用。 鑒權(quán)文檔[12] 中提供了一個包含所有可能值的示例配置。有關(guān)更多詳細(xì)信息,請閱讀鑒權(quán)文檔[13]。
5. 基于容器資源指標(biāo)的 Pod 自動擴縮容 (KEP-1610[14])
基于 ContainerResource 指標(biāo)的 Pod 水平自動擴縮容將在 v1.30 中升級為穩(wěn)定版。 HorizontalPodAutoscaler 的這一新行為允許你根據(jù)各個容器的資源使用情況而不是 Pod 的聚合資源使用情況來配置自動伸縮。 有關(guān)更多詳細(xì)信息,請參閱我們的Kubernetes 1.27:HorizontalPodAutoscaler ContainerResource 類型指標(biāo)進階至 Beta[15], 或閱讀容器資源指標(biāo)[16]。
示例:基于容器資源的 Pod 自動伸縮
通過使用此功能,可以啟用基于容器內(nèi)存或 CPU 指標(biāo)的水平 Pod 自動縮放 (HPA)。這使得可以根據(jù)容器的實際需求更精確地進行擴展。您可以通過專注于各個容器的指標(biāo)來充分利用 Kubernetes 集群的資源分配和擴展策略。
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: my-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-deployment
minReplicas: 2
maxReplicas: 5
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80
containerMetrics:
- name: web-container # Target container within the Pod
在部署過程中,HPA 會密切關(guān)注每個 Pod 使用的 CPU 資源量。HPA 將擴展部署,以在 Web 容器的所有實例中保持平均 CPU 使用率 80%,因為平均利用率設(shè)置為 80。指定要監(jiān)視 CPU 指標(biāo)的容器名稱 (web-container)在容器指標(biāo)部分。
6. 在準(zhǔn)入控制中使用 CEL (KEP-3488[17])
Kubernetes 為準(zhǔn)入控制集成了 Common Expression Language (CEL) 。這一集成引入了一種更動態(tài)、表達能力更強的方式來判定準(zhǔn)入請求。這個特性允許通過 Kubernetes API 直接定義和執(zhí)行復(fù)雜的、細(xì)粒度的策略,同時增強了安全性和治理能力,而不會影響性能或靈活性。
將 CEL 引入到 Kubernetes 的準(zhǔn)入控制后,集群管理員就具有了制定復(fù)雜規(guī)則的能力, 這些規(guī)則可以根據(jù)集群的期望狀態(tài)和策略來評估 API 請求的內(nèi)容,而無需使用基于 Webhook 的訪問控制器。 這種控制水平對于維護集群操作的完整性、安全性和效率至關(guān)重要,使 Kubernetes 環(huán)境更加健壯,更適應(yīng)各種用例和需求。有關(guān)使用 CEL 進行準(zhǔn)入控制的更多信息,請參閱 驗證準(zhǔn)入策略(ValidatingAdmissionPolicy)[18]中的 ValidatingAdmissionPolicy。
我們希望你和我們一樣對這個版本的發(fā)布感到興奮。請在未來幾周內(nèi)密切關(guān)注官方發(fā)布博客,以了解其他亮點!
引用鏈接
[1] KEP-4381: https://kep.k8s.io/4381[2] 動態(tài)資源分配(DRA): https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/dynamic-resource-allocation/[3] KEP-2400: https://kep.k8s.io/2400[4] Kubernetes 1.28:在 Linux 上使用交換內(nèi)存的 Beta 支持: https://kubernetes.io/zh-cn/blog/2023/08/24/swap-linux-beta/[5] 交換內(nèi)存管理文檔: https://kubernetes.io/zh-cn/docs/concepts/architecture/nodes/#swap-memory[6] KEP-127: https://kep.k8s.io/127[7] 用戶命名空間: https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/user-namespaces[8] CVE-2024-21626: https://github.com/opencontainers/runc/security/advisories/GHSA-xr7r-f8xq-vfvv[9] KEP-3221: https://kep.k8s.io/3221[10] 結(jié)構(gòu)化鑒權(quán)配置: https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/authorization/#configuring-the-api-server-using-an-authorization-config-file[11] CEL: https://kubernetes.io/zh-cn/docs/reference/using-api/cel/[12] 鑒權(quán)文檔: https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/authorization/#configuring-the-api-server-using-an-authorization-config-file[13] 鑒權(quán)文檔: https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/authorization/#configuring-the-api-server-using-an-authorization-config-file[14] KEP-1610: https://kep.k8s.io/1610[15] Kubernetes 1.27:HorizontalPodAutoscaler ContainerResource 類型指標(biāo)進階至 Beta: https://kubernetes.io/zh-cn/blog/2023/05/02/hpa-container-resource-metric/[16] 容器資源指標(biāo): https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale/#container-resource-metrics[17] KEP-3488: https://kep.k8s.io/3488[18] 驗證準(zhǔn)入策略(ValidatingAdmissionPolicy): https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/validating-admission-policy
推薦閱讀:
Go區(qū)不大,創(chuàng)造神話,科目三殺進來了
想要了解Go更多內(nèi)容,歡迎掃描下方??關(guān)注公眾號,掃描 [實戰(zhàn)群]二維碼 ,即可進群和我們交流~
- 掃碼即可加入實戰(zhàn)群 -
