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 controller、certcontroller与webhook,并结合仓库源码(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:不带子命令直接运行,负责调和
ExternalSecret、SecretStore、ClusterSecretStore、PushSecret、ClusterPushSecret、ClusterExternalSecret等核心资源; - certcontroller:
external-secrets certcontroller,负责为 CRD 与 ValidatingWebhookConfiguration 生成和管理 TLS 证书; - webhook:
external-secrets webhook,提供 ExternalSecret / SecretStore 的准入校验服务。
三者共享同一套日志(zap)、TLS、Metrics 与探针参数设计,但各自拥有独立的 Flag 集合。下面按组件逐一展开。
Core Controller Flags
core controller 不带子命令调用(即直接运行external-secrets),支持以下参数。下表完整覆盖官方文档参数,并补充了源码 cmd/controller/root.go 中实际注册的默认值与语义说明:
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
--client-burst | int | 100 | 传递给rest.Client的最大 Burst(突发令牌桶容量) |
--client-qps | float32 | 50 | 传递给rest.Client的 QPS(每秒请求数)配置 |
--concurrent | int | 1 | 并发调和(reconcile)的数量 |
--controller-class | string | default | 控制器以特定名称实例化,并按该属性过滤 ExternalSecret |
--enable-cluster-external-secret-reconciler | boolean | true | 启用 ClusterExternalSecret 调和器 |
--enable-cluster-store-reconciler | boolean | true | 启用 ClusterSecretStore 调和器 |
--enable-secret-store-reconciler | boolean | true | 启用 SecretStore 调和器 |
--enable-push-secret-reconciler | boolean | true | 启用 PushSecret 调和器 |
--enable-cluster-push-secret-reconciler | boolean | true | 启用 ClusterPushSecret 调和器 |
--enable-secrets-caching | boolean | false | 为集群中所有Secret 启用缓存(警告:可能显著增加内存占用) |
--enable-configmaps-caching | boolean | false | 为集群中所有ConfigMap 启用缓存(警告:可能显著增加内存占用) |
--enable-managed-secrets-caching | boolean | true | 仅为由 ExternalSecret 托管的 Secret 启用缓存 |
--enable-flood-gate | boolean | true | 启用洪泛闸门(flood gate):仅当 ClusterStore 或 Store 处于健康或未知状态时才调和 ExternalSecret |
--enable-extended-metric-labels | boolean | 源码默认 false | 在指标中启用推荐的 Kubernetes 注解作为标签(注意:官方文档表格写作 true,但 cmd/controller/root.go 实际默认值为false,请以源码为准) |
--enable-leader-election | boolean | false | 为 controller manager 启用 Leader Election,确保同一时刻只有一个活跃的 controller manager |
--enable-vault-token-cache | boolean | false | 启用 Vault Token 缓存,ExternalSecret 复用已有 Vault Token,避免每次请求都新建 |
--vault-token-cache-size | int | 0 | Vault Token 缓存的最大容量,仅在--enable-vault-token-cache开启时生效 |
--experimental-enable-aws-session-cache | boolean | false | 已废弃:该参数不再被使用并将在未来移除,因为 AWS SDK v2 自带会话缓存(当前源码中已无此 Flag 注册) |
--help | external-secrets 的帮助信息 | ||
--loglevel | string | info | 日志级别:debug、info、warn、error、dpanic、panic、fatal |
--zap-time-encoding | string | epoch | 时间编码:epoch、millis、nano、iso8601、rfc3339、rfc3339nano |
--live-addr | string | :8082 | live(存活)端点绑定的地址 |
--metrics-addr | string | :8080 | 指标端点绑定的地址 |
--namespace | string | 空 | 仅监视指定命名空间下的 ExternalSecret。ClusterSecretStore 仍可使用,但只有不引用其他命名空间资源时才有效 |
--store-requeue-interval | duration | 5m0s | (Cluster)SecretStore 两次调和之间的默认时间间隔 |
--enable-http2 | boolean | false | 若设置,将为 metrics server 启用 HTTP/2 |
参数分组与调优要点
API 客户端限流(--client-qps/--client-burst):源码在 cmd/controller/root.go 中通过config := ctrl.GetConfigOrDie()获取 kubeconfig 后,直接config.QPS = clientQPS、config.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 中注册healthz与readyz检查。源码中还补充了--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接受X25519、CurveP256等名称或十进制tls.CurveID。
日志(--loglevel/--zap-time-encoding):两个组件通用的setupLogger()(cmd/controller/certcontroller.go)会把日志级别与时间编码解析为 zap 配置并同时设置到 controller-runtime 与 klog 的 logger 上。Helm 中对应log.level与log.timeEncoding。
Debug-level logging:可观测破坏性操作的细节
设置--loglevel=debug(Helm 中为log.level: debug)会输出在默认info级别下被抑制的额外日志行,主要用于审计与告警,包括:
- Secret 删除(Secret deletion)——当 Provider 返回空数据且
DeletionPolicy=Delete时,控制器删除托管 Secret 的日志。字段:secret、namespace、reason。 - 托管 Secret 清理(Managed secret cleanup)——当托管 Secret 因其属主 ExternalSecret 被删除而随之删除时的日志。字段:
secret、namespace、reason。 - 孤儿 Secret 清理(Orphaned secret cleanup)——删除孤儿 Secret 时的日志。字段:
secret、namespace。对应源码中logSecretDeletedOrphaned = "deleted orphaned secret"(pkg/controllers/externalsecret/externalsecret_controller.go)以及deleteOrphanedSecrets中log.V(1).Info(...)的调用(同文件第 930 行附近)。 - Secret 数据 key 差异(Secret data key diff)——每次更新后数据 key 实际发生变化(key 被新增、更新、移除或清空)时的日志。只记录 key 名称,绝不记录 value。字段:
secret、namespace、added、updated、removed、emptied。
这些消息可以用于构建针对破坏性操作的告警规则。其底层实现是 pkg/controllers/externalsecret/util.go 中的diffSecretDataKeys(oldData, newData)函数:它逐 key 对比更新前后的 Secret 数据,将不存在的 key 归入added、值发生变化的归入updated、被清空(新值为零长度)的归入emptied(emptied是added/updated的子集),再遍历旧数据找出被移除的 key 归入removed,最后对四组列表分别排序。函数只返回 key 名称而不返回任何值,因此可以安全地写入日志。需要特别强调的是:差异计算在未开启 debug 日志时会被完全跳过,因此默认日志级别下没有任何性能开销——这是该特性可以放心开启的重要前提。
Cert Controller Flags
certcontroller负责调和 CRD 与 ValidatingWebhookConfiguration 的证书(在 cmd/controller/certcontroller.go 中分别创建crds.New(...)与webhookconfig.New(...)两个调和器),其参数如下:
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
--crd-requeue-interval | duration | 5m0s | 调和 CRD 以发现新证书的时间间隔 |
--enable-leader-election | boolean | false | 为 controller manager 启用 Leader Election,确保同一时刻只有一个活跃 controller manager |
--healthz-addr | string | :8081 | health 端点绑定的地址 |
--help | certcontroller 的帮助信息 | ||
--loglevel | string | info | 日志级别:debug、info、warn、error、dpanic、panic、fatal |
--zap-time-encoding | string | epoch | 时间编码:epoch、millis、nano、iso8601、rfc3339、rfc3339nano |
--metrics-addr | string | :8080 | 指标端点绑定的地址 |
--secret-name | string | external-secrets-webhook | 存放 webhook 证书的 Secret 名称 |
--secret-namespace | string | default | 存放证书的 Secret 所在命名空间 |
--service-name | string | external-secrets-webhook | Webhook Service 名称 |
--service-namespace | string | default | Webhook Service 所在命名空间 |
--enable-http2 | boolean | false | 若设置,将为 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-inject与validation-webhook-inject(cmd/controller/certcontroller.go),用于确认证书注入是否完成。Leader Election ID 固定为crd-certs-controller。
Webhook Flags
webhook提供 ExternalSecret、SecretStore、ClusterSecretStore 的准入校验(cmd/controller/webhook.go),其参数如下:
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
--cert-dir | string | /tmp/k8s-webhook-server/serving-certs | 证书检查路径 |
--check-interval | duration | 5m0s | 证书检查间隔 |
--dns-name | string | localhost | 用于校验证书的 DNS 名称 |
--healthz-addr | string | :8081 | health 端点绑定的地址 |
--help | webhook 的帮助信息 | ||
--loglevel | string | info | 日志级别:debug、info、warn、error、dpanic、panic、fatal |
--zap-time-encoding | string | epoch | 时间编码:epoch、millis、nano、iso8601、rfc3339、rfc3339nano |
--lookahead-interval | duration | 2160h0m0s(90 天) | 证书有效性前瞻检查间隔 |
--metrics-addr | string | :8080 | 指标端点绑定的地址 |
--port | number | 10250 | webhook server 服务的端口 |
--tls-ciphers | string | 空 | 允许的 TLS 密码套件(逗号分隔)。不适用于 TLS 1.3(自动选择)。列表顺序不表示优先级,排序由系统自动完成。可用密码套件全集见 Go 标准库crypto/tls常量。示例:TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 |
--tls-min-version | string | 源码默认空(文档记 1.2) | 支持的最低 TLS 版本(合法值 1.0/1.1/1.2/1.3;源码默认空表示使用 Go 默认最低版本,见 cmd/controller/webhook.go) |
--enable-http2 | boolean | false | 若设置,将为 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 | --loglevel | info |
log.timeEncoding | --zap-time-encoding | epoch |
leaderElect | --enable-leader-election | false |
leaderElectionID | --leader-election-id | 空(用默认external-secrets-controller) |
leaderElectionLeaseDuration/leaderElectionRenewDeadline/leaderElectionRetryPeriod | 对应的--leader-election-* | 15s / 10s / 2s |
controllerClass | --controller-class | 空(用默认default) |
extendedMetricLabels | --enable-extended-metric-labels | false |
scopedNamespace | --namespace | 空 |
processClusterExternalSecret/processClusterStore/processSecretStore/processClusterPushSecret/processPushSecret/processClusterGenerator | 对应的--enable-*-reconciler | true |
storeRequeueInterval | --store-requeue-interval | 空(用默认 5m) |
concurrent | --concurrent | 1 |
enableHTTP2 | --enable-http2 | false |
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-size | false / 262144 |
webhook.certCheckInterval/webhook.lookaheadInterval | --check-interval/--lookahead-interval | 5m / 空 |
webhook.port | --port | 10250 |
certController.requeueInterval | --crd-requeue-interval | 5m |
certController.enablePartialCache | --enable-partial-cache | true(注意 Chart 默认 true,而 CLI 默认 false) |
genericTargets.enabled | --unsafe-allow-generic-targets | false |
metrics.listen.auth.enabled/metrics.listen.secure.enabled | --metrics-auth/--metrics-secure | false |
例如,在大型集群中通过 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 不一致,请以实际部署对象为准):
--enable-extended-metric-labels:文档表格写默认true,源码 cmd/controller/root.go 与 ChartextendedMetricLabels默认均为false;--tls-min-version(webhook):文档表格写默认1.2,源码默认空字符串(使用 Go 默认最低版本),Charttls.minVersion默认亦为空;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),仅供参考