十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Argo Workflows 使用 Azure AD(Entra ID)令牌认证 Azure Database for PostgreSQL 实战指南

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),仅供参考
返回列表