## 🏗️ 新增功能 - **shared/**: 完整的基础组件部署方案 - docker-compose.yml: 统一编排所有基础服务 - .env.example: 标准化环境变量配置 - prometheus/prometheus.yml: 监控配置 - bin/up.sh & down.sh: 一键部署脚本 - README.md: 完整的使用文档 ## 🛠️ 核心服务 - **数据库层**: PostgreSQL 16 + MySQL 8 (统一密码: 123456) - **缓存层**: Redis 7 (密码: 123456) - **代码管理**: GitLab CE + Gitea (双代码仓库) - **镜像仓库**: Harbor (Docker Registry) - **监控层**: Prometheus + Grafana + cAdvisor - **网关反代**: Traefik v3.1 ## 🔧 技术优化 - 所有端口统一使用 2xx80 系列,避免端口冲突 - 统一网络架构 (core network),支持多项目接入 - 完善的健康检查和服务依赖配置 - 支持 ARM64 架构 (MySQL 8 兼容性修复) ## 📚 文档更新 - SYSTEM-CONFIG.md: 系统配置文档完善 - harbor/README.md: Harbor 模块使用说明 - docs/: 完整的部署和运维文档 ## 🚀 部署说明 所有服务已成功启动并通过验证: - GitLab: http://localhost:28082 (root/SecurePass2024!) - Gitea: http://localhost:23000 - Harbor: http://localhost:28081 - Grafana: http://localhost:23001 (admin/123456) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
9.6 KiB
9.6 KiB
Kubernetes 共享数据平面方案(仅文档,禁止直接实施)
目的:在同一集群内为多个项目(bookstore、stock、words、gmc_new …)提供可复用的 PostgreSQL、MySQL、Redis 与监控能力。本文是设计与约束,不可直接 apply。后续实施由任务契约驱动(见文末"Claude 执行契约")。
1. 命名与分层
1.1 命名空间(Namespaces)
platform-monitoring:Prometheus、Grafana、Loki、exportersshared-data:共享数据库与缓存实例(PostgreSQL、MySQL、Redis)app-bookstore、app-stock、app-words、app-gmc-new:各业务命名空间shared-ingress(可选):统一 Ingress/Nginx/Cert-Manager
原则:平台能力在 platform-,共享状态在 shared-,业务在 app-*。
1.2 资源与标注(Labels/Annotations)
- 统一标签:
app.kubernetes.io/part-of、app.kubernetes.io/component、cost-center、owner - 资源配额模板(示例目标):
platform-monitoring:CPU 8、Mem 16Gi、PVC 200Gishared-data:CPU 16、Mem 64Gi、PVC 2Ti(按需求调整)- 业务命名空间:按项目评估(配额与 LimitRange 必配)
2. 多租户模型(强约束)
2.1 PostgreSQL(推荐 Crunchy/Bitnami 任一)
- 租户模式优先级
- 同一 PG 集群、每项目一个数据库(推荐,安全/隔离/维护平衡)
- 同库多 schema(适合轻量 PoC)
- 独立 PG 集群(重度负载或合规隔离)
- 连接标识:
postgresql.shared-data.svc.cluster.local:5432 - 凭据:每项目最小权限专用用户:
<project>_app,只授予对应 DB - 网络:仅对 app-* 命名空间开放(NetworkPolicy)
2.2 MySQL
- 场景较少时优先集中单集群 + 逐项目 DB
- 连接:
mysql.shared-data.svc.cluster.local:3306 - 账户:
<project>_app
2.3 Redis(Bitnami,哨兵或 cluster 选其一)
- 共享 Redis + 多实例:不建议依赖 Redis "逻辑 DB index" 做多租户
- 每项目一个独立 Release/实例或共享大实例中的独立命名前缀(强烈建议独立实例)
- 连接:
redis-<project>.shared-data.svc.cluster.local:6379 - RDB+AOF 开启;持久化 PVC
3. 访问与服务发现(不暴露公网)
- 数据库/Redis 不走 Ingress,仅 ClusterIP/Headless
- 统一的 Service DNS:
postgresql.shared-data.svc.cluster.localmysql.shared-data.svc.cluster.localredis-<project>.shared-data.svc.cluster.local
- 业务侧通过 ConfigMap+Secret 注入连接(不写死 IP)
3.1 连接约定(示例)
# app-<project>/Deployment env(只示例键名约定)
env:
- name: DB_HOST
value: postgresql.shared-data.svc.cluster.local
- name: DB_NAME
valueFrom: configMapKeyRef: { name: db-conn, key: DB_NAME }
- name: DB_USER
valueFrom: secretKeyRef: { name: db-cred, key: username }
- name: DB_PASS
valueFrom: secretKeyRef: { name: db-cred, key: password }
- name: REDIS_HOST
value: redis-<project>.shared-data.svc.cluster.local
4. 安全与合规
- Secrets 管理:
- 开发环境:K8s Secret + SealedSecrets/SOPS(二选一)
- 严禁把明文凭据提交到 Git
- RBAC:
shared-data仅平台 SRE 拥有管理权限- 各
app-*只能读取本命名空间内的 Config/Secret
- NetworkPolicy:
shared-data默认 deny all- 仅允许来自
app-*命名空间的到端口 5432/3306/6379 流量
- 审计:数据库登录与 DDL/DML 审计表(PG 可用 pgaudit)
5. 备份与恢复(必须有演练)
- PostgreSQL:pgBackRest / WAL 连续备份 + 每日全量;按环境分 Bucket/路径
- MySQL:xtrabackup 或 mysqldump 定期
- Redis:RDB 定时 + AOF 持久化;跨盘快照
- 季度恢复演练:记录 RTO/RPO
- 备份状态上报到 Prometheus(失败告警)
6. 监控与告警
platform-monitoring部署 kube-prometheus-stack(或轻量 Prometheus + Grafana + Loki)- Exporters:
- PG:postgres-exporter
- MySQL:mysqld-exporter
- Redis:redis-exporter
- Grafana 预置看板:
- 数据库连接数/慢查询/复制延迟/WAL 速率
- Redis 命中率/内存碎片率/RDB/AOF 状态
- 告警:连接耗尽、磁盘使用 > 80%、复制延迟、备份失败
7. Helm/Operator 选型建议(仅策略)
- Postgres:Crunchy Operator(企业级特性丰富)或 Bitnami(简洁稳)
- MySQL:Bitnami Chart(更轻)或 Percona Operator(更强)
- Redis:Bitnami Redis(Cluster/Sentinel 任选其一)
选型落地由任务契约决定,不在本文中创建任何 Release。
8. 业务项目接入流程(GitOps)
- 申请表/CR(放仓库
infra/tenants/<project>.yaml)- 需求:DB 类型/容量/读写 QPS、备份级别、数据合规标签
- 生成:数据库/用户/权限/配额申请 PR
- 平台审核并合入 → 由 CI 触发 Helm/Operator 执行
- 业务获取 ConfigMap + Secret(仅读本项目所需)
- 上线前检查:连接可用性、限流策略、告警绑定
9. 可复用的"实施占位模板"(供后续任务使用)
以下清单仅示例结构与参数命名,不能直接 apply。
9.1 命名空间(只文档示例)
apiVersion: v1
kind: Namespace
metadata:
name: shared-data
labels:
app.kubernetes.io/part-of: data-plane
owner: sre
9.2 NetworkPolicy(仅允许 app-* 访问 DB 端口)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-app-to-pg
namespace: shared-data
spec:
podSelector:
matchLabels:
app: postgresql
policyTypes: [Ingress]
ingress:
- from:
- namespaceSelector:
matchExpressions:
- { key: name, operator: In, values: ["app-bookstore","app-stock","app-words","app-gmc-new"] }
ports:
- protocol: TCP
port: 5432
9.3 业务侧连接对象(模板占位)
apiVersion: v1
kind: ConfigMap
metadata:
name: db-conn
namespace: app-<project>
data:
DB_NAME: "<project>"
---
apiVersion: v1
kind: Secret
metadata:
name: db-cred
namespace: app-<project>
type: Opaque
stringData:
username: "<project>_app"
password: "<autogenerated-by-platform>"
10. SLO/容量基线(起点,实施时再细化)
- PG:p95 查询 < 50ms(关键 OLTP)、连接 > 20% 余量、WAL 可用空间 > 30%
- Redis:命中率 > 90%、内存使用 < 70%、RDB 成功率 100%
- 备份:RPO ≤ 1h、RTO ≤ 4h
- 告警响应:P1 ≤ 15m
11. Claude 执行契约(让 Claude 容易实施)
注意:下面是"任务契约模板",不是实施指令。把它放到 /docs/contracts/,后续每个任务用一份拷贝,Claude 只能在白名单输出里生成 Helm values/清单草案,不得 apply。
11.1 合同模板:建立共享 PostgreSQL(设计产物)
id: SD-PG-BASE
title: 共享 PostgreSQL 设计与占位清单
scope:
- 生成 Helm values 草案(Crunchy 或 Bitnami 二选一,列出 pros/cons)
- 生成 NetworkPolicy 草案(仅示例,禁止生产)
- 生成 租户 DB 创建 SQL 模板(create database / create role)
artifacts-allowlist:
- docs/artifacts/postgres/values.example.yaml
- docs/artifacts/postgres/networkpolicy.example.yaml
- docs/artifacts/postgres/tenant.sql
acceptance:
- 不包含 kubectl/helm apply 命令
- values 以占位符形式(<env>, <storageClass>, <cpu/mem>)
- SQL 模板仅示例最小权限
notes: "严禁生成可执行命令;仅文档、示例、占位符。"
11.2 合同模板:业务接入(bookstore)
id: SD-ONBOARD-BOOKSTORE
title: bookstore 接入共享数据平面(文档与清单)
scope:
- 生成 app-bookstore 的 ConfigMap/Secret 占位清单
- 指定连接 DNS 与端口、只读/读写账户差异
- 生成最小联通性测试脚本(psql/redis-cli 示例命令,注释掉)
artifacts-allowlist:
- docs/artifacts/bookstore/configmap.example.yaml
- docs/artifacts/bookstore/secret.example.yaml
- docs/artifacts/bookstore/connectivity-check.md
acceptance:
- 不包含 apply;示例命令前必须带注释
- Secret 仅示例键名,不给真实值
- 连接测试包含期望结果描述
notes: "仅示例;凭据由平台流水线生成。"
11.3 Claude 提示骨架(复用)
SYSTEM:
你是平台 SRE。严格遵守任务契约,仅输出"示例与占位符",不得给出可执行命令。
USER:
[PROJECT CONTEXT]
- 集群已存在 namespaces: platform-monitoring, shared-data, app-*
- 需要共享 PG/MySQL/Redis 与监控
- 不得立即实施
[TASK CONTRACT]
<粘贴上面的合同内容>
[OUTPUT FORMAT]
1) PLAN(不超过10行)
2) ARTIFACTS(逐个文件,使用 ```path\n<content>\n``` 格式)
3) CHECKLIST(逐条对应 acceptance)
12. 里程碑与变更控制
- 本文是架构设计与约束,作为 ADR(Architecture Decision Record)记录。
- 任何实施都必须通过"Claude 执行契约"产出占位清单后,进入变更评审(CR),再由平台流水线执行。
- 生产环境变更需:容量评估、回滚方案、演练记录。
附录 A · 项目对接清单(提交即视为需求冻结)
- 需要的能力(PG / MySQL / Redis)与读写模式
- 预计 QPS / 连接数 / 峰值周期
- 数据保留策略与合规标签(含脱敏需求)
- 备份级别与恢复目标(RPO/RTO)
- 告警联系人与通知渠道(飞书/邮件)
到这里为止,只有文档,没有实施。
下一步:把"Claude 执行契约"的 YAML 模板拷到 /docs/contracts/,针对 shared-data / bookstore / stock 各写一份任务合同,再把 Claude 拉来生成占位清单(values/example/np/sql 等)。这样 Claude 就会在明确白名单与验收约束下输出,不会乱改动或直接 apply。