生產環境中的 Kubernetes 最佳實踐

DevOps 從提出到現在,已經走過了一段很長的路。包括 Docker 和 Kubernetes 在內的多種平臺也已經幫助企業用前所未有的速度實現了軟件應用的交付。同時,隨着應用的容器化構建和發佈比率不斷上升,作爲事實上的容器編排工具,Kubernetes 在企業用戶中備受歡迎和廣泛認可。

Kubernetes 具有支持伸縮、零中斷部署、服務發現、自動更迭和自動回滾等卓越功能特性。在管理大規模容器部署方面,Kubernetes 因支持資源和工作負載的靈活分配能力,而成爲了企業的必選工具,在生產環境中廣泛應用。但與此同時,Kubernetes 的應用需要操作人員花許多時間來熟悉和掌握它,存在一定技術門檻。鑑於目前許多公司都希望在生產中使用 Kubernetes,因此有必要率先梳理這方面的最佳實踐。在本文中,我們將介紹 Kubernetes 在生產環境中的一些最佳實踐。

生產環境中 Kubernetes 表現


根據 Garner 的預測,到 2022 年時,全球超過 75% 的組織將在生產環境中運行容器化應用。這個比率在當前還不足 30%,而預計到 2025 年時,這個比率將在 2022 年的基礎上,繼續增長到 85%。快速增長的一個主要原因是雲原生的軟件應用在基礎設施自動化、DevOps、專業操作技能方面的需求越來越強烈,而且這些工具和技術在企業的 IT 組織中往往很難找到。

其次,業界普遍認爲在生產環境中運行容器並不容易,需要大量的計算資源和相關工作投入。目前市場上有多款容器編排平臺產品可供選擇,但已經獲得了主要雲提供商的支持和認可的平臺只有 Kubernetes。

再次,Kubernetes、容器化和微服務給企業用戶帶來的技術受益的同時,也帶來了新的安全挑戰。Kubernetes 的 Pod 具備在所有基礎設施類之間快速切換的能力,從而導致更多的內部流量和與之相關的安全風險,加上 Kubernetes 被攻擊面往往比我們預期的更大,以及 Kubernetes 的高度動態和臨時的環境與原有安全工具的融合差距等因素,可以預測使用 Kubernetes 並非是一件容易的事情。

最後,Kubernetes 豐富的功能導致它的學習曲線複雜而陡峭,在生產環境中的操作需應儘可能小心和謹慎。企業如果沒有熟悉這方面的專業人員,可以考慮外購 Kubernetes-as-a-service(KaaS)提供商的服務,獲取 Kubernetes 最佳實踐。但假設用戶是完全依靠自己的能力,管理生產環境中的 Kubernetes 集羣,在這種情況下,理解和實現 Kubernetes 最佳實踐尤其重要,特別是在可觀察性、日誌記錄、集羣監控和安全配置等方面。

綜上所述,非常有必要開發一套 Kubernetes 管理策略,以實現在安全性、監視、網絡、容器生命週期管理和平臺選擇等方面應用最佳實踐。如下是 Kubernetes 應用管理需要重點考慮的措施。

使用服務狀態探針進行健康檢查


管理大型分佈式系統是一件複雜的工作,尤其是出現問題的時候。因此爲了確保應用的實例工作正常,配置 Kubernetes 健康檢查至關重要。通過創建自定義運行狀況檢查,可以更好地滿足用戶的環境和應用的檢測需要。服務狀態探針包括服務就緒探針和服務活性探針。

就緒探針:目的是讓 Kubernetes 知道應用程序是否準備好提供服務。Kubernetes 始終會在確認準備就緒探針通過檢測後,然後才允許向 POD 發送服務請求流量。

活性探針:目的是幫助用戶確認應用程序是否正常存活,如果應用出現了異常,Kubernetes 將啓動新的 Pod,替換異常的 Pod。

資源管理


爲單個容器指定資源需求和資源限制是一個很好的實踐。另一個好的實踐是爲不同團隊、部門、應用程序和客戶端,劃分獨立的 Kubernetes 命名空間環境。提供相對獨立的運行資源環境,減少資源使用衝突。

資源使用

Kubernetes 資源使用情況掌握了生產環境中容器 / Pod 的資源數量使用情況。因此,密切關注 Pod 和容器的資源使用情況非常重要,資源使用越多,運行成本就越高。

資源利用


運維團隊通常致力於優化和最大化 Pod 分配資源的利用百分比。資源使用情況往往也是 Kubernetes 優化程度的重要指標之一。可以說,優化最好的 Kubernetes 環境,內部運行容器的平均 CPU 利用率也是最優的。

開啓 RBAC 策略


基於角色的訪問控制(RBAC)是系統或網絡中限制用戶和應用程序的接入或訪問的一種控制方法。

Kubernetes 從 1.8 版本開始,引入了 RBAC 訪問控制技術,使用 rbac.authorization.k8s.io 程序 API 創建授權策略。RBAC 的授權使用包括開啓訪問用戶或帳戶、添加 / 刪除權限、設置規則等。它爲 Kubernetes 集羣添加了一個額外的安全層,限制哪些訪問可以到達 Kubernetes 集羣的生產環境。

集羣配置和負載均衡


生產級 Kubernetes 基礎設施通常需要具備高可用性,具備多控制節點、多 etcd 集羣等關鍵特性。此類集羣特性的配置實現通常需要藉助如 Terraform 或 Ansible 等工具實現。

通常情況下,當集羣的所有配置都完成,並創建了 Pod 時,此時的 Pod 基本都會配置有負載均衡器,用於將流量路由到適當的應用服務。但這其中的負載均衡器並不是 Kubernetes 項目的默認配置,而是由 Kubernetes Ingress 控制器的擴展集成工具提供的。

標註 Kubernetes 對象


爲 Kubernetes 的 Pod 等對象打上鍵 / 值對類型的標籤,通常可以用來標記重要的對象屬性,特別是對用戶意義重大的屬性。因此,在生產環境中使用 Kubernetes 時,不能忽視的重要實踐就是利用標籤功能,它們可以幫助實現 Kubernetes 對象的批量查詢和批量操作。同時,標籤還具有將 Kubernetes 對象組織成集羣的獨特作用,這樣做的一個最佳實踐應用就是能夠根據應用對 Pod 進行分組管理。除此之外,標籤沒有數量和內容的限制,運維團隊可以任意創建和使用。

設置網絡策略


網絡策略設置對於生產環境中的 Kubernetes 平臺非常重要。

網絡策略本質上也是一種對象,讓用戶能夠聲明和決定哪些流量是允許或禁止傳輸的。Kubernetes 能夠阻止所有不需要的和不合規的流量。因此,強烈建議 Kubernetes 將網絡策略配置作爲基本和必要的安全措施之一,執行定義和限制集羣中的網絡流量。

Kubernetes 中的每條網絡策略都被定義成一個授權連接列表。無論何時創建的網絡策略,平臺全部的 Pod 都有權利建立或接受該連接列表。簡單來說,網絡策略其實就是授權和允許連接的請求白名單,無論是 “輸入” 還是 “輸出” 到 Pod,在至少有一條網絡策略允許的情況下,到該 Pod 流量才被允許通行。

集羣監控與日誌


監控對於運行狀態的 Kubernetes 至關重要,它直接影響到平臺配置、性能和流量的安全。能夠幫助用戶及時掌握平臺狀態,執行問題診斷、確保運行合規,是平臺運行的必要功能部署。在開啓集羣監視時,必須在平臺的每一層都開啓日誌記錄,讓產生的日誌能夠執行安全、審計和性能分析。

採用無狀態應用


雖然這種觀念正隨着 Kubernetes 應用組織的增加在不斷改變,但管理和運行無狀態應用要比有狀態應用要容易很多。事實上,對於剛接觸 Kubernetes 的團隊,建議一開始就採用無狀態應用的設計。同時,還建議採用無狀態的後端程序,從而讓開發人員更有效地部署應用程序,實現服務的零停機時間。但前提是需要開發團隊確保後端沒有長時間運行的連接,不會影響到運行環境的彈性擴展。無狀態應用還被認爲具備根據業務需要進行簡便遷移和快速擴展的能力。

啓用自動擴展


Kubernetes 的服務部署擁有 3 個自動擴展能力:Pod 水平自動擴展(HPA),Pod 垂直自動擴展(VPA)和集羣自動擴展。

Pod 水平自動擴展能夠基於 CPU 的利用率,自動擴展運行應用的 Pod 數量,調整副本控制器、副本集或狀態配置。

Pod 垂直自動擴展建議爲應用設定適當的 CPU,內存的需求值和上限值。VPA 能夠根據情況,自動伸縮配置適當的資源數量。

集羣自動擴展能夠伸縮工作節點的資源池規模,從而根據當前的資源使用情況,自動調整 Kubernetes 集羣的大小。

控制運行時的資源


如果允許 Pod 從公共庫中拉取鏡像,而不知道其真正運行內容的時候,用戶應該控制所運行容器集羣的資源,以避免資源使用的失控。而如果是從受信任的註冊節點提取鏡像,則可以在註冊節點上採用控制策略,限制只允許提取安全且經過認證的鏡像。

保持持續學習


對應用程序的狀態不斷評估、學習和改進。例如,通過查看容器的歷史內存使用情況,確定可以分配更少的內存來節省成本。

重點保護核心服務


使用 Pod 優先級功能,可以爲不同的服務設置重要度。例如,可以配置 RabbitMQ Pod 的優先級高於應用程序 Pod,以獲得更好的穩定性。或爲輸入控制器 Pod 配置比數據處理 Pod 更高的重要度,以保持服務的可用性。

保證服務零停機


服務的零停機能力可以通過全方位 HA 架構,支持集羣和服務的零停機升級。從而爲客戶獲得更高的服務可用性提供了保證。使用 Pod 反親和性配置,確保多個副本 Pod 被調度到不同的節點上,從而保證計劃和非計劃的集羣節點停機不會影響服務的可用性,或使用 Pod 中斷預備能力,確保在可用成本內,保留最少的副本數量。

爲失敗指定計劃


借用一句名言來理解如果應對硬件故障。“Hardware eventually fails. Software eventually works.”(Michael Hartung)。

結論


業界共知的 Kubernetes,實際上已經是 DevOps 的標配編配平臺。生產環境中運行的 Kubernetes 環境必須具備可用性、可伸縮性、安全性、彈性、資源管理和監控等功能和性能特徵。由於許多公司都在生產中使用 Kubernetes,因此建議遵循上面提到的 Kubernetes 最佳實踐,以便順利、可靠地運維和管理應用程序。

原文鏈接:https://containerjournal.com/topics/container-management/kubernetes-best-practices-in-production/

_文章轉載:分佈式實驗室
_

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。