因为之前已经搭建了kubernetes集群。操作在哪一台机器上做都是可以的,他们是一个集群,不分你我。虽然角色上是划分的,但是你执行命令都是没问题的
1 下载MySQL、PHP以及Nginx镜像 #拉取镜像是为了搞到我们内部的harbor上去
docker pull mysql:5.7 #我们拉下来5.7版本的mysql
docker pull richarvey/nginx-php-fpm #把nginx和php-fpm拉下来,并重建。上面的连接有步骤
然后再执行重建过程,含有nginx的配置文件(按照以上链接操作,先克隆项目)
2 将下载到的镜像push到harbor
docker tag mysql:5.7 harbor.yuankeedu.com/aminglinux/mysql:5.7
docker push harbor.yuankeedu.com/aminglinux/mysql:5.7
docker tag aming-nginx-php harbor.yuankeedu.com/aminglinux/nginx-php
docker push harbor.yuankeedu.com/aminglinux/nginx-php
3 搭建NFS服务 #把网站的目录(discuz应用的目录)通过NFS共享出来
yum install nfs-utils
vim /etc/exportfs
/data/k8s/ 172.7.5.0/24(sync,rw,no_root_squash)
systemctl start nfs
systemctl enable nfs
mkdir -p /data/k8s/discuz/{db,web} #这一步是因为k8s要供很多pod使用的,不要把全部的东西都放在k8s这个目录下,会很乱。
所以k8s目录下有个discuz目录,是放discuz相关的。而discuz目录下又有db目录是放mysql的,web目录是放nginx和php的
4 搭建MySQL服务
1)创建secret
kubectl create secret generic mysql-pass --from-literal=password=DzPasswd123 #定义mysql的root密码
2)创建pv #所有的yaml格式要复制对。根据上面的连接直接克隆下来就可以 ,他会存在相应的目录里
cd /data/k8s/discuz/db
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: 172.7.5.113
kubectl create -f mysql-pv.yaml
3)创建pvc
cd /data/k8s/discuz/db
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
kubectl get pvc #可以查看一下是否自动绑定pv
4)创建deployment
vim mysql-dp.yaml //内容如下
apiVersion: apps/v1
kind: Deployment
metadata:
name: dz-mysql
labels:
app: discuz
spec:
replicas: 2
selector:
matchLabels:
app: discuz
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: discuz
tier: mysql
spec:
imagePullSecrets:
- name: my-secret
containers:
- image: harbor.yuankeedu.com/aminglinux/mysql:5.7 #这个地址就是我们harbor里的那个images,要写对
name: dz-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 -uroot -pDzPasswd123 -h xxx #登录mysql是否成功,一次验证mysql搭建是否成功。(没有mysql的话要yum安装一个。
此处的密码是4.1步骤设置的密码。-h后的ip是service的唯一指定ip(kubectl get svc可查看到)
5 搭建nginx+php-fpm服务
1)创建pv #上面拉取nginx和php项目的时候,其实这些配置都存在,但是有些ip或目录要修改一下
cd /data/k8s/discuz/nginx_php #首先进入到nginx_php目录下来
vim web-pv.yaml //内容如下
apiVersion: v1
kind: PersistentVolume
metadata:
name: web-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
path: /data/k8s/discuz/nginx_php #注意路径
server: 192.168.208.128 #ip要改
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: harbor.yuankeedu.com/aminglinux/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
kubectil get pod #会看到此时正在拉镜像。显示running就没问题了。也可以用kubectl describepod dz-web-5ff4579b9d-gkqi7看一下
4)创建service
vim web-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: dz-web
labels:
app: discuz
spec:
ports:
- port: 80 #这个地方要写80.。实验中9000端口把暴露不出来,并且9000端口只监听127.0.0.0
selector:
app: discuz
tier: nginx-php
kubectl create -f web-svc.yaml
kubectl get svc #要查看一下dz-web的80端口是否暴露出来
curl 10.68.62.250 #kubectl get svc 出来的ip,curl一下,会显示403。当然可以去搞一个index.html
在
cd /data/k8s/web 首先登录到master2机器上,在这台机器上定义index.html。然后再curl(可能会需要一些时间才能curl出来)。如出现问题可在这面的路径里找相应的nginx或php-fpm的配置文件
.../k8s_discuz/dz_web_dockerfile #这个目录下有nginx和php-fpm的配置文件,就是在pull下来的目录里,前面的路径可能不太一样
测试解析php(做个php的界面出来):
cd /data/k8s/discuz/web #需在master2上执行
vi 1.php
<?php
phpinfo();
?>
curl 10.68.62.250/1.php #ip为kubectl get svc的ip。查看是否出现php的界面
- 安装Discuz
- 下载dz代码 (到NFS服务器上)
cd /tmp/ git clone https://gitee.com/ComsenzDiscuz/DiscuzX.git #把discuz代码克隆下来 cd /data/k8s/discuz/web/ mv /tmp/DiscuzX/upload/* . #将克隆下来的这个目录下所有的文件拷贝过来,也就是discuz chown -R 100 data uc_server/data/ uc_client/data/ config/ #做权限更改
#上面的100是用户。可先去查看一下php的配置文件,他写的用户和组都是nginx,那到了pod上,我们对应的nginx的用户和组到底是谁呢?kubectl exec dz-web-5ff4579b9d-gkqi7 id ningx可以看到他的uid就是100
- 设置MySQL普通用户
kubectl get svc dz-mysql //查看service的cluster-ip,我的是10.68.122.120 mysql -uroot -h10.68.122.120 -pDzPasswd1 //这里的密码是在一开始设置的mysql那个root密码 > create database dz; #创建discuz的数据库 > grant all on dz.* to 'dz'@'%' identified by 'dz-passwd-123';
- 设置Nginx代理
注意:目前nginx服务是运行在kubernetes集群里,node节点以及master节点上是可以通过cluster-ip访问到,但是外部的客户端就不能访问了。 所以,可以在任意一台node或者master上建一个nginx反向代理即可访问到集群内的nginx。 kubectl get svc dz-web //查看cluster-ip,我的ip是10.68.190.99
nginx代理配置文件内容如下: #在k8s集群外面(或者master上,不要用集群里的nginx,另外yum一个)yum一个nginx来做一个反向代理 server { listen 80; server_name dz.yuankeedu.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; } }
- 安装Discuz
安装discuz的时候,数据库服务器的名字不用填ip。填svc的名字:
做完Nginx代理,就可以通过node的IP来访问discuz了。
总结:
首先是镜像,就是拉取lnmp的镜像。然后再把nginx和php-fpm镜像重建一下,就是变成我们需要的,主要就是改配置文件。然后把所有镜像push到harbor上
搭建NFS,为了实现数据共享,包括数据库,就是持久化的。及时我们把pod和service删掉,这些数据还在(像dz的数据库、discuz的代码)
搭建mysql服务,创建pv、pvc、deployment、service这些核心的文件
搭建nginx+php-fpm,创建pv、pvc、deployment、service这些核心文件
安装discuz,包括数据库相关的创建,以及nginx代理(目的是对外映射端口)
所有评论(0)