深入学习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 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 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.2373306/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.23480/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//查询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 80:30001/TCP 23m //已有30001端口