在kubernetes中搭建LNMP环境,并安装Discuzx

本实验,需要已经搭建好kubernetes集群和harbor服务(使用腾讯云镜像仓库)。

首先克隆本项目:git clone https://github.com/donxan/k8s_lnmp_discuzx.git

下载镜像

docker pull mysql:5.7
docker pull richarvey/nginx-php-fpm

用dockerfile重建nginx-php-fpm镜像

cd k8s_discuz/dz_web_dockerfile/
docker build -t ccr.ccs.tencentyun.com/v_cjweichen/nginx-php .

将镜像push到镜像仓库

docker login ccr.ccs.tencentyun.com

docker push ccr.ccs.tencentyun.com/v_cjweichen/nginx-php:latest

docker tag mysql:5.7 ccr.ccs.tencentyun.com/v_cjweichen/mysql:5.7

docker push ccr.ccs.tencentyun.com/v_cjweichen/mysql:5.

搭建MySQL服务

  • 创建secret (设定mysql的root密码)
kubectl create secret generic mysql-pass --from-literal=password=DzPasswd1
  • 创建pv
cd ../../k8s_discuz/mysql
kubectl apply -f mysql-pv.yaml

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 10Gi
  csi:
    driver: com.tencent.cloud.csi.cfs
    volumeAttributes:
      host: 192.168.1.6
      path: /k8s/discuz/db
    volumeHandle: mysql-pv
  persistentVolumeReclaimPolicy: Retain
  storageClassName: cfs
  volumeMode: Filesystem
  • 创建pvc
kubectl apply -f mysql-pvc.yaml

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-claim
  namespace: lnmp
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  storageClassName: cfs
  volumeMode: Filesystem
  volumeName: mysql-pv
status:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 10Gi
  • 创建deployment
kubectl apply -f 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: harbor-secret
      containers:
      - image: ccr.ccs.tencentyun.com/v_cjweichen/mysql:5.7
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 3306
          name: dz-mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /data
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-claim
  • 创建service
kubectl apply -f mysql-svc.yaml

---
apiVersion: v1
kind: Service
metadata:
  name: dz-mysql
  labels:
    app: discuz
spec:
  ports:
    - port: 3306
  selector:
    app: discuz
    tier: mysql

搭建Nginx+php-fpm服务

注意搭建步骤,在部署mysql时,不能deploy,svc一起执行,需要一步一步来操作。

  • 搭建pv
cd ../../k8s_discuz/nginx_php
kubectl apply -f web-pv.yaml
----
apiVersion: v1
kind: PersistentVolume
metadata:
  name: web-pv
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 10Gi
  csi:
    driver: com.tencent.cloud.csi.cfs
    volumeAttributes:
      host: 192.168.1.6
      path: /k8s/discuz/web
    volumeHandle: mysql-pv
  persistentVolumeReclaimPolicy: Retain
  storageClassName: cfs
  volumeMode: Filesystem
  • 创建pvc
kubectl apply -f web-pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: web-claim
  namespace: lnmp
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  storageClassName: cfs
  volumeMode: Filesystem
  volumeName: web-pv
status:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 10Gi
  • 创建deployment
kubectl apply -f web-dp.yaml 

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dz-web
  labels:
    app: discuz
spec:
  replicas: 1
  selector:
    matchLabels:
      app: discuz
      tier: nginx-php
  template:
    metadata:
      labels:
        app: discuz
        tier: nginx-php
    spec:
      imagePullSecrets:
      - name: harbor-secret
      containers:
      - image: ccr.ccs.tencentyun.com/v_cjweichen/nginx-php:latest
        name: dz-web
        ports:
        - containerPort: 9000
        - containerPort: 80
          name: dz-web
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/www/html/
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: web-claim
  • 创建service
kubectl apply -f web-svc.yaml
---
apiVersion: v1
kind: Service
metadata:
  name: dz-web
  labels:
    app: discuz
spec:
  type: NodePort
  ports:
    - port: 80
      nodePort: 30001
  selector:
    app: discuz
    tier: nginx-php

安装Discuz

  • 下载dz代码 (到NFS服务器上)
cd /tmp/
git clone https://gitee.com/Discuz/DiscuzX.git
cd /nfsroot/k8s/discuz/web/
mv /tmp/DiscuzX/upload/* .
chown -R 100 data uc_server/data/ uc_client/data/ config/
  • 设置MySQL普通用户
kubectl get svc dz-mysql //查看service的cluster-ip,我的是10.68.122.120
mysql -uroot -h10.68.122.120 -pDzPasswd1  //这里的密码是在上面步骤中设置的那个密码
> create database dz;
> grant all on dz.* to 'dz'@'%' identified by 'dz-passwd-123';

部署traefik ingress

cd ../../k8s_discuz/nginx_php
kubectl apply -f web-ingress.yaml
 如果没有部署ingress,可以使用安装nginx,配置nginx反向代理。 参考如下。
  • 设置Nginx代理
注意:目前nginx服务是运行在kubernetes集群里,node节点以及master节点上是可以通过cluster-ip访问到,但是外部的客户端就不能访问了。
      所以,可以在任意一台node或者master上建一个nginx反向代理即可访问到集群内的nginx。
kubectl get svc dz-web //查看cluster-ip,我的ip是10.68.190.99
nginx代理配置文件内容如下:
server {
            listen 80;
            server_name dz.abcgogo.com;

            location / {
                proxy_pass      http://10.68.190.99:80;
                proxy_set_header Host   $host;
                proxy_set_header X-Real-IP      $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

做完Nginx代理,就可以通过node的IP来访问discuz了。

安装Discuz

按照提示配置即可。

results matching ""

    No results matching ""