Argo Workflows 使用 Azure AD(Entra ID)令牌认证 Azure Database for PostgreSQL 实战指南
Argo Workflows 使用 Azure ADEntra ID令牌认证 Azure Database for PostgreSQL 实战指南【免费下载链接】argo-workflowsWorkflow Engine for Kubernetes项目地址: https://gitcode.com/gh_mirrors/ar/argo-workflowsArgo Workflows 自 v4.1.0 起内置了对 Azure Database for PostgreSQL 的 Azure ADEntra ID令牌认证支持对应特性文档见 .features/released/v4.1.0/azure-postgres-entra-auth.mdIssue #15530。通过DefaultAzureCredential自动获取访问令牌Argo Workflows 可以利用 Azure Workload Identity 或 Managed Identity 免密连接持久化数据库彻底摆脱对长期有效数据库密码的依赖。读完本文你将掌握该特性的完整配置方法、底层实现原理以及如何将其同时应用于持久化persistence与同步synchronization两类数据库配置。功能概览为什么需要令牌认证在引入该特性之前Argo Workflows 连接 PostgreSQL 持久化数据库必须提供用户名和密码密码以 Kubernetes Secret 形式存储属于长期有效凭据long-lived credentials存在泄露与轮换成本问题。Azure ADEntra ID令牌认证则通过短时有效的访问令牌代替静态密码具备以下优势免密连接无需为数据库创建并维护长期密码数据库账号直接绑定 Entra ID 身份云原生身份在 Azure 环境AKS 等中可直接利用 Azure Workload Identity 或 Managed Identity 完成身份换取凭据由 Azure 平台托管安全可控令牌短时有效且可通过条件访问、角色分配等 Entra ID 策略进行细粒度管控。该特性本身提供三个核心能力来自特性文档原文使用DefaultAzureCredential实现 Azure 环境中的无缝认证seamless authentication支持可配置的令牌作用域configurable token scopes同时集成持久化数据库与同步数据库两类配置。配置详解在 workflow-controller ConfigMap 中启用该特性在 Argo Workflows 侧的全部配置都集中在 workflow-controller 的 ConfigMap 中完整字段说明见 docs/workflow-controller-configmap.md带注释的完整示例见 docs/workflow-controller-configmap.yaml。配置结构PostgreSQLConfig 与 AzureTokenConfig从 config/config.go 的源码定义可以看到令牌认证配置挂在 PostgreSQL 数据库配置下// PostgreSQLConfig contains PostgreSQL-specific database configuration type PostgreSQLConfig struct { DatabaseConfig // SSL enables SSL connection to the database SSL bool json:ssl,omitempty // SSLMode specifies the SSL mode (disable, require, verify-ca, verify-full) SSLMode string json:sslMode,omitempty // AzureToken specifies if the password should be fetched as an Azure token AzureToken *AzureTokenConfig json:azureToken,omitempty // AWSRDSToken specifies if the password should be fetched as an AWS RDS IAM auth token AWSRDSToken *AWSRDSTokenConfig json:awsRDSToken,omitempty } type AzureTokenConfig struct { // Enabled enables Azure token fetching Enabled bool json:enabled,omitempty // Scope is the scope to request the token for. Defaults to https://ossrdbms-aad.database.windows.net/.default if empty. Scope string json:scope,omitempty }AzureTokenConfig只有两个字段语义非常清晰字段类型说明enabledbool是否启用 Azure 令牌获取。false或缺省时走传统用户名/密码认证scopestring请求令牌时使用的 OAuth2 scope。留空时默认使用https://ossrdbms-aad.database.windows.net/.default需要注意的是enabled必须显式设为true才会走令牌路径。从 util/sqldb/sqldb.go 的分支逻辑可以看出控制器判断的依据是cfg.AzureToken ! nil cfg.AzureToken.Enabled并且azureToken与awsRDSToken互斥同时启用会直接报错only one of azureToken or awsRDSToken may be enabled, not both启用azureToken后无需再配置passwordSecret用户名仍从usernameSecret读取与 AWS RDS IAM 认证不同Azure 令牌路径不强制要求开启 SSLAWS 路径要求ssl: true见 util/sqldb/sqldb.go但生产环境强烈建议开启。持久化数据库persistence配置示例以下配置将 workflow-controller 的持久化存储切换到使用 Entra ID 令牌认证的 Azure PostgreSQLpersistence整体结构定义见 config/config.gopersistence: postgresql: host: argo-db.postgres.database.azure.com port: 5432 database: argo tableName: argo_workflows usernameSecret: name: argo-postgres-config key: username ssl: true sslMode: require azureToken: enabled: true # scope 可省略默认即 https://ossrdbms-aad.database.windows.net/.default # scope: https://ossrdbms-aad.database.windows.net/.default各字段说明对应 docs/workflow-controller-configmap.md 中PostgreSQLConfig与AzureTokenConfig两张字段表host/portAzure Database for PostgreSQL 服务器地址形如server-name.postgres.database.azure.com与端口默认 5432database要连接的数据库名tableNameArgo Workflows 使用的表名必须设置usernameSecret引用一个 Kubernetes Secret其key下保存的是Entra ID 用户主体名称例如userdomain.onmicrosoft.com或工作负载身份绑定的用户名ssl/sslMode启用 TLS 连接并指定 SSL 模式disable、require、verify-ca、verify-full。Azure Database for PostgreSQL 默认强制 TLS推荐require及以上azureToken.enabled: true开启 Entra ID 令牌认证azureToken.scope可选覆盖默认 scope。同步数据库synchronization配置示例同一套机制也适用于同步锁数据库。SyncConfig同样内嵌了DBConfig见 config/config.go因此配置方式与 persistence 完全一致synchronization: postgresql: host: argo-db.postgres.database.azure.com port: 5432 database: argo_sync tableName: sync usernameSecret: name: argo-postgres-config key: username ssl: true sslMode: require azureToken: enabled: true工作原理源码级拆解1. 配置分发persistence 与 synchronization 共用同一路径PersistConfig与SyncConfig都内嵌了DBConfig见 config/config.go因此无论是持久化还是同步场景最终都会进入同一个数据库会话创建函数。入口为 util/sqldb/sqldb.go 的CreateDBSession它根据dbConfig.PostgreSQL ! nil分发到createPostGresDBSession。2. 认证分支判定createPostGresDBSessionutil/sqldb/sqldb.go是核心调度函数其逻辑顺序为判断azureEnabled与awsEnabled二者同时启用即报错AWS 路径强制校验 SSL从usernameSecret读取用户名util.GetSecrets若azureEnabled调用createPostGresDBSessionWithAzure跳过密码 Secret 的读取否则读取passwordSecret走传统用户名/密码路径。也就是说启用令牌认证后passwordSecret可以完全从配置中移除。3. DSN 构造与令牌注入createPostGresDBSessionWithAzureutil/sqldb/sqldb.go先通过buildPostgresDSN构造出不含密码的 lib/pq keyword/value 形式 DSN包含user、dbname、sslmode、connect_timeout、host、port再将 scope 缺省值补全scope : cfg.AzureToken.Scope if scope { scope https://ossrdbms-aad.database.windows.net/.default }随后将 DSN 与 scope 封装进自定义的azureConnectorutil/sqldb/azure_auth.gofunc (c *azureConnector) Connect(ctx context.Context) (driver.Conn, error) { cred, err : azidentity.NewDefaultAzureCredential(nil) if err ! nil { return nil, fmt.Errorf(failed to obtain a credential: %w, err) } token, err : cred.GetToken(ctx, policy.TokenRequestOptions{Scopes: []string{c.scope}}) if err ! nil { return nil, fmt.Errorf(failed to get token: %w, err) } // Escape single quotes in token just in case escapedToken : strings.ReplaceAll(token.Token, , \\) // Append password to DSN dsnWithPassword : fmt.Sprintf(%s password%s, c.dsn, escapedToken) return pq.Driver{}.Open(dsnWithPassword) }关键实现细节令牌在每次建立连接时获取Connect每次都会调用azidentity.NewDefaultAzureCredential(nil)换取新令牌因此令牌天然短时有效无需手动轮换令牌作为 DSN 的 password 注入Entra ID 令牌被当作 PostgreSQL 连接的password字段使用这是 Azure Database for PostgreSQL 对 AAD 认证的标准交互方式单引号转义由于 DSN 采用passwordvalue形式拼接令牌中的会被转义为\避免破坏 DSN 语法作用域可配scope 通过policy.TokenRequestOptions传递给GetToken支持企业自定义 scope默认值适用于 Azure Database for PostgreSQL 的ossrdbms-aad资源。4. 连接复用与追踪azureConnector通过createPostGresDBSessionWithConnectorutil/sqldb/sqldb.go接入otelsql.OpenDB与普通密码路径一样享受 OpenTelemetry 数据库追踪属性semconv.DBSystemNamePostgreSQL随后通过 upper/db 的postgresqladp适配器包装并应用连接池配置ConfigureDBSession。这意味着令牌认证连接与普通连接在监控、连接池行为上完全一致不存在功能降级。前置条件与启用步骤Azure 侧准备基于公开的 Azure 服务标准流程在 Azure Database for PostgreSQL 中创建不含密码的 Entra ID 认证账号用户名即 Entra ID 用户主体如工作负载身份的服务主体将数据库服务器的 Entra ID 管理员配置好并授权该账号访问目标数据库为 Argo Workflows 运行环境准备好身份来源二选一Managed Identity在 VM/VMSS 等资源上启用系统或用户托管身份Workload Identity在 AKS 上为 workflow-controller 所在命名空间配置 Workload Identity 联邦并将身份绑定到服务账号。DefaultAzureCredential会按照 Azure SDK 的标准链式顺序尝试多种凭据来源环境变量、Workload Identity、Managed Identity、Azure CLI 等因此以上两种身份均可被自动识别无需额外代码改动。Argo 侧启用创建用户名 Secretkubectl -n argo create secret generic argo-postgres-config \ --from-literalusernameyour-entra-useryour-domain.onmicrosoft.com按上文给出的 persistence / synchronization 示例编辑 workflow-controller 的 ConfigMap将azureToken.enabled设为true配置模板参见 docs/workflow-controller-configmap.yaml重启 workflow-controller 使其重新加载配置提交一个 Workflow 并观察持久化/归档行为确认数据库连接正常。注意事项与排错指引用户名必须与 Entra ID 身份一致令牌路径下usernameSecret中保存的是 Entra ID 用户主体名称而非本地数据库角色名不要同时配置azureToken与awsRDSToken二者互斥同时启用会导致控制器启动失败并抛出明确错误util/sqldb/sqldb.goscope 一般无需修改默认 scopehttps://ossrdbms-aad.database.windows.net/.default对 Azure Database for PostgreSQL 已是标准值仅在特殊联邦场景下才需要覆盖令牌过期无需人工处理连接建立时才获取令牌连接池中的连接按各自生命周期换新令牌过期不会导致长期连接失效若启用 SSL 但未指定sslMode默认取值为prefer保留 upper/db PostgreSQL 适配器的历史默认行为见 util/sqldb/sqldb.go由于 Azure Database for PostgreSQL 默认强制 TLS建议显式设置require或更高级别连接超时保护DSN 中已自动携带connect_timeout来自ConnectionTimeoutSeconds缺省 5 秒见 config/config.go数据库不可达时连接建立会快速失败而非长时间挂起。版本与适用范围该特性随 v4.1.0 发布相关变更记录见 docs/new-features.mdAzure and HTTP/Artifactory stream the reader directly to the destination 段落及 v4.1.0 特性列表适用范围为Azure Database for PostgreSQL的 Entra IDAzure AD认证同一PostgreSQLConfig中还提供了对称的awsRDSToken用于 AWS RDS IAM 认证两者二选一仅 PostgreSQL 持久化路径支持该认证MySQL 配置中无对应令牌字段MySQLConfig仅含Options见 config/config.go。综上Argo Workflows 的 Azure Entra ID 令牌认证以极低的配置成本一个布尔开关 可选 scope换来了完全免密的数据库访问配合 Azure 平台的托管身份体系是 AKS 上部署 Argo Workflows 时接入 Azure PostgreSQL 的推荐方式。【免费下载链接】argo-workflowsWorkflow Engine for Kubernetes项目地址: https://gitcode.com/gh_mirrors/ar/argo-workflows创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

sentence-transformers 多向量编码器评估指南:MultiVectorEncoder 的 MaxSim 评测体系与 NanoBEIR 实战

sentence-transformers 多向量编码器评估指南:MultiVectorEncoder 的 MaxSim 评测体系与 NanoBEIR 实战

sentence-transformers 多向量编码器评估指南:MultiVectorEncoder 的 MaxSim 评测体系与 NanoBEIR 实战 【免费下载链接】sentence-transformers State-of-the-Art Embeddings, Retrieval, and Reranking 项目地址: https://gitcode.com/gh_mirrors/se/sentence-t…

2026/9/21 15:37:43 阅读更多 →
rrweb 录制存储优化实战:DOM 屏蔽、sampling 抽样、压缩与去冗全指南

rrweb 录制存储优化实战:DOM 屏蔽、sampling 抽样、压缩与去冗全指南

前端可观测性开发工具 【免费下载链接】rrweb record and replay the web 项目地址: https://gitcode.com/gh_mirrors/rr/rrweb 点击查看 免费下载 rrweb 以"录制即事件流"的方式工作,录制数据量与页面复杂度和用户交互频率成正比&#xff0c…

2026/9/21 15:36:42 阅读更多 →
Pandoc `--embed-resources` 内联 SVG 与 class 属性合并机制解析:从命令测试 9652 看源码实现

Pandoc `--embed-resources` 内联 SVG 与 class 属性合并机制解析:从命令测试 9652 看源码实现

Pandoc --embed-resources 内联 SVG 与 class 属性合并机制解析:从命令测试 9652 看源码实现 【免费下载链接】pandoc Universal markup converter 项目地址: https://gitcode.com/gh_mirrors/pa/pandoc 导读 本文以 pandoc 仓库中编号 9652 的命令测试&…

2026/9/21 15:36:42 阅读更多 →

最新新闻

C++类型系统与IO优化实战指南

C++类型系统与IO优化实战指南

1. 从C到C的类型系统演进在C语言中,类型系统相对简单直接,主要依赖基本数据类型和指针操作。这种设计虽然高效,但也带来了不少潜在风险。记得我刚接触C语言时,经常因为类型不匹配导致难以调试的内存错误。比如下面这个典型例子&am…

2026/9/21 16:13:16 阅读更多 →
PeerTube 多语言翻译指南:基于 Weblate 的协作流程、翻译文件体系与规范要点

PeerTube 多语言翻译指南:基于 Weblate 的协作流程、翻译文件体系与规范要点

音视频视频后端前端 【免费下载链接】PeerTube ActivityPub-federated video streaming platform using P2P directly in your web browser 项目地址: https://gitcode.com/gh_mirrors/pe/PeerTube 点击查看 免费下载 PeerTube 是一个基于 ActivityPub 联邦协议的分…

2026/9/21 16:13:16 阅读更多 →
Apache MXNet 贡献者 Git 实战指南:Fork 同步、冲突解决、提交整理与历史恢复全流程

Apache MXNet 贡献者 Git 实战指南:Fork 同步、冲突解决、提交整理与历史恢复全流程

Apache MXNet 贡献者 Git 实战指南:Fork 同步、冲突解决、提交整理与历史恢复全流程 【免费下载链接】mxnet Lightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scal…

2026/9/21 16:13:16 阅读更多 →
Task 环境变量完全指南:使用 TASK_ 前缀配置 Taskfile 构建工具

Task 环境变量完全指南:使用 TASK_ 前缀配置 Taskfile 构建工具

Task 环境变量完全指南:使用 TASK_ 前缀配置 Taskfile 构建工具 【免费下载链接】task A fast, cross-platform build tool inspired by Make, designed for modern workflows. 项目地址: https://gitcode.com/gh_mirrors/ta/task 导读 Task 是一个跨平台的…

2026/9/21 16:13:16 阅读更多 →
PouchDB 6.0.0 升级指南:移除旧 API、收紧依赖与视图沙箱化的全面解读

PouchDB 6.0.0 升级指南:移除旧 API、收紧依赖与视图沙箱化的全面解读

数据库数据同步 【免费下载链接】pouchdb :kangaroo: - PouchDB is a pocket-sized database. 项目地址: https://gitcode.com/gh_mirrors/po/pouchdb 点击查看 免费下载 本文基于仓库文档 docs/posts/2016-09-05-pouchdb-6.0.0.md 撰写,围绕 PouchDB 6…

2026/9/21 16:13:16 阅读更多 →
SkillOpt 完全指南:像训练神经网络一样训练 Agent 技能文档

SkillOpt 完全指南:像训练神经网络一样训练 Agent 技能文档

SkillOpt 完全指南:像训练神经网络一样训练 Agent 技能文档 【免费下载链接】SkillOpt SkillOpt is a text-space optimizer that trains reusable natural-language skills for frozen LLM agents through trajectory-driven edits, validation-gated updates, and…

2026/9/21 16:12:15 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →