K8S本身動手系列 - 2.3 - PV & PVC

前言

在實驗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

實戰

PVC定義

  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

PV定義

查看定義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

使Deployment使用該PVC

查看定義

  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
複製代碼

刷新網頁,發佈的測試文件還在,測試成功

新問題

查看官網說明:

意思是說,對於這個單實例的有狀態Deployment不要對其進行擴容,同時當Deployment定義發生更新時也不能使用滾動更新,而應該先刪除再建立,也就是strategy: type: Recreate 修改後的文件以下:

➜  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
複製代碼
相關文章
相關標籤/搜索