k8s經典實戰—搭建WordPress
說明:需要在k8s上部署lnmp環境,建議跟着步驟來端口最好不要改,希望你也能搭建成功,完成這個搭建后你對Kubernetes的技術基本上是入門了。首先看下效果圖:
一、部署存儲用戶持久化存儲
1. 准備一塊100G磁盤做為LVM邏輯卷(參考:https://www.cnblogs.com/Dev0ps/p/9381244.html)
fdisk -l fdisk /dev/vdb mkdir /u01 pvcreate /dev/vdb1 vgcreate vg0 /dev/vdb1 lvcreate -L 99G -n oralv vg0 mkfs.ext4 /dev/vg0/oralv mount /dev/vg0/oralv /u01/ echo "/dev/vg0/oralv /u01 ext4 defaults 0 0" >>/etc/fstab
用df -h 命令查看:

2、搭建NFS共享存儲
2.1 nfs服務端
yum install nfs-utils -y mkdir -pv /u01/nps/volumes vim /etc/exports /u01/nps/volumes 172.31.182.0/24(rw,no_root_squash) systemctl start nfs
查看服務是否開啟

2.2 創建nps掛載目錄
mkdir -pv /u01/nps/volumes/data{mysql,nginx}
2.3 nfs客戶端(k8s的node節點都需要安裝)
yum install nfs-utils -y
#驗證是否可以訪問nfs服務端
[root@node01 ~]# showmount -e 172.31.182.145 Export list for 172.31.182.145: /u01/nps/volumes 172.31.182.0/24 [root@node01 ~]# mount -t nfs 172.31.182.145:/u01/nps/volumes /mnt echo "172.31.182.145:/u01/nps/volumes /mnt nfs defaults 0 0" >>/etc/fstab
二、創建pv
[root@master Dockerfile-lnmp]# cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteMany
nfs:
path: /u01/nps/volumes/data/mysql
server: 172.31.182.145
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: wp-pv01
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
nfs:
path: /u01/nps/volumes/data/nginx
server: 172.31.182.145
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: wp-pv02
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
nfs:
path: /u01/nps/volumes/data/nginx
server: 172.31.182.145
創建pv:
kubectl apply -f pv.yaml
三、部署mysql
3.1 創建mysql-deployment
[root@master Dockerfile-lnmp]# cat mysql-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
ports:
- port: 3306
selector:
app: wordpress
tier: mysql
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: mysql
spec:
containers:
- name: mysql
spec:
containers:
- name: mysql
image: mysql:5.6
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- mountPath: "/var/lib/mysql"
name: mysql-data
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: mysql-pv-claim
創建mysql容器:
kubectl apply -f mysql-deployment.yaml
3.2 通過secret創建mysql密碼
kubectl create secret generic mysql-pass --from-literal=password=123456
四、上傳鏡像到Harbor
4.1 構建nginx鏡像並上傳
[root@master nginx]# docker build -t 172.31.182.143/dev/nginx:latest . [root@master nginx]# docker push 172.31.182.143/dev/nginx:latest
4.2 構建php鏡像並上傳
[root@master php]# docker build -t 172.31.182.143/dev/php:latest . [root@master php]# docker push 172.31.182.143/dev/php:latest
4.3 kubernetes配置Harbor倉庫
kubectl create secret docker-registry regcred --docker-server=172.31.182.143 --docker-username=admin --docker-password=Harbor%12345 --docker-email=admin@qq.com
注意!!上述由於沒有指定namespace默認會在default命名空間下創建secret,如果是別的ns需在后面指定如:-n test 否則test命名空間下的pod仍然無法拉取私有倉庫鏡像。
五、部署php環境
5.1 創建php-deployment
[root@master Dockerfile-lnmp]# cat php-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress-php
labels:
app: wordpress
spec:
ports:
- port: 9000
selector:
app: wordpress-php
tier: frontend
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pvc01
labels:
app: wordpress
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: wordpress-php
labels:
app: wordpress
spec:
replicas: 3
selector:
matchLabels:
app: wordpress-php
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress-php
tier: frontend
spec:
imagePullSecrets:
- name: regcred
containers:
- name: php
image: 172.31.182.143/dev/php:latest
ports:
- containerPort: 9000
name: wordpress
volumeMounts:
- name: php-data
mountPath: "/usr/local/nginx/html"
volumes:
- name: php-data
persistentVolumeClaim:
claimName: wp-pvc01
注意:在yaml文件中需加入secret用於訪問鏡像倉庫。
imagePullSecrets:
- name: regcred
創建php容器:
kubectl apply -f php-deployment.yaml
六、部署nginx環境
6.1 創建nginx-deployment
[root@master Dockerfile-lnmp]# cat nginx-deployment.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-wp-config
data:
site.conf: |-
server {
listen 80;
server_name localhost;
root html;
index index.php index.html;
location ~ \.php$ {
root html;
fastcgi_pass wordpress-php:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
---
apiVersion: v1
kind: Service
metadata:
name: wordpress-nginx
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress-nginx
tier: frontend
type: NodePort
sessionAffinity: ClientIP
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pvc02
labels:
app: wordpress
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: wordpress-nginx
labels:
app: wordpress
spec:
replicas: 3
selector:
matchLabels:
app: wordpress-nginx
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress-nginx
tier: frontend
spec:
imagePullSecrets:
- name: regcred
containers:
- name: nginx
image: 172.31.182.143/dev/nginx:latest
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- mountPath: "/usr/local/nginx/html"
name: nginx-data
- mountPath: "/usr/local/nginx/conf/vhost/site.conf"
name: config
subPath: site.conf
volumes:
- name: nginx-data
persistentVolumeClaim:
claimName: wp-pvc02
- name: config
configMap:
name: nginx-wp-config
創建nginx容器:
kubectl apply -f nginx-deployment.yaml
七、查看pod,svc,pv,pvc,secret的狀態
7.1 kubectl get pod

7.2 kubectl get svc

我這里wordpress-nginx的NodePort隨機生成是47074,訪問時改為你們自己生成的即可!!
7.3 kubectl get pv,pvc
7.4 kubectl get secret

八、創建wordpress數據庫
[root@master nginx]# kubectl exec -it wordpress-mysql-68cb6cc5b4-xxfhh bash
root@wordpress-mysql-68cb6cc5b4-xxfhh:/# mysql -uroot -p123456 Warning: Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 105 Server version: 5.6.43 MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> create database wordpress;
九、設置WordPress
9.1 解壓WordPress安裝包到nginx的掛載目錄下:

訪問地址為:http://nodeIP:nodePort//wordpress/index.php
9.2 配置相關信息,這里注意數據庫主機就是mysql的service:wordpress-mysql

9.3 提交后設置賬號密碼,一個熟悉的wordpress就出現在我們面前,嘖嘖嘖。。。

搭建博客用到的yaml文件及安裝包可在以下地址獲取:https://github.com/hejianlai/Docker-Kubernetes/tree/master/Kubernetes/Project/k8s_wordporss
