GX博客

分享个人 Full-Stack JavaScript 项目开发经验

在Kubernetes上部署Confluence

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,驱动亦可以正常使用。


调整 mysqld 配置

将 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 数据库

配置 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 服务。


部署 Confluence

下面例子为使用 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

下面是 Nginx 配置的相关片段:

upstream confluence {
  server localhost:8090;
  keepalive 32;
}

server {

    # ......

    location /confluence {
        proxy_pass http://confluence;
    }
}

注意问题

个人部署时,感觉 Confluence 对内存、CPU 的要求比较敏感,若出现错误,可以参考下面做法:

  • 若需要重新安装,请将整个 PersistentVolumeClaim 删掉再声明一个,避免缓存引起的应用程序报错。
  • 若在部署或应用初始化过程中,程序出现报错,可以保留卷,并重新部署 deployment。

版权声明:

本文为博主原创文章,若需转载,须注明出处,添加原文链接。

https://leeguangxing.cn/blog_post_90.html