根據 Google 的說法,使用容器的 7 種最佳實踐

筆記。 翻譯。:原文作者是 Théo Chamley,Google 雲解決方案架構師。 在 Google Cloud 博客的這篇文章中,他提供了其公司更詳細指南的摘要,稱為“操作容器的最佳實踐” 在其中,Google 專家收集了在使用 Google Kubernetes Engine 等環境下操作容器的最佳實踐,涉及廣泛的主題:從安全性到監控和日誌記錄。 那麼根據 Google 的說法,最重要的容器實踐是什麼?

根據 Google 的說法,使用容器的 7 種最佳實踐

Kubernetes 引擎 (基於 Kubernetes 的服務,用於在 Google Cloud 上運行容器化應用程序 - 約。 翻譯) 是運行需要擴展的工作負載的最佳方法之一。 Kubernetes 如果大多數應用程序被容器化,將確保它們順利運行。 但如果您希望應用程序易於管理並希望充分利用 Kubernetes,則需要遵循最佳實踐。 它們將簡化應用程序的操作、監控和調試,並提高安全性。

在本文中,我們將列出在 Kubernetes 上有效運行容器所需了解和執行的一系列事項。 那些希望深入了解細節的人應該閱讀材料 操作容器的最佳實踐,也請關注我們的 較早的帖子 關於組裝容器。

1.使用原生容器日誌機制

如果應用程序運行在 Kubernetes 集群上,則不需要太多日誌。 您正在使用的集群中可能已經內置了集中式日誌記錄系統。 在使用 Kubernetes Engine 的情況下,這是負責的 Stackdriver 日誌記錄. (筆記。 翻譯。:如果您使用自己的 Kubernetes 安裝,我們建議您仔細查看我們的開源解決方案 - 木屋.) 讓您的生活保持簡單並使用本機容器日誌記錄機制。 將日誌寫入 stdout 和 stderr - 它們將被自動接收、保存和索引。

如果需要,您還可以將日誌寫入 JSON格式。 這種方法將使向它們添加元數據變得容易。 有了它們,Stackdriver Logging 將能夠使用此元數據搜索日誌。

2. 確保容器是無狀態且不可變的

為了使容器在 Kubernetes 集群中正常運行,它們必須是無狀態且不可變的。 一旦滿足這些條件,Kubernetes 就可以完成其工作,在需要的時間和地點創建和銷毀應用程序實體。

無狀態 意味著任何狀態(任何類型的持久數據)都存儲在容器外部。 為此,根據需要,可以使用不同類型的外部存儲: 雲存儲, 永久磁碟, Redis的, 雲端SQL 或其他託管數據庫。 (筆記。 翻譯。:請閱讀我們的文章了解更多相關信息“Kubernetes 的 Operator:如何運行有狀態應用程序”。)

不可變 意味著容器在其生命週期內不會被修改:沒有更新、補丁、配置更改。 如果您需要更新應用程序代碼或應用補丁,請創建新映像並部署它。 建議將容器配置(監聽端口、運行時環境選項等)移至外部 秘密 и 配置映射。 無需構建新的容器映像即可更新它們。 要輕鬆地使用圖像組裝創建管道,您可以使用 雲構建. (筆記。 翻譯。:我們使用開源工具來實現這些目的 DAPP.)

根據 Google 的說法,使用容器的 7 種最佳實踐
使用掛載在 pod 中的 ConfigMap 作為配置來更新 Kubernetes 中的 Deployment 配置的示例

3.避免特權容器

您不會在服務器上以 root 身份運行應用程序,對嗎? 如果攻擊者進入該應用程序,他將獲得 root 訪問權限。 同樣的注意事項也適用於不運行特權容器。 如果需要更改主機上的設置,可以為容器指定特定的設置 能力 使用選項 securityContext 在 Kubernetes 中。 如果你需要改變 系統命令, Kubernetes 有 單獨的摘要 為了這。 一般來說,盡量充分利用 在裡面- 和 sidecar 容器來執行類似的特權操作。 它們不需要可供內部或外部流量訪問。

如果您管理集群,則可以使用 Pod 安全策略 用於限制特權容器的使用。

4.避免以 root 身份運行

特權容器已經討論過,但除此之外,如果您不在容器內以 root 身份運行應用程序,那就更好了。 如果攻擊者在具有 root 權限的應用程序中發現允許執行代碼的遠程漏洞,之後他能夠通過未知的漏洞離開容器,他將獲得主機上的 root 權限。

避免這種情況的最好方法是首先不要以 root 身份運行任何東西。 為此,您可以使用指令 USER в DockerfilerunAsUser 在 Kubernetes 中。 集群管理員還可以使用以下命令配置強制行為 Pod 安全策略.

5. 使應用程序易於監控

與日誌記錄一樣,監控是應用程序管理的一個組成部分。 Kubernetes 社區中流行的監控解決方案是 普羅米修斯 - 自動檢測需要監控的 Pod 和服務的系統。 (筆記。 翻譯。: 另請參閱我們的 詳細報告 關於使用 Prometheus 和 Kubernetes 進行監控的主題。) 堆棧驅動程序 能夠監控 Kubernetes 集群,並包含自己的 Prometheus 版本用於應用程序監控。

根據 Google 的說法,使用容器的 7 種最佳實踐
Stackdriver 上的 Kubernetes 儀表板

Prometheus 希望應用程序將指標轉發到 HTTP 端點。 可用於此 普羅米修斯客戶端庫。 其他工具也使用相同的格式,例如 開放人口普查 и Istio.

6. 提供應用程序的健康狀態

生產中的應用程序管理得益於其將其狀態傳達給整個系統的能力。 應用程序正在運行嗎? 可以嗎? 您準備好接收流量了嗎? 他表現如何? 解決這個問題最常見的方法就是實施健康檢查 (健康檢查)。 Kubernetes 有兩種類型: 活性和就緒性探針.

用於活性探針 (活力檢查) 應用程序必須有一個 HTTP 端點,如果它可以正常工作並且滿足其基本依賴性,則該端點會返回“200 OK”響應。 用於就緒探針 (服務準備情況檢查) 如果應用程序處於健康狀態、初始化步驟已完成並且任何有效請求都不會導致錯誤,則應用程序必須有另一個返回“200 OK”響應的 HTTP 端點。 僅當應用程序根據這些檢查準備就緒時,Kubernetes 才會將流量路由到容器。 如果活躍狀態和就緒狀態之間沒有差異,則可以合併兩個端點。

您可以在 Google 開發者倡導者 Sandeep Dinesh 的相關文章中閱讀更多相關內容:“Kubernetes 最佳實踐:使用就緒性和活性探針設置運行狀況檢查“。

7. 仔細選擇您的鏡像版本

大多數公共和私人圖像使用類似於中描述的標記系統 構建容器的最佳實踐。 如果圖像使用接近的系統 語義版本控制,有必要考慮標記的細節。 例如,標籤 latest 可以頻繁地從一個圖像移動到另一個圖像 - 如果您需要可預測和可重複的構建和安裝,則不能依賴。

您可以使用標籤 X.Y.Z (它們幾乎總是不變),但在這種情況下,請跟踪圖像的所有補丁和更新。 如果您使用的圖像有標籤 X.Y,這是一個中庸之道的好選擇。 通過選擇它,您將自動接收補丁,同時依賴應用程序的穩定版本。

譯者PS

另請閱讀我們的博客:

來源: www.habr.com

添加評論