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

发布时间:2026/11/5 14:56:20

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/11/2 6:40:08

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

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

2026/11/5 1:31:10

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

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

2026/11/4 16:32:09

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

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

2026/11/5 14:10:30

ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计

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

2026/11/5 14:10:30

UART接口24位ADC搭配RS485,解决远距离温度监控难题

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

2026/11/5 14:10:30

UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践

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

2026/11/5 13:55:19

GD32E10x官方例程入门:从GPIO点灯到串口调试

简介:这份GD32E10x系列官方例程面向嵌入式硬件与单片机开发者,基于ARM Cortex-M3内核,汇集兆易创新GD32E10x的示例代码,适合工业控制、消费电子、通信设备等场景的学习、验证与二次开发。压缩包共935个文件,约11.16MB&…

2026/11/5 13:50:18

基于Django的运维平台实战:资产、发布、巡检、告警一体化

简介:这份资源是一套基于Django框架开发的运维平台源码,面向具备Python基础、希望了解Web运维系统实现思路的开发者与运维人员,可用于学习主机管理、服务监控、日志查看、任务调度、权限控制、资源统计、脚本执行与故障告警等常见运维模块的落…

2026/11/5 13:25:11

基于ADS122U04IPWR与STM32F427ZI的工业测温方案设计

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

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

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

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

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