60 lines
2.2 KiB
Markdown
60 lines
2.2 KiB
Markdown
# 初始架构
|
||
|
||
## 职责边界
|
||
|
||
Kubernetes API 保存期望状态和最近一次观察结果;PostgreSQL catalog 是 database、
|
||
role 和权限的事实来源;OpenBao 是凭据的事实来源。controller 不把明文密码写入
|
||
Kubernetes API、Event 或日志。
|
||
|
||
```text
|
||
Git / kubectl / Terraform / Backstage
|
||
|
|
||
v
|
||
Kubernetes API (CRD)
|
||
|
|
||
v
|
||
postgresql-tenant-operator
|
||
| |
|
||
v v
|
||
external PostgreSQL OpenBao
|
||
```
|
||
|
||
## 资源模型
|
||
|
||
### PostgreSQLInstance
|
||
|
||
Cluster-scoped,由平台管理员创建。它描述服务器端点、管理凭据的 OpenBao 引用,
|
||
以及租户可以申请的 extension 白名单。
|
||
|
||
### PostgreSQLTenant
|
||
|
||
Namespaced,描述一个应用租户,包括 database、无登录 owner role、应用 login
|
||
role、extensions、凭据路径和删除策略。
|
||
|
||
第一版规定一个 tenant 拥有一个 database 和一个 login role。跨租户 grant、多个
|
||
login role 和定时轮换等需求出现后再扩展 API。
|
||
|
||
## Reconcile 原则
|
||
|
||
- 每轮从 PostgreSQL 和 OpenBao 读取实际状态,不把 `status` 当作事实来源。
|
||
- 所有操作幂等;任意步骤失败后可以从下一轮继续。
|
||
- 先验证 extension 白名单,再执行任何变更。
|
||
- controller 生成密码,调用方只能得到 OpenBao 路径和状态。
|
||
- `metadata.generation` 只表示 spec 变更,不承载凭据版本语义。
|
||
|
||
## 删除
|
||
|
||
默认 `deletionPolicy: Retain`。删除 CR 时保留 PostgreSQL database、roles 和
|
||
OpenBao 数据。`Delete` 模式将在实现备份检查、活动连接处理和可测试的 finalizer
|
||
状态机后加入实际销毁逻辑。
|
||
|
||
## 暂不包含
|
||
|
||
- PostgreSQL 实例、VM 或存储的创建。
|
||
- Web UI 或独立 REST API;Kubernetes API 已提供 get、list、watch 和 RBAC。
|
||
- PostgreSQL 高可用和备份编排。
|
||
- 凭据轮换;controller 只负责首次生成长期凭据并写入 OpenBao。只有出现能够
|
||
重新加载凭据并妥善处理现有连接的实际消费者后,才重新评估轮换协议。
|
||
- 自动将 OpenBao 数据投射为 Kubernetes Secret;这由 External Secrets Operator
|
||
负责。
|