1. 程式人生 > >越來越穩!Kubernetes 1.8.0 版本釋出

越來越穩!Kubernetes 1.8.0 版本釋出

本文為 K8sMeetup中國社群、Caicloud 工程師 翻譯和校稿:鄧德源、任玉泉、鄭佳金、郭維、包夢江、侯星輝、蔡通、鄭文彪、楊朝樂、劉搏

Kubernetes 1.8 被定位為穩定版本,社群主要投入在穩固已有的功能上。穩定性提升主要集中在幾個方向。應用負載相關功能已經遷移到 apps/v1beta2,意味著功能已經基本趨於穩定,很有可能會直接成為 v1 版本。安全相關的核心功能 RBAC 升級至 v1,並且高階審計功能升級至 beta,日趨成熟。節點層面在 1.8 中持續集中在提高底層穩定性,儘管同時有部分新功能推出。

釋出穩定版並不意味著 Kubernetes 停止新功能的的開發,實際上在

Kubernetes 1.8 中有非常多新功能釋出,部分功能甚至是“里程碑”式的功能;我們可以從這些功能看到 Kubernetes 的長期發展情況。

Cluster Lifecycle 層面對 kubeadm 添加了 self-hosted 功能,意味著可以將 Kubernetes 執行在 Kubernetes 上,即自舉。自舉被認為是系統”優雅”的一種體現,實際上 Kubernetes 在很早期就開始嘗試自舉,現在 kubeadm 直接新增此功能,無疑是更近一步。另外,儘管沒有對外發布,kubeadm 社群也一直在嘗試直接部署高可用(HA)Kubernetes 叢集。可以預見 kubeadm 在會進一步解決 Kubernetes 最為詬病的部署問題,降低使用門檻。

儲存功能的更新是本次釋出更新相對較多的模組,也是才雲科技非常重視並且持續投入的小組。首先,Kubernetes 的儲存模型已經穩定,在 1.8 的釋出中開始增加更多的擴充套件性和附加功能,例如支援掛載選擇,支援 StorageClass 引數化等。快照、擴容、本地儲存無疑是儲存模組本次釋出的亮點,儘管目前都是 alpha,甚至是 pre-alpha。由於檔案系統擴容方案暫未統一,擴容在本次釋出中只支援 GlusterFS,但才雲科技已經在 ceph、cinder 上進行了 prototype,相信在 1.9 中可以在社群中推出。本地臨時儲存在經過 1.7 和 1.8 兩次迭代已經處於穩定的 alpha 版本,後續方案不會再改變,我們會持續增強其穩定性。本地持久化儲存由於需要與排程討論設計,進展較慢。快照現在處於 prototype 階段,Kubernetes 對使用中的 Volume 快照會出現不一致的情況。

另外一個值得注意的情況是 SIG 的融合。目前,Kubernetes Node、Storage、Scheduling 等小組在合作形成 Resource Group,旨在使 Kubernetes 能夠支援更多型別的應用。Auth、Node 等小組合作成立 Container Identity Group,確保容器在對外通訊時的安全、可靠。在各個小組的合作下,Kubernetes 現在提出了 Device Plugin、CPU Manager、HugePage、Resource Claas,可以支援多樣化的硬體。Kubernetes 1.8 是此類 Group 的成立後的首次較大範圍功能釋出,期待後續更多的進展。

下面看一下 Kubernetes 1.8 中都有哪些釋出內容。

釋出主題

Kubernetes 通過興趣小組(SIG)管理社群與開發,下面根據興趣小組來解讀 Kubernetes 1.8 的釋出內容。

SIG Apps

SIG Apps 的工作集中在 Kubernetes API 上,提供多種管理不同型別應用的基本工具。

在 1.8 的釋出版本中,SIG Apps 將應用相關的一些 API 遷移到了 apps/v1beta2,包括 DaemonSet,Deployment,ReplicaSet 和 StatefulSet。在 apps/v1beta2 中,也有部分內容被棄用或者行為發生變更,這樣做的目的在於給開發者提供一個穩定且一致的 API 集合,方便開發者基於 Kubernetes 構建應用。在後續的釋出中,SIG Apps 會逐步推動該版本走向穩定版本。

SIG Auth

SIG Auth 負責 Kubernetes 認證,授權和叢集安全策略相關的工作。

在 Kubernetes 1.8 中 SIG Auth 主要專注於穩定之前的釋出中引入的功能。RBAC(基於角色的訪問控制)功能已經提升到 v1,advanced auditing (高階審計)功能已經發布 beta 版本。Encryption of resources at rest (靜態資源加密)功能依舊是 alpha 版本,開始嘗試整合外部的金鑰管理系統。

SIG Cluster Lifecycle

SIG Cluster Lifecycle 負責部署升級和刪除叢集的使用者體驗。

在 1.8 釋出中,SIG Cluster Lifecycle 繼續關注於擴充套件 kubeadm 的功能,它既是一個面向使用者的叢集管理工具,也作為一個構建單元提供給高層次的系統。從 1.8 版本開始,kubeadm 支援一個新的升級命令,並且對叢集控制組件的 self hosting 提供 alpha 支援。

SIG Node

SIG Node 負責 Pod 和 Host 主機之間資源互動的元件,以及管理節點上 Pod 的生命週期

對於 1.8 版本,SIG Node 繼續專注於支援更廣泛的工作負載型別,包括支援硬體和對效能敏感的工作負載,如資料分析和深度學習,同時不斷增強 Node 的可靠性。SIG Network 負責 Kubernetes 中的網路元件,API 和外掛。

SIG Network

SIG Network 負責 Kubernetes 中的網路元件,API 和外掛。

對於 1.8 版本,SIG Network 增強了 NetworkPolicy API,以支援 Pod 出口流量策略,以及允許策略規則匹配源或目標 CIDR 的匹配條件。這兩個增強特性都被設計為 beta 版本。 SIG Network 還專注於改進 kube-proxy,除了當前的 iptables 和 userspace 模式,kube-proxy 還引入了一個 alpha 版本的 IPVS 模式。

SIG Storage

儲存興趣組主要包含儲存和各種儲存卷外掛。

1.8 中,儲存興趣組擴充套件了 kubernetes 儲存 API,不再只是簡單的提供可使用的卷,又新增了卷擴容和快照功能。 除了這些 alpha/prototype 特性, 儲存興趣組主要聚焦在讓使用者更好的控制他們的儲存,提供瞭如下能力:能設定臨時儲存 requests & limits ,能指定掛載選項, 暴露更多儲存指標資訊, 改善 Flex driver deployment。

SIG Scheduling

SIG Scheduling 主要負責通用排程器和排程相關元件。

在 1.8 的釋出版本中,SIG Scheduling 通過引入 Pod 優先順序和搶佔特性擴充套件了共享叢集的概念。這些特性允許在單一叢集中混合執行不同型別的應用和任務,提高了叢集的利用率和可用性。這些特性目前都是 alpha 版本。SIG Scheduling 還將逐步優化排程相關的內部 API,讓其他元件和外部排程器能夠輕鬆的使用這些 API。

SIG Autoscaling

SIG Autoscaling 主要負責彈性伸縮相關的元件,比如 Horizontal Pod Autoscaler 和 Cluster Autoscaler。

在 1.8 的釋出版本中,SIG Autoscaling 主要在提升現有元件的穩定性和功能。比如新版的 Horizontal Pod Autoscaler 將支援自定義指標,Cluster Autoscaler 提升了效能和錯誤報告能力。

SIG Instrumentation

SIG Instrumentation 負責指標的輸出和收集。

在 1.8 版本中,SIG Instrumentation 的工作重心是支援新版本 HPA API,將所依賴的 API 和元件升級到穩定版本,包括:resource metrics API,custom metrics API 和 metrics-server(metrics-server 將會在替代 heapster 在預設監控流水線中的作用)。

SIG Scalability

SIG Scalability 負責可擴充套件性測試,測量和改進系統性能,並回答有關可擴充套件性的問題。

對於 1.8 版本, SIG Scalability 集中於在持續整合(CI)環境中自動化大型叢集可擴充套件性測試。除了定義可擴充套件性測試的具體過程之外,SIG Scalability 還為當前可擴充套件性閾值建立了文件,並定義了跨系統的一組新的服務級別指標(SLI)和服務級別目標(SLO)。

本次釋出的scalability validation report:

https://github.com/kubernetes/features/blob/master/release-1.8/scalability_validation_report.md

主要內容

Workload API (apps/v1beta2)

Kubernetes 1.8 中添加了 apps/v1beta2,這個版本中包含了 DaemonSet,Deployment,ReplicaSet 和 StatefulSet。這些 API 將在未來的版本中逐步走向穩定。

API 的新增和遷移

  • DaemonSet,Deployment,ReplicaSet 和 StatefulSet 的當前版本是 apps/v1beta2。

  • 在 apps/v1beta2 中,StatefulSet 增加了 Scale 子資源。

  • apps/v1beta2 中的所有型別都添加了相應的 Condition 型別。

行為變更

  • 對於 apps/v1beta2 中的所有型別,因為與 kubectl apply 和 strategic merge patch 不相容,因此 spec.selector 預設被禁用。使用者必須要顯式設定 spec.selector,並且如果 spec.selector 與 spec.template 中的 labels 不匹配,那麼這個物件是無效的。

  • 由於這些型別的控制器對於 selector 的處理方式不一致,因此在 apps/v1beta2 中這些型別的 selector 將不能修改。這個限制可能會在將來被移除,但是也有可能會保留到穩定版本。如果使用者有些程式碼依賴了可變的 selector,那麼這些程式碼可以繼續使用 apps/v1beta1 版本的型別,但是還是應該開始修改這些程式碼,不再依賴可修改的 selector。

  • Extended Resource 是除了 kubernetes.io 以外的合法域名。Extended Resource 的值必須是整數。使用者可以使用任意合法的資源名,比如 [aaa.]my-domain.bbb/ccc, 而不是繼續使用 Opaque Integer Resource。Extended Resource 不是動態的,因此在 request 和 limit 中,同樣的 Extended Resource 的值必須是相同的。

  • 由 kubeadm init v1.8 版本建立的預設的 Bootstrap Token 預設會在 24 小時後被刪除,防止叢集重要資訊洩漏。 使用者可以通過 kubeadm token create 建立一個新的 Bootstrap Token 或者通過給 kubeadm init 設定 –token-ttl 0 讓 Bootstrap Token 不會過期。預設的 Token 可以通過 kubeadm token delete 刪除。

  • kubeadm join 現在將 TLS 啟動交給 kubelet 完成,而不是自己實現該過程。kubeadm join 會將啟動用的 KubeConfig 檔案寫到 /etc/kubernetes/bootstrap-kubelet.conf。

預設值

  • StatefulSet 和 DaemonSet 的 spec.updateStrategy 預設值在 apps/v1beta2 中為 RollingUpdate。如有必要,使用者可以手動設定為 OnDelete。

  • selector 預設被禁用。

  • apps/v1beta2 中相關型別的 spec.revisionHistoryLimit 的預設值均為 10。

  • CronJob 的 spec.successfulJobsHistoryLimit 預設值為 3,spec.failedJobsHistoryLimit 的預設值為 1。

Workload API (batch)

  • CronJob 已經遷移到了 batch/v1beta1。

  • batch/v2alpha.CronJob 已經被廢棄並且在將來的版本中被移除。

  • Job 現在能通過 spec.backoffLimit 設定失敗策略。該欄位的預設值為 6。

  • batch/v2alpha1.ScheduledJobs 已經被移除。

  • Job 控制器現在分批建立 Pod,而不是之前的一次性建立。

  • Job 現在可以設定一個較短的 spec.ActiveDeadlineSeconds。

Scheduling

  • [alpha] 支援 Pod 優先順序和 PriorityClass

  • [alpha] 支援 Pod 基於優先順序的搶佔

  • [alpha] 按條件給 node 打 taint

Storage

  • [stable] 掛載選項

    • 把指定掛載選項能力從 beta 提升到穩定版

    • 在 PersistentVolume spec 中加入一個新的變數 MountOptions , 去指定掛載選項,從而代替原有的設定別名的方式

    • 在 StorageClass spec 中也加入 MountOptions,從而允許為動態提供的卷配置掛載選項。允許 k8s 管理員控制他們叢集裡面使用的掛載選項

  • [stable] 為 RWO 卷比如 iSCSI 和 FC 提供 Attach/Detach

  • [stable] 暴露儲存使用資訊

    • 通過 kubernetes metric API 暴露 PV 還剩下多少儲存空間可用

  • [stable] 卷外掛資訊

    • 通過 kubernetes metric API 暴露執行某些操作的成功或者延遲資訊,操作包括:mount/unmount/attach/detach/provision/delete

  • [stable] 修改 Azure File, CephFS, iSCSI, Glusterfs 相應的 PV spec ,從而讓他們可以引用名稱空間資源

  • [stable] 支援 iSCSI 卷外掛中定製每個卷 iSCSI initiator 名字

  • [stable] 支援 FC 卷識別符號的 WWID

  • [beta] StorageClass 回收策略

    • 執行配置 StorageClass 中的回收策略,不像以前那樣,對於動態提供的卷,預設只能是 delete

  • [alpha] 卷擴容

    • 執行通過 kubernetes API 對 volume 進行擴容

    • alpha 版本中,只對特定的 volume 進行擴容,但是並沒有做檔案系統擴容

    • alpha 版本中,只實現了 Gluster 的擴容

  • [alpha] 為本地臨時儲存提供隔離和管理功能

    • 對於新資源 ephemeral-storage, 執行設定容器的 requests/limits 和節點預留

    • ephemeral-stroage 包含了容器可能使用的所有磁碟空間

  • [alpha] 掛載空間傳播

    • pod 宣告中,為 container 的 VolumeMount 新加一項 VolumeMount.Propagation

    • 這一新增項可以被設定為 Bidirectional, 從而讓容器的某個掛載傳播到主機或者其他容器中

  • [alpha] 改進 Flexvolume 部署

    • 簡化 Flex volume driver 的部署

      • 自動發現並初始化新的 driver 檔案,而不是像以前一樣,必須要求重啟 kubelet 和 controller-manager

      • 提供一個 DaemonSet 樣例,可以被用來部署 Flexvolume drivers

  • [prototype] 卷快照

    • 允許通過 kubernetes API 觸發建立卷快照

    • 因為不支援快照前停止服務,所以,快照有可能資料不一致

    • 這個專案不在核心 kubernetes repo 裡面,在 https://github.com/kubernetes-incubator/external-storage/tree/master/snapshot 這裡

Node Component

kubelet

  • [alpha] Kubelet 現在支援使用新的 CPU 管理器替代的容器級 CPU 關聯策略。

  • [alpha] 應用程式現在可以通過在容器資源請求中使用新的 hugepages 資源來請求預先分配的 hugepages。

  • [alpha] 增加對 Kubelet 動態配置的支援

  • [alpha] 增加 CRI 校驗測試集和 CRI CLI

  • [alpha] 增加硬體裝置外掛的 API

  • [stable] 支援 CRI-O,已經通過所有的 e2es

自動擴充套件和度量指標

  • Horizontal Pod Autoscaler 對自定義度量指標升級到 beta 版本。關聯的度量指標的 APIs 升級到 v1beta1版本。升級前檢視需要的操作。

  • 推薦使用 metrics-server 作為提供資源度量指標 API 的元件。它可以部署為外掛,類似於 Heapster 的部署方式。

叢集自動擴充套件器

  • 叢集自動擴充套件器升級為 GA

  • 擴充套件叢集支援 1000 個節點

  • Pod 優雅停止時間為 10分鐘

  • 處理區域庫存和故障

  • 改良監控和錯誤報告

Auth

  • [GA] RBAC 的 API 組已經從 v1beta1 提升到 v1。沒有引入 API 相關的修改。

  • [beta] Advanced auditing 已經從 alpha 到 beta。和 alpha 相比 webhook 和 logging policy 格式相關的部分有所變化,可能需要修改。

  • [beta] Kubelet certificate rotation through the certificates API(通過證書 API 輪換證書)功能已經從 alpha 變為 beta。RBAC 針對 certificates controller(證書控制器)配置的 cluster role(叢集角色)已經被建立,用於訪問 kubelet 等的通用證書 API。

  • [beta] SelfSujectRulesReview 是一個用於讓一個使用者瞭解他在一個 namespace 下有什麼許可權的 API,已經被加入到了 authorization.k8s.io 這個 API 組內。這個批量查詢是為 UIs 根據使用者來展現和隱藏一些功能而設計的。並且這個 API 能讓使用者快速的瞭解他們自己的許可權。

  • [alpha] 基於 1.7 版本的工作之上允許對 secrets 等資源加密,將 resource 加密用的 key 儲存到外部的 KMS 系統中。該機制的實現除了支援最初基於檔案的儲存外還允許和各種 KMS 系統整合。Google Cloud KMS 外掛已經新增進來,一旦 Google 端的整合完成就能夠使用。

  • Websocket 請求現在可以通過在 websocket subprotocol base64url.bearer.authorization.k8s.io 中 設定 bearer token 來通過 API server 的認證。

  • Advanced audit 現在能夠正確的報告 impersonated user(模擬使用者)的資訊。

  • Advanced audit 策略現在支援匹配子資源和資源名稱,但是頂級資源不再能匹配子資源。舉個例子,”pods” 不再能匹配對 logs 子資源的請求。要使用 “pods/logs” 去匹配子資源。

  • 之前一個被刪除 service account 或者 bootstrapping token secret 會被認為有效直到它們真的被回收。現在當 deletionTimestamp 一被設定它們就會失效。

  • –insecure-allow-any-token 引數已經從 API server 刪除。使用這個引數的使用者應當使用 impersonation 頭替代它進行除錯。

  • NodeRestriction admission 外掛現在允許一個節點驅逐繫結到自己身上的 pods。

  • OwnerReferencesPermissionEnforcement admission 外掛為了在一個 owner reference (所有者引用)上設定 blockOwnerDeletion ,現在需要對 referenced owner(被引用的所有者)的 finalizers 子資源具有 update 許可權。

  • 在 authorization.k8s.io API 組下的 SubjectAccessReview API 現在允許提供使用者的 uid。

  • 在 kubelet 輪換它的客戶端證書後,它將關閉跟 API server 的連結去強制使用新證書握手。之前 kubelet 會保持已經存在的連線始終開啟,即使連線使用的證書已經過期並且被 API server 拒絕連線。

  • PodSecurityPolicies 現在能夠指定一個白名單,用於記錄允許作為主機資料卷的路徑。

  • API server 的認證現在快取了成功認證的 bearer token 幾秒鐘。

  • OpenID Connect 認證外掛現在能夠在 username 和 groups 兩個 claim 前新增自定義的字首,或者使用預設的字首。通過 –oidc-username-prefix 和 –oidc-groups-prefix 兩個引數設定。舉個例子,認證外掛能夠將使用者名稱為 “jane” 的使用者對映為 “google:jane”,通過設定 “google:” 這個 username 字首。

  • bootstrap token 認證外掛現在能夠在 tokens 中配置除了 system:bootstrappers 之外的 groups。

  • Advanced audit 允許記錄失敗的登陸請求。

  • kubectl auth reconcile 子命令已經被新增用來應用 RBAC 資源。當傳入一個檔案包括 RBAC roles,rolebindings,clusterroles,或者 clusterrolebindings,該命令能夠計算出覆蓋的許可權並且新增遺漏的規則。

Cluster Lifecycle

kubeadm

  • [beta] 一個新的 upgrade 子命令允許你使用 kubeadm 自動的升級一個 self-hosted 的叢集。

  • [alpha] 通過 kubeadm init 可以簡單的建立一個實驗性的 self-hosted 叢集. 通過配置 SelfHosting 特性為 true: –feature-gates=SelfHosting=true 來開啟這個功能。

    • 注意: 在下一個釋出版本,即 1.9 版本,Self-hosting 會作為部署控制組件的預設方式。

  • [alpha] 一個新的 phase 子命令支援執行 kubeadm init 流程的子任務。結合更易獲取的配置,kubeadm 現在開始容易整合到高階的部署平臺中,比如 kops 和 GKE。

    • 注意: 這個命令目前放在 kubeadm alpha phase 子命令裡,在未來版本一定會放到頂級命令中。

kops

  • [alpha] 支援裸機(非雲提供商)環境。

  • [alpha] kops 現在支援 作為服務執行。

  • [beta] GCE 支援從 alpha 升級為 beta。

Cluster Discovery/Bootstrap

  • [beta] Bootstrap Tokens 這種認證和鑑別方法進一步優化。使用 Bootstrap Tokens 去新增新的節點變的容器很多。

Multi-platform

  • [alpha] 一致的 e2e 測試套件開始支援 arm, arm64, 和 ppc64le 架構。

Cloud Providers

  • [alpha] 支援可插拔的,out-of-tree 及 out-of-core 的雲提供商的功能得到了顯著的改善。

Network

network-policy

  • [beta] 基於 CIDR 的 NetworkPlicy 策略支援。

  • [beta] NetworkPolicy 中支援 EgressRules。

kube-proxy ipvs 模式

  • [alpha] kube-proxy 支援 ipvs 模式。

 API Machinery

kube-apiserver

  • 修復了 APIService 自動註冊的問題。該問題曾影響新增或刪除 API 組的 HA API 的滾動重啟。

  • [Alpha] Kubernetes API 現在支援指定條件的列表查詢。客戶端可以指定返回結果的數量,並且如果存在更多結果,則會返回一個token令牌,用於重複呼叫直到所有的結果被檢索到。歸功於 etcd3 提供的功能,結果列表與不執行分塊的列表呼叫相同。這允許伺服器使用較少的記憶體和 CPU 響應非常大的列表。這個功能的入口是 APIListChunking 並且預設不開啟。1.9 版本,所有 informer 將會預設使用它。

  • 忽視在 ResourceQuota 中超過寬限期即被標記為刪除的pod。

Dynamic Admission Control

  • 當pod沒有初始化時,Pod spec 是變化的。API server 要求pod spec 是有效的, 即使pod未初始化。更新未初始化的pod的狀態是無效的。

  • 現在使用 alpha 的初始化功能要求開啟 Initializers 功能入口。如果啟用 Initializersadmission 外掛,此功能門將自動啟用。

  • [Action required] metadata.initializers.pending[x].name 的驗證規則是收緊的. initializer 的名稱需要包括至少三個由點分隔的段。根據構建規則,你可以用pending initializers 建立物件,並且不依賴API server去新增pending initializers。如果你這樣做,更新現有的物件和配置檔案中的initializer name,以符合新的驗證規則。

  • 即使API伺服器和節點在兩個單獨的網路中,webhook admission 外掛也能正常工作。例如,在GKE中。webhook author可以使用服務等DNS名稱作為共有名稱去生成wehhook的伺服器證書。

  • Action required:

  • 以前,為admission webhook重新生成server證書, CN的值可以被忽略。現在,必須把它設為webhook服務的DNS名稱: <service.Name>.<service.Namespace>.svc.

Custom Resource Definitions (CRDs)

  • [alpha] CustomResourceDefinition API現在可以選擇驗證CRD spec提供的基於JSON模式的自定義物件

  • 你可以在 kube-apiserver 中通過 CustomResourceValidation 功能入口啟用這個功能。

Garbage Collector

  • Garbage collector 現在支援通過 CustomResourceDefinition 或者 aggregated API servers 自定義API。Garbage collector controller 週期化的重新整理,因此,期望在新增 API 與 Garbage collector開始管理它之間,有30秒的間隔。

Monitoring/Prometheus

  • [action required] 在 prometheus 的 apiserver_request_* 系列中,WATCHLIST 作為動詞 WATCH。根據查詢的級別,一個新的 “scope” 標籤將被新增到所有的 apiserver_request_* 中,這個值可以是’cluster’, ‘resource’, 或者是 ‘namespace’。

Go Client

  • 新增客戶端垃圾郵件過濾的支援

特別感謝:Caicloud 工程師男神們的給力翻譯和校稿!

翻譯/校對:鄧德源、任玉泉、鄭佳金、郭維、包夢江、侯星輝、蔡通、鄭文彪、楊朝樂、劉搏