011.Kubernetes使用共享存儲持久化數據


本次實驗是以前面的實驗為基礎,使用的是模擬使用kubernetes集群部署一個企業版的wordpress為實例進行研究學習,主要的過程如下:

1.mysql deployment部署, wordpress deployment部署, wordpress連接mysql時,mysql的 pod ip易變

2.為mysql創建 service,申請固定 service lp

3. wordpress外部可訪問,使用 node port類型的 service

4. nodeport類型的 service需要映射端口,不是很優雅

5.使用 ingressl

6.mysq1的pod旦被重新調度,數據就會丟失

7. hostpath將pod數據掛載至本地,然后使用標簽選擇器將mysq1lpod固定在一個節點上

8.共享存儲以持久化數據,即使po掛掉,被重新拉起,也能自動掛載存儲

本次實驗解決使用共享存儲數據持久化的問題實驗使用NFS作為共享存儲

一 使用NFS共享存儲

1.1 安裝NFS

再server3和server1上安裝nfs

[root@docker-server1 ~]# yum -y install nfs-utils

[root@docker-server3 ~]# yum -y install nfs-utils

[root@docker-server3 ~]# vi /etc/exports

/data *(rw,no_root_squash)

[root@docker-server3 ~]# systemctl restart nfs

[root@docker-server3 ~]# systemctl status nfs

 

 

[root@docker-server3 ~]# showmount -e

Export list for docker-server3:
/data *

1.2 到server1上進行掛載測試

[root@docker-server1 ~]# mount -t nfs 192.168.132.133:/data /mnt

[root@docker-server1 ~]# df -hT

192.168.132.133:/data   nfs4       47G  7.3G   40G  16% /mnt

[root@docker-server1 ~]# umount /mnt/

nfs配置成功

1.3 數據庫使用共享存儲掛載卷

[root@docker-server3 ~]# mkdir /data/mysql

[root@docker-server1 deployment]# vi mysql-deployment.yaml

apiVersion:  apps/v1
kind: Deployment
metadata:
  name: mysql
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      volumes:
        - name: mydata
          nfs:
            server: 192.168.132.133
            path: /data/mysql
      containers:
        - name: mysql
          image: mysql:5.7
          volumeMounts:
            - name: mydata
              mountPath: /var/lib/mysql
          ports:
            - containerPort: 3306
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: RedHat123
            - name: MYSQL_DATABASE
              value: wordpress

[root@docker-server1 deployment]# kubectl get pods -o wide

mysql-857589b5d4-j65d2              1/1     Running   0          20s     10.244.2.20   192.168.132.133   <none> 

[root@docker-server3 ~]# ll /data/mysql

-rw-r----- 1 polkitd ssh_keys       56 Jan 17 22:29 auto.cnf
-rw------- 1 polkitd ssh_keys     1676 Jan 17 22:29 ca-key.pem
-rw-r--r-- 1 polkitd ssh_keys     1112 Jan 17 22:29 ca.pem
-rw-r--r-- 1 polkitd ssh_keys     1112 Jan 17 22:29 client-cert.pem
-rw------- 1 polkitd ssh_keys     1680 Jan 17 22:29 client-key.pem
-rw-r----- 1 polkitd ssh_keys     1346 Jan 17 22:29 ib_buffer_pool
-rw-r----- 1 polkitd ssh_keys 79691776 Jan 17 22:29 ibdata1
-rw-r----- 1 polkitd ssh_keys 50331648 Jan 17 22:29 ib_logfile0
-rw-r----- 1 polkitd ssh_keys 50331648 Jan 17 22:29 ib_logfile1
-rw-r----- 1 polkitd ssh_keys 12582912 Jan 17 22:30 ibtmp1
drwxr-x--- 2 polkitd ssh_keys     4096 Jan 17 22:29 mysql
drwxr-x--- 2 polkitd ssh_keys     8192 Jan 17 22:29 performance_schema
-rw------- 1 polkitd ssh_keys     1680 Jan 17 22:29 private_key.pem
-rw-r--r-- 1 polkitd ssh_keys      452 Jan 17 22:29 public_key.pem
-rw-r--r-- 1 polkitd ssh_keys     1112 Jan 17 22:29 server-cert.pem
-rw------- 1 polkitd ssh_keys     1680 Jan 17 22:29 server-key.pem
drwxr-x--- 2 polkitd ssh_keys     8192 Jan 17 22:29 sys
drwxr-x--- 2 polkitd ssh_keys       20 Jan 17 22:29 wordpress

這樣,房mysql的pod是被刪除的時候,數據不會丟失

這種方式,可以滿足效果,但是當直接對接不同的存儲,需要使用不同的對接格式,對於K8S而言,不方便,所以使用PV的格式掛載,即不管使用哪一種存儲方式,最終創建一個PV出來,然后K8S直接掛載PV,不用關心底層是哪一種存儲

二 持久化卷(PV)

2.1 PV及PVC介紹

PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 提供了方便的持久化卷:PV 提供網絡存儲資源,而 PVC 請求存儲資源。這樣,設置持久化的工作流包括配置底層文件系統或者雲數據卷、創建持久性數據卷、最后創建 PVC 來將 Pod 跟數據卷關聯起來。PV 和 PVC 可以將 pod 和數據卷解耦,pod 不需要知道確切的文件系統或者支持它的持久化引擎。

PersistentVolume(PV)是集群之中的一塊網絡存儲。跟 Node 一樣,也是集群的資源。PV 跟 Volume (卷) 類似,不過會有獨立於 Pod 的生命周期

1.為了屏蔽 kubernetes對底層存儲的差異,有了個申明稱之為pv

2. pod在創建時,只需要聲明需要一個pV即可,這

3. 創建pv:

  1. 大小10G
  2. 獨享還是共享
  3. 從哪種存儲申請

4. 創建pvc:

  1. 大小20G
  2. 獨享還是共享

2.2 創建一個PV

基於NFS創建PV

[root@docker-server1 yamls]# mkdir /yamls/storage

[root@docker-server1 yamls]# cd /yamls/storage

[root@docker-server1 storage]# vim pv1.yaml

apiVersion: v1
kind: PersistentVolume
metadata: 
  name: pv1
spec:
  capacity:
    storage: 1G
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.132.133
    path: "/data"

[root@docker-server1 storage]# kubectl apply -f pv1.yaml   

[root@docker-server1 storage]# kubectl get pv

NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv1    1G         RWX            Retain           Available                                   23s

RECLAIM POLICY回收策略

PV的回收策略(persistentVolumeReclaimPolicy,即PVC釋放卷的時候PV該如何操作)也有三種

  • Retain,不清理, 保留Volume(需要手動清理)
  • Recycle,刪除數據,即rm -rf /thevolume/*(只有NFS和HostPath支持)
  • Delete,刪除存儲資源,比如刪除AWS EBS卷(只有AWS EBS, GCE PD, Azure Disk和Cinder支持)

2.3 創建一個PVC

[root@docker-server1 storage]# vim pvc1.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc1
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

[root@docker-server1 storage]# kubectl apply -f pvc1.yaml

persistentvolumeclaim/pvc1 created

[root@docker-server1 storage]# kubectl get pvc -n kube-system

No resources found in kube-system namespace.    #pvc只有在創建的命名空間看到

[root@docker-server1 storage]# kubectl get pv -n kube-system

NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv1    1G         RWX            Retain           Available                                   8m56s

[root@docker-server1 storage]# kubectl get pvc 

NAME   STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc1   Pending                                                     2m8s

[root@docker-server1 storage]# kubectl describe pvc pvc1

Name:          pvc1
Namespace:     default
StorageClass:  
Status:        Pending
Volume:        
Labels:        <none>
Annotations:   kubectl.kubernetes.io/last-applied-configuration:
                 {"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"pvc1","namespace":"default"},"spec":{"accessModes":...
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      
Access Modes:  
VolumeMode:    Filesystem
Mounted By:    <none>
Events:
  Type    Reason         Age                  From                         Message
  ----    ------         ----                 ----                         -------
  Normal  FailedBinding  7s (x15 over 3m22s)  persistentvolume-controller  no persistent volumes available for this claim and no storage class is set   #沒有完全滿足的pv可以綁定

這是因為pv是1G,PVC申請的是1Gi,修改如下

[root@docker-server1 storage]# vi pvc1.yaml 

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc1
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1G

pvc資源只能刪除重建

[root@docker-server1 storage]# kubectl delete pvc pvc1

persistentvolumeclaim "pvc1" deleted

[root@docker-server1 storage]# kubectl apply -f pvc1.yaml

persistentvolumeclaim/pvc1 created

[root@docker-server1 storage]# kubectl get pvc

NAME   STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc1   Bound    pv1      1G         RWX                           5s

已經綁定

[root@docker-server1 storage]# kubectl get pv

NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM          STORAGECLASS   REASON   AGE
pv1    1G         RWX            Retain           Bound    default/pvc1                           16m

2.4 mysql使用pvc綁定

[root@docker-server3 ~]# mkdir /data/mysql11

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-rwo.yaml
spec:
  capacity:
    storage: 10G
  accessModes:
    - ReadWriteOnce
  nfs:
    server: 192.168.132.133
    path: "/data/mysql11"

[root@docker-server1 storage]# kubectl apply -f pv-rwo.yaml

[root@docker-server1 storage]# vi pvc-rwo.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc-rwo
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10G

[root@docker-server1 storage]# kubectl get pvc

NAME      STATUS   VOLUME        CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-rwo   Bound    pv-rwo.yaml   10G        RWO                           6s
pvc1      Bound    pv1           1G         RWX                           10m

[root@docker-server1 storage]# kubectl get pv

NAME          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
pv-rwo.yaml   10G        RWO            Retain           Bound    default/pvc-rwo                           101s
pv1           1G         RWX            Retain           Bound    default/pvc1                              24m

掛載到數據庫

[root@docker-server1 storage]# vim /yamls/deployment/mysql-deployment.yaml

apiVersion:  apps/v1
kind: Deployment
metadata:
  name: mysql
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
     # volumes:
     #   - name: mydata
     #     nfs:
     #       server: 192.168.132.133
     #       path: /data/mysql
      volumes:
        - name: mydata
          persistentVolumeClaim:
            claimName: pvc-rwo
      containers:
        - name: mysql
          image: mysql:5.7
          volumeMounts:
            - name: mydata
              mountPath: /var/lib/mysql
          ports:
            - containerPort: 3306
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: RedHat123
            - name: MYSQL_DATABASE
              value: wordpress

[root@docker-server1 storage]# kubectl apply -f /yamls/deployment/mysql-deployment.yaml

[root@docker-server3 ~]# ll /data/mysql11

total 188484
-rw-r----- 1 polkitd ssh_keys       56 Jan 18 00:46 auto.cnf
-rw------- 1 polkitd ssh_keys     1676 Jan 18 00:46 ca-key.pem
-rw-r--r-- 1 polkitd ssh_keys     1112 Jan 18 00:46 ca.pem
-rw-r--r-- 1 polkitd ssh_keys     1112 Jan 18 00:46 client-cert.pem
-rw------- 1 polkitd ssh_keys     1680 Jan 18 00:46 client-key.pem
-rw-r----- 1 polkitd ssh_keys     1346 Jan 18 00:46 ib_buffer_pool
-rw-r----- 1 polkitd ssh_keys 79691776 Jan 18 00:46 ibdata1
-rw-r----- 1 polkitd ssh_keys 50331648 Jan 18 00:46 ib_logfile0
-rw-r----- 1 polkitd ssh_keys 50331648 Jan 18 00:46 ib_logfile1
-rw-r----- 1 polkitd ssh_keys 12582912 Jan 18 00:46 ibtmp1
drwxr-x--- 2 polkitd ssh_keys     4096 Jan 18 00:46 mysql
drwxr-x--- 2 polkitd ssh_keys     8192 Jan 18 00:46 performance_schema
-rw------- 1 polkitd ssh_keys     1680 Jan 18 00:46 private_key.pem
-rw-r--r-- 1 polkitd ssh_keys      452 Jan 18 00:46 public_key.pem
-rw-r--r-- 1 polkitd ssh_keys     1112 Jan 18 00:46 server-cert.pem
-rw------- 1 polkitd ssh_keys     1680 Jan 18 00:46 server-key.pem
drwxr-x--- 2 polkitd ssh_keys     8192 Jan 18 00:46 sys
drwxr-x--- 2 polkitd ssh_keys       20 Jan 18 00:46 wordpress

已經重建數據,則PV和PVC簡單學習到這里


 

博主聲明:本文的內容來源主要來自譽天教育晏威老師,由本人實驗完成操作驗證,需要的博友請聯系譽天教育(http://www.yutianedu.com/),獲得官方同意或者晏老師(https://www.cnblogs.com/breezey/)本人同意即可轉載,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM