ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

External Secrets Operator 高级模板引擎(Templating v2)实战指南:从数据变换到 Secret 渲染

External Secrets Operator 高级模板引擎(Templating v2)实战指南:从数据变换到 Secret 渲染 External Secrets Operator 高级模板引擎Templating v2实战指南从数据变换到 Secret 渲染【免费下载链接】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 OperatorESO从 AWS Secrets Manager、Vault、Azure Key Vault 等外部服务读取密钥后默认会原样写入 Kubernetes 的KindSecret。但很多场景下我们需要在落盘前对数据进行变换拼接多段配置、重组 JSON、把 PKCS#12 证书拆成tls.crt/tls.key、为 ingress 生成 htpasswd 认证文件甚至解密 RSA 密文。ESO 提供的Templating v2 高级模板引擎通过spec.target.template启用正是为此设计。本文以 docs/guides/templating.md 为核心骨架结合仓库内 API 类型定义apis/externalsecrets/v1/externalsecret_types.go与模板引擎实现runtime/template/v2/template.go系统讲解模板配置、mergePolicy、templateFrom、内置辅助函数、PushSecret 模板化以及从 v1 迁移的完整路径读者读完即可在自己的 ExternalSecret 中落地各类数据变换方案。一、模板引擎工作原理与基本约定1.1 核心机制External Secrets Operator 允许在将外部数据写入KindSecret之前通过spec.target.template对数据进行变换。其基本原理是模板中每个 data 值都会被当作一个 Go template 来解释模板的输入数据.根对象是来自spec.data与spec.dataFrom查询到的全部键值对。从源码看模板执行入口由版本分发EngineForVersion在 runtime/template/engine.go 中根据TemplateEngineVersion选择执行器当前唯一受支持的版本是v2对应v2.Execute见 runtime/template/v2/template.go。Execute会根据TemplateScopeValues或KeysAndValues分别走“仅渲染值”或“键值一起渲染”两条路径。一个必须牢记的语义引用模板中不存在的键会直接报错而不是静默忽略。这一点在引擎实现中有明确体现——execute函数创建模板时显式指定了Option(missingkeyerror)runtime/template/v2/template.go因此任何拼写错误都会在渲染阶段暴露并由控制器重试而不是生成残缺的 Secret。1.2 命名约定camelCase 与带横线的键官方建议spec.data.secretKey尽量使用 camelCase如serviceAccountToken这符合模板点路径的访问习惯。如果密钥名称中包含-横线无法用.data.xxx形式直接访问必须改用 Go template 的index函数{{ index .data service-account-token }}1.3 自定义分隔符引擎还支持通过控制器启动参数调整模板定界符--template-left-delimiter默认{{与--template-right-delimiter默认}}见 runtime/template/v2/template.go。一般情况下无需改动但如果你的配置内容本身大量包含{{ }}可以借此避免转义。二、Helm 安装下的模板转义当通过 Helm 部署 ExternalSecret 清单时Helm 自身也会渲染{{ }}表达式。为避免 Helm 与 ESO 两层模板引擎互相干扰最简单的方式是使用反引号包裹Go 原始字符串常量不会触发任何模板解析。完整示例见 docs/snippets/helm-template-v2-escape-sequence.yamlapiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: template spec: # ... target: template: engineVersion: v2 data: name: admin # password: {{ .mysecret }} # 纯 manifest / GitOps 工具直接用 password: {{ {{ .mysecret }} }} # 使用 Helm 时用反引号转义 data: - secretKey: mysecret remoteRef: key: /credentials注意上面 YAML 中password的值是一个字符串它同时包含外层反引号Helm 不再解析与内层的{{ .mysecret }}最终由 ESO 渲染。若使用 Argo CD、Kustomize 等不渲染 Go template 的 GitOps 工具则直接写{{ .mysecret }}即可。三、基础示例多行配置与多键模板3.1 把密钥注入配置文件最常见的用法是将多个密钥拼装成一个挂载到 Pod 里的配置文件。以下示例见 docs/snippets/multiline-template-v2-external-secret.yaml演示了多行 YAML 配置与管道函数replace的用法apiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: template spec: # ... target: name: secret-to-be-created # 这就是最终 KindSecret 的样子 template: engineVersion: v2 data: # 多行字符串 config: | datasources: - name: Graphite type: graphite access: proxy url: http://localhost:8080 password: {{ .password }} user: {{ .user }} # 用 replace 函数改写密钥值 connection: {{ .dburl | replace postgres:// postgresql:// }} data: - secretKey: user remoteRef: key: /grafana/user - secretKey: password remoteRef: key: /grafana/password - secretKey: dburl remoteRef: key: /database/url要点target.name指定生成的 Secret 名称target.template.data的键就是最终 Secret data 的键模板输入.user、.password、.dburl分别来自下方data中定义的secretKeyreplace属于 sprig 字符串函数ESO 在 runtime/template/v2/template.go 中通过maps.Copy(tplFuncs, sprig.TxtFuncMap())将 200 个 sprig 函数全部注册进模板环境。3.2 同一 Secret 中的多键渲染另一个示例docs/snippets/multikey-template-v2-external-secret.yaml展示了在同一个模板 Secret 中渲染多个键并标注了 Helm 场景下的转义写法apiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: template spec: # ... target: template: engineVersion: v2 data: name: admin password: {{ .mysecret }} # 纯 manifest / GitOps 工具 # password: {{ {{ .mysecret }} }} # Helm 等模板化工具 data: - secretKey: mysecret remoteRef: key: /credentials四、MergePolicy模板结果与原始数据的合并策略默认情况下模板机制不会使用data/dataFrom查询到的任何原始信息最终 Secret 只包含模板渲染出的内容。通过template.mergePolicy可以改变这一行为Replace默认值模板输出完全替换原始数据Mergedata与dataFrom的键也会被嵌入模板生成的 Secret 中但优先级低于模板输出——即模板渲染出的同名键会覆盖原始键。API 类型定义见 apis/externalsecrets/v1/externalsecret_types.go枚举值由 CRD 校验限定为Replace;Merge。合并语义同样可以在引擎代码中印证valueScopeApply对模板中每个键执行渲染后调用applyToTarget而Merge模式下会保留原始 data 键见 runtime/template/v2/template.go 与Execute的合并逻辑。示例docs/snippets/merge-template-v2-external-secret.yamlapiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: template spec: # ... target: template: mergePolicy: Merge engineVersion: v2 data: name: admin password: {{ .password | b64dec }} # 覆盖 data 中 password使用这里的渲染结果 data: - secretKey: password remoteRef: key: /credentials/password - secretKey: username # Merge 模式下username 会原样保留在模板 Secret 中 remoteRef: key: /credentials/username上面的例子中password先从 provider 取回通常 Base64 编码模板里用b64dec解码后覆盖写入而username因为没有出现在模板中在Merge策略下被原样保留。五、TemplateFrom从 ConfigMap/Secret 拉取模板5.1 模板外置与定向渲染模板不一定要内联写在 ExternalSecret 中可以通过template.templateFrom引用ConfigMap 或其他 Secret作为模板来源。每个TemplateFrom条目可以引用一个configMap或secret并通过items[].key指定要使用的键、items[].templateAs指定渲染方式Values或KeysAndValues。templateFrom还允许把模板结果定向渲染到 Secret 的Annotations、Labels 或 Data三个目标位置对应TemplateTargetData、TemplateTargetAnnotations、TemplateTargetLabels见 apis/externalsecrets/v1/externalsecret_types.go。API 校验器会限制目标值对于 Secret 资源只接受空值、Data、Annotations、Labels其它值会被拒绝以防止写入 Secret 的特权字段见 apis/externalsecrets/v1/externalsecret_validator.go。完整示例见 docs/snippets/template-v2-from-secret.yaml# 先在 ConfigMap 中定义模板 apiVersion: v1 kind: ConfigMap metadata: name: grafana-config-tpl data: config.yaml: | datasources: - name: Graphite type: graphite access: proxy url: {{ .uri }} password: {{ .password }} user: {{ .user }} templated: | # 键和值都被模板化 my-application-{{ .user}}: {{ .password | b64enc }} # 条件键 {{- if hasPrefix oci:// .uri }} enableOCI: true {{- else }} enableOCI: false {{- end }} # 固定值 application-type: grafana annotations: | # 动态时间戳 last-synced-for-user/{{ .user }}: {{ now }} --- apiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: my-template-example spec: # ... target: name: secret-to-be-created template: engineVersion: v2 templateFrom: - target: Data configMap: name: grafana-config-tpl items: - key: config.yaml templateAs: Values - key: templated templateAs: KeysAndValues - target: Annotations configMap: name: grafana-config-tpl items: - key: annotations templateAs: KeysAndValues data: - secretKey: user remoteRef: key: /grafana/user - secretKey: password remoteRef: key: /grafana/password - secretKey: uri remoteRef: key: /grafana/uri这里的关键差异在于templateAsValues只渲染模板的值键保持 ConfigMap 中的原样如config.yaml键KeysAndValues模板被当作一段 YAML/文本整体渲染渲染结果中既产生键也产生值如templated条目里动态生成的my-application-user键以及hasPrefix条件控制的enableOCI键。引擎中对这两种 scope 的分派逻辑在 runtime/template/v2/template.goKeysAndValues走mapScopeApply先把渲染结果当作 YAML 反序列化为map[string]string再逐个写入Values走valueScopeApply逐个键渲染。5.2 Literal内联快捷模板templateFrom还支持literal块用于快速内联模板。与template.data不同Literal渲染的是key: value形式的整体内容而template.data只能对单个值做模板化。下面的示例docs/snippets/template-v2-scope-and-target.yaml把一条动态注解渲染到 Secret 的 AnnotationsapiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: my-template-example spec: # ... target: name: secret-to-be-created template: engineVersion: v2 templateFrom: - target: Annotations literal: last-sync-for-user/{{ .user }}: {{ .now }} data: - secretKey: user remoteRef: key: /grafana/user - secretKey: password remoteRef: key: /grafana/passwordliteral在TemplateFrom结构体中以可选指针字段存在apis/externalsecrets/v1/externalsecret_types.go可以与configMap/secret引用并存。5.3 ValuesDecodingStrategy渲染值的解码策略templateFrom条目可以通过valuesDecodingStrategy对渲染后的值进行解码。这在模板从结构化 provider 数据中挑选 Base64 编码值时特别有用——最终写入 Kubernetes Secret 的应该是解码后的原始字节。设想dataFrom.find匹配到的多个远端 Secret 含有如下 JSON{ cert: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCg, description: certificate encoded as base64 }对应的 ExternalSecret 定义来自 docs/guides/templating.md 原文apiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: nginx-certs spec: refreshInterval: 1h secretStoreRef: kind: ClusterSecretStore name: aws-secretsmanager dataFrom: - find: name: regexp: ^productA/nginx/.* rewrite: - regexp: source: ^productA/nginx/(.*) target: $1 target: name: nginx-certs template: engineVersion: v2 templateFrom: - literal: |- {{- range $key, $val : . }} {{- $json : $val | fromJson }} {{ $key }}: {{ $json.cert }} {{- end }}如果不设置valuesDecodingStrategy模板选中的cert属性会以 Base64 文本形式存入 Secret。改为显式声明解码策略templateFrom: - valuesDecodingStrategy: Base64 literal: |- {{- range $key, $val : . }} {{- $json : $val | fromJson }} {{ $key }}: {{ $json.cert }} {{- end }}此时模板内部仍然渲染安全的 Base64 文本ESO 随后对渲染值解码将解码后的字节写入 Secret 的 data只有渲染的值被解码渲染出的键保持不变见 runtime/template/v2/template.go 中decoding.Decode的调用位置。ExternalSecretDecodingStrategy的合法取值在 API 中定义为Auto;Base64;Base64URL;Noneapis/externalsecrets/v1/externalsecret_types.go值未编码时用None值可能是 Base64/Base64URL 编码时用Base64、Base64URL甚至Auto。官方还特别提醒对二进制数据来说用valuesDecodingStrategy解码比在模板内写{{ $json.cert | b64dec }}更安全因为b64dec会把原始字节直接注入中间渲染出的 YAML 中容易破坏 YAML 结构。5.4 htpasswd 示例为 ingress-controller 生成认证文件htpasswd函数可以生成bcrypt或SHA-1哈希用于构造 ingress-nginx basic auth 所需的htpasswd文件内容通过auth键提供给 ingress。假设 provider 中的 Secret 是一组键值对{ user1: password1, user2: password2, ... }可以用bcrypt更安全或sha部分应用不支持 bcrypt 时作为哈希算法参数。示例见 docs/snippets/template-v2-literal-example.yamlapiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: my-template-example spec: # ... target: name: secret-to-be-created template: engineVersion: v2 templateFrom: - target: Data literal: |- {{- $creds : list }} {{- range $user, $pw : . }} {{- $creds append $creds (printf %s (htpasswd $user $pw bcrypt)) }} {{- end }} auth: {{ $creds | join \n | quote }} dataFrom: - extract: key: /ingress-controller/valid-users该模板遍历dataFrom.extract取回的所有键值对对每个用户生成 bcrypt 哈希再用换行符拼接成标准的 htpasswd 文件内容写入auth键。htpasswd函数在仓库内由 ESO 自带实现并注册进模板函数表见 runtime/template/v2/sprig/crypto.go 与 runtime/template/v2/sprig/functions.go测试用例同时覆盖了bcrypt与shaSHA-1两种算法runtime/template/v2/template_test.go。六、证书与密钥处理辅助函数模板引擎内置了一批与 PKCS#12、PEM、JWK 相关的专用函数方便在模板中直接完成证书格式转换。6.1 从 PKCS#12 归档提取密钥与证书利用预置函数可以从 PKCS#12 归档中提取私钥和证书并以 PEM 格式存储示例见 docs/snippets/pkcs12-template-v2-external-secret.yamlapiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: template spec: # ... target: template: type: kubernetes.io/tls engineVersion: v2 data: tls.crt: {{ .mysecret | pkcs12cert }} tls.key: {{ .mysecret | pkcs12key }} # 归档带密码时使用 Pass 变体解锁 tls.crt: {{ .mysecret | pkcs12certPass my-password }}pkcs12key/pkcs12keyPass提取 PKCS#12 归档中的全部私钥编码为 PKCS#8 PEMpkcs12cert/pkcs12certPass提取全部证书并在可能时排序leaf / intermediate(s) / root证书不连续或有多个 leaf 时按原样返回生成 Secret 的type可设为kubernetes.io/tls方便直接挂载到 Ingress 等对象。反向转换也有对应函数pemToPkcs12/pemToPkcs12Pass单证书密钥 → Base64 的 PKCS#12 归档、fullPemToPkcs12/fullPemToPkcs12Pass证书链密钥 → PKCS#12、pemTruststoreToPKCS12/pemTruststoreToPKCS12Pass仅证书 → PKCS#12 信任库。6.2 从 JWK 提取公钥/私钥当 provider 返回的是 JSON 序列化的 JWK 时可以提取其公钥/私钥部分输出为 PEM 格式示例见 docs/snippets/jwk-template-v2-external-secret.yamlapiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: template spec: # ... target: template: engineVersion: v2 data: # .myjwk 是 json 编码的 JWK 字符串 jwk_pub: {{ .myjwk | jwkPublicKeyPem }} # 私钥输出为 PEM 编码的 PKCS#8 私钥 jwk_priv: {{ .myjwk | jwkPrivateKeyPem }}jwkPublicKeyPem输入 JSON 序列化的 JWK输出类型为PUBLIC KEY的 PEM 块基于crypto/x509.MarshalPKIXPublicKeyjwkPrivateKeyPem输入 JWK 字符串输出类型为PRIVATE KEY、PKCS#8 格式的 PEM 块基于crypto/x509.MarshalPKCS8PrivateKey。6.3 过滤 PEM 块与证书链当某个 Secret 同时包含 PEM 编码的证书和私钥时可以用filterPEM只提取指定类型的 PEM 块若同一类型存在多个块将按顺序全部返回。示例见 docs/snippets/filterpem-template-v2-external-secret.yamlapiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: template spec: # ... target: template: type: kubernetes.io/tls engineVersion: v2 data: tls.crt: {{ .mysecret | filterPEM CERTIFICATE }} tls.key: {{ .mysecret | filterPEM PRIVATE KEY }}对于包含部分证书链的 Secret可以用filterCertChain提取leaf、intermediate或root证书。把filterPEM与filterCertChain组合可以拆分证书链tls.crt只含 leaf 证书ca.crt含全部中间证书示例见 docs/snippets/filtercertchain-template-v2-external-secret.yamlapiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: template spec: # ... target: template: type: kubernetes.io/tls engineVersion: v2 data: ca.crt: {{ .mysecret | filterPEM CERTIFICATE | filterCertChain intermediate }} tls.crt: {{ .mysecret | filterPEM CERTIFICATE | filterCertChain leaf }} tls.key: {{ .mysecret | filterPEM PRIVATE KEY }}6.4 certSANs提取证书的 Subject Alternative NamescertSANs从 PEM 编码的证书中提取全部 Subject Alternative NamesSAN返回包含 DNS 名称、IP 地址、邮箱地址和 URI 的字符串列表。它可以与filterPEM、filterCertChain组合先取出链中的 leaf 证书再获取其 SAN 列表示例见 docs/snippets/certsans-template-v2-external-secret.yamlapiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: cert-sans-example spec: # ... target: template: engineVersion: v2 data: # 以逗号分隔的字符串存储所有 SAN sans: {{ .certificate | filterPEM CERTIFICATE | filterCertChain leaf | certSANs | join , }} # 取第一个 SAN如主域名 primary-domain: {{ index (.certificate | filterPEM CERTIFICATE | filterCertChain leaf | certSANs) 0 }} # 以 JSON 数组存储 SAN sans-json: {{ .certificate | filterPEM CERTIFICATE | filterCertChain leaf | certSANs | toJson }}6.5 rsaDecrypt在模板中解密 RSA 密文当 provider 返回 RSA 加密的值时可以直接在 v2 模板中用rsaDecrypt函数解密。其调用形式为privateKeyPEM | rsaDecrypt SCHEME HASH ciphertextSCHEMENone或RSA-OAEPHASHSHA1或SHA256第三个参数ciphertext必须是二进制形式。由于 provider 通常返回 Base64 编码的密文有两种处理方式在模板内用b64dec解码如(.password_encrypted_base64 | b64dec)在对应spec.data.remoteRef上设置decodingStrategy: Base64让模板直接收到二进制数据。使用前提spec.target.template.engineVersion: v2同一 ExternalSecret 中有另一个引用提供了无口令的 PEM 格式 RSA 私钥密文必须与密钥对及所选算法/哈希匹配。完整示例见 docs/snippets/rsadecrypt-template-v2-external-secret.yamlapiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: rsa-decrypt-template-v2 spec: # ... target: template: engineVersion: v2 data: # rsaDecrypt(SCHEME, HASH, ciphertext, privateKeyPEM) 解密二进制密文 password: {{ rsaDecrypt RSA-OAEP SHA1 .password_encrypted_binary .privatekey }} data: - secretKey: privatekey remoteRef: key: a-secretname-in-cluster property: privatekey sourceRef: storeRef: kind: SecretStore # 或 ClusterSecretStore name: kubernetes # k8s provider 的名称 - secretKey: password_encrypted_binary remoteRef: key: /credentials/password_encrypted_binary # 若密文是 Base64 编码可在模板内 b64dec或使用 decodingStrategy: Base64 # - secretKey: password_encrypted_base64 # remoteRef: # key: /credentials/password_encrypted_base64 # decodingStrategy: Base64错误处理注意点模板中引用不存在的键会导致渲染失败若密钥/算法/哈希与密文不匹配解密失败控制器会在下次协调时重试。七、PushSecret 的模板化PushSecret的模板化与 ExternalSecret 几乎相同——底层复用的是同一套模板数据结构因此前面介绍的所有能力函数、mergePolicy、templateFrom 等在 PushSecret 上同样可用最终在 provider 侧生成模板化后的 Secret。示例见 docs/snippets/template-v2-push-secret.yamlapiVersion: external-secrets.io/v1beta1 kind: PushSecret metadata: name: template spec: # ... template: engineVersion: v2 data: token: {{ .token | toString | upper }} was templated data: - match: secretKey: token remoteRef: remoteKey: create-secret-name property: token这里template.data.token将本地 Secret 中的token值大写后拼接文本再推送到远端 provider。注意 PushSecret 的模板位于spec.template与 ExternalSecret 的spec.target.template位置不同。八、Helper Functions 速查表除 Go 标准模板函数与 200 sprig 函数外ESO 提供了以下便利函数全部在 runtime/template/v2/template.go 的tplFuncs中注册。出于安全原因env与expandenv这两个 sprig 函数被移除不可以在模板中使用。函数说明pkcs12key从 PKCS#12 归档提取全部私钥编码为 PKCS#8 PEMpkcs12keyPass同pkcs12key使用给定密码解密归档pkcs12cert从 PKCS#12 归档提取全部证书尽可能排序leaf / intermediate(s) / root证书不连续或有多个 leaf 时按原样返回pkcs12certPass同pkcs12cert使用给定密码解密归档pemToPkcs12输入 PEM 证书和密钥生成 Base64 编码的 PKCS#12 归档pemToPkcs12Pass同pemToPkcs12使用给定密码加密归档fullPemToPkcs12输入 PEM 证书链和密钥生成 Base64 编码的 PKCS#12 归档fullPemToPkcs12Pass同fullPemToPkcs12使用给定密码加密归档pemTruststoreToPKCS12输入 PEM 证书生成 Base64 编码的 PKCS#12 归档信任库pemTruststoreToPKCS12Pass同pemTruststoreToPKCS12使用给定密码加密归档filterPEM从一组 PEM 块中过滤出指定类型的块filterCertChain从证书链类型为CERTIFICATE的 PEM 块中过滤指定证书类型leaf/intermediate/rootcertSANs从 PEM 证书提取 Subject Alternative Names含 DNS、IP、邮箱、URI返回字符串列表jwkPublicKeyPem输入 JSON 序列化的 JWK返回类型为PUBLIC KEY的 PEM 块jwkPrivateKeyPem输入 JSON 序列化的 JWK 字符串返回 PKCS#8 格式、类型为PRIVATE KEY的 PEM 块rsaDecrypt用 PEM 私钥解密 RSA 密文。用法rsaDecrypt SCHEME HASH ciphertext privateKeyPEM或privateKeyPEM \| rsaDecrypt SCHEME HASH ciphertext。SCHEME 支持None、RSA-OAEPHASH 支持SHA1、SHA256密文必须是二进制Base64 载荷先用b64dec或decodingStrategy: Base64转换toYaml将任意 interface 序列化为 YAML 字符串marshal 出错时返回空字符串fromYaml将 YAML 文档转换为map[string]anyhexdec解码十六进制值另外sprig 的toJson/fromJson、b64enc/b64dec、htpasswd、replace、hasPrefix、upper、now、quote等函数也全部可用除被移除的env/expandenv外。ESO 还在控制器启动参数中暴露了定界符配置--template-left-delimiter/--template-right-delimiter。九、从 v1 迁移到 v2如果仍在使用v1alpha1的模板引擎旧版需要显式指定template.engineVersion: v2来启用新引擎apiVersion: external-secrets.io/v1alpha1 kind: ExternalSecret metadata: name: secret spec: # ... target: template: engineVersion: v2 # ...v2 最大的变化是几乎所有函数的参数与返回值类型从[]byte改成了string。这意味着不再需要在模板管道的末尾到处写toStringapiVersion: external-secrets.io/v1alpha1 kind: ExternalSecret # ... spec: target: template: engineVersion: v2 data: # 以前需要写成 {{ .foobar | toString }} egg: new: {{ .foobar }}9.1 被移除/替换的函数base64encode更名为b64encbase64decode更名为b64dec解码过程中的错误会被静默fromJSON更名为fromJson反序列化错误会被静默toJSON更名为toJson序列化错误会被静默pkcs12key与pkcs12keyPass直接输出 PEM 编码的 PKCS#8 密钥不再需要调用pemPrivateKey且现在提取归档中的全部私钥不只是第一个pkcs12cert与pkcs12certPass直接输出 PEM 编码的证书不再需要调用pemCertificate且现在提取全部证书不只是第一个toString改用 sprig 实现API 兼容toBytes被移除pemPrivateKey被移除其逻辑已并入pkcs12*函数pemCertificate被移除其逻辑已并入pkcs12*函数。十、结语Templating v2 把 External Secrets Operator 从密钥搬运工升级为数据变换平台通过spec.target.template可以把来自任意 provider 的原始数据在落盘前重组为配置文件、TLS 密钥对、htpasswd 认证文件、解码后的证书字节等任意形态。结合mergePolicy控制合并语义、templateFrom外置并定向渲染模板、valuesDecodingStrategy安全解码二进制值以及 PKCS#12/JWK/PEM/RSA 一整套证书与加密辅助函数绝大多数密钥编排场景都可以用声明式 YAML 直接表达无需额外的 sidecar 或初始化容器。官方推荐直接使用engineVersion: v2配合 sprig 的 200 通用函数几乎任何拿到密钥后还要加工一下的需求都能在模板内完成。如需进一步查阅可参考 docs/snippets 目录下的全部模板示例、API 类型定义 apis/externalsecrets/v1/externalsecret_types.go、引擎实现 runtime/template/v2/template.go 以及对应的单元测试 runtime/template/v2/template_test.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),仅供参考
返回列表