由于以前已经搭建了kubernetes集群。操做在哪一台机器上作都是能够的,他们是一个集群,不分你我。虽然角色上是划分的,可是你执行命令都是没问题的php
1 下载MySQL、PHP以及Nginx镜像 #拉取镜像是为了搞到咱们内部的harbor上去html
docker pull mysql:5.7 #咱们拉下来5.7版本的mysqlnode
docker pull richarvey/nginx-php-fpm #把nginx和php-fpm拉下来,并重建。上面的链接有步骤mysql
而后再执行重建过程,含有nginx的配置文件(按照以上连接操做,先克隆项目)linux
2 将下载到的镜像push到harbornginx
docker tag mysql:5.7 harbor.yuankeedu.com/aminglinux/mysql:5.7git
docker push harbor.yuankeedu.com/aminglinux/mysql:5.7web
docker tag aming-nginx-php harbor.yuankeedu.com/aminglinux/nginx-phpsql
docker push harbor.yuankeedu.com/aminglinux/nginx-phpdocker
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的界面
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
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服务是运行在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的时候,数据库服务器的名字不用填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代理(目的是对外映射端口)