环境介绍
依然使用之前部署的 k8s 集群和 harbor 服务
下载 MySQL、PHP 以及 Nginx 镜像
这一步在 ansible 控制端(master1)上做操作
事实上集群上任意一台机器均可
docker pull mysql:5.7
docker pull richarvey/nginx-php-fpm
使用 Dockerfile 重构 nginx-php-fpm
https://git.coding.net/aminglinux/k8s_discuz.git
这个项目包含了下面实验需要用到的 Dockerfile 和 nginx/php 的配置文件 和 yaml 配置文件
cd /etc/ansible/ && git clone https://git.coding.net/aminglinux/k8s_discuz.git
cd k8s_discuz/dz_web_dockerfile/ && docker build -t nginx-php .
将下载到的镜像 push 到 harbor
先要登陆之前部署的 harbor 才能 push
docker login 10.18.30.33
docker tag mysql:5.7 10.18.30.33/library/mysql:5.7
docker push 10.18.30.33/library/mysql:5.7
docker tag nginx-php 10.18.30.33/library/nginx-php
docker push 10.18.30.33/library/nginx-php
搭建 NFS 服务
部署 nfs 服务器,我这里就用之前部署的了
之前部署到了 harbor 上
yum -y install nfs-utils rpcbind
vim /etc/exports
/data/k8s/ 10.18.30.0/24(sync,rw,no_root_squash)
mkdir /data/k8s/ && chmod 755 /data/k8s/
systemctl start nfs
systemctl enable nfs
mkdir -p /data/k8s/discuz/{db,web}
搭建 MySQL 服务
1)创建 secret
cd /etc/ansible/
kubectl create secret generic mysql-pass --from-literal=password=DzPasswd1
2)创建 pv
vim mysql-pv.yaml //内容如下
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
path: /data/k8s/discuz/db
server: 10.18.30.33
kubectl create -f mysql-pv.yaml
3)创建 pvc
vim mysql-pvc.yaml //内容如下
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-claim
labels:
app: discuz
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
kubectl create -f mysql-pvc.yaml
4)创建 deployment
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: 10.18.30.33/library/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
kubectl create -f mysql-dp.yaml
5)创建 service
vim mysql-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: dz-mysql
labels:
app: discuz
spec:
ports:
- port: 3306
selector:
app: discuz
tier: mysql
kubectl create -f mysql-svc.yaml
验证一下 mysql 是否能用
yum -y install mariadb
mysql -h10.68.51.27 -uroot -pDzPasswd1
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.29 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)]> quit
Bye
搭建 nginx+php-fpm 服务
1)创建 pv
vim web-pv.yaml //内容如下
apiVersion: v1
kind: PersistentVolume
metadata:
name: web-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
path: /data/k8s/discuz/web
server: 10.18.30.33
kubectl create -f web-pv.yaml
2)创建 pvc
vim web-pvc.yaml //内容如下
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: web-claim
labels:
app: discuz
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
kubectl create -f web-pvc.yaml
3)创建 deployment
vim 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: my-secret
containers:
- image: 10.18.30.33/library/nginx-php
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
kubectl create -f web-dp.yaml
4)创建 service
vim web-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: dz-web
labels:
app: discuz
spec:
ports:
- port: 80
selector:
app: discuz
tier: nginx-php
kubectl create -f web-svc.yaml
验证 nginx+php 环境是否成功
1)在 harbor 上的共享目录做修改
cd /data/k8s/discuz/web/ && vim 1.php
<?php
phpinfo();
?>
2)在 master1 上测试
curl 10.68.244.146/1.php
部署 Discuz
1)查看 nginx 用户的 id(master1 上)
kubectl exec dz-web-5f4c5c46d5-tcfzz id nginx
uid=100(nginx) gid=101(nginx) groups=101(nginx),101(nginx)
2)下载 dz 代码 (NFS 上)
cd /tmp/
yum -y install git
git clone https://gitee.com/ComsenzDiscuz/DiscuzX.git
cd /data/k8s/discuz/web/
mv /tmp/DiscuzX/upload/* .
chown -R 100 data uc_server/data/ uc_client/data/ config/
3)设置 MySQL 普通用户(master1 上)
kubectl get svc dz-mysql //查看 service 的 cluster-ip,我的是 10.68.51.27
mysql -uroot -h10.68.51.27 -pDzPasswd1 //这里的密码是在上面步骤中设置的那个密码
> create database dz;
> grant all on dz.* to 'dz'@'%' identified by 'dz-passwd-123';
4)外部机器访问 Discuz
利用 nginx 反向代理
设置 Nginx 代理(master1 上)
注意:目前 nginx 服务是运行在 kubernetes 集群里,node 节点以及 master 节点上是可以通过 cluster-ip 访问到,但是外部的客户端就不能访问了。
所以,可以在任意一台 node 或者 master 上建一个 nginx 反向代理即可访问到集群内的 nginx。
yum -y install nginx
kubectl get svc dz-web //查看 cluster-ip,我的 ip 是10.68.190.99
vim /etc/nginx/nginx.conf
nginx 代理配置文件内容如下:
server {
listen 80;
server_name 10.18.30.28;
# 这里在实际环境中可以改为域名
location / {
proxy_pass http://10.68.244.146: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;
}
}
systemctl start nginx
5)访问 Discuz
访问 discuz
完成~~!