最新:在TwitterMastodon

扩展 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.yaml
config:
apiVersion: controller.config.cert-manager.io/v1alpha1
kind: ControllerConfiguration
kubernetesAPIQPS: 10000
kubernetesAPIBurst: 10000

ℹ️ 从技术上讲,这不会禁用客户端侧速率限制,而是将 QPS 和 Burst 值配置得足够高,以至于永远不会达到它们。

🔗 阅读 cert-manager#6890: 允许禁用客户端侧速率限制;一项有关禁用客户端侧速率限制的 cert-manager 配置选项的提案。

🔗 阅读 kubernetes#111880: 在启用 AP&F 时禁用客户端侧速率限制;一项建议,即 kubernetes.io/client-go 模块在启用服务器端速率限制时应自动使用服务器端速率限制。

🔗 阅读有关禁用客户端侧速率限制的其他项目的资料: Flux

📖 阅读 ControllerConfiguration 的 API 文档,了解 kubernetesAPIQPSkubernetesAPIBurst 配置选项的说明。

限制使用大型 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 使用更新请求 来创建和修改资源,例如 CertificateRequestSecret,但在繁忙的集群中,随着 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.yaml
config:
apiVersion: controller.config.cert-manager.io/v1alpha1
kind: ControllerConfiguration
featureGates:
ServerSideApply: true

📖 阅读 在控制器中使用服务器端应用,了解服务器端应用对 cert-manager 等软件的优势。