说明:本实验在该篇章https://www.cnblogs.com/douyi/p/12031600.html集群基础上模拟真实的一个线上环境,在k8s集群中部署LNMP环境运行Discuz论坛
一、下载公共镜像【deploy上操作】
1:下载mysql5.7镜像
1 [root@master ~]# docker pull mysql:5.7 2 5.7: Pulling from library/mysql 3 d599a449871e: Pull complete 4 f287049d3170: Pull complete 5 08947732a1b0: Pull complete 6 96f3056887f2: Pull complete 7 871f7f65f017: Pull complete 8 1dd50c4b99cb: Pull complete 9 5bcbdf508448: Pull complete 10 02a97db830bd: Pull complete 11 c09912a99bce: Pull complete 12 08a981fc6a89: Pull complete 13 818a84239152: Pull complete 14 Digest: sha256:5779c71a4730da36f013a23a437b5831198e68e634575f487d37a0639470e3a8 15 Status: Downloaded newer image for mysql:5.7
2:下载nginx-php-fpm镜像
1 [root@master ~]# docker pull richarvey/nginx-php-fpm 2 Using default tag: latest 3 latest: Pulling from richarvey/nginx-php-fpm 4 9d48c3bd43c5: Pull complete 5 4bf02c0a37c8: Pull complete 6 9ce49f939c6f: Pull complete 7 2fa33c09831c: Pull complete 8 64d703475f7c: Pull complete 9 687e14517432: Pull complete 10 5d8ec717fece: Pull complete 11 9fe12d3f6add: Pull complete 12 e860070fe546: Pull complete 13 36baa049bdfe: Pull complete 14 4073f665d7d8: Pull complete 15 42a3d0ae6c56: Pull complete 16 682e06ece949: Pull complete 17 3c3d9faab7c5: Pull complete 18 258d52d772e4: Pull complete 19 41336c37b6cd: Pull complete 20 9ef84aa1b775: Pull complete 21 94c642e23a42: Pull complete 22 f601338f6a53: Pull complete 23 0c5f20947667: Pull complete 24 50f6eb03fd0b: Pull complete 25 75174a25ab08: Pull complete 26 8e16258eb3ba: Pull complete 27 447fabc9be1b: Pull complete 28 a485db129518: Pull complete 29 de30cb0b9f89: Pull complete 30 5724050c9b48: Pull complete 31 c20deb9ffa63: Pull complete 32 52031a5fa502: Pull complete 33 6aea67ff4e17: Pull complete 34 Digest: sha256:f8109029deb401ee83c4fcd1e737cc496f42aca6a6e8f445f8501ea977be6784 35 Status: Downloaded newer image for richarvey/nginx-php-fpm:latest
二、上传镜像到harbor【deploy上操作】
说明:harbor安装方法参考次篇文章https://www.cnblogs.com/douyi/p/12057218.html
1:mysql镜像push到harbor上
1 [root@master ~]# docker tag mysql:5.7 harbor.ghs.com/lnmp/mysql:5.7 2 [root@master ~]# docker push harbor.ghs.com/lnmp/mysql:5.7 3 The push refers to repository [harbor.ghs.com/lnmp/mysql] 4 94a471180601: Pushed 5 934de0c0816e: Pushed 6 fc12e028de3b: Pushed 7 398ef8a407f7: Pushed 8 7055b7f82e4c: Pushed 9 2a9aab74013a: Pushed 10 414373ffccb4: Pushed 11 6599033b2ab2: Pushed 12 51734435c93c: Pushed 13 5a8a245abd1c: Pushed 14 99b5261d397c: Pushed 15 5.7: digest: sha256:9e02c7c9a87d363588e85c87b8c6f637254c5c67b915b1666482f54121bb0926 size: 2622
2:nginx-php-fpm镜像push到harbor上
1 [root@master ~]# docker tag richarvey/nginx-php-fpm harbor.ghs.com/lnmp/nginx-php-fpm:latest 2 [root@master ~]# docker push harbor.ghs.com/lnmp/nginx-php-fpm:latest 3 The push refers to repository [harbor.ghs.com/lnmp/nginx-php-fpm] 4 2624e7202e4b: Pushed 5 eb30cdb90ca1: Pushed 6 ae93c067c849: Pushed 7 9801a5392a22: Pushed 8 7b2d66211161: Pushed 9 9d4627716f06: Pushed 10 d3cf99377a74: Pushed 11 f647f7714c77: Pushed 12 8ed73ab2d11b: Pushed 13 525bffddcce1: Pushed 14 d93022710c58: Pushed 15 28e868b9a611: Pushed 16 ebbffb8bead8: Pushed 17 c4ffba011c55: Pushed 18 9ac09047b17d: Pushed 19 3fefc401e422: Pushed 20 3b73d52fb480: Pushed 21 73f0a2737684: Pushed 22 bb46af78e4a5: Pushed 23 5d02268e182d: Pushed 24 84bd64e5da78: Pushed 25 14d91eeebaab: Pushed 26 67ee9b354071: Pushed 27 d822f3d53ee3: Pushed 28 a0c85631af8f: Pushed 29 7c1ad7fa7002: Pushed 30 03ecc22184eb: Pushed 31 1581c77670a3: Pushed 32 14ee8729351c: Pushed 33 03901b4a2ea8: Pushed 34 latest: digest: sha256:f8109029deb401ee83c4fcd1e737cc496f42aca6a6e8f445f8501ea977be6784 size: 6576
三、安装NFS【master2上操作】
1:创建web和DB目录
##/data/k8s下的两个目录用于集群中运行LNMP环境存放的数据,web目录为nginx网站的根目录,DB为数据库存放的数据目录
[root@master2 ~]# mkdir -p /data/k8s/{web,db}
2:yum安装nfs
[root@master2 ~]# yum -y install nfs-utils
3:设置共享目录
[root@master2 ~]# vim /etc/exportfs
/data/k8s 192.168.1.0/24(sync,rw,no_root_squash)
4:启动服务
[root@master2 ~]# systemctl start nfs
[root@master2 ~]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
四、安装Mysql服务【deploy上操作】
1:创建存放mysql服务的yaml文件目录
[root@master2 ~]# mkdir -p /home/k8s/lnmp/mysql
2:创建secret,将mysql数据库的密码存放到secret中
[root@master mysql]# kubectl create secret generic mysql-pass --from-literal=password=abc123
3:创建mysql-pv
1 [root@master mysql]# vim mysql-pv.yaml 2 apiVersion: v1 3 kind: PersistentVolume 4 metadata: 5 name: mysql-pv 6 spec: 7 capacity: 8 storage: 10Gi 9 accessModes: 10 - ReadWriteMany 11 nfs: 12 path: /data/k8s/db ##该参数指定你的NFS端的共享目录 13 server: 192.168.1.201 ##指定nfs端的IP 14 [root@master mysql]# kubectl create -f mysql-pv.yaml 15 persistentvolume/mysql-pv created
4:创建mysql-pvc
1 [root@master mysql]# vim mysql-pvc.yaml 2 apiVersion: v1 3 kind: PersistentVolumeClaim 4 metadata: 5 name: mysql-claim 6 labels: 7 app: discuz 8 spec: 9 accessModes: 10 - ReadWriteMany 11 resources: 12 requests: 13 storage: 10Gi 14 [root@master mysql]# kubectl create -f mysql-pvc.yaml 15 persistentvolumeclaim/mysql-claim created
5:查看pv,pvc信息
##下面可以看出状态Bound(绑定)正常,pv中的CLAIM列绑定的信息为pvc定义的name,pvc中VOLUME列的信息显示绑定了mysql-pv的name
1 [root@master mysql]# kubectl get pv,pvc 2 NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE 3 persistentvolume/mysql-pv 10Gi RWX Retain Bound default/mysql-claim 71s 4 5 NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE 6 persistentvolumeclaim/mysql-claim Bound mysql-pv 10Gi RWX 15s
6:创建mysql-deploy
1 [root@master mysql]# vim mysql-dp.yaml 2 apiVersion: apps/v1 3 kind: Deployment 4 metadata: 5 name: dz-mysql 6 labels: 7 app: discuz 8 spec: 9 selector: 10 matchLabels: 11 app: discuz 12 tier: mysql 13 strategy: 14 type: Recreate 15 template: 16 metadata: 17 labels: 18 app: discuz 19 tier: mysql 20 spec: 21 imagePullSecrets: 22 - name: my-secret 23 containers: 24 - image: harbor.ghs.com/lnmp/mysql:5.7 ##此处指定你的harbor需要拉取的镜像 25 name: mysql 26 env: 27 - name: MYSQL_ROOT_PASSWORD 28 valueFrom: 29 secretKeyRef: 30 name: mysql-pass ##此模块是调用secret中存放的mysql密码 31 key: password 32 ports: 33 - containerPort: 3306 34 name: dz-mysql 35 volumeMounts: 36 - name: mysql-persistent-storage 37 mountPath: /var/lib/mysql 38 volumes: 39 - name: mysql-persistent-storage 40 persistentVolumeClaim: ##此模块参数调用定义创建的pvc名称 41 claimName: mysql-claim 42 [root@master mysql]# kubectl create -f mysql-dp.yaml 43 deployment.apps/dz-mysql created
7:创建mysql-service
1 [root@master mysql]# vim mysql-svc.yaml 2 apiVersion: v1 3 kind: Service 4 metadata: 5 name: dz-mysql 6 labels: 7 app: discuz 8 spec: 9 ports: 10 - port: 3306 11 selector: 12 app: discuz 13 tier: mysql 14 [root@master mysql]# kubectl create -f mysql-svc.yaml 15 service/dz-mysql created
8:查看mysql服务的pod和svc信息
##下面信息可以看出,dz-mysql状态Running(运行)正常,分配的cluster-ip=10.68.235.35,该IP在集群中可以访问,外部无法访问该IP
1 [root@master mysql]# kubectl get pod,svc 2 NAME READY STATUS RESTARTS AGE 3 pod/dz-mysql-787586b8d6-9kl5b 1/1 Running 0 5m35s 4 pod/nginx-7c45b84548-4998z 1/1 Running 2 20d 5 6 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE 7 service/dz-mysql ClusterIP 10.68.235.35 <none> 3306/TCP 5m13s 8 service/kubernetes ClusterIP 10.68.0.1 <none> 443/TCP 20d 9 service/nginx ClusterIP 10.68.241.175 <none> 80/TCP 20d
五、安装Nginx服务【deploy上操作】
1:创建nginx-pv
1 [root@master nginx]# vim web-pv.yaml 2 apiVersion: v1 3 kind: PersistentVolume 4 metadata: 5 name: web-pv 6 spec: 7 capacity: 8 storage: 10Gi 9 accessModes: 10 - ReadWriteMany 11 nfs: 12 path: /data/k8s/web 13 server: 192.168.1.201 14 [root@master nginx]# kubectl create -f web-pv.yaml 15 persistentvolume/web-pv created
2:创建nginx-pvc
1 [root@master nginx]# vim web-pvc.yaml 2 apiVersion: v1 3 kind: PersistentVolumeClaim 4 metadata: 5 name: web-claim 6 labels: 7 app: discuz 8 spec: 9 accessModes: 10 - ReadWriteMany 11 resources: 12 requests: 13 storage: 10Gi 14 [root@master nginx]# kubectl create -f web-pvc.yaml 15 persistentvolumeclaim/web-claim created
3:查看nginx的pv,pvc信息
1 [root@master nginx]# kubectl get pv,pvc 2 NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE 3 persistentvolume/mysql-pv 10Gi RWX Retain Bound default/mysql-claim 34m 4 persistentvolume/web-pv 10Gi RWX Retain Bound default/web-claim 114s 5 6 NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE 7 persistentvolumeclaim/mysql-claim Bound mysql-pv 10Gi RWX 33m 8 persistentvolumeclaim/web-claim Bound web-pv 10Gi RWX 108s
4:创建nginx-deploy
1 [root@master nginx]# vim web-dp.yaml 2 apiVersion: apps/v1 3 kind: Deployment 4 metadata: 5 name: dz-web 6 labels: 7 app: discuz 8 spec: 9 replicas: 1 10 selector: 11 matchLabels: 12 app: discuz 13 tier: nginx-php 14 template: 15 metadata: 16 labels: 17 app: discuz 18 tier: nginx-php 19 spec: 20 imagePullSecrets: 21 - name: my-secret 22 containers: 23 - image: harbor.ghs.com/lnmp/nginx-php-fpm:latest 24 name: dz-web 25 ports: 26 - containerPort: 9000 27 - containerPort: 80 28 name: dz-web 29 volumeMounts: 30 - name: mysql-persistent-storage 31 mountPath: /var/www/html/ 32 volumes: 33 - name: mysql-persistent-storage 34 persistentVolumeClaim: 35 claimName: web-claim 36 [root@master nginx]# kubectl create -f web-dp.yaml 37 deployment.apps/dz-web created
5:创建nginx-service
##映射端口30001提供集群外部的机器访问web网站
1 [root@master nginx]# vim web-svc.yaml 2 apiVersion: v1 3 kind: Service 4 metadata: 5 name: dz-web 6 labels: 7 app: discuz 8 spec: 9 type: NodePort 10 ports: 11 - port: 80 12 nodePort: 30001 13 selector: 14 app: discuz 15 tier: nginx-php 16 [root@master nginx]# kubectl create -f web-svc.yaml 17 service/dz-web created
6:查看nginx的pod,svc信息
1 [root@master nginx]# kubectl get pod,svc 2 NAME READY STATUS RESTARTS AGE 3 pod/dz-mysql-787586b8d6-9kl5b 1/1 Running 1 38m 4 pod/dz-web-d4968cf8d-clppp 1/1 Running 0 3m37s 5 pod/nginx-7c45b84548-4998z 1/1 Running 2 20d 6 7 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE 8 service/dz-mysql ClusterIP 10.68.235.35 <none> 3306/TCP 38m 9 service/dz-web NodePort 10.68.53.228 <none> 80:30001/TCP 11m 10 service/kubernetes ClusterIP 10.68.0.1 <none> 443/TCP 20d 11 service/nginx ClusterIP 10.68.241.175 <none> 80/TCP 20d
六、安装Discuz【NFS上操作】
1:下载Discuz
1 [root@master2 ~]# cd /data/ 2 [root@master2 data]# git clone https://gitee.com/ComsenzDiscuz/DiscuzX.git 3 正克隆到 'DiscuzX'... 4 remote: Counting objects: 9085, done. 5 remote: Compressing objects: 100% (5400/5400), done. 6 remote: Total 9085 (delta 3895), reused 8535 (delta 3632) 7 接收对象中: 100% (9085/9085), 12.96 MiB | 166.00 KiB/s, done. 8 处理 delta 中: 100% (3895/3895), done.
2:将Discuz项目中upload目录下所有文件,放到web中
1 [root@master2 data]# mv DiscuzX/upload/* k8s/web/ 2 [root@master2 data]# cd k8s/web/ 3 [root@master2 web]# chmod 100 data uc_server/data uc_client/data config
3:进入mysql,创建dz库和授权用户
1 [root@master ~]# kubectl exec -it dz-mysql-787586b8d6-9kl5b -- mysql -u root -p 2 Welcome to the MySQL monitor. Commands end with ; or \g. 3 Your MySQL connection id is 4 4 Server version: 5.7.28 MySQL Community Server (GPL) 5 6 Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. 7 8 Oracle is a registered trademark of Oracle Corporation and/or its 9 affiliates. Other names may be trademarks of their respective 10 owners. 11 12 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 13 14 mysql> create database dz; 15 Query OK, 1 row affected (0.19 sec) 16 17 mysql> grant all on dz.* to 'dz'@'%' identified by 'abc123'; 18 Query OK, 0 rows affected, 1 warning (0.11 sec
4:浏览器访问web安装页面
实验成功
5:通过设置Nginx代理供外部访问
##目前nginx服务是运行在kubernetes集群里,node节点以及master节点上是可以通过cluster-ip访问到,但是外部的客户端就不能访问了。所以,可以在任意一台node或者master上建一个nginx反向代理即可访问到集群内的nginx。 kubectl get svc dz-web //查看cluster-ip,我的ip是10.68.235.35
nginx代理配置文件内容如下:
1 server { 2 listen 80; 3 server_name dz.yuankeedu.com; 4 5 location / { 6 proxy_pass http://10.68.235.35; 7 proxy_set_header Host $host; 8 proxy_set_header X-Real-IP $remote_addr; 9 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 10 } 11 }