暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

部署confluence示例 · 从 Docker 到 Kubernetes

蛮懒 2020-05-22
1073

docker方式部署

docker run -v /data/your-confluence-home:/var/atlassian/application-data/confluence --name="confluence" -d -p 8090:8090 -p 8091:8091 atlassian/confluence-server


Kubernetes方式部署

将confluence应用部署到k8s集群中,主要涉及两个镜像:confluence-server和mysql,其中confluence-server是应用的核心程序,mysql用于数据存储的。整体流程如下:

步骤1:我们需要先通过命令:kubectl create namespace blog创建一个命名空间blog

步骤2:编写yaml文件(注意文件格式准确)进行pod构建

说明:如果将confluence-server与mysql通过单一Pod的方式进行部署,多个副本中mysql的数据不相通,所以需要分开部署;还有由于confluence-server依赖mysql启动后才能正常启动,所以需要拆分,通过InitContainer来保证mysql-pod先于confluence-server-pod启动

因此步骤2,我们是拆分成单个pod进行构建

Part1:mysql部分的yaml文件编写如下:

apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
namespace: blog
labels:
app: mysql
spec:
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
args:
- --default_authentication_plugin=mysql_native_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
ports:
- containerPort: 3306
name: dbport
env:
- name: MYSQL_ROOT_PASSWORD
value: root密码
- name: MYSQL_DATABASE
value: confluence数据库
- name: MYSQL_USER
value: confluence操作db的用户名
- name: MYSQL_PASSWORD
value: confluence操作db的密码
volumeMounts:
- name: db
mountPath: /var/lib/mysql
- name: conf
mountPath: /etc/mysql/conf.d
volumes:
- name: db
hostPath:
            path: /data/mysql/data
- name: conf
hostPath:
path: /data/mysql/conf


---
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: blog
spec:
selector:
app: mysql
type: NodePort
ports:
- name: mysqlport
protocol: TCP
port: 3306
nodePort: 30306
targetPort: dbport

说明:

指定kind为Deployment,即部署无状态mysql服务,

pod关联一组标签为mysql的容器,

pod中容器只包含mysql:

使用image: mysql:5.7镜像,容器运行时接收参数通过args进行设置,容器内部端口3306

env中指定容器构建是传入的环境变量,针对mysql:5.7镜像,重要环境变量名称如下:

  • MYSQL_ROOT_PASSWORD

  • MYSQL_DATABASE

  • MYSQL_USER

  • MYSQL_PASSWORD

将/var/lib/mysql挂载到本地的/data/mysql/data目录(视情况调整)

如果需要使用自定义的mysqld.cnf,则将/etc/mysql/conf.d挂载到包含mysqld.cnf的本地目录

也可以通过ConfigMap的方式构建,本文未使用这种方式,后续会单就ConfigMap方式写一篇文章

上述的部署,只能够通过Pod IP进行访问,外部无法访问,所以构建service使用NodePort的方式将pod中的端口映射到物理端口,注意targetPort取值要与Deployment中port对应的name一致

protocol: TCP
port: 3306
nodePort: 30306
targetPort: dbport

通过运行命令kubectl create -f mysql-pod.yaml创建mysql pod,接下来就是等待拉取镜像,启动容器,使用describe
指令查看详细信息:

kubectl describe pod mysql -n blog
kubectl describe svc mysql -n blog # 展示Endpoints信息

Part2:confluence部分的yaml文件编写如下:

apiVersion: apps/v1
kind: Deployment
metadata:
name: confluence
namespace: blog
labels:
app: confluence
spec:
selector:
matchLabels:
app: confluence
minReadySeconds: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
template:
metadata:
labels:
app: confluence
spec:
containers:
- name: confluence
image: atlassian/confluence-server
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8090
name: cfport
protocol: TCP
- containerPort: 8091
name: cfhttpport
protocol: TCP
env:
- name: ATL_JDBC_URL
value: "jdbc:mysql://mysql:3306/confluence?sessionVariables=tx_isolation=\"READ-COMMITTED\"&useUnicode=true&characterEncoding=utf8&autoReconnect=true"
- name: ATL_JDBC_USER
              value: confluence操作db的用户名(与mysql中的一致)
- name: ATL_JDBC_PASSWORD
              value: confluence操作db的密码(与mysql中的一致)
- name: ATL_DB_TYPE
value: mysql
volumeMounts:
- name: application-data-confluence
mountPath: /var/atlassian/application-data/confluence
- name: confluence-lib
mountPath: /opt/atlassian/confluence/confluence/WEB-INF/lib
readinessProbe:
tcpSocket:
port: 8090
initialDelaySeconds: 5
periodSeconds: 10
resources:
limits:
cpu: 500m
memory: 2Gi
requests:
cpu: 500m
memory: 2Gi
volumes:
- name: application-data-confluence
hostPath:
            path: /data/atlassian/application-data/confluence
- name: confluence-lib
hostPath:
path: /data/atlassian/confluence/lib


---
apiVersion: v1
kind: Service
metadata:
name: confluence
namespace: blog
spec:
selector:
app: confluence
type: NodePort
ports:
- name: confluenceport
protocol: TCP
port: 8090
      nodePort: 30800
targetPort: cfport
- name: confluencehttpport
protocol: TCP
      port: 8091
      nodePort: 30801
targetPort: cfhttpport

说明:

指定kind:为Deployment,即部署无状态confluence服务,

pod关联一组标签为confluence的容器,

pod中容器只包含confluence:

使用image: atlassian/confluence-server镜像,容器内部端口8090、8091

env中指定容器构建是传入的环境变量,针对atlassian/confluence-server镜像,

主要几个环境变量名称如下:

  • ATL_JDBC_URL

  • ATL_JDBC_USER

  • ATL_JDBC_PASSWORD

  • ATL_DB_TYPE

特别注意:ATL_JDBC_URL中访问mysql直接使用的service名(如果使用mysql服务的clusterIP地址,pod重新构建ip发生变动时需要反复进行修改)

将/var/atlassian/application-data/confluence挂载到本地/data/atlassian/application-data/confluence目录(视情况调整)

由于mysql驱动类依赖包mysql-connector-java-XXX-bin.jar,需要将其放于目录/opt/atlassian/confluence/confluence/WEB-INF/lib

为了操作的方便,直接将整个lib目录进行了挂载(之后进行优化,取消挂载lib的方式)

同样由于只能够通过Pod IP进行访问,外部无法访问,所以构建service使用NodePort的方式将pod中的2个端口分别映射到物理端口30800、30800

kubectl create -f confluence-pod.yaml创建confluence Pod,接下来就是等待拉取镜像,启动容器,使用describe指令查看详细信息,如果镜像拉去耗时,可以先提前手动进行docker pull atlassian/confluence-server:

kubectl describe pod confluence -n blog
kubectl describe svc confluence -n blog # 展示Endpoints信息


提高稳定性的措施

(1)增加健康检测,通过liveness probe和rediness probe是提高应用稳定性非常重要的方法:

livenessProbe:
tcpSocket:
port: 8090
initialDelaySeconds: 3
periodSeconds: 3
readinessProbe:
tcpSocket:
port: 8090
initialDelaySeconds: 5
periodSeconds: 10
增加上面两个探针,每10s检测一次应用是否可读,每3s检测一次应用是否存活

(2)增加 HPA,让我们的应用能够自动应对流量高峰期:

kubectl get deployments -n blog
kubectl autoscale deployment confluence --cpu-percent=10 --min=1 --max=10 -n blog

kubectl autoscale
命令为confluence创建一个HPA
对象:

最小的 pod 副本数为1,最大为10,HPA
会根据设定的 cpu使用率(10%)动态的增加或者减少pod数量。
同时也为Pod
声明一些资源限制:
resources:
limits:
cpu: 500m
memory: 2Gi
requests:
cpu: 500m
memory: 2Gi
更新Deployment后,通过如下命令来测试下上面的HPA
是否会生效:
kubectl run -i --tty load-generator --image=busybox /bin/sh
If you don't see a command prompt, try pressing enter.
/ # while true; do wget -q -O- http://10.244.1.62:80; done

通过kubectl get deployment confluence观察Deployment的副本数是否有变化

(3)增加滚动更新策略,来保证在更新应用的时候服务不会被中断:

replicas: 2
revisionHistoryLimit: 10
minReadySeconds: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
(4)确保mysql服务在启动confluence应用之前先启动,检查mysql服务,如果服务正常就开始部署应用
initContainers:
- name: init-db
image: busybox
command: ['sh', '-c', 'until nslookup mysql; do echo waiting for mysql service; sleep 2; done;']
直到mysql服务创建完成后,initContainer才结束,结束完成后才开始下面的部署。
到此,通过k8s部署confluence的操作就结束,也可以借助helm工具进行安装,后面会有专门文章整理helm相关使用经验


参考链接:

https://hub.docker.com/r/atlassian/confluence-server

https://hub.helm.sh/charts/mox/confluence-server

https://itnext.io/jira-on-kubernetes-by-helm-8a38357da4e

https://github.com/int128/devops-kompose


文章转载自蛮懒,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论