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/v1kind: Deploymentmetadata:name: mysqlnamespace: bloglabels:app: mysqlspec:selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:5.7args:- --default_authentication_plugin=mysql_native_password- --character-set-server=utf8mb4- --collation-server=utf8mb4_unicode_ciports:- containerPort: 3306name: dbportenv:- name: MYSQL_ROOT_PASSWORDvalue: root密码- name: MYSQL_DATABASEvalue: confluence数据库- name: MYSQL_USERvalue: confluence操作db的用户名- name: MYSQL_PASSWORDvalue: confluence操作db的密码volumeMounts:- name: dbmountPath: /var/lib/mysql- name: confmountPath: /etc/mysql/conf.dvolumes:- name: dbhostPath:path: /data/mysql/data- name: confhostPath:path: /data/mysql/conf---apiVersion: v1kind: Servicemetadata:name: mysqlnamespace: blogspec:selector:app: mysqltype: NodePortports:- name: mysqlportprotocol: TCPport: 3306nodePort: 30306targetPort: 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: TCPport: 3306nodePort: 30306targetPort: dbport
通过运行命令kubectl create -f mysql-pod.yaml创建mysql pod,接下来就是等待拉取镜像,启动容器,使用describe
指令查看详细信息:
kubectl describe pod mysql -n blogkubectl describe svc mysql -n blog # 展示Endpoints信息
Part2:confluence部分的yaml文件编写如下:
apiVersion: apps/v1kind: Deploymentmetadata:name: confluencenamespace: bloglabels:app: confluencespec:selector:matchLabels:app: confluenceminReadySeconds: 5strategy:type: RollingUpdaterollingUpdate:maxSurge: 1maxUnavailable: 1template:metadata:labels:app: confluencespec:containers:- name: confluenceimage: atlassian/confluence-serverimagePullPolicy: IfNotPresentports:- containerPort: 8090name: cfportprotocol: TCP- containerPort: 8091name: cfhttpportprotocol: TCPenv:- name: ATL_JDBC_URLvalue: "jdbc:mysql://mysql:3306/confluence?sessionVariables=tx_isolation=\"READ-COMMITTED\"&useUnicode=true&characterEncoding=utf8&autoReconnect=true"- name: ATL_JDBC_USERvalue: confluence操作db的用户名(与mysql中的一致)- name: ATL_JDBC_PASSWORDvalue: confluence操作db的密码(与mysql中的一致)- name: ATL_DB_TYPEvalue: mysqlvolumeMounts:- name: application-data-confluencemountPath: /var/atlassian/application-data/confluence- name: confluence-libmountPath: /opt/atlassian/confluence/confluence/WEB-INF/libreadinessProbe:tcpSocket:port: 8090initialDelaySeconds: 5periodSeconds: 10resources:limits:cpu: 500mmemory: 2Girequests:cpu: 500mmemory: 2Givolumes:- name: application-data-confluencehostPath:path: /data/atlassian/application-data/confluence- name: confluence-libhostPath:path: /data/atlassian/confluence/lib---apiVersion: v1kind: Servicemetadata:name: confluencenamespace: blogspec:selector:app: confluencetype: NodePortports:- name: confluenceportprotocol: TCPport: 8090nodePort: 30800targetPort: cfport- name: confluencehttpportprotocol: TCPport: 8091nodePort: 30801targetPort: 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 blogkubectl describe svc confluence -n blog # 展示Endpoints信息
提高稳定性的措施(1)增加健康检测,通过liveness probe和rediness probe是提高应用稳定性非常重要的方法:
livenessProbe:tcpSocket:port: 8090initialDelaySeconds: 3periodSeconds: 3readinessProbe:tcpSocket:port: 8090initialDelaySeconds: 5periodSeconds: 10
增加上面两个探针,每10s检测一次应用是否可读,每3s检测一次应用是否存活(2)增加 HPA,让我们的应用能够自动应对流量高峰期:
kubectl get deployments -n blogkubectl 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: 500mmemory: 2Girequests:cpu: 500mmemory: 2Gi
更新Deployment后,通过如下命令来测试下上面的HPA
是否会生效:
kubectl run -i --tty load-generator --image=busybox /bin/shIf 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: 2revisionHistoryLimit: 10minReadySeconds: 5strategy:type: RollingUpdaterollingUpdate:maxSurge: 1maxUnavailable: 1
(4)确保mysql服务在启动confluence应用之前先启动,检查mysql服务,如果服务正常就开始部署应用initContainers:- name: init-dbimage: busyboxcommand: ['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




