由於以前已經搭建了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代理(目的是對外映射端口)