扩展 cert-manager
了解如何为您的集群优化 cert-manager。
概述
Helm 图表和 YAML 清单中的默认值适用于一般用途。您可能需要修改配置以适合您的 Kubernetes 集群的大小和使用情况。
设置适当的内存请求和限制
当证书资源是主要用例时,例如当工作负载需要挂载 TLS 密钥或使用网关垫片时,cert-manager 控制器的内存消耗将大致与包含 TLS 密钥对的这些密钥资源的总大小成正比。为什么?因为 cert-manager 控制器会在内存中缓存这些密钥资源的全部内容。如果使用大型 TLS 密钥(例如 RSA 4096),则内存使用量将高于使用小型 TLS 密钥(例如 ECDSA)时。
集群中的其他密钥,例如用于 Helm 图表配置或其他工作负载的密钥,不会显着增加内存消耗,因为 cert-manager 只会缓存这些密钥的元数据。
当 CertificateRequest
资源是主要用例时,例如使用 csi-driver 或 istio-csr,cert-manager 控制器的内存消耗会低得多,因为 TLS 密钥更少,需要缓存的资源也更少。
📖️ 阅读 每个人都应该了解的 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 密钥。
📖 了解 如何使用 Kyverno 自动设置证书默认值。
在所有证书资源上设置 revisionHistoryLimit: 1
默认情况下,cert-manager 会保留它创建的所有 CertificateRequest
资源 (revisionHistoryLimit
)
证书历史记录中维护的
CertificateRequest
修订的最大数量。每个修订代表由该证书创建的单个CertificateRequest
,无论是创建时、续订时还是规范更改时。如果修订数量超过此数量,将按最旧优先的顺序删除修订。如果设置,revisionHistoryLimit
必须是1
或更大的值。如果未设置 (nil
),修订将不会被垃圾回收。默认值为nil
。
在繁忙的集群中,这些资源最终会压垮您的 Kubernetes API 服务器;因为缓存它们所需内存和 CPU 以及保存它们所需的存储空间。
使用 Kyverno 等工具来覆盖所有命名空间的 Certificate.spec.revisionHistoryLimit
。
📖 调整 教程中的 Kyverno 策略:如何自动设置证书默认值,以覆盖而不是默认
revisionHistoryLimit
字段。📖 了解 如何使用带注释的 Ingress 资源设置
revisionHistoryLimit
。🔗 阅读
cert-manager#3958
: 证书修订历史限制的合理默认值;一项更改默认revisionHistoryLimit
的提案,这将使这项特定建议变得多余。
启用服务器端应用
默认情况下,cert-manager 使用更新请求 来创建和修改资源,例如 CertificateRequest
和 Secret
,但在繁忙的集群中,随着 cert-manager 中的控制循环都尝试更新各种资源的状态,会出现频繁的冲突。
您将在日志中看到类似以下内容的错误
I0419 14:11:51.325377 1 controller.go:162] "re-queuing item due to optimistic locking on resource" logger="cert-manager.certificates-trigger" key="team-864-p6ts6/app-7" error="Operation cannot be fulfilled on certificates.cert-manager.io \"app-7\": the object has been modified; please apply your changes to the latest version and try again"
此错误相对无害,因为更新尝试会重试,但会减慢协调速度,因为每个错误都会触发指数级回退机制,这会导致重试之间延迟越来越长。
解决方案是开启 服务器端应用功能,这会导致 cert-manager 在需要修改 API 资源时使用 使用服务器端应用的 HTTP PATCH。这会避免所有冲突,因为每个 cert-manager 控制器只设置它拥有的字段。
您可以使用以下 Helm 图表值启用服务器端应用功能网关
# helm-values.yamlconfig:apiVersion: controller.config.cert-manager.io/v1alpha1kind: ControllerConfigurationfeatureGates:ServerSideApply: true
📖 阅读 在控制器中使用服务器端应用,了解服务器端应用对 cert-manager 等软件的优势。