2023年Kubernetes最佳實踐

banq發表於2022-12-02

作為容器編排平臺,Kubernetes(K8s)具有諸多優勢。例如,K8s 在自動化方面很重要。這包括工作負載發現、自我修復和容器化應用程式擴充套件。
然而,Kubernetes 並不總是在經過一些調整後就可以投入生產。
本指南分享了您應該立即實施的關鍵 Kubernetes 最佳實踐,以提高您的 K8s 安全性、效能和成本。

1.跟上最穩定版本的步伐
一般規則是將您的 K8s 更新到最新的穩定版本。它很可能已經針對任何安全或效能問題進行了修補。幾乎肯定還會有更多基於社群或供應商提供的支援。最後,K8s 最佳實踐可以讓您避免可能危及服務交付的安全、效能和成本異常。

2. 整理你的清單
也許您發現 YAML 很難使用。然後你可以使用 yamllint,它可以在一個檔案中處理多個文件。
還有 Kubernetes 特定的 linters 可用:
您可以使用 kube-score 整理您的清單並遵循最佳實踐。Kubeval 也會檢查你的清單。但是,它只檢查有效性。Kubernetes 1.13 中 kubectl 的 dry-run 選項允許 Kubernetes 檢查但不應用您的清單。此功能允許您驗證 K8s 的 YAML 檔案。

3.版本控制配置檔案是你的朋友
將所有配置檔案(例如部署、服務和入口配置檔案)儲存在版本控制系統中。GitHub 是最流行的開源分散式版本控制平臺,但其他平臺還包括 GitLab、BitBucket 和 SourceForge。
在將您的程式碼推送到叢集之前執行此操作使您能夠跟蹤原始碼更改以及誰進行了更改。必要時,您可以快速回滾更改、重新建立或恢復叢集,以確保穩定性和安全性。

4. Git 工作流是必經之路
GitOps,或基於 Git 的工作流,是一個優秀的模型,用於自動化所有任務,包括 CI/CD 管道,Git 作為唯一的真實來源。除了提高生產力之外,GitOps 框架還可以透過以下方式為您提供幫助:

  1. 加速部署
  2. 增強錯誤跟蹤
  3. 自動化您的 CI/CD 工作流程。

最後,使用 GitOps 方法可以簡化叢集管理並加快應用程式開發。

5. 利用宣告性 YAML 檔案
編寫宣告性 YAML 檔案,而不是使用 kubectl run 等命令式 kubectl 命令。然後,使用 kubectl apply 命令,您可以將它們新增到叢集中。宣告式方法允許您指定所需的狀態,而 Kubernetes 將弄清楚如何到達那裡。
您的所有物件以及您的程式碼都可以儲存在 YAML 檔案中並進行版本控制。如果出現問題,您可以透過恢復較早的 YAML 檔案並重新應用它來輕鬆回滾部署。此外,此模型可確保您的團隊可以看到叢集的當前狀態以及隨時間對其所做的更改。

6. 明確你想要的資源請求和上限
在為請求或限制定義CPU和記憶體限制時,通常對CPU使用毫微克,對記憶體使用mebibytes或兆位元組。如果資源請求超過了你指定的限制,容器將不會在pod中執行。

當資源稀缺時,生產叢集可能在沒有資源限制和請求的情況下失敗。多餘的資源會被叢集中的pod消耗掉,增加你的Kubernetes成本。此外,如果pod消耗了太多的CPU或記憶體,而排程器無法新增新的pod,節點可能會崩潰。

7.將Pod與部署、ReplicaSets和作業結合起來
儘可能地避免使用裸露的pod。在節點發生故障時,裸露的pod不能被重新安排,因為它們沒有與部署或複製集繫結。

部署可以實現兩個目標。

  • 建立一個ReplicaSet以保持所需數量的pod。
  • 為pod定義一個替換策略,例如RollingUpdate。

除非你有一個嚴格的重啟策略。從不使用的情況下,部署幾乎總是比直接建立pod更有效率。

8.清楚地標記你的K8s資源
標籤是鍵/值對,幫助你識別Kubernetes叢集中特定資源的特徵。標籤還允許你用kubectl過濾和選擇物件,使你能夠根據特定的特徵快速識別物件。

即使你不認為你會馬上使用它們,給你的物件貼上標籤也是一個好主意。另外,儘可能多地使用描述性的標籤來區分你的團隊將要工作的資源。物件可以按所有者、版本、例項、元件、管理人、專案、團隊、保密級別、合規性方面和其他標準進行標註。

9.執行有效性探針(在這個其他探針之後)
Liveness probes定期檢查長期存在的pod的健康狀況,防止Kubernetes將流量路由到不健康的pod。Kubernetes(kubelet預設策略)會重新啟動無法透過健康檢查的pod,確保你的應用程式的可用性。

探針向pod傳送一個ping,看是否收到響應。沒有響應表明你的應用程式沒有在該pod上執行,導致探針啟動一個新的pod並在那裡執行應用程式。

還有一點。你必須先執行一個啟動探針,這是第三種型別的探針,當一個pod的啟動序列完成時,它會提醒K8s。如果一個pod的啟動探針不完整,有效性和準備性探針就不會針對它。

10.名稱空間簡化了資源管理
名稱空間協助你的團隊將叢集邏輯地劃分為子叢集。當你想在多個專案或團隊之間同時共享一個Kubernetes叢集時,這一點特別有用。名稱空間允許開發、測試和生產團隊在同一叢集內進行協作,而不會覆蓋或干擾對方的專案。

Kubernetes有三個名稱空間:預設、kube-system和kube-public。一個叢集可以支援多個名稱空間,這些名稱空間在邏輯上是獨立的,但可以相互通訊。

11.保持無狀態
無狀態的應用程式通常比有狀態的應用程式更容易管理,儘管隨著Kubernetes運營商的普及,這種情況正在改變。

無狀態的後端使剛接觸Kubernetes的團隊不再需要維護限制擴充套件性的長期執行的連線。

無狀態的應用程式也更容易按需遷移和擴充套件。

還有一件事。保持工作負載無狀態允許你使用現貨例項。

事情是這樣的。使用現貨例項的一個缺點是,AWS和Azure等供應商經常要求在短時間內歸還廉價的計算資源,這可能會擾亂你的工作負載。你可以透過使你的應用程式無狀態來規避這個問題。

12.建立你的網路策略
Kubernetes的網路策略規定了哪些流量是允許的,哪些是不允許的。這類似於在Kubernetes叢集的吊艙之間設定防火牆。無論流量如何在環境中的吊艙之間移動,只有在網路策略允許的情況下才會被允許。

在建立網路策略之前,你必須定義授權連線,並指定該策略應適用於哪些豆莢。這將過濾掉任何不符合你標準的流量。

你可以在這個資源庫中找到各種Kubernetes網路策略的例子和YAML檔案樣本。

13.設定基於角色的訪問控制
RedHat在2022年對超過300名DevOps專業人士的調查中發現了以下情況。

  • 對於55%的受訪者來說,安全問題延遲了應用程式的釋出。
  • 在繼續使用Kubernetes和容器方面,59%的人認為安全是一個主要障礙。
  • 31%的人說,安全漏洞導致了收入或客戶損失。
  • 幾乎所有的人(94%)在過去一年中至少有一次Kubernetes安全事件。

你可以使用RBAC來指定哪些使用者可以訪問哪些Kubernetes資源,例如他們可以訪問哪些叢集,誰可以進行修改,以及他們可以在多大程度上進行修改。

RBAC許可權可以透過兩種方式配置:
  • 如果你想為非名稱空間的資源設定許可權,請使用ClusterRole。
  • -按角色設定名稱空間的Kubernetes資源


14.為你的Kubernetes環境安裝防火牆
另一個重要的Kubernetes安全最佳實踐。

在叢集前面設定一個防火牆,以限制外部請求到達API伺服器,此外還有網路策略來控制叢集內的內部流量。這可以透過使用常規或埠防火牆規則來實現。

此外,確保IP地址被列入白名單,開放的埠被限制。

15.較小的映象更理想
使你的映象小而有層次。映象越小,構建速度越快,所需的儲存空間越小。透過有效地分層,一個映象的大小可以大大減少。透過從頭開始,你可以最佳化你的映象。

怎麼做?
如果你需要許多不同的元件,在一個Docker檔案中使用多個FROM語句。該設定將根據FROM命令從部署的容器中提升每一層。
該功能會生成一些部分,每個部分指的是不同的基礎映象。產生的Docker容器更小,因為它不再包括以前的層,只有你需要的元件。
 

相關文章