基于k8s实现wordpress博客系统部署并实现数据的持久化
1、准备k8s环境
#一主两从环境
[root@k8s-master01 ~]# kubectl get nodes -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-master01.dinginx.org Ready control-plane 29d v1.34.1 11.0.1.10 <none> Ubuntu 22.04.2 LTS 5.15.0-157-generic docker://28.4.0
k8s-node01.dinginx.org Ready <none> 29d v1.34.1 11.0.1.11 <none> Ubuntu 22.04.2 LTS 5.15.0-157-generic docker://28.4.0
k8s-node02.dinginx.org Ready <none> 29d v1.34.1 11.0.1.12 <none> Ubuntu 22.04.2 LTS 5.15.0-157-generic docker://28.4.0[root@k8s-master01 ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy ok
2、准备yaml文件
2.1 namespace的yaml
[root@k8s-node01 ~/web03]
[root@k8s-node01 ~/web03]
apiVersion: v1
kind: Namespace
metadata:name: web03
spec: {}
status: {}
[root@k8s-node01 ~]
2.2 pv的yaml文件
apiVersion: v1
kind: PersistentVolume
metadata:name: dinginx-pvnamespace: blog
spec:capacity:storage: 5GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: standardhostPath:path: "/mnt/data"
2.3 pvc的yaml文件
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: dinginx-pv-claimnamespace: blog
spec:accessModes:- ReadWriteOnceresources:requests:storage: 5GistorageClassName: standard
2.4 mysql的yaml文件
apiVersion: v1
kind: Pod
metadata:name: mysqlnamespace: bloglabels:app: mysql
spec:volumes:- name: dinginx-pv-storagepersistentVolumeClaim:claimName: dinginx-pv-claimcontainers:- name: mysqlimage: mysql:8.0imagePullPolicy: IfNotPresentenv:- name: MYSQL_ROOT_PASSWORDvalue: "123456"- name: MYSQL_USERvalue: "wpuser"- name: MYSQL_PASSWORDvalue: "wppass"- name: MYSQL_DATABASEvalue: "wordpress"volumeMounts:- mountPath: "/var/lib/mysql"name: dinginx-pv-storagerestartPolicy: Always
2.5 service的yaml文件
apiVersion: v1
kind: Service
metadata:name: mysqlnamespace: bloglabels:app: mysql
spec:ports:- name: mysqlport: 3306protocol: TCPtargetPort: 3306selector:app: mysqltype: ClusterIP
2.6 wordpress的yaml文件
apiVersion: v1
kind: Pod
metadata:name: wordpressnamespace: bloglabels:app: wordpress
spec:containers:- name: wordpressimage: wordpress:6imagePullPolicy: IfNotPresentenv:- name: WORDPRESS_DB_HOSTvalue: mysql- name: WORDPRESS_DB_NAMEvalue: wordpress- name: WORDPRESS_DB_USERvalue: wpuser- name: WORDPRESS_DB_PASSWORDvalue: wppassrestartPolicy: Always
2.7 wordpress的service的yaml
apiVersion: v1
kind: Service
metadata:name: wordpressnamespace: bloglabels:app: wordpress
spec:ports:- name: 80-80port: 80protocol: TCPtargetPort: 80type: NodePort
3 创建资源并验证
3.1 整合yaml文件
[root@k8s-node01 ~]
apiVersion: v1
kind: Namespace
metadata:name: blog
---
apiVersion: v1
kind: PersistentVolume
metadata:name: dinginx-pvnamespace: blog
spec:capacity:storage: 5GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: standardhostPath:path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: dinginx-pv-claimnamespace: blog
spec:accessModes:- ReadWriteOnceresources:requests:storage: 5GistorageClassName: standard
---
apiVersion: v1
kind: Pod
metadata:name: mysqlnamespace: bloglabels:app: mysql
spec:volumes:- name: dinginx-pv-storagepersistentVolumeClaim:claimName: dinginx-pv-claimcontainers:- name: mysqlimage: mysql:8.0imagePullPolicy: IfNotPresentenv:- name: MYSQL_ROOT_PASSWORDvalue: "123456"- name: MYSQL_USERvalue: "wpuser"- name: MYSQL_PASSWORDvalue: "wppass"- name: MYSQL_DATABASEvalue: "wordpress"volumeMounts:- mountPath: "/var/lib/mysql"name: dinginx-pv-storagerestartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:name: mysqlnamespace: bloglabels:app: mysql
spec:ports:- name: mysqlport: 3306protocol: TCPtargetPort: 3306selector:app: mysqltype: ClusterIP
---
apiVersion: v1
kind: Pod
metadata:name: wordpressnamespace: bloglabels:app: wordpress
spec:containers:- name: wordpressimage: wordpress:6imagePullPolicy: IfNotPresentenv:- name: WORDPRESS_DB_HOSTvalue: mysql- name: WORDPRESS_DB_NAMEvalue: wordpress- name: WORDPRESS_DB_USERvalue: wpuser- name: WORDPRESS_DB_PASSWORDvalue: wppassrestartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:name: wordpressnamespace: bloglabels:app: wordpress
spec:ports:- name: 80-80port: 80protocol: TCPtargetPort: 80type: NodePort
3.2 创建资源
[root@k8s-node01 ~]# kubectl apply -f wordpress-pvc.yaml
[root@k8s-node01 ~]# kubectl -n blog get pod,svc
NAME READY STATUS RESTARTS AGE
pod/mysql 1/1 Running 0 5h8m
pod/wordpress 1/1 Running 0 5h8mNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mysql ClusterIP 10.102.99.199 <none> 3306/TCP 5h8m
service/wordpress NodePort 10.106.78.131 <none> 80:31255/TCP 5h8m#进入容器验证
[root@k8s-node01 ~]# kubectl -n blog exec -it pods/wordpress -- /bin/bash
root@wordpress:/var/www/html# curl -Ik 127.0.0.1
HTTP/1.1 301 Moved Permanently
Date: Mon, 27 Oct 2025 00:44:32 GMT
Server: Apache/2.4.65 (Debian)
X-Powered-By: PHP/8.3.27
X-Redirect-By: WordPress
Location: http://127.0.0.1:31255/
Content-Type: text/html; charset=UTF-8#宿主机验证
[root@k8s-node01 ~]# curl 127.0.0.1:31255 -I
HTTP/1.1 200 OK
Date: Mon, 27 Oct 2025 00:46:10 GMT
Server: Apache/2.4.65 (Debian)
X-Powered-By: PHP/8.3.27
Link: <http://11.0.1.10:31255/wp-json/>; rel="https://api.w.org/"
Content-Type: text/html; charset=UTF-8
3.3 浏览器通过service暴露的端口访问
http://11.0.1.10:31255/
