使用 k8s 搭建 confluence 6.10.x 版本
将公司中已有的 confluence 服务迁移到 k8s 集群中,需要保留当前已有的数据。整体需要分为如下几个步骤:
- 备份 mysql 数据
- 备份 confluence 安装目录
- 备份 confluence 数据目录
- 制作 mysql 镜像并导入数据
- 制作 confluence 镜像
一、MySQL 服务
1. 制作 MySQL 镜像
由于公司环境中的 confluence 服务使用的数据库版本是 5.6,所以首先下载官方 mysql 镜像:
docker pull mysql:5.6
将下载好的镜像修改 tag 并推送到内部镜像仓库:
docker tag mysql:5.6 harbor.inner.com/ops/mysql:5.6
docker push harbor.inner.com/ops/mysql:5.6
2. 创建命名空间
首先创建一个 MySQL 和 Confluence 服务共用的命名空间 ns-wiki,yaml 文件内容如下:
---
apiVersion: v1
kind: Namespace
metadata:
name: ns-wiki
labels:
name: ns-wiki
3. 创建 PV
首先创建如下目录:
mkdir -p /opt/ops_ceph_data/mysql_for_confluence
为了实现 MySQL 数据的持久化存储,需要使用到 pv 和 pvc,yaml 文件内容如下:
---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: ceph-mysql-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: ceph-mysql-pv
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 500Gi
local:
path: /opt/ops_ceph_data/mysql_for_confluence
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: mysql-for-confluence
operator: In
values:
- "true"
persistentVolumeReclaimPolicy: Retain
storageClassName: ceph-mysql-storage
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: ceph-mysql-pvc
namespace: ns-wiki
spec:
accessModes:
- ReadWriteOnce
storageClassName: ceph-mysql-storage
resources:
requests:
storage: 500Gi
在 k8s 的 node 节点上创建用于绑定 pv 的 label:
for i in 1 2 3 4 5
do
kubectl label nodes k8s-node${i} mysql-for-confluence=true
done
4. 创建 Service
创建用于映射 3306 端口的 Service,yaml 文件内容如下:
---
kind: Service
apiVersion: v1
metadata:
labels:
app: mysql
name: mysql-port
namespace: ns-wiki
spec:
type: NodePort
ports:
- port: 3306
protocol: TCP
targetPort: 3306
nodePort: 32306
selector:
app: mysql
5. 创建 configmap
为了可以动态的修改 MySQL 的配置文件,需要在创建 pod 时将配置进行挂载,用 k8s 提供的 configmap 可以实现该功能。
创建 configmap 有两种方式,一种是从已有的配置文件中进行导入:
kubectl create configmap mysql-config --from-file=my.cnf -n ns-wiki
导入完成后可以通过 describe 命令查看:
[@k8s-master2 /opt/k8s/mysql]# kubectl describe configmap mysql-config -n ns-wiki
Name: mysql-config
Namespace: ns-wiki
Labels: <none>
Annotations: <none>
Data
====
my.cnf:
----
[mysqld]
datadir=/var/lib/mysql
symbolic-links=0
max_allowed_packet=256M
max_connections=1000
innodb_log_file_size=2GB
transaction-isolation=READ-COMMITTED
binlog_format=row
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
Events: <none>
还有一种方式是编写 yaml 文件创建,文件内容如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-config
namespace: ns-wiki
data:
my.cnf: |
[mysqld]
datadir=/var/lib/mysql
symbolic-links=0
max_allowed_packet=256M
max_connections=1000
innodb_log_file_size=2GB
transaction-isolation=READ-COMMITTED
binlog_format=row
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
6. 创建 secret
在启动 MySQL 的 Pod 时,需要给系统传递一个参数用于初始化数据库 root 用户的密码,通常情况下可以直接在 pod 的 yaml 文件中按照如下格式编写:
containers:
- name: mysql
image: harbor.inner.com/ops/mysql:5.6
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
另一种方式是使用 secret,在 secret 中设置的值是经过 base64 编码的。创建 secret 的 yaml 文件内容如下:
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret # 指定secret的名称
namespace: ns-wiki
type: Opaque # 指定secret的类型
data:
mysql-user-root-pwd: MTIzNDU2
创建 secret 后可以使用如下命令查看:
[@k8s-master2 /opt/k8s/mysql]# kubectl describe secret mysql-secret -n ns-wiki
Name: mysql-secret
Namespace: ns-wiki
Labels: <none>
Annotations:
Type: Opaque
Data
====
mysql-user-root-pwd: 6 bytes
再创建一个用于和 Harbor 校验的 secret:
kubectl create secret docker-registry harbor-secret --namespace=ns-wiki --docker-server=http://harbor.inner.com --docker-username=admin --docker-password=Harbor12345
7. 创建 Deployment
最后是编写用于创建 MySQL Pod 的 yaml 文件,内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
labels:
app: mysql
namespace: ns-wiki
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
name: mysql
labels:
app: mysql
spec:
restartPolicy: Always
containers:
- name: mysql
image: harbor.inner.com/ops/mysql:5.6
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_ROOT_PASSWORD # 注意此处引用 secret 来初始化 root 密码
valueFrom:
secretKeyRef:
name: mysql-secret
key:mysql-user-root-pwd
volumeMounts:
- name: mysql-conf # 指定数据库配置文件挂载的目录路径
mountPath: /etc/mysql/mysql.conf.d
- name: mysql-data # 指定数据目录路径
mountPath: /var/lib/mysql
- name: date-conf # 指定时区配置文件挂载路径
mountPath: /etc/localtime
imagePullSecrets:
- name: harbor-secret
volumes:
- name: mysql-conf # 引用 configmap 挂载配置文件
configMap:
name: mysql-config
- name: mysql-data
persistentVolumeClaim:
claimName: ceph-mysql-pvc
- name: date-conf # 将本地的时区文件挂载到 pod 中,避免 pod 时区错误
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
8. 创建数据库并导入数据
Pod 创建完成后,需要进入到 Pod 中创建 confluence_smc 库:
CREATE DATABASE confluence_smc CHARACTER SET utf8 COLLATE utf8_bin;
为数据库赋权:
GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO root@'127.0.0.1' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO root@'localhost' IDENTIFIED BY '123456';
flush privileges;
配置完成后,将已备份的数据库数据导入到新的库中即可。
二、Confluence 服务
1. 制作 Confluence 镜像
我是基于 Ubuntu:16.04 来制作的 Confluence 镜像,首先下载 Ubuntu:16.04 镜像,修改 tag 后推送到内部镜像仓库:
docker pull ubuntu:16.04
docker tag ubuntu:16.04 harbor.inner.com/ops/ubuntu:16.04
docker push harbor.inner.com/ops/ubuntu:16.04
然后创建用于制作 Confluence 镜像的 Dockerfile 文件,内容如下:
FROM harbor.inner.com/ops/ubuntu:16.04
MAINTAINER haha@xxx.com
COPY run.sh /
COPY sources.list /etc/apt/
ADD wiki.tar.gz /opt
ENV TZ=Asia/Shanghai
RUN apt-get update && apt-get -y install fontconfig \
&& rm -rf /var/cache/apt/archives/*.deb \
&& ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
EXPOSE 8090
CMD ["/run.sh"]
- wiki.tar.gz 文件就是备份的原 confluence 工作目录文件
- 安装 fontconfig 是为了解决 confluence 启动时报错 System fonts are not available 的问题,具体报错内容如下:
Starting Installer ...
java.lang.NullPointerException
at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774)
...
启动脚本 run.sh 内容如下(脚本需要添加 x 权限):
#!/bin/bash
[ -e /opt/confluencedata/lock ] && rm -rf /opt/confluencedata/lock
/opt/wiki/bin/catalina.sh run
confluence 服务启动的命令是 /opt/wiki/bin/startup.sh ,这里使用 /opt/wiki/bin/catalina.sh run 是为了保证 tomcat 在前台运行,否则 Pod 会自动停止。
在启动之前删除数据目录下的 lock 文件是确保 confluence 服务在重新部署时,有可能未删除 lock 文件,这样会导致新启动的 confluence 服务检测到 lock 文件,认为与其他 confluence 服务共用了数据目录,会导致报错。
将 run.sh 、sources.list 、wiki.tar.gz 文件放到与 Dockerfile 文件同级的目录下,执行如下命令构建镜像:
docker build --tag harbor.inner.com/ops/confluence:6.15.10 -f Dockerfile .
推送镜像到内部仓库。
docker push harbor.inner.com/ops/confluence:6.15.10 -f Dockerfile .
2. 创建命名空间
上文中创建 MySQL 服务时已经创建了 ns-wiki 命名空间,此处不再创建。
3. 创建 PV
创建如下目录用于存储 confluence 数据:
mkdir -p /opt/ops_ceph_data/confluence_data
将备份的原 confluence 服务的数据目录文件 confluencedata.tar.gz 解压到该目录下,并修改数据库连接地址。
创建用于持久化存储 confluence 数据的 pv,yaml 文件内容如下:
---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: ceph-wiki-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: ceph-wiki-pv
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 500Gi
local:
path: /opt/ops_ceph_data/confluence_data/confluencedata
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: confluence-app
operator: In
values:
- "true"
persistentVolumeReclaimPolicy: Retain
storageClassName: ceph-wiki-storage
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: ceph-wiki-pvc
namespace: ns-wiki
spec:
accessModes:
- ReadWriteOnce
storageClassName: ceph-wiki-storage
resources:
requests:
storage: 500Gi
在 k8s 的 node 节点上创建用于绑定 pv 的label:
for i in 1 2 3 4 5
do
kubectl label nodes k8s-node${i} confluence-app=true
done
4. 创建 Service
创建用于映射 confluence 服务端口的 Service,yaml 文件内容如下:
---
kind: Service
apiVersion: v1
metadata:
labels:
app: wiki
name: wiki-port
namespace: ns-wiki
spec:
type: NodePort
ports:
- port: 8090
protocol: TCP
targetPort: 8090
nodePort: 32090
selector:
app: wiki
5. 创建 Deployment
创建 confluence 的 Pod,yaml 文件内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: wiki
labels:
app: wiki
namespace: ns-wiki
spec:
replicas: 1
selector:
matchLabels:
app: wiki
template:
metadata:
name: wiki
labels:
app: wiki
spec:
restartPolicy: Always
containers:
- name: wiki
image: harbor.inner.com/ops/confluence:6.15.10
imagePullPolicy: Always
volumeMounts:
- name: wiki-data
mountPath: /opt/confluencedata
- name: date-conf
mountPath: /etc/localtime
imagePullSecrets:
- name: harbor-secret
volumes:
- name: wiki-data
persistentVolumeClaim:
claimName: ceph-wiki-pvc
- name: date-conf
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
使用 k8s 搭建 confluence 6.10.x 版本的更多相关文章
- 使用kubeadm搭建Kubernetes(1.10.2)集群(国内环境)
目录 目标 准备 主机 软件 步骤 (1/4)安装 kubeadm, kubelet and kubectl (2/4)初始化master节点 (3/4) 安装网络插件 (4/4)加入其他节点 (可选 ...
- 轻松搭建自己的Linux发行版本
许多人想要搭建自己的Linux发行版本,可能是觉得有趣,也可能是为了学习更多的Linux知识,或者因为他们有很正式的问题要解决.但是秘密是:自己搭建完美的发行版本不是很困难的一件事.事实上,我们收集了 ...
- 第九章 搭建Hadoop 2.2.0版本HDFS的HA配置
Hadoop中的NameNode好比是人的心脏,非常重要,绝对不可以停止工作.在hadoop1时代,只有一个NameNode.如果该NameNode数据丢失或者不能工作,那么整个集群就不能恢复了.这是 ...
- k8S 搭建集群
k8S 搭建集群1:修改主机名称hostnamectl --static set-hostname masterhostnamectl --static set-hostname node1hostn ...
- 二进制方法-部署k8s集群部署1.18版本
二进制方法-部署k8s集群部署1.18版本 1. 前置知识点 1.1 生产环境可部署kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式 kuberadm Kubea ...
- 功能更新到 Windows 10 企业版, 版本 1607
功能更新到 Windows 10 企业版, 版本 1607
- 汇总10.4版本ArcGIS Server与ArcMap 安装+SDE+注册数据源(非破解)
文档参考了Server技术支持部各位前辈的总结文档. win10 + Server 10.4 + ArcMap 10.4 + Oracle instant client (32位 和 64位) 安装 ...
- .ecp认证文件(10.3版本)
arcgisserver,103,ecp.arcgis.engine,01-jan-2030,E9PJJE2G05FB8RZDF121 3dengine,103,ecp.arcgis.engine,0 ...
- Windows 10 ADK 版本及下载链接汇总
Windows 评估和部署工具包 (Windows ADK) 具有自定义大规模部署的 Windows 映像以及测试系统.添加的组件和在该系统上运行的应用程序的质量和性能所需的工具. Windows A ...
随机推荐
- DVWA从注入到GETSHELL
好好过你的生活,不要老是忙着告诉别人你在干嘛. 最近在复习学过的东西,自己就重新搭了个dvwa来学习新思路,写一些简单的脚本来练习写代码的能力. 众所周知SQL注入的危害是相当大的,对于每个老司机来说 ...
- 系统模块sys的常用方法
sys.argv参数 sys.argv 等价于是一个列表,argv[0] 代表当前脚本程序路径名,可以通过在外部获取多个参数传递给脚本程序执行,按照列表的取值方式第二个数据就是sys.argv[1] ...
- RectTransform简析
UGUI简述 UGUI主要提供了两个能力 UI元素的渲染与适配(其中UI元素的Mesh中的position信息就是通过RectTransform生成的,本文重点) 设备事件的响应与处理(Event ...
- layui动态添加选项卡
<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><head> <meta ...
- 关于Xilinx PCIE DMA的问答
关于Xilinx PCIE DMA的问答 很久没上博客园了,但由于之前在博客园写了几篇关于PCIE DMA的文章,很多同学给我发消息询问相关知识点,之前有空的时候都是语音一小时跟人细讲,最近由于工作繁 ...
- VSCode搭建golang环境
安装对应版本的Golang 略 VSCode安装对应 Go 插件 在应用商店安装即可:go VSCode安装 Go 工具: 在VSCode输入:Crtl + Shift + P 在弹出框输入:inst ...
- ASP。NET Core Blazor CRUD使用实体框架和Web API
下载source code - 1.7 MB 介绍 *请查看我的Youtube视频链接来学习ASP.NET Core Blazor CRUD使用实体框架和Web API. 在本文中,我们将了解如何为A ...
- Redis哨兵知识点总结
1.Redis哨兵介绍 sentinal,中文名是哨兵 A.哨兵是redis集群架构中非常重要的一个组件,主要功能如下 集群监控,负责监控redis master和slave进程是否正常工作 消息通知 ...
- 持续集成工具之Jenkins使用配置
在上一篇博客中,我们主要介绍了DevOps理念以及java环境和jenkins的安装,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13805666.html: ...
- CSGO 服务端扩展插件开发记录之"DropClientReason"(1)
最近开始接触到了CSGO这款游戏,还是老套路,就是想千方百计的从里面增添新的游戏功能,当然刚开始想做到游刃有余是有点困难, 跟之前做CS1.6的第三方开发一样,都得自己慢慢的摸索过来,纵然CSGO所使 ...