擴展 cert-manager
了解如何針對您的叢集最佳化 cert-manager。
概述
Helm chart 和 YAML 清單中的預設值適用於一般用途。您可能需要修改組態以符合您的 Kubernetes 叢集的大小和使用情況。
設定適當的記憶體請求和限制
當憑證資源為主要使用案例時,例如當工作負載需要掛載 TLS Secret 或使用 gateway-shim 時,cert-manager 控制器的記憶體消耗將大致與包含 TLS 金鑰對的 Secret 資源總大小成正比。為什麼呢?因為 cert-manager 控制器會將這些 Secret 資源的整個內容快取在記憶體中。如果使用大型 TLS 金鑰(例如 RSA 4096),記憶體使用量將高於使用較小 TLS 金鑰(例如 ECDSA)的情況。
叢集中的其他 Secret,例如用於 Helm chart 組態或其他工作負載的 Secret,不會顯著增加記憶體消耗,因為 cert-manager 只會快取這些 Secret 的中繼資料。
當 CertificateRequest
資源為主要使用案例時,例如使用 csi-driver 或 istio-csr 時,cert-manager 控制器的記憶體消耗將會低得多,因為 TLS Secret 和要快取的資源會更少。
📖 閱讀 關於 Kubernetes 記憶體限制,每個人都應該知道的事,以了解如何正確調整記憶體請求大小。
停用 Kubernetes API 請求的用戶端速率限制
依預設,cert-manager 會將對 Kubernetes API 伺服器的請求速率限制為每秒 20 個查詢。過去,這樣做的目的是防止 cert-manager 壓垮 Kubernetes API 伺服器,但現代版本的 Kubernetes 實作了 API 優先順序和公平性,這消除了用戶端速率限制的需要。您可以使用以下 helm 值來增加用戶端速率限制器的閾值
# helm-values.yamlconfig:apiVersion: controller.config.cert-manager.io/v1alpha1kind: ControllerConfigurationkubernetesAPIQPS: 10000kubernetesAPIBurst: 10000
ℹ️ 這並非技術上停用用戶端速率限制,而是將 QPS 和 Burst 值設定得足夠高,使其永遠不會達到。
🔗 閱讀
cert-manager#6890
:允許停用用戶端速率限制;這是關於 cert-manager 設定選項的提案,旨在停用用戶端速率限制。🔗 閱讀
kubernetes#111880
:啟用 AP&F 時停用用戶端速率限制;這是一個提案,建議當啟用伺服器端速率限制時,kubernetes.io/client-go
模組應自動使用伺服器端速率限制。🔗 閱讀其他停用用戶端速率限制的專案:Flux。
📖 閱讀 ControllerConfiguration 的 API 文件,以了解
kubernetesAPIQPS
和kubernetesAPIBurst
組態選項的說明。
限制大型 RSA 金鑰的使用
具有大型 RSA 金鑰的憑證會導致 cert-manager 使用更多的 CPU 資源。當 CPU 資源不足時,協調佇列長度會增加,這會延遲所有憑證的協調。有權限建立大量 RSA 4096 憑證的使用者可能會意外或惡意地導致叢集上其他使用者的阻斷服務。
📖 了解 如何實施核准原則,以防止使用大型 RSA 金鑰。
在所有憑證資源上設定 revisionHistoryLimit: 1
依預設,cert-manager 將保留 它 建立的所有 CertificateRequest
資源(revisionHistoryLimit
)
在憑證的歷程記錄中維護的
CertificateRequest
修訂版本的最大數量。每個修訂版本都代表此憑證建立的單一CertificateRequest
,無論是在建立、續訂或 Spec 變更時建立的。如果修訂版本的數量超過此數字,則會先移除最舊的修訂版本。如果設定,則revisionHistoryLimit
的值必須為1
或更大。如果未設定(nil
),則不會進行垃圾收集。預設值為nil
。
在繁忙的叢集上,這些最終會壓垮您的 Kubernetes API 伺服器;因為快取所有這些項目需要記憶體和 CPU,而且儲存它們也需要儲存空間。
使用 Kyverno 等工具來覆寫所有命名空間的 Certificate.spec.revisionHistoryLimit
。
📖 調整 教學課程中的 Kyverno 原則:如何自動設定憑證預設值,以覆寫而非預設
revisionHistoryLimit
欄位。📖 了解 在使用 Annotated Ingress 資源時如何設定
revisionHistoryLimit
。🔗 閱讀
cert-manager#3958
:憑證修訂歷程記錄限制的合理預設值;這是一個變更預設revisionHistoryLimit
的提案,這將消除此特定建議。
啟用伺服器端套用
依預設,cert-manager 使用更新請求來建立和修改 CertificateRequest
和 Secret
等資源,但在繁忙的叢集上,當 cert-manager 中的控制迴路都嘗試更新各種資源的狀態時,會頻繁發生衝突。
您會在記錄中看到類似這樣的錯誤
I0419 14:11:51.325377 1 controller.go:162] "由於資源的樂觀鎖定而重新將項目加入佇列" logger="cert-manager.certificates-trigger" key="team-864-p6ts6/app-7" error="無法在 certificates.cert-manager.io \"app-7\" 上完成操作:物件已修改;請將您的變更套用至最新版本,然後重試"
此錯誤相對無害,因為更新嘗試會重試,但它會減慢協調速度,因為每個錯誤都會觸發指數退避機制,這會導致重試之間的時間延遲增加。
解決方案是啟用 伺服器端套用功能,這會導致 cert-manager 在需要修改 API 資源時,使用 使用伺服器端套用的 HTTP PATCH。這樣可以避免所有衝突,因為每個 cert-manager 控制器僅設定它擁有的欄位。
您可以使用以下 Helm chart 值來啟用伺服器端套用功能閘道
# helm-values.yamlconfig:apiVersion: controller.config.cert-manager.io/v1alpha1kind: ControllerConfigurationfeatureGates:ServerSideApply: true
📖 閱讀 在控制器中使用伺服器端套用,以了解伺服器端套用對於像 cert-manager 這類軟體的優點。