分享个人 Full-Stack JavaScript 项目开发经验
Confluence是一款可以远程和团队协作的文档软件。它使知识管理、项目合作和分享变得更加简单高效。本文将介绍如何在 Kubernetes 上部署单节点的、基于外部 MySQL 数据库的 Confluence。
由许可证原因,Confluence 没有将 MySQL 的驱动程序添加到镜像中,我们可以下载驱动并重新构建镜像。
MySQL 8.0.21 Confluence 驱动下载:
https://dev.mysql.com/downloads/connector/j/8.0.html。
Confluence 官方镜像:
https://hub.docker.com/r/atlassian/confluence-server
下载 Platform Independent 的 zip 包,解压后,将 mysql-connector-java-8.0.21.jar 添加到镜像中。Dockerfile 如下:
FROM atlassian/confluence-server
COPY mysql-connector-java-8.0.21.jar /opt/atlassian/confluence/confluence/WEB-INF/lib
经测试,对于 MySQL 8.0.20,驱动亦可以正常使用。
将 Confluence 连接到数据:
https://confluence.atlassian.com/doc/database-configuration-159764.html
MySQL 数据库设置介绍:
https://confluence.atlassian.com/doc/database-setup-for-mysql-128747.html
使用镜像部署的 MySQL 需要将配置文件放置在挂在于 /etc/mysql/conf.d 目录的卷目录下即可,/etc/mysql/my.cnf 主配置文件会将配置目录的其它配置包含进去:
!includedir /etc/mysql/conf.d/
custom-config.cnf 配置如下:
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_bin
default-storage-engine=INNODB
max_allowed_packet=256M
innodb_log_file_size=2GB
transaction-isolation=READ-COMMITTED
binlog_format=row
重启 MySQL 后,登录并查询验证配置,如:
SELECT @@innodb_log_file_size;
配置 Confluence 连接外部数据库需要为其提供一个初始化的数据库。init-confluence.sql 如下:
CREATE DATABASE confluence CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
CREATE USER IF NOT EXISTS 'confluenceuser'@'%' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON confluence.* TO 'confluenceuser'@'%';
上面创建了名为 Confluence 的数据库,并创建了 confluenceuser 用户,它有 Confluence 数据库的完全使用权限,并且允许外部所有 IP 访问。访问控制通过 Kubernetes 的 NetworkPolicy 限制,如:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: mysql-network-policy
spec:
podSelector:
matchLabels:
app: mysql
ingress:
# 只允许带有特定标签的 pod 访问
- from:
- podSelector:
matchLabels:
run: mysql-client
namespaceSelector: {}
- podSelector:
matchLabels:
app: mysql-client
namespaceSelector: {}
ports:
- port: 3306
部署 Confluence 后,可以通过 web 端配置并测试数据库的连接参数。访问 Kubernetes 上部署的 MySQL 可以通过全限定域名(FQDN)作为主机名来访问,如:
mysql.default.svc.cluster.local
它将指向本地集群 default 命名空间的 mysql 服务。
下面例子为使用 deployment 部署的单服务器单节点 Confluence 例子。它工作在 Nginx 背后,并且使用 MySQL 作为外部数据库:
apiVersion: v1
kind: Namespace
metadata:
name: document
---
apiVersion: v1
kind: Service
metadata:
name: confluence
namespace: document
spec:
type: NodePort
ports:
- port: 8090
targetPort: http
nodePort: 8090
selector:
app: confluence
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: confluence-nfs-pvc
namespace: document
spec:
resources:
requests:
storage: 4Gi
accessModes:
- ReadWriteMany
storageClassName: nfs-dynamic
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: confluence
namespace: document
spec:
replicas: 1
minReadySeconds: 30
revisionHistoryLimit: 2
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
progressDeadlineSeconds: 120
selector:
matchLabels:
app: confluence
template:
metadata:
name: confluence
labels:
app: confluence
run: mysql-client
spec:
imagePullSecrets:
- name: aliyun-docker-vpc-registry
volumes:
- name: confluence-data
persistentVolumeClaim:
claimName: confluence-nfs-pvc
containers:
- image: registry-vpc.cn-shenzhen.aliyuncs.com/leeguangxing/confluence-server:v7.8.0
imagePullPolicy: IfNotPresent
name: confluence
env:
# 对应反向代理的配置
- name: ATL_PROXY_NAME
value: 'www.leeguangxing.cn'
- name: ATL_PROXY_PORT
value: '443'
- name: ATL_TOMCAT_CONTEXTPATH
value: /confluence
# JVM 堆栈大小及代码缓存大小调整
- name: JVM_MINIMUM_MEMORY
value: 512m
- name: JVM_MAXIMUM_MEMORY
value: 512m
- name: JVM_RESERVED_CODE_CACHE_SIZE
value: 128m
volumeMounts:
- name: confluence-data
mountPath: /var/atlassian/application-data/confluence
readOnly: false
ports:
- name: http
containerPort: 8090
resources:
requests:
memory: 1.5Gi
limits:
memory: 2Gi
在生产环境部署时,容器初始化时候探针一直返回 403,应用初始化时候探针返回 500,所以这里未添加探针。这里暂时保留,未作探究。可以先考虑在应用初始化成功后,再添加探针部署。
下面是 Nginx 配置的相关片段:
upstream confluence {
server localhost:8090;
keepalive 32;
}
server {
# ......
location /confluence {
proxy_pass http://confluence;
}
}
个人部署时,感觉 Confluence 对内存、CPU 的要求比较敏感,若出现错误,可以参考下面做法: