External Secrets Operator 集成 Cloud.ru Secret Manager:认证、SecretStore 与 ExternalSecret 完整配置指南

发布时间:2026/9/17 23:21:05

External Secrets Operator 集成 Cloud.ru Secret Manager:认证、SecretStore 与 ExternalSecret 完整配置指南 External Secrets Operator 集成 Cloud.ru Secret Manager认证、SecretStore 与 ExternalSecret 完整配置指南【免费下载链接】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官方提供者文档的实战解读围绕 Cloud.ru Secret ManagerCSM与 Key Manager 密钥管理系统协同工作的安全模型完整讲解从服务账号与 Access Key 认证、在控制台或 REST API 中创建密钥到编写 SecretStore 与多种形态 ExternalSecret单值、Multi KeyValue、dataFrom提取、按名称/标签/路径检索的端到端配置并结合当前仓库providers/v1/cloudru的源码实现说明底层认证、令牌缓存与 API 调用机制。Cloud.ru 提供者概览External Secrets Operator 通过与 Cloud.ru 云平台的 Secret Manager 服务集成把云端的密钥安全地同步为 Kubernetes Secret。Cloud.ru Secret Manager 与 Key Manager 密钥管理系统协同工作确保密钥在存储与使用过程中的加密安全。在 External Secrets Operator 中该提供者的注册位于 pkg/register/cloudru.go构建时通过cloudru或all_providersbuild tag 启用func init() { // Register cloudru provider esv1.Register(cloudru.NewProvider(), cloudru.ProviderSpec(), cloudru.MaintenanceStatus()) }提供者的能力被声明为只读SecretStoreReadOnly即只能把云端密钥拉取到集群内不能反向推送或删除云端密钥见 provider.go 的Capabilities()实现以及 client.go 中PushSecret、DeleteSecret、SecretExists均返回不支持的错误。因此本文所有场景均为从 Cloud.ru 拉取到 Kubernetes的单向同步。认证机制服务账号与 Access Key使用 Cloud.ru Secret Manager 前需要完成两步准备工作在 Cloud.ru Console 中创建服务账号Service Account。为该服务账号创建 Access Key访问密钥获得一对key_id与key_secret。重要与 SecretManager API 交互时必须使用访问令牌access token。拿到 Access Key 后可通过下面这条 curl 命令换取令牌curl -i --data-urlencode grant_typeaccess_key \ --data-urlencode client_id$KEY_ID \ --data-urlencode client_secret$SECRET \ https://id.cloud.ru/auth/system/openid/token其中$KEY_ID与$SECRET即上一步创建的 Access Key 的key_id与key_secret。从源码看ESO 并不是用 curl 方式换取令牌而是通过 gRPC 调用 Cloud.ru IAM 服务iam-sdk的AuthServiceClient.GetToken并且对令牌做了进程内缓存APIClient保存accessToken与accessTokenExpiresAt只有当令牌过期ExpiresIn到期时才重新向 IAM 换取避免每个请求都重复认证见 adapter/csm_client.go。同时提供者按discoveryURL KeyID Secret组合对客户端做缓存见 provider.go相同凭据复用同一连接减少重复建连与令牌获取。API 端点地址并非硬编码而是从https://api.cloud.ru/endpoints动态发现secret-manager与iam两个产品端点也可以通过环境变量CLOUDRU_DISCOVERY_URL、CLOUDRU_CSM_ADDRESS、CLOUDRU_IAM_ADDRESS覆盖细节见 endpoints.go 与 provider.go。在 Cloud.ru 中创建密钥通过控制台创建登录 Cloud.ru 控制台。点击左上角菜单滚动到Management管理区域选择Secret Manager。点击Create secret创建密钥。填写密钥名称secret name与密钥值secret value。点击Create创建。通过 SecretManager API 创建也可以直接调用 SecretManager API 创建密钥curl --location https://secretmanager.api.cloud.ru/v1/secrets \ --header Content-Type: application/json \ --header Authorization: Bearer ${ACCESS_TOKEN} \ --data { description: your secret description, labels: { env: production }, name: my_first_secret, parent_id: 50000000-4000-3000-2000-100000000001, payload: { data: { value: aGksIHRoZXJlJ3Mgbm90aGluZyBpbnRlcmVzdGluZyBoZXJlCg } } }请求体各字段说明字段说明ACCESS_TOKENCloud.ru API 的访问令牌见上文认证机制一节parent_id父服务实例标识符即 ServiceInstanceID。获取方式在个人账户左上角点击九宫格按钮选择Management → Secret Manager复制 Service Instance ID 字段的值name密钥的名称description密钥的描述labels密钥的标签tags用于检索payload.data.value密钥值base64 编码后的内容注意如需在 Cloud.ru 中创建多键值Multi KeyValue密钥可以直接把 JSON 对象作为密钥值{ key1: value1, key2: value2 }该 JSON 形态与后文 ExternalSecret 的property、dataFrom用法直接对应。创建 SecretStore接入 Cloud.ru 凭据第一步创建 Kubernetes Secret 存放凭据ESO 需要从集群内的 Kubernetes Secret 读取 Access Key 用于认证先创建如下csm-secretapiVersion: v1 kind: Secret metadata: name: csm-secret labels: type: csm type: Opaque stringData: key_id: 000000000000000000001 key_secret: 000000000000000000002字段说明key_idAccess Key 的key_id。key_secretAccess Key 的key_secret。从源码看ESO 通过KubeCredentialsResolver使用SecretKeyRef从指定命名空间解析这两个字段见 resolver.go。如果解析失败如 Secret 不存在或键缺失会返回 failed to resolve accessKeyID / accessKeySecret 错误。第二步创建 SecretStore创建指向csm-secret的 SecretStore关于 SecretStore 的通用说明可参考 SecretStore 文档apiVersion: external-secrets.io/v1 kind: SecretStore metadata: name: csm spec: provider: cloudrusm: auth: secretRef: accessKeyIDSecretRef: name: csm-secret key: key_id accessKeySecretSecretRef: name: csm-secret key: key_secret projectID: 50000000-4000-3000-2000-100000000001字段说明accessKeyIDSecretRef引用存放 Access Key 的 Kubernetes Secretname为 Secret 名key为键名。accessKeySecretSecretRef同上引用 Access Key 的 secret 部分。projectID项目标识符。获取方式在个人账户左上角点击项目名称在弹出的窗口中点击所需项目名称旁边的三个点再点击 Copy the Project ID复制项目 ID。cloudrusm提供者的类型定义位于 apis/externalsecrets/v1/secretstore_cloudru_types.go。从 provider.go 的ValidateStore可知创建连接前会做严格校验auth.secretRef与projectID均为必填项且projectID必须是合法的 UUID 格式否则校验失败accessKeyIDSecretRef与accessKeySecretSecretRef也会通过ValidateReferentSecretSelector校验引用有效性。因此配置时请务必确保projectID形如50000000-4000-3000-2000-100000000001的标准 UUID。创建 ExternalSecret五种典型用法以下 ExternalSecret 均引用上文名为csm的 SecretStore关于 ExternalSecret 的完整字段说明见 ExternalSecret 文档。1. 经典单值密钥非 JSONapiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: csm-ext-secret spec: refreshInterval: 10s secretStoreRef: name: csm kind: SecretStore target: name: my-awesome-secret creationPolicy: Owner data: - secretKey: target_key remoteRef: key: my_first_secret # 也可以使用 secret.id例如 50000000-4000-3000-2000-100000000001remoteRef.key既可以是密钥名称也可以是密钥的 UUID 标识符。从 client.go 的accessSecret实现可见其判断逻辑若key能被解析为 UUID则直接按密钥 ID 调用AccessSecretVersion否则视为密钥名称通过AccessSecretVersionByPath按路径访问。另外remoteRef.version支持形如1的整型版本号或关键字latest空值也按 latest 处理传入其他非数字值会返回ErrInvalidSecretVersion错误。2. 从 Multi KeyValue 密钥中取单个键属性必须是 JSON 格式apiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: csm-ext-secret spec: refreshInterval: 10s secretStoreRef: name: csm kind: SecretStore target: name: my-awesome-secret creationPolicy: Owner data: - secretKey: target_key remoteRef: key: my_first_secret # 也可以使用 secret.id例如 50000000-4000-3000-2000-100000000001 property: cloudru.secret.key # 密钥值中的 JSON 路径property支持点号分隔的嵌套 JSON 路径。底层使用gjson解析见 client.go如果指定了property但密钥值不是合法 JSON会明确报错expecting the secret in JSON format如果 JSON 路径不存在则报错the requested property does not exist in secret。3. 提取全部字段值必须是 JSON 格式apiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: csm-ext-secret spec: refreshInterval: 10s secretStoreRef: name: csm kind: SecretStore target: name: my-awesome-secret creationPolicy: Owner dataFrom: - extract: key: my_first_secret # 也可以使用 secret.id例如 50000000-4000-3000-2000-100000000001该用法对应GetSecretMap实现client.go密钥值按 JSON 对象解析后每个顶层键都会成为 Kubernetes Secret 中的一个条目嵌套对象则保留其 JSON 文本测试用例见 client_test.go。若密钥值不是合法 JSON同步会失败。4. 按名称或标签tags检索dataFrom.find支持单独或组合使用name正则与tags过滤要同步的密钥集合apiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: csm-ext-secret spec: refreshInterval: 10s secretStoreRef: name: csm kind: SecretStore target: name: my-awesome-secret creationPolicy: Owner dataFrom: - find: # 可以单独或同时使用 name 和 tags 来检索密钥 tags: env: production name: regexp: my.*secret5. 按路径检索支持与名称、标签任意组合仅按路径取回该路径下的全部密钥dataFrom: - find: # 获取指定路径下的所有密钥 path: oss/snmp-auths按路径 名称过滤dataFrom: - find: # 获取路径下名称匹配模式的密钥 path: oss/snmp-auths name: regexp: .*按路径 标签过滤dataFrom: - find: # 获取路径下带有指定标签的密钥 path: oss/snmp-auths tags: env: production按路径 名称 标签组合过滤dataFrom: - find: # 获取路径下名称匹配模式且带有指定标签的密钥 path: oss/snmp-auths name: regexp: auth.* tags: env: productionfind的底层实现是GetAllSecretsclient.gotags、name.regexp、path至少设置其一否则返回错误 at least one of the following fields must be set: tags, name, path检索通过 CSM v2SearchSecretRequest完成深度-1表示递归搜索见 adapter/csm_client.go随后对每个命中的密钥取其latest版本。最终输出的 Secret 键名取自密钥的路径其中的/会被替换为_以保证是合法的 Kubernetes Secret 键名可由conversionStrategy控制测试验证见 client_test.go。常见问题与注意事项认证失败确认key_id/key_secret对应的 Access Key 有效且服务账号具备访问 Secret Manager 的权限令牌由 IAM 服务颁发令牌过期后 ESO 会自动重新获取。projectID不合法SecretStore 校验要求projectID必须是标准 UUID否则提供者拒绝创建客户端请从控制台复制正确的 Project ID。JSON 相关报错使用property或dataFrom.extract时云端密钥值必须是合法 JSON使用property时指定的 JSON 路径必须真实存在。只读能力Cloud.ru 提供者仅支持从云端拉取密钥ReadOnly不支持 PushSecret、删除或存在性检查相关调用会直接返回not supported / not implemented错误。版本选择remoteRef.version只接受整型字符串或latest其他值会报ErrInvalidSecretVersion。参考与延伸提供者注册pkg/register/cloudru.goAPI 类型定义apis/externalsecrets/v1/secretstore_cloudru_types.go提供者实现providers/v1/cloudru/secretmanager/provider.go、client.go、adapter/csm_client.go单元测试providers/v1/cloudru/secretmanager/client_test.go通用资源说明SecretStore 与 ExternalSecret【免费下载链接】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),仅供参考
延伸阅读

更多相关文章

2026/9/17 23:21:05

LSTM+Attention+强化学习:机器人导航时序决策框架解析

你有没有遇到过这种情况:仿真环境里跑得挺顺的导航策略,一挪到真实机器人上就各种撞墙、绕远、原地转圈?或者静态地图下没毛病,一旦出现移动行人,整个决策就乱了。我早两年做移动机器人导航实验时,被这类问…

2026/9/17 23:21:05

FDAtool设计IIR滤波器:二阶节系数导出与C语言定点实现

简介:这份PDF文档围绕MATLAB FDAtool在IIR数字滤波器设计中的参数生成与C语言代码导出展开,面向数字信号处理学习者、嵌入式开发人员及需要将滤波器移植到C环境的工程师。内容从角频率与采样频率的关系、通带与阻带截止频率等基本概念切入,对…

2026/9/17 23:16:05

土地复垦方案图件制作规范与PPT教案:坐标系、面积量算与批量出图

简介:这是一份面向土地复垦方案编制人员、国土空间规划与测绘技术人员及高校相关专业师生的专业课件,围绕土地复垦方案图件的制作规范与制图要点展开,可用于岗位培训、课程教学与方案编制自查。整套内容以18页PPT形式呈现,先讲图面…

2026/9/18 1:16:13

集成学习调参实战:从决策树到XGBoost/LightGBM排错

简介:这份由南京大学推出的机器学习导论课程第08章讲义,聚焦集成学习,适合正在系统入门机器学习的高校学生与自学者,用以理解如何将多个学习器组合成更强模型。压缩包内仅1个PDF文件,共14页,约840KB&#x…

2026/9/18 1:16:13

从零构建漫画推荐系统:数据、算法与在线部署实战

简介:这是一篇基于Python的漫画平台推荐系统毕业设计论文,目标读者是计算机相关专业的本科生、研究生,以及正在开发推荐系统项目的开发者。文中不仅阐述了研究背景与开发意义,还系统介绍了Python、B/S架构、MySQL、Django、Vue、J…

2026/9/18 1:16:13

为 Cohere 生成任务选 TaoToken 出口,先对齐 endpoint

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 1:11:12

DOSBox汇编环境搭建与MASM编译链接全流程指南

搞汇编的人,多少都有过被“环境配置”卡住的时候。明明代码在书上看懂了,一到自己机器上就是跑不起来。这几年我帮新生调试课程设计,发现很大一部分问题,根本不是汇编逻辑的问题,而是DOSBox没装好、ASM文件没走到编译那…

2026/9/16 12:52:37

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/18 0:01:09

Google Colab 实战:运行模型、数据加载与报错排查

1. 为什么我劝你先搞懂 Colab 的运行模型1.1 Colab 到底是什么,跟本地跑代码差在哪Google Colab 简单说就是一台跑在浏览器里的 Linux 虚拟机,你打开一个 Notebook,背后就连上了一台带 GPU 的远程机器。你在单元格里敲的每一行 Python&#x…

2026/9/18 0:01:09

C语言数据类型与表达式详解

1. C语言数据与数据类型概述在C语言编程中,数据是程序处理的核心对象。理解数据的分类和特性是掌握C语言的基础。C语言中的数据主要分为四大类:常量、变量、表达式和函数。这些数据类型构成了C语言程序的基本元素,每种类型都有其独特的特性和…

2026/9/18 0:01:09

SQL时间字段指定时间段查询:区间语义、索引与时区避坑

上周排查一个线上问题&#xff0c;用户反馈"昨天的订单一条都没查到"&#xff0c;但数据库里明明躺着两千多条。最后定位下来&#xff0c;不是数据丢了&#xff0c;也不是接口挂了&#xff0c;而是那个查询条件把时间段写成了> 2024-05-20 00:00:00 AND < 2024…

2026/9/16 22:55:57

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/16 22:56:09

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/16 22:56:16

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码