Confluence 不能裸跑在 Kubernetes 中,因其依赖外部数据库、持久化存储(confluence-home 必须挂载 PV)、反向代理配置(需透传 Host 头并禁用 backend SSL 验证)及特定 JVM 参数与环境变量(如 JVM_MINIMUM_MEMORY、CONFLUENCE_HOME、ATL_PROXY_NAME 等),且官方镜像缺失 JDBC 驱动、MySQL 5.7 需调低 sql_mode 才能初始化成功。

Confluence 在 Kubernetes 上不能直接用官方镜像跑起来,必须配好外部数据库、反向代理和持久化存储,否则启动就卡在初始化页面或反复报 Database connection failed 错误。
为什么 Confluence 不能裸跑在 Kubernetes 里
Confluence 启动时会检测数据库连接、写入本地 confluence-home 目录、加载插件并生成唯一 license key。这三件事在默认的 Pod 生命周期里都不可靠:
-
confluence-home必须挂载到持久卷(PersistentVolume),否则重启后所有空间配置、附件、用户数据全丢 - 官方镜像没内置 JDBC 驱动,连 MySQL/PostgreSQL 前得手动注入
mysql-connector-java.jar或改用带驱动的镜像(比如atlassian/confluence-server:7.20.0-jdk11) - Confluence 默认监听
localhost:8090,且硬编码了上下文路径(/),不配好server.proxy-name和server.proxy-port,反向代理(如 Nginx / Ingress)会返回 404 或无限重定向
MySQL 5.7 必须调低 sql_mode 才能通过 Confluence 初始化
Confluence 7.2+ 在建表时用到了 ON UPDATE CURRENT_TIMESTAMP,而 MySQL 5.7 默认开启 STRICT_TRANS_TABLES,会导致初始化失败,日志里出现类似:
Caused by: java.sql.SQLSyntaxErrorException: Invalid default value for 'lastmoddate'
解决方法是在 MySQL ConfigMap 的 my.cnf 里显式禁用它:
[mysqld] sql_mode = "NO_ENGINE_SUBSTITUTION"
注意:NO_ZERO_DATE 和 ERROR_FOR_DIVISION_BY_ZERO 也得去掉,否则 Confluence 某些审计表建不成功。
Confluence Deployment 必须显式设置 JVM 参数和环境变量
不设参数的话,Confluence 容器大概率 OOM 被 Kubelet 杀掉,或者卡在 “Starting Confluence…” 不动。关键配置项有:
-
JVM_MINIMUM_MEMORY和JVM_MAXIMUM_MEMORY:至少设成2g,推荐4g(对应容器resources.limits.memory: 6Gi) -
CONFLUENCE_HOME:必须指向挂载的 PV 路径,比如/var/atlassian/application-data/confluence -
ATL_PROXY_NAME和ATL_PROXY_PORT:配合 Ingress 使用,例如docs.example.com+443 -
ATL_TOMCAT_CONTEXTPATH:保持为空(即根路径),别设成/confluence,否则静态资源 404
示例片段(Deployment 中的 env):
env: - name: JVM_MINIMUM_MEMORY value: "2g" - name: JVM_MAXIMUM_MEMORY value: "4g" - name: CONFLUENCE_HOME value: "/var/atlassian/application-data/confluence" - name: ATL_PROXY_NAME value: "docs.example.com" - name: ATL_PROXY_PORT value: "443"
Ingress 路由必须透传 Host 头且关闭 backend SSL 验证
Confluence 自身不处理 TLS 终止,依赖前置代理做 HTTPS 卸载。如果 Ingress controller(如 nginx-ingress)没透传 Host 头,Confluence 会生成错误的绝对链接(比如跳转到 http://localhost:8090);如果它又默认校验 backend 的自签名证书,还会卡在健康检查失败。
典型修复点:
- Ingress annotation 加上
nginx.ingress.kubernetes.io/proxy-set-headers: "nginx-configmap",并在 configmap 中定义Host: $host - 若 backend 是 HTTP(非 HTTPS),加
nginx.ingress.kubernetes.io/ssl-passthrough: "false"并确保nginx.ingress.kubernetes.io/backend-protocol: "HTTP" - 避免用
path: /confluence做子路径路由——Confluence 对子路径支持极差,URL 重写极易出错
最稳的做法:用独立域名(confluence.example.com)+ 根路径路由 + HTTP backend。
Confluence 的 confluence-home 目录一旦初始化完成,就绝不能被多个 Pod 同时挂载(哪怕只读),否则 Lucene 索引会损坏;升级版本前务必先备份整个 PV,因为跨大版本(如 7.x → 8.x)的 schema 迁移可能失败且不可逆。











