External Secrets Operator 控制器启动参数完全指南:core controller、certcontroller 与 webhook 的 Flags 与 Helm 配置
2026/9/17 4:43:50 网站建设 项目流程

External Secrets Operator 控制器启动参数完全指南:core controller、certcontroller 与 webhook 的 Flags 与 Helm 配置

【免费下载链接】external-secretsExternal Secrets Operator reads information from a third-party service like AWS Secrets Manager and automatically injects the values as Kubernetes Secrets.项目地址: https://gitcode.com/GitHub_Trending/ex/external-secrets

External Secrets Operator(ESO)是一个把第三方密钥管理服务(如 AWS Secrets Manager、Vault、Azure Key Vault 等)中的值自动注入为 Kubernetes Secret 的 Operator。本文聚焦 ESO 官方控制器参数文档(docs/api/controller-options.md),系统梳理其单一二进制内三大组件的全部启动参数——core controllercertcontrollerwebhook,并结合仓库源码(cmd/controller/root.go、cmd/controller/certcontroller.go、cmd/controller/webhook.go)与 Helm Chart(deploy/charts/external-secrets/values.yaml)讲解每个参数的作用、默认值、底层实现与调优建议。读完本文,你将能够根据集群规模、安全要求与资源预算,精准定制 ESO 的运行参数,并理解各参数在源码中的真实生效路径。

一个二进制,三个组件

ESO 的二进制入口位于仓库根目录的 main.go,它只做两件事:导入cmd/controller包,并import _ "github.com/external-secrets/external-secrets/pkg/register"以注册全部 Provider 与 Generator,随后调用controller.Execute()。在cmd/controller包内,通过 Cobra 框架注册了三个可执行命令:

  • core controller:不带子命令直接运行,负责调和ExternalSecretSecretStoreClusterSecretStorePushSecretClusterPushSecretClusterExternalSecret等核心资源;
  • certcontrollerexternal-secrets certcontroller,负责为 CRD 与 ValidatingWebhookConfiguration 生成和管理 TLS 证书;
  • webhookexternal-secrets webhook,提供 ExternalSecret / SecretStore 的准入校验服务。

三者共享同一套日志(zap)、TLS、Metrics 与探针参数设计,但各自拥有独立的 Flag 集合。下面按组件逐一展开。

Core Controller Flags

core controller 不带子命令调用(即直接运行external-secrets),支持以下参数。下表完整覆盖官方文档参数,并补充了源码 cmd/controller/root.go 中实际注册的默认值与语义说明:

名称类型默认值描述
--client-burstint100传递给rest.Client的最大 Burst(突发令牌桶容量)
--client-qpsfloat3250传递给rest.Client的 QPS(每秒请求数)配置
--concurrentint1并发调和(reconcile)的数量
--controller-classstringdefault控制器以特定名称实例化,并按该属性过滤 ExternalSecret
--enable-cluster-external-secret-reconcilerbooleantrue启用 ClusterExternalSecret 调和器
--enable-cluster-store-reconcilerbooleantrue启用 ClusterSecretStore 调和器
--enable-secret-store-reconcilerbooleantrue启用 SecretStore 调和器
--enable-push-secret-reconcilerbooleantrue启用 PushSecret 调和器
--enable-cluster-push-secret-reconcilerbooleantrue启用 ClusterPushSecret 调和器
--enable-secrets-cachingbooleanfalse为集群中所有Secret 启用缓存(警告:可能显著增加内存占用)
--enable-configmaps-cachingbooleanfalse为集群中所有ConfigMap 启用缓存(警告:可能显著增加内存占用)
--enable-managed-secrets-cachingbooleantrue仅为由 ExternalSecret 托管的 Secret 启用缓存
--enable-flood-gatebooleantrue启用洪泛闸门(flood gate):仅当 ClusterStore 或 Store 处于健康或未知状态时才调和 ExternalSecret
--enable-extended-metric-labelsboolean源码默认 false在指标中启用推荐的 Kubernetes 注解作为标签(注意:官方文档表格写作 true,但 cmd/controller/root.go 实际默认值为false,请以源码为准)
--enable-leader-electionbooleanfalse为 controller manager 启用 Leader Election,确保同一时刻只有一个活跃的 controller manager
--enable-vault-token-cachebooleanfalse启用 Vault Token 缓存,ExternalSecret 复用已有 Vault Token,避免每次请求都新建
--vault-token-cache-sizeint0Vault Token 缓存的最大容量,仅在--enable-vault-token-cache开启时生效
--experimental-enable-aws-session-cachebooleanfalse已废弃:该参数不再被使用并将在未来移除,因为 AWS SDK v2 自带会话缓存(当前源码中已无此 Flag 注册)
--helpexternal-secrets 的帮助信息
--loglevelstringinfo日志级别:debug、info、warn、error、dpanic、panic、fatal
--zap-time-encodingstringepoch时间编码:epoch、millis、nano、iso8601、rfc3339、rfc3339nano
--live-addrstring:8082live(存活)端点绑定的地址
--metrics-addrstring:8080指标端点绑定的地址
--namespacestring仅监视指定命名空间下的 ExternalSecret。ClusterSecretStore 仍可使用,但只有不引用其他命名空间资源时才有效
--store-requeue-intervalduration5m0s(Cluster)SecretStore 两次调和之间的默认时间间隔
--enable-http2booleanfalse若设置,将为 metrics server 启用 HTTP/2

参数分组与调优要点

API 客户端限流(--client-qps/--client-burst:源码在 cmd/controller/root.go 中通过config := ctrl.GetConfigOrDie()获取 kubeconfig 后,直接config.QPS = clientQPSconfig.Burst = clientBurst覆盖默认限流值。在 Secret 数量庞大的集群中,适当提高这两个值可以加快调和速度,但也会给 API Server 带来更大压力,需要按集群规模权衡。

并发度(--concurrent:该值会通过ctrlcommon.BuildControllerOptions(concurrent)传入每个调和器(见 cmd/controller/root.go),决定每个 controller 同时运行多少个 reconcile 循环。默认 1 意味着串行处理,吞吐瓶颈明显;调大可显著提升大规模 Secret 的同步效率,但会成比例增加 CPU 与 API 调用。

调和器开关(--enable-*-reconciler系列):这些布尔开关在 cmd/controller/root.go 中逐个包裹对应的SetupWithManager调用。当你只使用 SecretStore 而不使用 ClusterSecretStore 时,可关闭--enable-cluster-store-reconciler以减少监听对象与内存开销;同样,不使用 PushSecret / ClusterPushSecret 时可关闭相应调和器。注意 GeneratorState 调和器(--enable-generator-state,默认 true)不受这些开关控制,始终注册。

缓存策略(--enable-secrets-caching/--enable-configmaps-caching/--enable-managed-secrets-caching:源码在 cmd/controller/root.go 中构造clientCacheDisableFor列表:默认(--enable-secrets-caching=false)会把v1.Secret加入DisableFor(不缓存所有 Secret),默认(--enable-configmaps-caching=false)会把v1.ConfigMap加入不缓存列表。原因在于 Secret/ConfigMap 数量大、变化频繁,全量缓存会大幅推高内存(对应 upstream issue #721 的讨论)。同时,当--enable-managed-secrets-caching=true且未开启全量缓存时,会通过ctrlcommon.BuildManagedSecretClient(mgr, namespace)构建一个只缓存“由 ExternalSecret 托管 Secret”的特殊客户端(cmd/controller/root.go),在内存与 API 开销之间取得平衡。此外源码还提供了--enable-secret-api-read-on-cache-mismatch(默认 true):当部分缓存与托管缓存不一致时直连 API 读取一次,关闭则仅依赖缓存重试。

洪泛闸门(--enable-flood-gate:默认开启。开启后 ExternalSecret 只有在关联的 ClusterStore/Store 处于健康或未知状态时才会被调和,避免在存储后端异常时对 API Server 发起无效的洪泛式请求。该值会传入 ExternalSecret 调和器(cmd/controller/root.go)。

Leader Election(--enable-leader-election:默认关闭,适合单副本部署;多副本或高可用部署时建议开启,确保同一时刻只有一个活跃 controller manager。源码还注册了细化参数:--leader-election-id(默认external-secrets-controller,多套独立部署于同一命名空间时需设为唯一值)、--leader-election-lease-duration(默认 15s)、--leader-election-renew-deadline(默认 10s,必须小于 lease duration)、--leader-election-retry-period(默认 2s),详见 cmd/controller/root.go。

Vault Token 缓存(--enable-vault-token-cache/--vault-token-cache-size:启用后 ExternalSecret 会复用 Vault Token 而非每次请求重新获取,可显著降低 Vault 的认证开销。注意官方文档中--vault-token-cache-size默认值为 0,而 Helm Chart 的vault.tokenCacheSize默认值为 262144,实际生效值以部署方式为准。

命名空间限定(--namespace:设置后 controller manager 的 informer 缓存只监听该命名空间(源码在 cmd/controller/root.go 中通过mgrOpts.Cache.DefaultNamespaces实现)。适合多租户隔离或轻量部署,但如文档所述,ClusterSecretStore 只有在不引用其他命名空间资源时才可用。

指标与健康探针(--metrics-addr/--live-addr--metrics-addr(默认:8080)绑定 Prometheus 指标端点;--live-addr(默认:8082)绑定 healthz/readyz 探针端点,并在 cmd/controller/root.go 中注册healthzreadyz检查。源码中还补充了--metrics-secure(启用 HTTPS)、--metrics-cert-dir/--metrics-cert-name(默认tls.crt)/--metrics-key-name(默认tls.key)、--metrics-auth(启用基于 Kubernetes RBAC 的认证授权,注意它要求同时开启--metrics-secure,否则进程会报错退出,见 cmd/controller/root.go)。

TLS 相关(--enable-http2/--tls-ciphers/--tls-min-version/--tls-curve-preferences:这些参数最终汇入buildTLSConfigFuncs(cmd/controller/root.go),用于配置 metrics server 的tls.Config。默认关闭 HTTP/2 时会将NextProtos强制设为http/1.1--tls-ciphers接受逗号分隔的密码套件名列表(TLS 1.3 自动选择不受此影响);--tls-min-version的合法值为 1.0/1.1/1.2/1.3(源码 cmd/controller/webhook.go 中的tlsVersion函数负责转换);--tls-curve-preferences接受X25519CurveP256等名称或十进制tls.CurveID

日志(--loglevel/--zap-time-encoding:两个组件通用的setupLogger()(cmd/controller/certcontroller.go)会把日志级别与时间编码解析为 zap 配置并同时设置到 controller-runtime 与 klog 的 logger 上。Helm 中对应log.levellog.timeEncoding

Debug-level logging:可观测破坏性操作的细节

设置--loglevel=debug(Helm 中为log.level: debug)会输出在默认info级别下被抑制的额外日志行,主要用于审计与告警,包括:

  • Secret 删除(Secret deletion)——当 Provider 返回空数据且DeletionPolicy=Delete时,控制器删除托管 Secret 的日志。字段:secretnamespacereason
  • 托管 Secret 清理(Managed secret cleanup)——当托管 Secret 因其属主 ExternalSecret 被删除而随之删除时的日志。字段:secretnamespacereason
  • 孤儿 Secret 清理(Orphaned secret cleanup)——删除孤儿 Secret 时的日志。字段:secretnamespace。对应源码中logSecretDeletedOrphaned = "deleted orphaned secret"(pkg/controllers/externalsecret/externalsecret_controller.go)以及deleteOrphanedSecretslog.V(1).Info(...)的调用(同文件第 930 行附近)。
  • Secret 数据 key 差异(Secret data key diff)——每次更新后数据 key 实际发生变化(key 被新增、更新、移除或清空)时的日志。只记录 key 名称,绝不记录 value。字段:secretnamespaceaddedupdatedremovedemptied

这些消息可以用于构建针对破坏性操作的告警规则。其底层实现是 pkg/controllers/externalsecret/util.go 中的diffSecretDataKeys(oldData, newData)函数:它逐 key 对比更新前后的 Secret 数据,将不存在的 key 归入added、值发生变化的归入updated、被清空(新值为零长度)的归入emptiedemptiedadded/updated的子集),再遍历旧数据找出被移除的 key 归入removed,最后对四组列表分别排序。函数只返回 key 名称而不返回任何值,因此可以安全地写入日志。需要特别强调的是:差异计算在未开启 debug 日志时会被完全跳过,因此默认日志级别下没有任何性能开销——这是该特性可以放心开启的重要前提。

Cert Controller Flags

certcontroller负责调和 CRD 与 ValidatingWebhookConfiguration 的证书(在 cmd/controller/certcontroller.go 中分别创建crds.New(...)webhookconfig.New(...)两个调和器),其参数如下:

名称类型默认值描述
--crd-requeue-intervalduration5m0s调和 CRD 以发现新证书的时间间隔
--enable-leader-electionbooleanfalse为 controller manager 启用 Leader Election,确保同一时刻只有一个活跃 controller manager
--healthz-addrstring:8081health 端点绑定的地址
--helpcertcontroller 的帮助信息
--loglevelstringinfo日志级别:debug、info、warn、error、dpanic、panic、fatal
--zap-time-encodingstringepoch时间编码:epoch、millis、nano、iso8601、rfc3339、rfc3339nano
--metrics-addrstring:8080指标端点绑定的地址
--secret-namestringexternal-secrets-webhook存放 webhook 证书的 Secret 名称
--secret-namespacestringdefault存放证书的 Secret 所在命名空间
--service-namestringexternal-secrets-webhookWebhook Service 名称
--service-namespacestringdefaultWebhook Service 所在命名空间
--enable-http2booleanfalse若设置,将为 metrics server 启用 HTTP/2

补充源码中的细节参数:--crd-names(默认["externalsecrets.external-secrets.io", "clustersecretstores.external-secrets.io", "secretstores.external-secrets.io"],指定调和器管理的 CRD 列表,见 cmd/controller/certcontroller.go)以及--enable-partial-cache(默认 false,启用后 Informer 只缓存带external-secrets.io/component=webhook标签的 ValidatingWebhookConfiguration 与带external-secrets.io/component=controller标签的 CRD,以降低大集群中的内存占用,见 cmd/controller/certcontroller.go)。certcontroller 还额外注册了两个就绪检查crd-injectvalidation-webhook-inject(cmd/controller/certcontroller.go),用于确认证书注入是否完成。Leader Election ID 固定为crd-certs-controller

Webhook Flags

webhook提供 ExternalSecret、SecretStore、ClusterSecretStore 的准入校验(cmd/controller/webhook.go),其参数如下:

名称类型默认值描述
--cert-dirstring/tmp/k8s-webhook-server/serving-certs证书检查路径
--check-intervalduration5m0s证书检查间隔
--dns-namestringlocalhost用于校验证书的 DNS 名称
--healthz-addrstring:8081health 端点绑定的地址
--helpwebhook 的帮助信息
--loglevelstringinfo日志级别:debug、info、warn、error、dpanic、panic、fatal
--zap-time-encodingstringepoch时间编码:epoch、millis、nano、iso8601、rfc3339、rfc3339nano
--lookahead-intervalduration2160h0m0s(90 天)证书有效性前瞻检查间隔
--metrics-addrstring:8080指标端点绑定的地址
--portnumber10250webhook server 服务的端口
--tls-ciphersstring允许的 TLS 密码套件(逗号分隔)。不适用于 TLS 1.3(自动选择)。列表顺序不表示优先级,排序由系统自动完成。可用密码套件全集见 Go 标准库crypto/tls常量。示例:TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
--tls-min-versionstring源码默认空(文档记 1.2)支持的最低 TLS 版本(合法值 1.0/1.1/1.2/1.3;源码默认空表示使用 Go 默认最低版本,见 cmd/controller/webhook.go)
--enable-http2booleanfalse若设置,将为 metrics 与 webhook server 启用 HTTP/2

webhook 的启动流程(cmd/controller/webhook.go)值得关注:进程启动后会先调用waitForCerts,在 2 分钟超时内反复用crds.CheckCerts校验证书,失败则每 10 秒重试;随后启动一个后台 goroutine,按--check-interval(默认 5 分钟)周期校验证书,并以--lookahead-interval(默认 90 天)为前瞻窗口——若证书在“当前时间 + lookahead”内即将失效,则主动触发进程关闭(cancel()),等待 certcontroller 轮换新证书后由 Kubernetes 重新拉起。这也是--lookahead-interval必须小于证书签发有效期的原因。此外 webhook 还注册了certs就绪检查(以 1 小时为前瞻窗口)。--tls-ciphers通过 cmd/controller/webhook.go 中的getTLSCipherSuitesIDs解析:它遍历tls.CipherSuites()建立名称到 ID 的映射,遇到未知套件名会直接返回错误。

通过 Helm Chart 配置这些参数

生产环境最常用的方式是使用官方 Helm Chart(deploy/charts/external-secrets/values.yaml)。Chart 会把下列 values 映射为上述命令行参数:

Helm Values对应 Flag默认值
log.level--loglevelinfo
log.timeEncoding--zap-time-encodingepoch
leaderElect--enable-leader-electionfalse
leaderElectionID--leader-election-id空(用默认external-secrets-controller
leaderElectionLeaseDuration/leaderElectionRenewDeadline/leaderElectionRetryPeriod对应的--leader-election-*15s / 10s / 2s
controllerClass--controller-class空(用默认default
extendedMetricLabels--enable-extended-metric-labelsfalse
scopedNamespace--namespace
processClusterExternalSecret/processClusterStore/processSecretStore/processClusterPushSecret/processPushSecret/processClusterGenerator对应的--enable-*-reconcilertrue
storeRequeueInterval--store-requeue-interval空(用默认 5m)
concurrent--concurrent1
enableHTTP2--enable-http2false
tls.minVersion/tls.ciphers/tls.curvePreferences--tls-min-version/--tls-ciphers/--tls-curve-preferences空(Go 默认)
vault.enableTokenCache/vault.tokenCacheSize--enable-vault-token-cache/--vault-token-cache-sizefalse / 262144
webhook.certCheckInterval/webhook.lookaheadInterval--check-interval/--lookahead-interval5m / 空
webhook.port--port10250
certController.requeueInterval--crd-requeue-interval5m
certController.enablePartialCache--enable-partial-cachetrue(注意 Chart 默认 true,而 CLI 默认 false)
genericTargets.enabled--unsafe-allow-generic-targetsfalse
metrics.listen.auth.enabled/metrics.listen.secure.enabled--metrics-auth/--metrics-securefalse

例如,在大型集群中通过 Helm 提高并发与 API 限流、开启 Vault Token 缓存并启用 leader election:

concurrent: 8 leaderElect: true extraArgs: client-qps: "100" client-burst: "200" enable-vault-token-cache: "true" vault-token-cache-size: "262144" vault: enableTokenCache: true tokenCacheSize: 262144

需要特别留意的三处默认值差异(文档表格与源码/Chart 不一致,请以实际部署对象为准):

  1. --enable-extended-metric-labels:文档表格写默认true,源码 cmd/controller/root.go 与 ChartextendedMetricLabels默认均为false
  2. --tls-min-version(webhook):文档表格写默认1.2,源码默认空字符串(使用 Go 默认最低版本),Charttls.minVersion默认亦为空;
  3. certController.enablePartialCache:Chart 默认true,而 CLI 的--enable-partial-cache默认false,Chart 会显式传入以覆盖默认值。

进一步阅读

  • 官方参数总览原文:docs/api/controller-options.md
  • Core controller 参数注册与调和器装配:cmd/controller/root.go
  • CertController 参数与证书调和器装配:cmd/controller/certcontroller.go
  • Webhook 参数、证书轮换与 TLS 解析:cmd/controller/webhook.go
  • 二进制入口与 Provider/Generator 注册:main.go
  • Helm Chart 全部 values 及注释:deploy/charts/external-secrets/values.yaml
  • Debug 日志差异计算实现:pkg/controllers/externalsecret/util.go
  • 孤儿 Secret 删除与 debug 日志调用点:pkg/controllers/externalsecret/externalsecret_controller.go
  • 各资源类型的通用说明:docs/api/components.md

【免费下载链接】external-secretsExternal Secrets Operator reads information from a third-party service like AWS Secrets Manager and automatically injects the values as Kubernetes Secrets.项目地址: https://gitcode.com/GitHub_Trending/ex/external-secrets

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询