在實驗2.2 – Deployment中,咱們將原來基於Pod部署的wordpress+mysql成功改形成基於Deployment部署,基於Deployment部署有不少好處,例如:支持滾動升級(Rolling Update),支持水平擴展。java
不過有個問題,就是當咱們的Deployment修改了,或者Pod刪除重建了,數據也隨之丟失了,這是咱們不但願看到的,本篇文章咱們就來嘗試一下基於PV & PVC保存數據狀態的有狀態應用。mysql
對於單實例的有狀態應用,咱們能夠定義Deployment而且replicas只能爲1,用指定PVC的方式關聯到一個PV上,使用PV提供的狀態存儲功能。若是要啓動多實例,那麼Deployment就沒法勝任這個任務,必須使用到咱們後面會講到的StatefulSet+PVC Template的方式建立多實例對多PVC的模型。git
本文實驗全部的源碼保存在: github.com/zrbcool/blo…github
➜ lab06 git:(master) ✗ cat 03-wordpress-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wordpress-pv-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
複製代碼
部署後查看狀態sql
➜ lab06 git:(master) ✗ kubectl apply -f 03-wordpress-pvc.yaml
persistentvolumeclaim/wordpress-pv-claim created
➜ lab06 git:(master) ✗ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
wordpress-mysql-pv-claim Pending 4s
複製代碼
發現PVC處於Pending狀態,追查下緣由api
➜ lab06 git:(master) ✗ kubectl describe pvc/wordpress-mysql-pv-claim
Name: wordpress-mysql-pv-claim
Namespace: default
StorageClass:
Status: Pending
Volume:
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"wordpress-mysql-pv-claim","namespace":"default"},"s...
Finalizers: [kubernetes.io/pvc-protection]
Capacity:
Access Modes:
VolumeMode: Filesystem
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal FailedBinding 6s (x4 over 36s) persistentvolume-controller no persistent volumes available for this claim and no storage class is set
Mounted By: <none>
複製代碼
接下來咱們建立PVapp
查看定義wordpress
➜ lab06 git:(master) ✗ cat 04-wordpress-pv.yaml
kind: PersistentVolume
apiVersion: v1
metadata:
name: wordpress-mysql-pv-volume
labels:
type: local
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/data/pv/wordpress/mysql"
複製代碼
該pv定義是基於hostPath的方式,因此咱們要在節點上提早建立好目錄,以下:測試
➜ lab06 git:(master) ✗ mkdir -p /data/pv/wordpress/mysql
➜ lab06 git:(master) ✗ kubectl create -f 04-wordpress-pv.yaml
persistentvolume/wordpress-mysql-pv-volume created
➜ lab06 git:(master) ✗ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
wordpress-mysql-pv-volume 2Gi RWO Retain Bound default/wordpress-mysql-pv-claim 31s
➜ lab06 git:(master) ✗ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
wordpress-mysql-pv-claim Bound wordpress-mysql-pv-volume 2Gi RWO 118s
複製代碼
此時咱們以前定義的pvc也已經成功綁定了this
查看定義
➜ lab06 git:(master) ✗ cat 01-wordpress-mysql-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: wordpress
name: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- image: wordpress:latest
imagePullPolicy: IfNotPresent
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: "127.0.0.1"
- name: WORDPRESS_DB_USER
value: "root"
- name: WORDPRESS_DB_PASSWORD
value: "passw0rd"
- image: mysql:5.7.26
imagePullPolicy: IfNotPresent
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "passw0rd"
- name: MYSQL_DATABASE
value: "wordpress"
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: wordpress-mysql-pv-claim
複製代碼
執行更新並查看效果
➜ lab06 git:(master) ✗ kubectl apply -f 01-wordpress-mysql-deployment.yaml
deployment.extensions/wordpress configured
➜ lab06 git:(master) ✗ kubectl get pod
NAME READY STATUS RESTARTS AGE
wordpress-6cfd879fcd-9mlhb 2/2 Running 0 29s
➜ lab06 git:(master) ✗ ls -l /data/pv/wordpress/mysql/
total 188480
-rw-r----- 1 999 999 56 Jun 10 23:42 auto.cnf
-rw------- 1 999 999 1675 Jun 10 23:42 ca-key.pem
-rw-r--r-- 1 999 999 1107 Jun 10 23:42 ca.pem
...
drwxr-x--- 2 999 999 12288 Jun 10 23:42 sys
drwxr-x--- 2 999 999 4096 Jun 10 23:42 wordpress
複製代碼
可見,Pod已經在/data/pv/wordpress/mysql/下產生數據了,接下來咱們來試一下配置數據後,刪除Pod,使Deployment控制Pod重建,配置數據是否可以保存 經過下面命令刪除Pod使其重建
➜ lab06 git:(master) ✗ kubectl get pod
NAME READY STATUS RESTARTS AGE
wordpress-6cfd879fcd-9mlhb 2/2 Running 0 7m34s
➜ lab06 git:(master) ✗ kubectl delete pod/wordpress-6cfd879fcd-9mlhb
pod "wordpress-6cfd879fcd-9mlhb" deleted
➜ lab06 git:(master) ✗ kubectl get pod
NAME READY STATUS RESTARTS AGE
wordpress-6cfd879fcd-29qg9 2/2 Running 1 11s
複製代碼
刷新網頁,發佈的測試文件還在,測試成功
查看官網說明:
➜ lab06 git:(master) ✗ cat 01-wordpress-mysql-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: wordpress
name: wordpress
spec:
strategy:
type: Recreate
replicas: 1
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- image: wordpress:latest
imagePullPolicy: IfNotPresent
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: "127.0.0.1"
- name: WORDPRESS_DB_USER
value: "root"
- name: WORDPRESS_DB_PASSWORD
value: "passw0rd"
- image: mysql:5.7.26
imagePullPolicy: IfNotPresent
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "passw0rd"
- name: MYSQL_DATABASE
value: "wordpress"
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: wordpress-mysql-pv-claim
複製代碼
清除數據
➜ lab06 git:(master) ✗ kubectl delete -f .
deployment.extensions "wordpress" deleted
service "wordpress-svc" deleted
persistentvolumeclaim "wordpress-mysql-pv-claim" deleted
persistentvolume "wordpress-mysql-pv-volume" deleted
複製代碼