如何使用服务主体从AKS集群安全连接Azure PostgreSQL单服务器
使用服务主体从AKS集群安全连接Azure PostgreSQL单服务器步骤
1. 创建并记录Azure服务主体(SP)
- 执行Azure CLI命令创建服务主体,跳过自动权限分配:
az ad sp create-for-rbac --name aks-postgres-sp --skip-assignment - 保存命令输出中的
appId、password、tenantId以及displayName字段,后续配置会用到。
2. 配置Azure PostgreSQL的AD认证
- 设置PostgreSQL服务器的AD管理员为该服务主体:
az postgres server ad-admin create \ --resource-group <你的资源组名称> \ --server-name <PostgreSQL服务器名称> \ --display-name <SP的displayName> \ --object-id <SP的appId> - 使用PostgreSQL管理员账号(本地或AD管理员)登录数据库,创建对应服务主体的数据库用户:
CREATE ROLE "<SP的displayName>" WITH LOGIN PASSWORD '<SP的password>' IN ROLE azure_ad_user; - 为该用户分配目标数据库的必要权限(示例为读写权限):
GRANT CONNECT ON DATABASE <目标数据库名称> TO "<SP的displayName>"; GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO "<SP的displayName>";
3. 在AKS集群中存储服务主体凭据
- 通过Kubernetes Secret存储SP的认证信息,避免硬编码:
kubectl create secret generic postgres-sp-secret \ --from-literal=client-id=<SP的appId> \ --from-literal=client-secret=<SP的password> \ --from-literal=tenant-id=<SP的tenantId> \ --from-literal=server-name=<PostgreSQL服务器名称> \ --from-literal=db-name=<目标数据库名称> - 应用部署时可通过环境变量或卷挂载方式读取该Secret中的内容。
4. 在AKS应用中实现认证连接
- 应用需先从Azure AD获取PostgreSQL的访问令牌,再用令牌作为密码建立连接:
- 以Python为例,使用Azure Identity SDK获取令牌:
from azure.identity import ClientSecretCredential import psycopg2 # 从Kubernetes Secret读取配置 tenant_id = "<SP的tenantId>" client_id = "<SP的appId>" client_secret = "<SP的password>" server_name = "<PostgreSQL服务器名称>" db_name = "<目标数据库名称>" # 获取AD访问令牌 credential = ClientSecretCredential(tenant_id, client_id, client_secret) token = credential.get_token("https://ossrdbms-aad.database.windows.net/.default") # 建立PostgreSQL连接 conn_str = f"host={server_name}.postgres.database.azure.com dbname={db_name} user={client_id} password={token.token} sslmode=require" conn = psycopg2.connect(conn_str)
- 以Python为例,使用Azure Identity SDK获取令牌:
- 确保应用容器安装了依赖包(如
azure-identity、psycopg2-binary)。
5. 验证连接有效性
- 部署应用到AKS后,检查应用日志确认连接是否成功
- 可临时进入AKS Pod,执行测试代码或命令验证令牌获取与数据库连接流程
内容的提问来源于stack exchange,提问作者Anjali Loganathan
相关产品推荐
相关产品推荐

