External Secrets Operator API 规范全解析:external-secrets.io/v1 与 v1alpha1/v1beta1 资源字段权威参考
2026/9/17 20:40:05 网站建设 项目流程

External Secrets Operator API 规范全解析:external-secrets.io/v1 与 v1alpha1/v1beta1 资源字段权威参考

【免费下载链接】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)的API 规范(spec)权威参考指南,以仓库中的 docs/api/spec.md 为核心骨架,完整梳理external-secrets.io/v1(核心 CRD:ExternalSecret、SecretStore、ClusterSecretStore、ClusterExternalSecret)、external-secrets.io/v1alpha1(PushSecret 推送能力)与generators.external-secrets.io/v1alpha1(密钥生成器)四个 Go 包下全部资源类型的字段定义、枚举取值与默认行为。读完本文,你将能够:准确编写可校验的 ExternalSecret / SecretStore / PushSecret 清单文件;理解datadataFromcreationPolicydeletionPolicyrefreshPolicysyncWindows等关键配置项的真实语义;并掌握如何在本仓库源码(apis/externalsecrets/v1/*.go)与生成的 CRD 清单(config/crds/bases)中核对每一项字段。文档入口:docs/api/spec.md(另见 docs/api/externalsecret.md、docs/api/secretstore.md、docs/api/pushsecret.md 等分篇指南)。


一、API 包总览:四个包的定位与关系

docs/api/spec.md在开头即给出包索引,全部 API 类型分布在以下四个包中:

版本定位核心资源类型
external-secrets.io/v1主版本(GA),当前默认使用ExternalSecret、SecretStore、ClusterSecretStore、ClusterExternalSecret 及全部 Provider 配置
external-secrets.io/v1alpha1早期版本,承载演进中的 PushSecret / ClusterPushSecretPushSecret、ClusterPushSecret 及全部 PushSecret 子类型
external-secrets.io/v1beta1Beta 版本(已进入弃用流程),结构与 v1 基本对齐ExternalSecret、SecretStore、ClusterSecretStore、ClusterExternalSecret 及 Provider 配置
generators.external-secrets.io/v1alpha1密钥生成器(Generator)专用ACRAccessToken、ECRAuthorizationToken、GCRAccessToken、GitHubAccessToken、GitLabDeployToken、Password、SSHKey、UUID、VaultDynamicSecret、Webhook 等

对应源码位于 apis/externalsecrets/v1(含externalsecret_types.gosecretstore_types.gosecretstore_*.go系列文件)、apis/externalsecrets/v1alpha1 与 apis/generators/v1alpha1。生成的 CRD 清单见 config/crds/bases 下的 26 个 YAML 文件,二者字段一一对应,可作为校验清单的最佳事实来源。


二、SecretStore 与 ClusterSecretStore:密钥源的统一抽象

2.1 资源定位

SecretStore 是命名空间级资源,ClusterSecretStore 是集群级资源,二者承载相同的specSecretStoreSpec)与statusSecretStoreStatus)。ExternalSecret 通过spec.secretStoreRef引用它们,从而解耦“密钥从哪里来”与“密钥怎么用”。

2.2 SecretStoreSpec 核心字段

字段类型说明
providerSecretStoreProvider必填,Provider 专属配置,二选一(详见下文)
refreshIntervalmeta/v1.Duration可选,Provider 凭据的刷新间隔(Golang Duration 字符串,如"1h"
controllerstring可选,指定由哪个 controller 实例处理;配合--enable-controller与 ControllerClass 实现多租户隔离
retrySettingsSecretStoreRetrySettings可选,定义请求重试策略(maxRetriesretryInterval等),见docs/api/secretstore.md

2.3 SecretStoreProvider:Provider 专属配置的并集

SecretStoreProvider是一个“一字段一 Provider”的并集结构,docs/api/spec.md为其列出了数十个可选字段,每个字段对应一个 Provider 的完整配置类型:

  • 云厂商密钥服务awsAWSProvider)、azurekvAzureKVProvider)、gcpsmGCPSMProvider)、oracleOracleProvider)、ibmIBMProvider)、yandexlockboxYandexLockboxProvider)、yandexcertificatemanagerYandexCertificateManagerProvider)、volcengineVolcengineProvider)、scalewayScalewayProvider)、cloudruCloudruSMProvider)、nebiusNebiusMysteryboxProvider);
  • Vault 生态vaultVaultProvider)、openbaoOpenBaoProvider)、akeylessAkeylessProvider)、fortanixFortanixProvider)、conjurConjurProvider);
  • DevOps / SaaS 平台dopplerDopplerProvider)、infisicalInfisicalProvider)、onboardbaseOnboardbaseProvider)、previderPreviderProvider)、passboltPassboltProvider)、passworddepotPasswordDepotProvider)、secretserverSecretServerProvider)、delineaDelineaProvider)、keepersecurityKeeperSecurityProvider)、senhaseguraSenhaseguraProvider)、bitwardensecretsmanagerBitwardenSecretsManagerProvider)、ngrokNgrokProvider)、pulumiPulumiProvider)、beyondtrustBeyondtrustProvider)、beyondtrustworkloadcredentialsBeyondtrustWorkloadCredentialsProvider)、chefChefProvider)、dvlsDVLSProvider);
  • 代码托管 / GitOpsgithubGithubProvider,仅支持写操作,即 PushSecret,无法从 GitHub 拉取)、gitlabGitlabProvider);
  • 通用 / 基础设施kubernetesKubernetesProvider,读取其他集群的 Secret)、crdCRDProvider,从任意 Kubernetes 资源读取,按 API group/version/kind 选择;注意读取 core v1 Secret 被有意禁用,应改用 Kubernetes Provider)、webhookWebhookProvider,通用模板化 Webhook)、fakeFakeProvider,静态键值对,多用于测试与本地演示)、onepasswordOnePasswordProvider)、onepasswordSDKOnePasswordSDKProvider)、ovhOvhProvider)。

说明:GithubProvider在 spec 中被明确标注为“仅支持写操作(PushSecret)且无法从 GitHub 获取密钥”;CRDProvider则说明“group 可为空字符串以选择 ConfigMap 等核心资源,但读取 core v1 Secret 被有意阻止”。

2.4 以 AWSProvider 为例看 Provider 配置结构

AWSProvider是 Provider 配置中最具代表性的一个,其字段在 spec 中均有完整描述:

字段类型必填说明
serviceAWSServiceType指定使用哪个 AWS 服务,枚举:SecretsManagerParameterStoreCertificateManager
regionstringProvider 使用的 AWS 区域
authAWSAuth认证信息;若不设置,AWS SDK 会从环境推断凭据
rolestringProvider 将扮演的 Role ARN
additionalRoles[]string在扮演最终 Role 之前依序扮演的链式 Role ARN 列表
externalIDstring设置在假定 IAM 角色上的 AWS External ID
sessionTags[]*TagAWS STS assume role 会话标签
transitiveTagKeys[]string传递性会话标签,多规则场景必需
sessionTagsPolicySessionTagsPolicy控制扮演角色时是否及如何附加 STS 会话标签:None(默认,不加)、Simple(自动附加esoNamespaceesoStoreNameesoStoreKind)、Custom(在 Simple 基础上追加customSessionTags);使用 Simple/Custom 时 IAM 角色必须具备sts:TagSession权限
customSessionTagsmap[string]stringSessionTagsPolicy=Custom时附加的自定义会话标签
secretsManagerSecretsManager定义与 AWS SecretsManager 交互时的行为
prefixstring为所有取回的值添加前缀

AWSAuth规定认证方式三选一:secretRef(静态凭据)、jwt(基于 ServiceAccount 令牌,AWSJWTAuth.serviceAccountRef)或都不设置(由 AWS SDK 默认链路解析)。AWSAuthSecretRef要求accessKeyIDSecretRefsecretAccessKeySecretRef必须同时定义才能正确认证;若为临时凭据,还需提供sessionTokenSecretRef

最小可运行示例(AWS SecretsManager + 静态凭据):

apiVersion: external-secrets.io/v1 kind: SecretStore metadata: name: aws-secretsmanager spec: provider: aws: service: SecretsManager region: us-east-1 auth: secretRef: accessKeyIDSecretRef: name: aws-credentials key: access-key secretAccessKeySecretRef: name: aws-credentials key: secret-access-key # 可选:角色扮演与会话标签 # role: arn:aws:iam::123456789012:role/eso-reader # sessionTagsPolicy: Simple

对应的完整 Provider 文档与示例可分别查看 docs/provider/aws-secrets-manager.md、docs/snippets/aws-sm-store.yaml。Provider 的类型定义源码位于 apis/externalsecrets/v1/secretstore_aws_types.go 等secretstore_*.go文件中。


三、ExternalSecret:把外部密钥变成 Kubernetes Secret

3.1 资源定义与核心 Spec 字段

spec 对 ExternalSecret 的定位是:“定义如何从外部 API 获取数据,并将其作为 Kubernetes Secrets 提供”(见ExternalSecret类型注释)。其specExternalSecretSpec)字段如下:

字段类型说明
secretStoreRefSecretStoreRef可选,引用SecretStoreClusterSecretStore(含kind字段区分二者)
targetExternalSecretTarget可选,定义要创建的 Kubernetes Secret 的蓝图
refreshPolicyExternalSecretRefreshPolicy可选,刷新策略(见下)
refreshIntervalmeta/v1.Duration可选,从 Provider 重新读取值的间隔;默认1h0m0s
syncWindowsExternalSecretSyncWindows可选,限制周期刷新的时间窗口(仅对 Periodic 策略生效)
data[]ExternalSecretData可选,逐键映射:K8s Secret 键 ↔ Provider 数据
dataFrom[]ExternalSecretDataFromRemoteRef可选,批量拉取 Provider 数据的所有属性;多条按顺序合并

refreshInterval使用 Golang Duration 字符串,合法时间单位是nsus(或µs)、mssmh,例如"1h0m0s""2h30m0s""10m0s";设为"0s"表示只拉取并创建一次。

3.2 RefreshPolicy:三种刷新策略

ExternalSecretRefreshPolicystring别名)在 spec 中定义了三个取值:

取值语义
CreatedOnce仅在 Secret 不存在时创建,之后不再更新
PeriodicrefreshInterval周期从外部源同步;若refreshInterval为 0 则不进行周期更新
OnChange仅在 ExternalSecret 的 metadata 或 spec 发生变化时同步

syncWindows用于进一步约束 Periodic 刷新:每个条目由schedule(标准 5 段 cron 表达式,UTC 求值,也支持@daily@every 1h等简写)与duration(窗口持续时长,如"8h")组成;kindallow(仅窗口激活期间允许刷新)或deny(窗口激活期间阻止刷新),同一列表内所有窗口共享一个 Kind。示例:schedule: "0 22 * * 1-5"duration: "8h"表示每个工作日 22:00 UTC 打开 8 小时刷新窗口。

3.3 Target:目标 Secret 的创建策略

ExternalSecretTarget字段包括:

字段类型默认值 / 说明
namestring默认为 ExternalSecret 的.metadata.name
creationPolicyExternalSecretCreationPolicy默认Owner
deletionPolicyExternalSecretDeletionPolicy默认Retain
templateExternalSecretTemplate目标 Secret 的蓝图(type、engineVersion、metadata、mergePolicy、data、templateFrom)
manifestManifestReference改为创建自定义资源(如 ConfigMap、CR)而非 Secret;spec 明确警告这是 Generic target,需确保访问策略与加密配置正确
immutablebool最终 Secret 是否不可变

ExternalSecretCreationPolicy的五个取值(spec 有逐项语义说明):

取值语义
CreateOrMerge缺失时创建,已存在时合并 data 字段且不设置 ownerReference;ExternalSecret 存在期间被删除的目标会被重建,删除 ExternalSecret 后 Secret 保留
Merge不创建 Secret,仅将 data 字段合并进已有 Secret
None不创建 Secret(预留给未来 injector 使用)
Orphan创建 Secret 但不设置 ownerReference,ExternalSecret 删除后 Secret 被孤立保留
Owner创建 Secret 并设置.metadata.ownerReferences指向 ExternalSecret(默认值)

3.4 data 与 dataFrom:单键映射与批量拉取

data[].ExternalSecretData是“一键一值”的显式映射:

字段说明
secretKeyKubernetes Secret 中存放值的键
remoteRef指向远端密钥,定义拉取哪个 secret(version/property 等)
sourceRef允许覆盖值的来源(StoreSourceRef

remoteRefExternalSecretDataRemoteRef的完整字段:

字段必填说明
keyProvider 中的密钥键,必填
metadataPolicy是否拉取 Provider 密钥的 tags/labels:FetchNone,默认None
property当 Provider 值是 map 时选择特定属性(如 JSON 字段)
version远端密钥版本(Provider 支持时)
conversionStrategy值转换策略:Default/UnicodeExternalSecretConversionStrategy
decodingStrategy解码策略(ExternalSecretDecodingStrategy),见 docs/guides/decoding-strategy.md

dataFrom[].ExternalSecretDataFromRemoteRef用于批量拉取,支持四种子模式(字段互斥组合):

字段说明
extract从一个 secret 中提取多组键值对(不支持sourceRef.Generator
find基于 tags 或正则查找多个 secret(不支持sourceRef.Generator
rewrite对拉取到的 Secret 键做重写,支持多个操作按“先到后”分层应用
sourceRef指向 store 或 generator(StoreGeneratorSourceRef);指向 generator 时不支持 Extract/Find,generator 返回静态 map

ExternalSecretRewrite支持regexp(正则重写,ExternalSecretRewriteRegexp)与transform(变换重写,ExternalSecretRewriteTransform)两种操作,对应实战指南见 docs/guides/datafrom-rewrite.md 与 docs/api/selectable-fields.md。

最小可运行示例(data + dataFrom 组合):

apiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: app-secrets spec: refreshInterval: 10m refreshPolicy: Periodic secretStoreRef: name: aws-secretsmanager kind: SecretStore target: name: my-app-secret creationPolicy: Owner deletionPolicy: Retain template: type: Opaque data: - secretKey: db-password remoteRef: key: prod/db property: password dataFrom: - extract: key: prod/app-config - find: name: regexp: "^prod/feature-.*$" - rewrite: - regexp: source: "prod/" target: ""

3.5 Status 与观测字段

ExternalSecretStatus包含:refreshTime(最近一次拉取并更新目标 Secret 的时间)、syncedResourceVersion(最近同步版本)、conditions(条件列表)与binding(servicebinding.io Provisioned Service 引用)。ExternalSecretConditionType只有两个取值:Ready(已就绪并同步)与Deleted(已删除)。


四、ClusterExternalSecret:跨命名空间批量生成 ExternalSecret

ClusterExternalSecretexternal-secrets.io/v1)与ClusterSecretStore(集群级)配套,解决“一个外部密钥源分发到多个命名空间”的问题。ClusterExternalSecretSpec在 spec 中完整列出了:

字段说明
externalSecretSpec嵌入的ExternalSecretSpec,作为每个命名空间中生成的 ExternalSecret 的模板
namespaceSelector/namespaceList选择目标命名空间(标签选择器或显式列表)
refreshInterval重新评估命名空间匹配并生成/回收 ExternalSecret 的间隔
maxNamespaces(推断)单次最多生成的命名空间数上限

其状态(ClusterExternalSecretStatus)含conditionsgeneratedExternalSecrets(已生成的 ExternalSecret 数量)、failedNamespacesClusterExternalSecretNamespaceFailure,含 namespace 与失败原因)等观测字段。完整介绍见 docs/api/clusterexternalsecret.md 与设计文档 design/003-cluster-external-secret-spec.md。


五、PushSecret 与 ClusterPushSecret(v1alpha1):把 Kubernetes Secret 推回 Provider

external-secrets.io/v1alpha1包承载方向相反的同步能力——将集群内的 Secret 推送到外部 Provider。PushSecretSpec核心字段:

字段类型说明
refreshIntervalmeta/v1.Duration尝试推送的间隔
secretStoreRefs[]PushSecretStoreRef目标 Provider 引用列表(可同时推送到多个 store)
updatePolicyPushSecretUpdatePolicy如何更新 Provider 中的 Secret
deletionPolicyPushSecretDeletionPolicy删除 ExternalSecret 时如何处理 Provider 中的 Secret
selectorPushSecretSelector指定源 Kubernetes Secret
data[]PushSecretData逐键推送规则(match匹配源键、conversionStrategy转换策略)
dataTo[]PushSecretDataTo批量推送规则:把源 Secret 的键按match/正则展开为 Provider 条目(含overriderewritetemplatemetadata等)
templateExternalSecretTemplate推送内容的模板

配套类型还包括:PushSecretDataToMatchall/regexp)、PushSecretRewritePushSecretMetadataPushSecretRemoteRefPushSecretSecretPushSecretStoreRef(storeRef +generation)以及SyncedPushSecretsMapstatus.syncedPushSecrets记录各 store 的同步结果)。PushSecretStatus提供refreshTimesyncedResourceVersionsyncedPushSecrets三个观测字段。

最小示例(推送到 AWS SecretsManager):

apiVersion: external-secrets.io/v1alpha1 kind: PushSecret metadata: name: push-db-creds spec: refreshInterval: 10m secretStoreRefs: - name: aws-secretsmanager kind: SecretStore selector: secret: name: my-app-secret data: - match: secretKey: db-password remoteRef: remoteKey: prod/db-password

完整说明见 docs/api/pushsecret.md、docs/guides/pushsecrets.md 与设计文档 design/002-pushsecret.md。注意:PushSecret 属于 v1alpha1,字段仍可能演进。


六、generators.external-secrets.io/v1alpha1:在集群内生成新密钥

generators.external-secrets.io/v1alpha1提供“生成器”能力——不再从外部系统拉取,而是在集群内按需生成新凭据,并通过 ExternalSecret 的dataFrom[].sourceRef.generatorRef消费。spec 中列出了完整的生成器类型,包括:

生成器用途
ACRAccessTokenAzure Container Registry 短期访问令牌
ECRAuthorizationTokenAWS ECR 授权令牌
GCRAccessTokenGoogle Container Registry 访问令牌
GitHubAccessTokenGitHub App 安装访问令牌
GitLabDeployTokenGitLab Deploy Token 创建
Password按规则生成随机密码(长度、字符集、数字/符号数量等)
SSHKey生成 RSA/ECDSA SSH 密钥对
UUID生成 UUID
VaultDynamicSecret从 Vault 动态 secret 引擎获取租约凭据
Webhook通过自定义 Webhook 生成
其他Quay、Cloudsmith、Fake、Grafana、MFA、STS、beyondtrustworkloadcredentials 等

典型用法:ExternalSecret 的dataFrom[].sourceRef指向generatorRefGeneratorRef,含apiVersionkindname)。例如用 Password 生成器:

apiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: generated-password spec: secretStoreRef: name: fake-store kind: SecretStore target: name: generated-secret dataFrom: - sourceRef: generatorRef: apiVersion: generators.external-secrets.io/v1alpha1 kind: Password name: my-password --- apiVersion: generators.external-secrets.io/v1alpha1 kind: Password metadata: name: my-password spec: length: 32 digits: 8 symbols: 4

生成器的 API 文档分篇见 docs/api/generator,示例见 docs/snippets/generator-password-example.yaml;其实现位于 generators/v1 下的独立子模块(每个生成器一个 Go module)。生成器的状态机与条件说明见 design/011-generator-state.md。


七、v1 与 v1beta1:版本关系与迁移提示

spec 中external-secrets.io/v1beta1的绝大部分类型与external-secrets.io/v1同名同构(如AWSAuthExternalSecretSecretStoreVaultProvider等),但存在少量差异,例如:

  • v1beta1 提供AlibabaAuth/AlibabaProvider/AlibabaRRSAAuthDevice42Provider等 v1 中未出现的 Provider 类型;
  • v1beta1 未包含 v1 中的部分新字段(如ExternalSecretRewriteMergeExternalSecretSyncWindowssessionTagsPolicyexternalID等演进特性集中在 v1)。

从仓库文档 docs/guides/v1beta1.md 与 docs/introduction/deprecation-policy.md 可以看出,项目维护者持续推进 API 收敛:新功能优先落在external-secrets.io/v1,存量 v1beta1 用户应逐步迁移到 v1。设计动机见 design/001-design-crd-v1beta1.md。


八、如何在仓库中核对每一项字段

由于 spec.md 是代码生成文档(仓库 hack/api-docs 负责生成),核对字段时推荐以下“三重校验”路径:

  1. 类型定义:阅读 apis/externalsecrets/v1 下对应*_types.go文件,例如externalsecret_types.gosecretstore_types.gosecretstore_aws_types.gosecretstore_vault_types.go等,字段注释即 spec.md 的原始来源;
  2. CRD 清单:查看 config/crds/bases 下对应 YAML(如externalsecrets.external-secrets.io_externalsecrets.yaml),确认 JSON schema 与校验规则;
  3. 校验器与测试:阅读 apis/externalsecrets/v1/externalsecret_validator.go 与测试文件(externalsecret_validator_test.gosecretstore_validator_test.go),理解 Webhook 校验逻辑;端到端用例见 e2e/suites。

结语

docs/api/spec.md是一份覆盖面极广的 API 权威参考——从 ExternalSecret 的data/dataFrom双通道拉取、creationPolicy/deletionPolicy/refreshPolicy三策略矩阵,到 SecretStoreProvider 的四十余种 Provider 配置、PushSecret 的反向推送,再到 Generator 的集群内密钥生成。本文已按“包结构 → Store → ExternalSecret → 集群级资源 → PushSecret → Generator → 版本迁移 → 源码核对”的主线将其完整展开。当你需要编写或审查 ESO 清单文件时,建议以 docs/api/spec.md 查字段语义、以 config/crds/bases 验 schema、以 apis/externalsecrets/v1 的 Go 注释追溯设计意图,三管齐下即可保证配置的准确性与可维护性。

【免费下载链接】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),仅供参考

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

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

立即咨询