作者 | Herve Khg
編譯 | 如煙
出品 | 51CTO技術(shù)棧(微信號(hào):blog51cto)
Kubernetes 作為云計(jì)算領(lǐng)域的絕對(duì)主角,當(dāng)仁不讓地坐上了容器技術(shù)領(lǐng)域的“頭把交椅”。它的精髓在于,你只要在 YAML 里描述清楚應(yīng)用的樣子,剩下的一切都可以交給它來(lái)完成。
但這一切的前提是 K8s 集群的高效管理。
說(shuō)起我管理 Kubernetes 集群這三年,真可謂是一波三折、跌宕起伏。在這段充滿挑戰(zhàn)的經(jīng)歷中,我對(duì)這項(xiàng)技術(shù)有了更加深刻的了解,總結(jié)出十條我認(rèn)為最有價(jià)值的經(jīng)驗(yàn)教訓(xùn),涵蓋的內(nèi)容包括管理底層基礎(chǔ)設(shè)施、優(yōu)化部署流程、確保集群的可擴(kuò)展性和安全性的最佳實(shí)踐。
無(wú)論你是剛?cè)腴T(mén) Kubernetes 的新手,還是經(jīng)驗(yàn)豐富的專(zhuān)家,這些經(jīng)驗(yàn)都可以為管理 Kubernetes 集群提供更豐富的視角。
1、自己管理 Kubernetes 底層基礎(chǔ)設(shè)施?真的沒(méi)必要
花費(fèi)大量時(shí)間管理底層基礎(chǔ)設(shè)施,或許可以讓你成為kube-api、kube-apiserver、kubelet、etcd、kube-proxy 等領(lǐng)域的專(zhuān)家,但這對(duì)于業(yè)務(wù)而言可能是事倍功半。
想要更高效地管理 Kubernetes 集群,只要將這個(gè)任務(wù)交給合適的云服務(wù)廠商就行。
2、使用代碼部署 Kubernetes 基礎(chǔ)設(shè)施
不要在控制臺(tái)上進(jìn)行任何集群操作,特別是不要抱著“在操作臺(tái)修復(fù)問(wèn)題后,我馬上就更新代碼”的僥幸心理。
3、避免過(guò)度使用您無(wú)法完全控制的Helm Chart
雖然Helm Chart 提供了一種更加簡(jiǎn)單的方式來(lái)打包和分發(fā) Kubernetes 應(yīng)用,不需要為了編寫(xiě) YAML 絞盡腦汁。但也要注意,還是要理解 values.yaml 文件中的每個(gè)變量并避免使用默認(rèn)值。
4、Kubernetes 不適合直接遷移
不要讓 Kubernetes 適應(yīng)你的應(yīng)用,而是要讓?xiě)?yīng)用適應(yīng) Kubernetes。所以你需要重新調(diào)整舊的應(yīng)用程序,確保能夠與云兼容。如果無(wú)法重新編碼應(yīng)用程序,也可以繼續(xù)使用舊的虛擬機(jī)。
5、是否要安裝服務(wù)網(wǎng)格?
非必要不安裝服務(wù)網(wǎng)格。那如何判斷是否需要安裝服務(wù)網(wǎng)格呢?可以問(wèn)自己兩個(gè)問(wèn)題:
一是集群中的應(yīng)用程序可以相互通信嗎?
二是集群中的應(yīng)用程序之間的交換是否需要被保護(hù)?
如果這兩個(gè)問(wèn)題的答案都是肯定的,那么就需要安裝服務(wù)網(wǎng)格。
6、不要使用多種工具
Kubernetes 提供了大量的輔助工具,可以幫助你更好地管理集群,包括 argocd, lens, k9s, keda, krew, kubectx, kubens, kail等。但不要依賴太多工具,合適的 kubectl 就能滿足 90%的需求。
以我的經(jīng)驗(yàn)來(lái)說(shuō),一般只選擇 kubectx、kubens、k9s 這幾種工具,這樣管理集群的效率更高。
7、務(wù)必定義分配給 pod 的資源限制
這樣做可以防止因某些 pod 過(guò)于貪婪致使編碼或配置不當(dāng)?shù)膽?yīng)用程序吞噬所有集群資源,最終導(dǎo)致應(yīng)用程序一個(gè)接一個(gè)關(guān)閉的風(fēng)險(xiǎn)。這也是對(duì) Helm Chart 保持警惕并始終檢查完美包裝背后的清單源代碼的原因之一。
8、避免在 pod 中保留數(shù)據(jù)
如果確實(shí)難以實(shí)現(xiàn),那么最好安裝在 NAS上而不是磁盤(pán)上。否則你會(huì)發(fā)現(xiàn)部署中的某些 pod 無(wú)權(quán)訪問(wèn)持久資源。
因?yàn)橛脖P(pán)只能掛載在一個(gè)節(jié)點(diǎn)上,所以如果你的 pod 分布在多個(gè)節(jié)點(diǎn)上,同一節(jié)點(diǎn)上的 pod 會(huì)看到相同的數(shù)據(jù),而其他節(jié)點(diǎn)上的 pod 則看不到數(shù)據(jù)。使用類(lèi)似 EFS 這樣的 NAS 類(lèi)型安裝,就能避免這個(gè)問(wèn)題。
9、配置HPA
如果你想停止像以前那樣工作,并受益于Kubernetes根據(jù)需求自動(dòng)管理資源利用率的能力,就需要在所有應(yīng)用程序項(xiàng)目上配置HPA(水平 pod 自動(dòng)縮放器)。
10、不要害怕改變
每四個(gè)月就應(yīng)該升級(jí)一次集群版本,一年下來(lái)大概要升級(jí)三次。有些升級(jí)更新是透明的,但通常也會(huì)帶來(lái)一些影響。
為了做好更加充分的更新準(zhǔn)備,我覺(jué)得你需要重新回顧一下發(fā)行說(shuō)明并多參考一下其他專(zhuān)家的經(jīng)驗(yàn)。
11、寫(xiě)在最后
本文主要分析了 K8s 集群管理必須要考慮的十大要點(diǎn),主要包括底層基礎(chǔ)設(shè)施的部署和管理、Helm Chart 的使用、服務(wù)網(wǎng)格的安裝、Kubernetes 工具的選擇、 定義 pod 的資源限制等。但在實(shí)際工作中,往往可能需要同時(shí)管理多個(gè)集群,情況也更加復(fù)雜。所以有些要點(diǎn)在實(shí)際操作過(guò)程中是可以忽略的,但還有些“坑”是需要自己格外注意的。