一、组件介绍
组件基于 external-secrets 开源项目构建,通过自定义资源(CRD)描述密钥来源与同步策略,Controller 负责监听并同步,实现密钥的生命周期管理。
二、组件包含的子模块
| 子模块 | 类型 | 说明 |
| external-secrets | Deployment | 核心 Controller,负责 ExternalSecret / ClusterExternalSecret / PushSecret 的协调与同步。 |
| webhook | Deployment | Validating Webhook Server,对 CRD 资源进行准入校验,保障配置合法性。 |
| cert-controller | Deployment | 证书控制器,负责自动轮换 Webhook 所需的 TLS 证书。 |
三、支持的 CRD 资源
| CRD | 说明 |
| SecretStore | 命名空间级别的密钥存储后端配置。 |
| ClusterSecretStore | 集群级别的密钥存储后端配置。 |
| ExternalSecret | 命名空间级别的外部密钥同步对象。 |
| ClusterExternalSecret | 集群级别的外部密钥同步对象,可跨命名空间创建 Secret。 |
| PushSecret | 将 Kubernetes Secret 推送到外部密钥管理系统。 |
四、全局参数
| 名称 | 含义 | 类型 | 必填 | 取值范围 | 备注 |
| replicaCount | Controller 副本数 | Integer | 否 | 正整数,默认值为 1 | 生产环境建议设置为 2 并开启 leaderElect |
| image.repository | Controller 镜像仓库地址 | String | 否 | 默认使用镜像 | – |
| image.tag | Controller 镜像版本标签 | String | 否 | 默认使用 Chart appVersion | 留空时自动使用与 Chart 版本匹配的镜像 |
| image.pullPolicy | 镜像拉取策略 | String | 否 | IfNotPresent、Always、Never,默认值为 IfNotPresent | – |
| imagePullSecrets | 镜像拉取凭证列表 | Array | 否 | 默认值为 [] | 拉取私有仓库镜像时填写 |
| serviceAccount.create | 是否自动创建 ServiceAccount | Boolean | 否 | true / false,默认值为 true | 设为 false 时需通过 serviceAccount.name 指定已有 SA |
| serviceAccount.name | ServiceAccount 名称 | String | 否 | 默认值为 "" | 留空时自动生成 |
| serviceAccount.annotations | ServiceAccount 注解 | Object | 否 | 默认值为 {} | 常用于配置 Workload Identity / IRSA |
| rbac.create | 是否自动创建 RBAC 资源 | Boolean | 否 | true / false,默认值为 true | – |
| podAnnotations | Controller Pod 注解 | Object | 否 | 默认值为 {} | – |
| podSecurityContext | Controller Pod 安全上下文 | Object | 否 | 默认值为 {} | – |
| securityContext | Controller 容器安全上下文 | Object | 否 | 默认值为 {} | – |
| nodeSelector | Controller 节点选择器 | Object | 否 | 默认值为 {} | – |
| tolerations | Controller 容忍配置 | Array | 否 | 默认值为 [] | – |
| affinity | Controller 亲和性配置 | Object | 否 | 默认值为 {} | – |
五、Controller(external-secrets)参数
| 名称 | 含义 | 类型 | 必填 | 取值范围 | 备注 |
| resources.requests.cpu | CPU 请求量 | String | 否 | 默认值为 10m | – |
| resources.requests.memory | 内存请求量 | String | 否 | 默认值为 64Mi | – |
| resources.limits.cpu | CPU 限制 | String | 否 | 默认值为 100m | – |
| resources.limits.memory | 内存限制 | String | 否 | 默认值为 128Mi | – |
| leaderElect | 是否启用 Leader 选举 | Boolean | 否 | true / false,默认值为 true | 当 replicaCount > 1 时必须开启 |
| concurrent | 并发 Reconcile 数量 | Integer | 否 | 正整数,默认值为 1 | 增大该值可提升大规模集群的同步吞吐量 |
| controllerClass | Controller 类名 | String | 否 | 默认值为 "" | 用于多 Controller 实例场景隔离资源处理范围 |
| processClusterExternalSecret | 是否处理 ClusterExternalSecret 资源 | Boolean | 否 | true / false,默认值为 true | 设为 false 则忽略集群级别的外部密钥同步对象 |
| processClusterStore | 是否处理 ClusterSecretStore 资源 | Boolean | 否 | true / false,默认值为 true | 设为 false 则忽略集群级别的密钥存储后端配置 |
| processPushSecret | 是否处理 PushSecret 资源 | Boolean | 否 | true / false,默认值为 true | 设为 false 则禁用将 Kubernetes Secret 推送到外部密钥管理系统的功能 |
| extendedMetricLabels | 是否开启扩展指标标签 | Boolean | 否 | true / false,默认值为 false | 开启后 Prometheus 指标包含 Secret 名称等附加标签 |
| scopedRBAC | 是否启用 Scoped RBAC | Boolean | 否 | true / false,默认值为 false | 开启后 Controller 仅具有指定命名空间的权限 |
| log.level | 日志级别 | String | 否 | debug、info、warn、error,默认值为 info | – |
| log.timeEncoding | 日志时间格式 | String | 否 | epoch、millis、nano、iso8601,默认值为 epoch | – |
六、Webhook 参数
| 名称 | 含义 | 类型 | 必填 | 取值范围 | 备注 |
| webhook.create | 是否部署 Webhook 组件 | Boolean | 否 | true / false,默认值为 true | 禁用后 CRD 资源将不进行准入校验 |
| webhook.replicaCount | Webhook 副本数 | Integer | 否 | 正整数,默认值为 1 | – |
| webhook.image.repository | Webhook 镜像仓库地址 | String | 否 | 默认与 Controller 共用同一镜像 | – |
| webhook.image.tag | Webhook 镜像版本标签 | String | 否 | 默认值为 "" | 留空时与 Controller 镜像版本一致 |
| webhook.image.pullPolicy | 镜像拉取策略 | String | 否 | IfNotPresent、Always、Never,默认值为 IfNotPresent | – |
| webhook.resources.requests.cpu | CPU 请求量 | String | 否 | 默认值为 10m | – |
| webhook.resources.requests.memory | 内存请求量 | String | 否 | 默认值为 64Mi | – |
| webhook.resources.limits.cpu | CPU 限制 | String | 否 | 默认值为 100m | – |
| webhook.resources.limits.memory | 内存限制 | String | 否 | 默认值为 128Mi | – |
| webhook.port | Webhook 服务监听端口 | Integer | 否 | 默认值为 10250 | – |
| webhook.servicePort | Webhook Service 对外端口 | Integer | 否 | 默认值为 443 | – |
| webhook.certCheckInterval | TLS 证书检查间隔 | String | 否 | 默认值为 5m | 格式遵循 Go duration,例如 5m、1h |
| webhook.lookaheadInterval | 证书提前续签时间窗口 | String | 否 | 默认值为 "" | 留空时使用 cert-controller 默认策略 |
| webhook.podAnnotations | Webhook Pod 注解 | Object | 否 | 默认值为 {} | – |
| webhook.nodeSelector | Webhook 节点选择器 | Object | 否 | 默认值为 {} | – |
| webhook.tolerations | Webhook 容忍配置 | Array | 否 | 默认值为 [] | – |
| webhook.affinity | Webhook 亲和性配置 | Object | 否 | 默认值为 {} | – |
七、CertController 参数
| 名称 | 含义 | 类型 | 必填 | 取值范围 | 备注 |
| certController.create | 是否部署 CertController 组件 | Boolean | 否 | true / false,默认值为 true | 禁用时需自行管理 Webhook 的 TLS 证书 |
| certController.replicaCount | CertController 副本数 | Integer | 否 | 正整数,默认值为 1 | – |
| certController.image.repository | CertController 镜像仓库地址 | String | 否 | 默认与 Controller 共用同一镜像 | – |
| certController.image.tag | CertController 镜像版本标签 | String | 否 | 默认值为 "" | 留空时与 Controller 镜像版本一致 |
| certController.image.pullPolicy | 镜像拉取策略 | String | 否 | IfNotPresent、Always、Never,默认值为 IfNotPresent | – |
| certController.resources.requests.cpu | CPU 请求量 | String | 否 | 默认值为 10m | – |
| certController.resources.requests.memory | 内存请求量 | String | 否 | 默认值为 64Mi | – |
| certController.resources.limits.cpu | CPU 限制 | String | 否 | 默认值为 100m | – |
| certController.resources.limits.memory | 内存限制 | String | 否 | 默认值为 128Mi | – |
| certController.requeueInterval | 证书轮换检查间隔 | String | 否 | 默认值为 5m | 格式遵循 Go duration,例如 5m、1h |
| certController.podAnnotations | CertController Pod 注解 | Object | 否 | 默认值为 {} | – |
| certController.nodeSelector | CertController 节点选择器 | Object | 否 | 默认值为 {} | – |
| certController.tolerations | CertController 容忍配置 | Array | 否 | 默认值为 [] | – |
| certController.affinity | CertController 亲和性配置 | Object | 否 | 默认值为 {} | – |
八、通过 Terraform 管理组件参数
使用 Terraform 管理 TKE 集群时,可通过 addon_config 字段传入 JSON 格式的 Helm values,自定义组件配置。
以下示例展示了如何通过 Terraform 配置 ExternalSecrets 组件的副本数和资源限制:
resource "tencentcloud_kubernetes_addon_attachment" "external_secrets" { cluster_id = var.cluster_id name = "external-secrets" addon_config = jsonencode({ replicaCount = 2 leaderElect = true resources = { requests = { cpu = "50m", memory = "128Mi" } limits = { cpu = "200m", memory = "256Mi" } } webhook = { replicaCount = 2 } certController = { replicaCount = 1 } })}
注意:说明:
注意:addon_config 接受标准 Helm values 结构。各参数的含义和默认值请参见上方配置参数说明。
九、安装组件
你可以按照以下步骤进行安装:
1. 登录 容器服务控制台,在左侧导航栏中选择集群。
2. 在集群列表中,单击目标集群 ID,进入集群详情页。
3. 选择左侧菜单栏中的组件管理,在组件管理页面单击新建。
4. 在新建组件管理页面中勾选 external-secrets。
5. 单击完成即可创建组件。