深入学习Kubernetes(六):在kubernetes中搭建LNMP环境,并安装Discuz
##登录harbor,并push新的镜像 [root@marster1 dz_web_dockerfile]# docker login harbor.wangjianhua.xyz //输入正确的用户名和密码 [root@marster1 dz_web_dockerfile]# docker tag mysql:5.7 harbor.wangjianhua.xyz/wjh/mysql:5.7 [root@marster1 dz_web_dockerfile]# docker tag nginx-php harbor.wangjianhua.xyz/wjh/nginx-php //给镜像打标签 [root@marster1 dz_web_dockerfile]# docker push harbor.wangjianhua.xyz/wjh/nginx-php [root@marster1 dz_web_dockerfile]# docker push harbor.wangjianhua.xyz/wjh/mysql:5.7 //往 harbor推镜像
一、准备工作(把需要的镜像上传到harbor)
1.1下载镜像
[root@marster1 ~]# docker pull mysql:5.7 [root@marster1 ~]# docker pull richarvey/nginx-php-fpm
1.2.用dockerfile重建nginx-php-fpm镜像
[root@marster1 ~]# git clone https://git.coding.net/aminglinux/k8s_discuz.git [root@marster1 dz_web_dockerfile]# ls Dockerfile localtime nginx.conf php-fpm-www.conf [root@marster1 dz_web_dockerfile]# docker build -t nginx-php .
1.3.将镜像push到harbor
##登录harbor,并push新的镜像 [root@marster1 dz_web_dockerfile]# docker login harbor.wangjianhua.xyz //输入正确的用户名和密码 [root@marster1 dz_web_dockerfile]# docker tag nginx-php harbor.wangjianhua.xyz/wjh/nginx-php [root@marster1 dz_web_dockerfile]# docker tag mysql:5.7 harbor.wangjianhua.xyz/wjh/mysql:5.7 //给镜像打标签 [root@marster1 dz_web_dockerfile]# docker push harbor.wangjianhua.xyz/wjh/mysql:5.7 [root@marster1 dz_web_dockerfile]# docker push harbor.wangjianhua.xyz/wjh/nginx-php //往harbor,push镜像
1.4.harbor查看已上传的镜像
二、搭建nfs
[root@master2 ~]# yum install nfs-utils rpcbing [root@master2 ~]# vim /etc/exports /data/k8s/ 192.168.0.0/24(sync,rw,no_root_squash) [root@master2 ~]# mkdir -p /data/k8s/discuz/{db,web} [root@master2 ~]# chmod 777 -R /data [root@master2 ~]# systemctl start nfs [root@master2 ~]# systemctl enable nfs
三、搭建mysql服务
3.1创建secret (设定mysql的root密码)
[root@marster1 dz_web_dockerfile]# kubectl create secret generic mysql-pass --from-literal=password=111111 secret/mysql-pass created
3.2 创建PV
[root@marster1 k8s_discuz]# cd mysql [root@marster1 mysql]# ls mysql-dp.yaml mysql-pvc.yaml mysql-pv.yaml mysql-svc.yaml //mysql目录已有做好各种资源的yaml文件 [root@marster1 mysql]# vi mysql-pv.yaml apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteMany nfs: path: /data/k8s/discuz/db ##这里的IP,是NFS server的IP server: 192.168.0.113 [root@marster1 mysql]# kubectl create -f mysql-pv.yaml persistentvolume/mysql-pv created //创建mysql-pv [root@marster1 mysql]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE mysql-pv 10Gi RWX Retain Available 9s //查看创建的pv
3.2 创建PVC
[root@marster1 mysql]# vi mysql-pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-claim labels: app: discuz spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi [root@marster1 mysql]# kubectl create -f mysql-pvc.yaml persistentvolumeclaim/mysql-claim created [root@marster1 mysql]# kubectl get pvc mysql-claim NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mysql-claim Bound mysql-pv 10Gi RWX 31s [root@marster1 mysql]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE mysql-pv 10Gi RWX Retain Bound default/mysql-claim 3m //查看pv,已经和pvc绑定
3.3 创建deployment
[root@marster1 mysql]# vi 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: harbor.wangjianhua.xyz/wjh/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: /var/lib/mysql volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: mysql-claim [root@marster1 mysql]# kubectl create -f mysql-dp.yaml deployment.apps/dz-mysql created [root@marster1 mysql]# kubectl get pod NAME READY STATUS RESTARTS AGE dz-mysql-77c6c66578-2x9cf 1/1 Running 0 1m [root@marster1 mysql]# kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE dz-mysql 1 1 1 1 4m
3.4创建service
[root@marster1 mysql]# vi mysql-svc.yaml apiVersion: v1 kind: Service metadata: name: dz-mysql labels: app: discuz spec: ports: - port: 3306 selector: app: discuz tier: mysql [root@marster1 mysql]# kubectl create -f mysql-svc.yaml service/dz-mysql created [root@marster1 mysql]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE dz-mysql ClusterIP 10.68.5.237 <none> 3306/TCP 7s
3.5验证mysql
[root@marster1 mysql]# mysql -uroot -p111111 -h10.68.5.237 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.24 MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.04 sec) MySQL [(none)]> quit Bye
四、搭建Nginx+php-fpm服务
4.1搭建pv
[root@marster1 ~]# cd k8s_discuz/nginx_php/
[root@marster1 nginx_php]# ls
web-dp.yaml web-pvc.yaml web-pv.yaml web-svc.yaml
[root@marster1 nginx_php]# vi web-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: web-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
path: /data/k8s/discuz/web
server: 192.168.0.113
[root@marster1 nginx_php]# kubectl create -f web-pv.yaml
persistentvolume/web-pv created
[root@marster1 nginx_php]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
mysql-pv 10Gi RWX Retain Bound default/mysql-claim 10h
pv001 10Gi RWX Retain Bound default/myclaim 1d
web-pv 10Gi RWX Retain Available 8s
4.2创建PVC
[root@marster1 nginx_php]# vi web-pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: web-claim labels: app: discuz spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi [root@marster1 nginx_php]# kubectl create -f web-pvc.yaml persistentvolumeclaim/web-claim created [root@marster1 nginx_php]# kubectl get pvc web-claim NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE web-claim Bound web-pv 10Gi RWX 56s [root@marster1 nginx_php]# kubectl get pv web-pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE web-pv 10Gi RWX Retain Bound default/web-claim 2m
4.3创建deployment
[root@marster1 nginx_php]# vi web-dp.yaml apiVersion: apps/v1 kind: Deployment metadata: name: dz-web labels: app: discuz spec: replicas: 2 selector: matchLabels: app: discuz tier: nginx-php template: metadata: labels: app: discuz tier: nginx-php spec: imagePullSecrets: - name: my-secret containers: - image: harbor.wangjianhua.xyz/wjh/nginx-php name: dz-web ports: - containerPort: 9000 - containerPort: 80 [root@marster1 nginx_php]# kubectl get deployments. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE dz-mysql 1 1 1 1 10h dz-web 2 2 2 0 2m [root@marster1 nginx_php]# kubectl get pods NAME READY STATUS RESTARTS AGE dz-mysql-77c6c66578-2x9cf 1/1 Running 1 11h dz-web-648dcfbfc9-brwb7 1/1 Running 0 3m dz-web-648dcfbfc9-v7pfl 0/1 ContainerCreating 0 3m
4.4 创建service
[root@marster1 nginx_php]# vi web-svc.yaml apiVersion: v1 kind: Service metadata: name: dz-web labels: app: discuz spec: ports: - port: 80 selector: app: discuz tier: nginx-php [root@marster1 nginx_php]# kubectl create -f web-svc.yaml service/dz-web created [root@marster1 nginx_php]# kubectl get svc dz-web NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE dz-web ClusterIP 10.68.122.234 <none> 80/TCP 20s
五、安装discuz
5.1下载dz代码 (到NFS服务器上)
[root@master2 ~]# cd /tmp [root@master2 tmp]# git clone https://gitee.com/ComsenzDiscuz/DiscuzX.git [root@master2 tmp]# cd /data/k8s/discuz/web/ [root@master2 web]# mv /tmp/DiscuzX/upload/* . [root@master2 web]# chown -R 100 data uc_server/data/ uc_client/data/ config/ [root@master2 web]# ls admin.php archiver crossdomain.xml forum.php index.php member.php portal.php source uc_client api config data group.php install misc.php robots.txt static uc_server api.php connect.php favicon.ico home.php m plugin.php search.php template
5.2 设置MySQL普通用户
[root@master2 web]# kubectl get svc dz-mysql NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE dz-mysql ClusterIP 10.68.5.237 <none> 3306/TCP 11h //查看service的cluster-ip [root@marster1 nginx_php]# mysql -uroot -h10.68.5.237 -p111111 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.24 MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]> create database dz; Query OK, 1 row affected (0.04 sec) MySQL [(none)]> grant all on dz.* to 'dz'@'%' identified by '111111'; Query OK, 0 rows affected, 1 warning (0.01 sec) MySQL [(none)]> quit
5.3 设置nginx代理
注意:目前nginx服务是运行在kubernetes集群里,node节点以及master节点上是可以通过cluster-ip访问到,但是外部的客户端就不能访问了。所以,可以在任意一台node或者master上建一个nginx反向代理即可访问到集群内的nginx。 [root@marster1 nginx_php]# kubectl get svc dz-web NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE dz-web ClusterIP 10.68.122.234 <none> 80/TCP 16m //查看cluster-ip [root@marster1 ~]# yum install -y nginx //把marster1做为nginx反向代理 [root@marster1 ~]# vi /etc/nginx/nginx.conf
server {
listen 80;
server_name www.discuz.com;
location / {
proxy_pass http://10.68.133.120: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;
}
}
[root@marster1 ~]# systemctl start nginx
5.4 安装Discuz
##域名绑定 打开windows的host文件增加: 192.168.0.110 www.discuz.com 在浏览器输入www.discuz.com/install
5.5 也可以通过node的IP来访问discuz了
[root@master2 web]# kubectl get pod dz-web-648dcfbfc9-68wwf -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE dz-web-648dcfbfc9-68wwf 1/1 Running 1 11h 172.20.2.35 192.168.0.112 <none> //查询node的IP [root@marster1 nginx_php]# vi web-svc.yaml apiVersion: v1 kind: Service metadata: name: dz-web labels: app: discuz spec: type: NodePort //指定类型是NodePort ports: - port: 80 nodePort: 30001 //添加nodePort端口 selector: app: discuz tier: nginx-php [root@marster1 nginx_php]# kubectl create -f web-svc.yaml [root@marster1 nginx_php]# kubectl get svc dz-web NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE dz-web NodePort 10.68.133.120 <none> 80:30001/TCP 23m //已有30001端口