平台元数据库配置
平台用一个关系型数据库存储所有元数据(项目、任务流、模型、数据集、用户权限等)。元数据库类型由后端 Pod 的环境变量决定,默认数据库名为 kubeflow。
连接串与选型优先级
后端在 config.py 中按以下优先级解析连接串到 SQLALCHEMY_DATABASE_URI(install/docker/config.py:476-488):
MYSQL_SERVICE → POSTGRESQL_SERVICE → KINGBASE_SERVICE → DM_SERVICE
即:配了 MYSQL_SERVICE 就用 MySQL;否则看 POSTGRESQL_SERVICE,再否则 KINGBASE_SERVICE(人大金仓),最后 DM_SERVICE(达梦)。这些环境变量配置在 infra 命名空间下 kubeflow-dashboard 的 Deployment 上(线上由 deploy-config configmap 注入,见 配置文件管理.md)。
用 PostgreSQL(或人大金仓)时,不要再配置
MYSQL_SERVICE,否则会优先走 MySQL。
一、MySQL
环境变量:
MYSQL_SERVICE = mysql+pymysql://$user:$password@$host:$port/kubeflow?charset=utf8mb4
其中 $user/$password/$host/$port 为 MySQL 的用户名、密码、ip、端口。
线上 kustomize 默认值(
install/kubernetes/cube/overlays/kustomization.yml:20):mysql+pymysql://root:admin@mysql-service.infra:3306/kubeflow?charset=utf8mb4
MySQL 的数据库表迁移文件在 myapp/migrations/versions(默认即 MySQL 版本;仓库另存了一份 myapp/migrations/versions-mysql 作为来源)。
二、PostgreSQL
环境变量:
POSTGRESQL_SERVICE = postgresql+psycopg2://$user:$password@$host:$port/kubeflow
测试/内网连接串示例:
postgresql+psycopg2://postgres:postgres@postgresql.kubeflow:5432/kubeflow
迁移目录会自动切换(无需手动改)
PostgreSQL 的迁移文件在 myapp/migrations/versions-postgres。当检测到配置了 POSTGRESQL_SERVICE(或 KINGBASE_SERVICE)时,config.py 会自动删除 versions 目录并把 versions-postgres 拷贝过去(install/docker/config.py:480-482):
shutil.rmtree('/home/myapp/myapp/migrations/versions', ignore_errors=True)
shutil.copytree('/home/myapp/myapp/migrations/versions-postgres', '/home/myapp/myapp/migrations/versions')
⚠️ 与旧文档差异:早期文档要求「手动把 versions-postgres 改名为 versions、并自行备份原 MySQL 结构」。当前版本已由
config.py在启动时自动完成该切换,不需要手动改目录。这是一次性覆盖versions目录的操作,源在versions-postgres,无需也不应手动备份运行目录里的versions。依据install/docker/config.py:478-482。
Postgres 不支持 sa.Text(length=65536)
PostgreSQL 无法识别 sa.Text(length=65536) 这类带长度的 Text,需改为 sa.Text()。也就是说,用作 Postgres 元数据库时,迁移/模型里不能出现 sa.Text(length=65536) 这种列类型。
人大金仓 KingBase(PostgreSQL 兼容)
人大金仓(KingBase)兼容 PostgreSQL 协议,平台把它当作 PG 使用:
连接串配
KINGBASE_SERVICE,格式与 PG 相同(驱动仍是postgresql+psycopg2),端口默认54321:KINGBASE_SERVICE = postgresql+psycopg2://$user:$password@$host:54321/kubeflow选型优先级上
KINGBASE_SERVICE在POSTGRESQL_SERVICE之后(见本文开头);配了它就和 PG 一样自动切到versions-postgres迁移目录、走 Alembic 建表,上面 PG 的sa.Text(length=...)限制同样适用。平台对 KingBase 有一段兼容补丁:
myapp/__init__.py:8-17会在任何 SQLAlchemy 连接建立前执行, 按KingbaseES Vxx Rxx版本号做适配,因此KINGBASE_SERVICE必须在启动时就配好。schema 初始化与 PG 一致(
myapp/create_db.py、install/docker/README.md:230对 postgres/kingbase/达梦做了兼容)。
三、数据库初始化(建表)
容器启动脚本 entrypoint.sh 负责初始化(install/docker/entrypoint.sh:21-32):
export FLASK_APP=myapp:app
python myapp/create_db.py # 建库 / db.create_all() 兜底
# 非达梦时执行 Alembic 迁移(MySQL/PostgreSQL 走这里)
if [ -z "$DM_SERVICE" ]; then
myapp db upgrade # 按 versions 目录把表结构同步到数据库
fi
myapp fab create-admin ... # 创建 admin 用户/角色/权限
myapp init # 初始化默认角色、权限、自定义 menu
达梦(
DM_SERVICE)不走 Alembic 迁移,靠create_db.py里的db.create_all()建表,并在config.py中清空versions目录(install/docker/config.py:484-488)。达梦的部署与迁移另见 达梦数据库部署与迁移.md。
四、数据库定时备份
通过 crontab 定时备份数据库数据目录(按月清理旧备份、按天打快照):
# 添加到 crontab
mkdir -p /data/back/
rm -rf /data/back/mysql-$(date +%Y%m)*
cp -r /data/k8s/infra/mysql /data/back/mysql-$(date +%Y%m%d)
该示例针对 MySQL 数据目录
/data/k8s/infra/mysql(hostpath 部署)。PostgreSQL/达梦请按其数据目录与官方备份工具(如pg_dump)调整。
相关
- 连接串环境变量配在哪、如何升级:配置文件管理.md。
- 达梦数据库:达梦数据库部署与迁移.md。
- 数据库选型 / 连接串速查:07-参考速查。
具体连接行为以源码
install/docker/config.py与install/docker/entrypoint.sh为准。