生產(chǎn)環(huán)境中的 Kubernetes 最佳實踐
公眾號關(guān)注“杰哥的IT之旅”,
選擇“星標”,重磅干貨,第一時間送達!

文章轉(zhuǎn)載:分布式實驗室
原文鏈接:https://reurl.cc/5rpavM
(版權(quán)歸原作者所有,侵刪)
DevOps從提出到現(xiàn)在,已經(jīng)走過了一段很長的路。包括Docker和Kubernetes在內(nèi)的多種平臺也已經(jīng)幫助企業(yè)用前所未有的速度實現(xiàn)了軟件應用的交付。同時,隨著應用的容器化構(gòu)建和發(fā)布比率不斷上升,作為事實上的容器編排工具,Kubernetes在企業(yè)用戶中備受歡迎和廣泛認可。
Kubernetes具有支持伸縮、零中斷部署、服務(wù)發(fā)現(xiàn)、自動更迭和自動回滾等卓越功能特性。在管理大規(guī)模容器部署方面,Kubernetes因支持資源和工作負載的靈活分配能力,而成為了企業(yè)的必選工具,在生產(chǎn)環(huán)境中廣泛應用。但與此同時,Kubernetes的應用需要操作人員花許多時間來熟悉和掌握它,存在一定技術(shù)門檻。鑒于目前許多公司都希望在生產(chǎn)中使用Kubernetes,因此有必要率先梳理這方面的最佳實踐。在本文中,我們將介紹Kubernetes在生產(chǎn)環(huán)境中的一些最佳實踐。
生產(chǎn)環(huán)境中Kubernetes表現(xiàn)
根據(jù)Garner的預測,到2022年時,全球超過75%的組織將在生產(chǎn)環(huán)境中運行容器化應用。這個比率在當前還不足30%,而預計到2025年時,這個比率將在2022年的基礎(chǔ)上,繼續(xù)增長到85%??焖僭鲩L的一個主要原因是云原生的軟件應用在基礎(chǔ)設(shè)施自動化、DevOps、專業(yè)操作技能方面的需求越來越強烈,而且這些工具和技術(shù)在企業(yè)的IT組織中往往很難找到。
其次,業(yè)界普遍認為在生產(chǎn)環(huán)境中運行容器并不容易,需要大量的計算資源和相關(guān)工作投入。目前市場上有多款容器編排平臺產(chǎn)品可供選擇,但已經(jīng)獲得了主要云提供商的支持和認可的平臺只有Kubernetes。
再次,Kubernetes、容器化和微服務(wù)給企業(yè)用戶帶來的技術(shù)受益的同時,也帶來了新的安全挑戰(zhàn)。Kubernetes的Pod具備在所有基礎(chǔ)設(shè)施類之間快速切換的能力,從而導致更多的內(nèi)部流量和與之相關(guān)的安全風險,加上Kubernetes被攻擊面往往比我們預期的更大,以及Kubernetes的高度動態(tài)和臨時的環(huán)境與原有安全工具的融合差距等因素,可以預測使用Kubernetes并非是一件容易的事情。
最后,Kubernetes豐富的功能導致它的學習曲線復雜而陡峭,在生產(chǎn)環(huán)境中的操作需應盡可能小心和謹慎。企業(yè)如果沒有熟悉這方面的專業(yè)人員,可以考慮外購Kubernetes-as-a-service(KaaS)提供商的服務(wù),獲取Kubernetes最佳實踐。但假設(shè)用戶是完全依靠自己的能力,管理生產(chǎn)環(huán)境中的Kubernetes集群,在這種情況下,理解和實現(xiàn)Kubernetes最佳實踐尤其重要,特別是在可觀察性、日志記錄、集群監(jiān)控和安全配置等方面。
綜上所述,非常有必要開發(fā)一套Kubernetes管理策略,以實現(xiàn)在安全性、監(jiān)視、網(wǎng)絡(luò)、容器生命周期管理和平臺選擇等方面應用最佳實踐。如下是Kubernetes應用管理需要重點考慮的措施。
使用服務(wù)狀態(tài)探針進行健康檢查
管理大型分布式系統(tǒng)是一件復雜的工作,尤其是出現(xiàn)問題的時候。因此為了確保應用的實例工作正常,配置Kubernetes健康檢查至關(guān)重要。通過創(chuàng)建自定義運行狀況檢查,可以更好地滿足用戶的環(huán)境和應用的檢測需要。服務(wù)狀態(tài)探針包括服務(wù)就緒探針和服務(wù)活性探針。

就緒探針:目的是讓Kubernetes知道應用程序是否準備好提供服務(wù)。Kubernetes始終會在確認準備就緒探針通過檢測后,然后才允許向POD發(fā)送服務(wù)請求流量。
活性探針:目的是幫助用戶確認應用程序是否正常存活,如果應用出現(xiàn)了異常,Kubernetes將啟動新的Pod,替換異常的Pod。
資源管理
為單個容器指定資源需求和資源限制是一個很好的實踐。另一個好的實踐是為不同團隊、部門、應用程序和客戶端,劃分獨立的Kubernetes命名空間環(huán)境。提供相對獨立的運行資源環(huán)境,減少資源使用沖突。

資源使用
Kubernetes資源使用情況掌握了生產(chǎn)環(huán)境中容器/Pod的資源數(shù)量使用情況。因此,密切關(guān)注Pod和容器的資源使用情況非常重要,資源使用越多,運行成本就越高。
資源利用
運維團隊通常致力于優(yōu)化和最大化Pod分配資源的利用百分比。資源使用情況往往也是Kubernetes優(yōu)化程度的重要指標之一。可以說,優(yōu)化最好的Kubernetes環(huán)境,內(nèi)部運行容器的平均CPU利用率也是最優(yōu)的。
開啟RBAC策略
基于角色的訪問控制(RBAC)是系統(tǒng)或網(wǎng)絡(luò)中限制用戶和應用程序的接入或訪問的一種控制方法。

Kubernetes 從1.8版本開始,引入了RBAC訪問控制技術(shù),使用rbac.authorization.k8s.io程序API創(chuàng)建授權(quán)策略。RBAC的授權(quán)使用包括開啟訪問用戶或帳戶、添加/刪除權(quán)限、設(shè)置規(guī)則等。它為Kubernetes集群添加了一個額外的安全層,限制哪些訪問可以到達Kubernetes集群的生產(chǎn)環(huán)境。
集群配置和負載均衡
生產(chǎn)級Kubernetes基礎(chǔ)設(shè)施通常需要具備高可用性,具備多控制節(jié)點、多etcd集群等關(guān)鍵特性。此類集群特性的配置實現(xiàn)通常需要借助如Terraform或Ansible等工具實現(xiàn)。

通常情況下,當集群的所有配置都完成,并創(chuàng)建了Pod時,此時的Pod基本都會配置有負載均衡器,用于將流量路由到適當?shù)膽梅?wù)。但這其中的負載均衡器并不是Kubernetes項目的默認配置,而是由Kubernetes Ingress控制器的擴展集成工具提供的。
標注Kubernetes對象?????????????????????????????????????
為Kubernetes的Pod等對象打上鍵/值對類型的標簽,通常可以用來標記重要的對象屬性,特別是對用戶意義重大的屬性。因此,在生產(chǎn)環(huán)境中使用Kubernetes時,不能忽視的重要實踐就是利用標簽功能,它們可以幫助實現(xiàn)Kubernetes對象的批量查詢和批量操作。同時,標簽還具有將Kubernetes對象組織成集群的獨特作用,這樣做的一個最佳實踐應用就是能夠根據(jù)應用對Pod進行分組管理。除此之外,標簽沒有數(shù)量和內(nèi)容的限制,運維團隊可以任意創(chuàng)建和使用。

設(shè)置網(wǎng)絡(luò)策略
網(wǎng)絡(luò)策略設(shè)置對于生產(chǎn)環(huán)境中的Kubernetes平臺非常重要。

網(wǎng)絡(luò)策略本質(zhì)上也是一種對象,讓用戶能夠聲明和決定哪些流量是允許或禁止傳輸?shù)摹ubernetes能夠阻止所有不需要的和不合規(guī)的流量。因此,強烈建議Kubernetes將網(wǎng)絡(luò)策略配置作為基本和必要的安全措施之一,執(zhí)行定義和限制集群中的網(wǎng)絡(luò)流量。
Kubernetes中的每條網(wǎng)絡(luò)策略都被定義成一個授權(quán)連接列表。無論何時創(chuàng)建的網(wǎng)絡(luò)策略,平臺全部的Pod都有權(quán)利建立或接受該連接列表。簡單來說,網(wǎng)絡(luò)策略其實就是授權(quán)和允許連接的請求白名單,無論是“輸入”還是“輸出”到Pod,在至少有一條網(wǎng)絡(luò)策略允許的情況下,到該Pod流量才被允許通行。
集群監(jiān)控與日志
監(jiān)控對于運行狀態(tài)的Kubernetes至關(guān)重要,它直接影響到平臺配置、性能和流量的安全。能夠幫助用戶及時掌握平臺狀態(tài),執(zhí)行問題診斷、確保運行合規(guī),是平臺運行的必要功能部署。在開啟集群監(jiān)視時,必須在平臺的每一層都開啟日志記錄,讓產(chǎn)生的日志能夠執(zhí)行安全、審計和性能分析。

采用無狀態(tài)應用
雖然這種觀念正隨著Kubernetes應用組織的增加在不斷改變,但管理和運行無狀態(tài)應用要比有狀態(tài)應用要容易很多。事實上,對于剛接觸Kubernetes的團隊,建議一開始就采用無狀態(tài)應用的設(shè)計。同時,還建議采用無狀態(tài)的后端程序,從而讓開發(fā)人員更有效地部署應用程序,實現(xiàn)服務(wù)的零停機時間。但前提是需要開發(fā)團隊確保后端沒有長時間運行的連接,不會影響到運行環(huán)境的彈性擴展。無狀態(tài)應用還被認為具備根據(jù)業(yè)務(wù)需要進行簡便遷移和快速擴展的能力。
啟用自動擴展

Kubernetes的服務(wù)部署擁有3個自動擴展能力:Pod水平自動擴展(HPA),Pod垂直自動擴展(VPA)和集群自動擴展。
Pod水平自動擴展能夠基于CPU的利用率,自動擴展運行應用的Pod數(shù)量,調(diào)整副本控制器、副本集或狀態(tài)配置。
Pod垂直自動擴展建議為應用設(shè)定適當?shù)腃PU,內(nèi)存的需求值和上限值。VPA能夠根據(jù)情況,自動伸縮配置適當?shù)馁Y源數(shù)量。
集群自動擴展能夠伸縮工作節(jié)點的資源池規(guī)模,從而根據(jù)當前的資源使用情況,自動調(diào)整Kubernetes集群的大小。
控制運行時的資源
如果允許Pod從公共庫中拉取鏡像,而不知道其真正運行內(nèi)容的時候,用戶應該控制所運行容器集群的資源,以避免資源使用的失控。而如果是從受信任的注冊節(jié)點提取鏡像,則可以在注冊節(jié)點上采用控制策略,限制只允許提取安全且經(jīng)過認證的鏡像。
保持持續(xù)學習
對應用程序的狀態(tài)不斷評估、學習和改進。例如,通過查看容器的歷史內(nèi)存使用情況,確定可以分配更少的內(nèi)存來節(jié)省成本。
重點保護核心服務(wù)
使用Pod優(yōu)先級功能,可以為不同的服務(wù)設(shè)置重要度。例如,可以配置RabbitMQ Pod的優(yōu)先級高于應用程序Pod,以獲得更好的穩(wěn)定性。或為輸入控制器Pod配置比數(shù)據(jù)處理Pod更高的重要度,以保持服務(wù)的可用性。
保證服務(wù)零停機
服務(wù)的零停機能力可以通過全方位HA架構(gòu),支持集群和服務(wù)的零停機升級。從而為客戶獲得更高的服務(wù)可用性提供了保證。使用Pod反親和性配置,確保多個副本Pod被調(diào)度到不同的節(jié)點上,從而保證計劃和非計劃的集群節(jié)點停機不會影響服務(wù)的可用性,或使用Pod中斷預備能力,確保在可用成本內(nèi),保留最少的副本數(shù)量。
為失敗指定計劃
借用一句名言來理解如果應對硬件故障?!癏ardware eventually fails. Software eventually works.”(Michael Hartung)。
結(jié)論
業(yè)界共知的Kubernetes,實際上已經(jīng)是DevOps的標配編配平臺。生產(chǎn)環(huán)境中運行的Kubernetes環(huán)境必須具備可用性、可伸縮性、安全性、彈性、資源管理和監(jiān)控等功能和性能特征。由于許多公司都在生產(chǎn)中使用Kubernetes,因此建議遵循上面提到的Kubernetes最佳實踐,以便順利、可靠地運維和管理應用程序。
公眾號「杰哥的IT之旅」后臺回復「搜索」即可搜索你所需要的文章;
公眾號「杰哥的IT之旅」后臺回復「wx」添加杰哥微信即可加入讀者交流群;
推薦閱讀
杰哥的另一個公眾號,主要分享關(guān)于個人成長經(jīng)歷的那點事,歡迎您的關(guān)注。

