您现在的位置是:首页 > cms教程 > Discuz教程Discuz教程

kubernetes部署Discuz的步骤方法

路留时2025-07-06Discuz教程已有人查阅

导读本文将介绍在kubernetes环境中部署一套php应用系统。前端web采用nginx、中间件php以fastcgi的方式运行,后台数据库由mysql提供支撑。

本文将介绍在kubernetes环境中部署一套php应用系统。前端web采用nginx、中间件php以fastcgi的方式运行,后台数据库由mysql提供支撑。
各服务组件之间的调用采用dns解析服务名的方式进行,数据库/应用包/配置文件使用nfs做后端存储,注:k8s版本v1.19.0
一、安装NFS
由于服务器有限,计划NFS服务端安装在k8s-master节点,NFS客户端安装在k8s-node节点
1)所有机器操作
# 所需安装包
yum install nfs-utils rpcbind -y
2)创建web和DB目录
##/nfsdata/k8s下的两个目录用于集群中运行LNMP环境存放的数据,web目录为nginx网站的根目录,DB为数据库存放的数据目录
[root@k8s-master ~]# mkdir -p /nfsdata/k8s/{web,db}
[root@k8s-master ~]# chown -R nfsnobody.nfsnobody /nfsdata/
[root@k8s-master ~]# vim /etc/exports
/nfsdata/k8s 10.3.104.0/21(sync,rw,no_root_squash)
### 启动NFS服务
[root@k8s-master ~]# systemctl start rpcbind.service
[root@k8s-master ~]# systemctl start nfs.service
### 检查NFS服务 , 其中 10.3.104.51 为服务端IP
[root@k8s-master ~]# showmount -e 10.3.104.51
Export list for 10.3.104.51:
/nfsdata/k8s 10.3.104.0/21
3)NFS客户端验证
在k8s-node1机器验证
# rpcbind服务启动并加入开机自启动
[root@k8s-node1 ~]# systemctl start rpcbind.service && systemctl enable rpcbind.service
# 查看NFS服务信息
[root@k8s-node1 ~]# showmount -e 10.3.104.51
Export list for 10.3.104.51:
/nfsdata/k8s 10.3.104.0/21
# 挂载,并进行读写验证
[root@k8s-node1 ~]# mount -t nfs 10.3.104.51:/nfsdata/k8s /mnt
[root@k8s-node1 ~]# df -h | grep mnt
10.3.104.51:/nfsdata/k8s 40G 13G 25G 34% /mnt
# 验证完毕,去掉NFS挂载
[root@k8s-node1 ~]# umount -lf 10.3.104.51:/nfsdata/k8s
二、安装Mysql服务
1)创建存放mysql服务的yaml文件目录
[root@k8s-master ~]# mkdir -p /home/k8s/lnmp/mysql
2)创建secret,将mysql数据库的密码存放到secret中
[root@k8s-master mysql]# kubectl create secret generic mysql-pass --from-literal=password=abc123
3)创建mysql-pv
[root@k8s-master mysql]# vim mysql-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
path: /nfsdata/k8s/db ##该参数指定你的NFS端的共享目录
server: 10.3.104.51 ##指定nfs端的IP
[root@k8s-master mysql]# kubectl create -f mysql-pv.yaml
persistentvolume/mysql-pv created
4)创建mysql-pvc
[root@k8s-master mysql]# vim mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-claim
labels:
app: discuz
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
[root@k8s-master mysql]# kubectl create -f mysql-pvc.yaml
persistentvolumeclaim/mysql-claim created
5)查看pv,pvc信息
##下面可以看出状态Bound(绑定)正常,pv中的CLAIM列绑定的信息为pvc定义的name,pvc中VOLUME列的信息显示绑定了mysql-pv的name
[root@k8s-master mysql]# kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/mysql-pv 10Gi RWX Retain Bound default/mysql-claim 71s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/mysql-claim Bound mysql-pv 10Gi RWX 15s
6)创建mysql-deploy
[root@k8s-master mysql]# vim mysql-dp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dz-mysql
labels:
app: discuz
spec:
selector:
matchLabels:
app: discuz
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: discuz
tier: mysql
spec:
imagePullSecrets:
- name: my-secret
containers:
- image: mysql:5.7 ##此处指定你的harbor需要拉取的镜像,我这里是直接线上拉取了
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass ##此模块是调用secret中存放的mysql密码
key: password
ports:
- containerPort: 3306
name: dz-mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim: ##此模块参数调用定义创建的pvc名称
claimName: mysql-claim
[root@k8s-master mysql]# kubectl create -f mysql-dp.yaml
deployment.apps/dz-mysql created
7)创建mysql-service
[root@k8s-master mysql]# vim mysql-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: dz-mysql
labels:
app: discuz
spec:
ports:
- port: 3306
selector:
app: discuz
tier: mysql
[root@k8s-master mysql]# kubectl create -f mysql-svc.yaml
service/dz-mysql created
8)查看mysql服务的pod和svc信息
##下面信息可以看出,dz-mysql状态Running(运行)正常,分配的cluster-ip=10.98.13.175,该IP在集群中可以访问,外部无法访问该IP
[root@k8s-master mysql]# kubectl get pod,svc -o wide | grep mysql
pod/dz-mysql-79cd646bf7-fxnbf 1/1 Running 0 4d19h 10.244.1.62 k8s-node1 <none> <none>
service/dz-mysql ClusterIP 10.98.13.175 <none> 3306/TCP 4d19h app=discuz,tier=mysql
三、安装php-fm
1)创建存放php-fm服务的yaml文件目录
[root@k8s-master ~]# mkdir -p /home/k8s/lnmp/php-fm
2)创建php-pv
[root@master php-fm]# vim php-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: web-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
path: /nfsdata/k8s/web
server: 10.3.104.51
[root@master php-fm]# kubectl create -f php-pv.yaml
persistentvolume/web-pv created
3)创建php-pvc
[root@master php-fm]# vim php-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: web-claim
labels:
app: discuz
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
[root@master php-fm]# kubectl create -f php-pvc.yaml
persistentvolumeclaim/web-claim created
4)查看pv,pvc绑定状态
[root@master php-fm]# kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/mysql-pv 10Gi RWX Retain Bound default/mysql-claim 34m
persistentvolume/web-pv 10Gi RWX Retain Bound default/web-claim 114s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/mysql-claim Bound mysql-pv 10Gi RWX 33m
persistentvolumeclaim/web-claim Bound web-pv 10Gi RWX 108s
5)通过dockerfile创建php镜像文件
[root@k8s-master php-fm]# cat dockerfile
FROM docker.io/openshift/base-centos7:latest
MAINTAINER feiyu "akwangj@126.com"
RUN yum makecache
RUN yum -y install php-fpm php php-gd php-mysql php-mbstring php-xml php-mcrypt php-imap php-odbc php-pear php-xmlrpc
RUN sed -i 's/listen = 127.0.0.1:9000/listen = 0.0.0.0:9000/' /etc/php-fpm.d/ .conf
RUN sed -i 's/listen.allowed_clients = 127.0.0.1/;listen.allowed_clients = 127.0.0.1/' /etc/php-fpm.d/ .conf
EXPOSE 9000
CMD ["/sbin/php-fpm"]
[root@k8s-master php-fm]# docker build -t php:0.1 .
6)部署php-deploy
[root@k8s-master php-fm]# cat php-dp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dz-php
labels:
app: discuz
spec:
replicas: 1
selector:
matchLabels:
app: discuz
tier: php-fm
template:
metadata:
labels:
app: discuz
tier: php-fm
spec:
imagePullSecrets:
- name: my-secret
containers:
- name: dz-php
image: php:0.1 ## 如果harbor仓库有填仓库地址,如果没harbor仓库,每个Node都制作下该镜像
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9000
volumeMounts:
- name: php-persistent-storage
mountPath: /var/ /html/
volumes:
- name: php-persistent-storage
persistentVolumeClaim:
claimName: web-claim
[root@master php-fm]# kubectl create -f php-dp.yaml
deployment.apps/dz-web created
7)部署php-svc
[root@k8s-master php-fm]# cat php-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: php
labels:
app: discuz
spec:
ports:
- name: php
port: 9000
protocol: TCP
targetPort: 9000
selector:
app: discuz
tier: php-fm
[root@k8s-master php-fm]# kubectl create -f php-svc.yaml
service/dz-web created
8)查看php的pod,svc信息
[root@k8s-master php-fm]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dz-mysql ClusterIP 10.98.13.175 <none> 3306/TCP 4d20h
php ClusterIP 10.110.59.41 <none> 9000/TCP 4s
[root@k8s-master php-fm]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/dz-mysql-79cd646bf7-fxnbf 1/1 Running 0 4d20h
pod/dz-php-857b6bdf68-kt6lt 1/1 Running 0 101s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/dz-mysql ClusterIP 10.98.13.175 <none> 3306/TCP 4d20h
service/php ClusterIP 10.110.59.41 <none> 9000/TCP 36s
四、安装nginx
1)创建存放php-fm服务的yaml文件目录
[root@k8s-master ~]# mkdir -p /home/k8s/lnmp/nginx
2)部署nginx.conf(以configmap形式存储)
[root@k8s-master nginx]# cat nginx-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-configmap
data:
nginx_conf: |-
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
autoindex on;
index index.php index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
root /var/ /html;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/ /html/$fastcgi_script_name;
include fastcgi_params;
}
}
}
[root@k8s-master nginx]# kubectl apply -f nginx-configmap.yaml
configmap/nginx-configmap created
[root@k8s-master nginx]# kubectl get cm
NAME DATA AGE
nginx-configmap 1 7s
3)部署nginx-deploy
[root@k8s-master nginx]# cat nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-php
spec:
selector:
matchLabels:
app: nginx-php
replicas: 1
template:
metadata:
labels:
app: nginx-php
spec:
containers:
- name: nginx-php
image: nginx:latest ## 在线拉取了较新nginx镜像
ports:
- containerPort: 80
volumeMounts:
- name: nginx-data
mountPath: /usr/share/nginx/html
- name: nginx-conf
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf
volumes:
- name: nginx-data
persistentVolumeClaim:
claimName: web-claim ##将nfsdata/k8s/web映射到/usr/share/nginx/html目录
- name: nginx-conf
configMap:
name: nginx-configmap ## 将nginx-cofigmap映射到/etc/nginx/nginx.conf
items:
- key: nginx_conf
path: nginx.conf
4)部署nginx-svc
[root@k8s-master nginx]# cat nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-php
spec:
type: NodePort
ports:
- name: nginx
port: 80
protocol: TCP
targetPort: 80
nodePort: 30004
selector:
app: nginx-php
[root@k8s-master nginx]# kubectl apply -f nginx-svc.yaml
service/nginx-php created
5)查看nginx的pod,svc信息
[root@k8s-master nginx]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/dz-mysql-79cd646bf7-fxnbf 1/1 Running 0 4d21h
pod/dz-php-857b6bdf68-kt6lt 1/1 Running 0 13m
pod/nfs-client-provisioner-677fc9c97c-9cj92 1/1 Running 2 93d
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/dz-mysql ClusterIP 10.98.13.175 <none> 3306/TCP 4d21h
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 100d
service/nginx-php NodePort 10.97.61.182 <none> 80:30004/TCP 28s
service/php ClusterIP 10.110.59.41 <none> 9000/TCP 12m
五、安装Discuz【NFS上操作】
1)下载Discuz
[root@k8s-master ~]# cd /data/
[root@k8s-master data]# git clone https://gitee.com/ComsenzDiscuz/DiscuzX.git
正克隆到 'DiscuzX'...
remote: Counting objects: 9085, done.
remote: Compressing objects: 100% (5400/5400), done.
remote: Total 9085 (delta 3895), reused 8535 (delta 3632)
接收对象中: 100% (9085/9085), 12.96 MiB | 166.00 KiB/s, done.
处理 delta 中: 100% (3895/3895), done.
2)将Discuz项目中upload目录下所有文件,放到web中
[root@k8s-master data]# mv DiscuzX/upload/* /nfsdata/k8s/web/
[root@k8s-master data]# cd /nfsdata/k8s/web/
[root@k8s-master web]# chmod 100 data uc_server/data uc_client/data config
3)进入mysql,创建dz库和授权用户
[root@k8s-master ~]# kubectl exec -it dz-mysql-787586b8d6-9kl5b -- mysql -u root -p
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.28 MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database dz;
Query OK, 1 row affected (0.19 sec)
mysql> grant all on dz.* to 'dz'@'%' identified by 'abc123';
Query OK, 0 rows affected, 1 warning (0.11 sec
4)浏览器访问web安装页面
补充:通过ingress访问
1)ingress资源文件
[root@k8s-master php]# cat ingress-http.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: nginx-http
namespace: default
spec:
rules:
- host:.cuztest.com
http:
paths:
- path: /
backend:
serviceName: nginx-php
servicePort: 80
[root@k8s-master php]# kubectl apply -f ingress-http.yaml
Warning: networking.k8s.io/v1beta1 Ingress is deprecated in v1.19+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
ingress.networking.k8s.io/nginx-http created
[root@k8s-master php]# kubectl get ingress
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
nginx-http <none>.cuztest.com 80 15s
2)本地hosts添加域名解析

本文标签:

很赞哦! ()

相关源码

  • (自适应)大型农业机械设备水稻玉米收割机网站pbootcms源码下载本模板基于PbootCMS内核开发,为农业机械设备制造与销售企业设计,特别适合水稻玉米收割机、拖拉机、播种机等农用机械展示。模板充分考虑了农机行业的特性,从产品展示到技术参数,从作业案例到售后服务查看源码
  • (自适应)帝国cms7.5模板新闻资讯门户带会员中心基于帝国CMS7.5内核开发的HTML5响应式模板,为新闻机构、媒体门户及资讯聚合平台设计。通过模块化布局实现图文混排查看源码
  • (自适应)绿色新闻生活百科资讯文章博客类网站pbootcms模板源码本模板基于PbootCMS开发,为生活百科、资讯文章和博客类网站设计。采用清新绿色系风格,提供舒适的阅读体验,同时适配PC和移动设备。适用于生活技巧分享、健康知识传播查看源码
  • (自适应)大气壁挂炉暖气设备家用电器模板带加盟申请和下载资料为壁挂炉、暖气片等供暖设备企业设计的PbootCMS模板,通过响应式技术实现跨终端展示产品参数和技术细节。后台统一管理确保采暖系统数据、服务网点信息实时同步更新查看源码
  • 自适应恒温恒湿机空调机械设备营销型网站模板(自适应手机版)响应式营销型恒温恒湿机环境设备类网站pbootcms模板 蓝色营销型空调设备网站源码下载PbootCMS内核开发的网站模板,该模板适用于营查看源码
  • (自适应响应式)个人作品技术文章博客网站模板下载基于PbootCMS内核开发的响应式博客模板,为数字营销、技术分享类内容打造。采用前沿设计理念,兼顾内容展示与阅读体验,适配各类终端设备。通过本模板可快速构建专业级行业博客,有效传播专业知识与案例成果。查看源码
分享笔记 (共有 篇笔记)
验证码:

本栏推荐