本文由張磊、心貴、臨石、徙遠、衷源、潯鳴等同窗聯合撰寫。linux
Kubernetes 1.14.0 Release 已經於 3 月 25 日正式發佈。相信你也已經注意到,相比於1.13 和 1.12 版本,此次發佈包含的重要變很是多,其對應的 Release Note 的篇幅長度也創下了「新高」。git
面對這樣一份「海量信息」的 Release Note,咱們該如何從這份文檔裏進行高效的信息過濾和挖掘,幫助團隊更精準、快速的梳理出此次發佈最主要的技術脈絡呢?github
在本篇文章中,咱們將 1.14 的Release Note 按照主題進行了從新概括和梳理,按照類別對重要變動進行了技術剖析和討論。但願這種「分類解讀」的方式,可以幫助你們更好的理解 1.14 這個發佈的核心內容。數據庫
隨着1.14的發佈,Kubernetes 對windows節點的生產級支持無疑是一個重要的里程碑。具體來講,1.14 版本針對 Windows 作了大量加強;windows
而伴隨着 Windows 容器的生態正在慢慢壯大,可以在生產級別支持 Windows 節點的容器服務開始見諸各大雲廠商。阿里雲容器服務(ACK)近期已經推出了 Windows Container 的支持,提供了 linux/windows 應用混合部署的統一管理能力。網絡
參見:Support for Windows Nodes is Graduating to Stable (#116 )架構
長期以來,可以讓 Kubernetes 直接用宿主機的本地存儲設備(好比:本地 SSD 硬盤)來提供持久化數據卷(即:Local PV 功能),一直是社區裏很是強烈的一個訴求。這個緣由很容易理解:相對於遠程存儲(網絡存儲),Local PV 在時延性、易用性、穩定性和費用上具備獨特的優點,尤爲是對於相關特性比較敏感的應用,如數據庫應用和搜索引擎應用來講,有着重要的意義。less
而在 1.14 中,Local PV 終於正式宣佈 GA,爲雲上的持久化存儲選擇增長了一種重要的的可能。運維
不過,必需要明確的是, 選擇使用 Local PV,也意味着用戶必須本身承擔一些潛在的風險,這包括:分佈式
第一個問題,能夠經過好比阿里雲的 local-volume-provisioner 實現本地 SSD Nvme 實例自動建立數據捲來解決,但對於容錯性和健壯性的問題,就是比較棘手的了。
參見:Durable Local Storage Management is Now GA (#121)
Kubernetes 裏的任務優先級(priority)和搶佔機制(preemption)的目的十分明確:保證高優先級的任務能夠在須要的時候經過搶佔低優先級任務的方式獲得運行。
這其中,優先級定義了一個 Pod 在集羣中的重要程度,這個重要程度體現且僅體如今兩個地方:
(1)高優先級的Pod 在調度階段更容易被優先調度(K8s 採用隊列調度模型),注意這裏並不保證高優先級 Pod 永遠被優先調度,實際影響調度順序的因素有不少;
(2)在集羣總體負載較高時,若是出現高優先級 Pod 沒法被調度的狀況(集羣中沒有知足條件的 Node 供 Pod 運行),K8s 會啓動搶佔機制,經過搶佔已經運行的低優先級的 Pod 的方式,讓高優先級的 Pod 能夠運行起來。搶佔機制即是在這裏引入的。
搶佔機制指當調度器發現某個Pod(如 Pod-A)沒法在集羣中找到合適的節點部署時(全部節點 Predicates 所有失敗),會試圖經過刪除一些優先級低於 Pod-A 的 Pod 來「騰出空間」部署 Pod-A,這樣 Pod-A 就能夠被調度了。這樣一個「看似簡單」的需求在分佈式環境中實施起來有不少細節,例如:如何決定刪除哪一個節點的哪些 Pod、如何保證爲 Pod-A 騰出的空間不被其它 Pod 佔用、如何保證 Pod-A 不被餓死(Starvation)、如何處理有親和性需求的 Pod 調度約束、是否須要支持跨節點 Preemption 以支持某些特定的約束(例如某 Failure Domain 的反親和約束)等等。
參見:Pod Priority and Preemption in Kubernetes (#564)
在 1.14 版本以前,Kubernetes 判斷一個 Pod 是否 Ready,就是檢查這個 Pod 的容器是否所有正常運行。可是這裏有個問題,那就是容器或者說裏面的主進程 Ready,並不必定意味着這個應用副本就必定是就緒的。爲了確認 Pod 確實能夠正常可用,咱們但願給它增長一些外部指標(好比,該 Pod 須要的 Service,DNS,存儲等服務所有就緒),來反應這個Pod是否「真正」Ready。
這個特性,就是1.14 裏一個叫作「Pod Readiness Gates」、也叫作 Pod Ready ++ 的特性。它爲pod的「Ready 狀態」 提供了一個很是強大的擴展點。須要注意的是,用戶須要編寫一個外部控制器(Controller)來爲這個Pod Readiness Gates 字段對應的指標設置值。
參見:Pod Ready++ (#580)
1.14以後,Kubernetes 項目自己開始具有了原生的應用管理能力,這其中最重要的一個功能,就是 Kustomize。
Kustomize 容許用戶從一個基礎 YAML 文件,經過 overlay 的方式生成最終部署應用所需的 YAML 文件,而不是像 Helm 那樣經過字符串替換的方式來直接修改基礎 YAML 文件(模板)。這樣,在一個用戶經過 overlay 生成新的 YAML 文件的同時,其餘用戶能夠徹底不受影響的使用任何一個基礎 YAML 或者某一層生成出來的 YAML 。這使得每個用戶,均可以經過 fork/modify/rebase 這樣 Git 風格的流程來管理海量的 YAML 文件。這種 PATCH 的思想跟 Docker 鏡像是很是相似的,它既規避了「字符串替換」對 YAML 文件的入侵,也不須要用戶學習蹩腳的 DSL 語法(好比 Lua)。
在1.14以後,Kustomize 已經成爲了 kubectl 的一個內置命令。不難看到,Kubernetes 社區正在探索一種 Helm 以外的、更加 Kubernetes 原生的應用管理方法。具體效果如何,咱們不妨拭目以待。
參見:Added Kustomize as a subcommand in kubectl (#73033, @Liujingfang1)
隨着你們對 Kubernetes 愈來愈熟悉,對 kubectl 依賴也愈來愈強烈,需求也愈來愈多樣化。而在 1.14 中,kubectl 着重在如下幾個方面,提高用戶體驗,增強對平常運維能力的支持。
kubectl auth can-i --list --namespace=ns1
來查看本身在 ns1 這個 namespace 下能夠訪問哪些資源 (好比 Pod,Service 等),並有哪些操做的權限(好比 Get,List,Patch,Delete 等)了。kubectl delete xxx --all-n
amespaces
來進行統一的刪除操做了(這裏 XXX 能夠是 Pod,Services,Deployment,自定義的 CRD 等等),而且還能夠配合 -l
和 --field-selector
能夠更精確地刪除知足特定條件的資源。和以前每一個版本同樣,Kubernetes 的新版本發佈對穩定性和可靠性加強的關注一直是重中之重,下面咱們列舉出一些值得注意的修復和升級。
在 Kubernetes 的主幹功能日趨穩定以後,社區已經開始更多的關注大規模場景下 Kubernetes 項目會暴露出來的各類各樣的問題。在 v1.14 中,Kubernetes 社區從面向最終用戶的角度作出了不少優化,好比:
#72641:github.com/kubernetes/…
#64820:github.com/kubernetes/…
#73716:github.com/kubernetes/…
#72730:github.com/kubernetes/…
#73802:github.com/kubernetes/…
#74389:github.com/kubernetes/…
#72709:github.com/kubernetes/…
#73345:github.com/kubernetes/…
#74000:github.com/kubernetes/…
#71223:github.com/kubernetes/…
公衆號:金融級分佈式架構(Antfin_SOFA)