写在前面

在团队开发过程中,经常会遇到这样的问题:
技术文档到处都是,有的在本地,有的在群文件,还有的甚至只存在某个人的电脑里。一旦人员变动或者时间久了,很多知识就“丢失”了。为了解决这些问题,我决定通过搭建confluence 来解决这一个痛点问题。以下记录本人搭建心里路程

1. 整体架构

NodePort

Confluence Pod

MySQL Pod(utf8mb4)

PVC 持久化存储

版本说明:

MySQL:5.7.30

Kubernetes:1.29+

images:haxqer/confluence:8.9.1

2. MySQL(核心:防乱码)

我的数据库版本是5.7.30,部分优化参数可以不加,其中 字符编码必须要是 character-set-server=utf8mb4 ,collation-server=utf8mb4_bin 不然会是乱码,踩坑。

ConfigMap

[root@kingdee /data]# cat /manifests/configmap/mysql-config.yaml 
[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
log-bin-trust-function-creators = 1
// 如果为Mysql5.7,关闭derived_merge能优化仪表板加载缓慢
optimizer_switch = derived_merge=off
...

启动MySQL

  • 创建数据库

CREATE DATABASE confluence CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
  • 创建用户

CREATE user 'confluence'@'%' IDENTIFIED BY '<password>';
  • 授权

GRANT ALL PRIVILEGES ON confluence .* TO 'confluence'@'%' WITH GRANT OPTION;

3. Confluence

pv/pvc

[root@kingdee /manifests/pv]# cat confluence/pv.yaml 
apiVersion: v1 
kind: PersistentVolume 
metadata: 
 name: confluence-k8s-pv 
 namespace: confluence
spec: 
 capacity: 
  storage: 200Gi 
 accessModes: 
 - ReadWriteMany 
 nfs: 
  server: 192.168.0.77 
  path: /data/confluence
[root@kingdee /manifests/pv]# cat confluence/pvc.yaml 
kind: PersistentVolumeClaim 
apiVersion: v1 
metadata: 
 name: confluence-k8s-pvc 
 namespace: confluence 
spec: 
 resources: 
   requests: 
     storage: 200Gi 
 accessModes: 
 - ReadWriteMany

Deployment

[root@kingdee /manifests]# cat deployments/confluence.yaml 
kind: Deployment
apiVersion: apps/v1
metadata:
  name: confluence
  namespace: confluence
spec:
  replicas: 1
  selector:
    matchLabels:
      app: confluence
  template:
    metadata:
      labels:
        app: confluence 
    spec:
      containers:
      - name: confluence 
        image: 192.168.0.77:32237/haxqer/confluence:8.9.1 
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8090
          name: web
          protocol: TCP
        volumeMounts:
        - name: confluence-data
          mountPath: /var/confluence
      volumes:
      - name: confluence-data
        persistentVolumeClaim:
          claimName: confluence-k8s-pvc

service

这里我使用了NodePort 的暴露方式。

[root@kingdee /manifests]# cat service/confluence-service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: confluence-service
  namespace: confluence
  labels:
    app: confluence
spec:
  selector:
    app: confluence
  type: NodePort
  ports:
  - name: web
    port: 8090
    targetPort: web
    nodePort: 30085

浏览器访问:<server-ip>:30085

拿到server id

4. 破解插件

## 查看pod
[root@kingdee /manifests]# kubectl  get pod  -n confluence 
NAME                          READY   STATUS    RESTARTS   AGE
confluence-6db6678655-25pwm   1/1     Running   0          53m

## 进入pod 进行破解  这里的server-id 需要你在浏览器访问获取
[root@kingdee /manifests]# kubectl exec -it confluence-6db6678655-25pwm -n confluence /bin/bash 
root@confluence-6db6678655-25pwm:/opt/confluence# cd /var/agent/
root@confluence-6db6678655-25pwm:/var/agent# ls 
atlassian-agent.jar

root@confluence-6db6678655-25pwm: java -jar atlassian-agent.jar -d -p conf -m xingzhibang@pexetech.com xingzhibang@pexetech.com -n Hello@world.com  -o pexetech -s <you-server-id>

## 生成许可 粘贴进浏览器中

5. 连接MySQL

点击下一步后 可以选择数据库,我这里是MySQL,地址可以写数据库的service的地址。后面的useUnicode=true&characterEncoding=utf8mb4&useSSL=false&serverTimezone=Asia/Shanghai 建议加一下,如果是MySQL5.7的话 改为characterEncoding=utf8。

jdbc:mysql://xxx:3306/confluence?useUnicode=true&characterEncoding=utf8mb4&useSSL=false&serverTimezone=Asia/Shanghai

6. 开始体验