真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Kubernetes存儲(chǔ)卷管理PV&PVC(十)

為了持久化保存容器的數(shù)據(jù),可以使用 Kubernetes Volume。

創(chuàng)新互聯(lián)建站專注于企業(yè)營銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、金鳳網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、html5、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為金鳳等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

Volume 的生命周期獨(dú)立于容器,Pod 中的容器可能被銷毀和重建,但 Volume 會(huì)被保留。

本質(zhì)上,Kubernetes Volume 是一個(gè)目錄,這一點(diǎn)與 Docker Volume 類似。當(dāng) Volume 被 mount 到 Pod,Pod 中的所有容器都可以訪問這個(gè) Volume。Kubernetes Volume 也支持多種 backend 類型,包括 emptyDir、hostPath、GCE Persistent Disk、AWS Elastic Block Store、NFS、Ceph 等,完整列表可參考 https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes

一、emptyDir

emptyDir 是最基礎(chǔ)的 Volume 類型。正如其名字所示,一個(gè) emptyDir Volume 是 Host 上的一個(gè)空目錄。

emptyDir Volume 對于容器來說是持久的,對于 Pod 則不是。當(dāng) Pod 從節(jié)點(diǎn)刪除時(shí),Volume 的內(nèi)容也會(huì)被刪除。但如果只是容器被銷毀而 Pod 還在,則 Volume 不受影響。

也就是說:emptyDir Volume 的生命周期與 Pod 一致。

Pod 中的所有容器都可以共享 Volume,它們可以指定各自的 mount 路徑。下面通過例子來實(shí)踐 emptyDir,配置文件如下:

apiVersion: v1
kind: Pod
metadata:
  name: producer-consumer
spec:
  containers:
  - name: producer
    image: busybox
    volumeMounts:
    - name: shared-volume
      mountPath: /producer_dir
    args:
    - /bin/sh
    - -c
    - echo "hello world" > /producer_dir/hello; sleep 30000
  - name: consumer
    image: busybox
    volumeMounts:
    - name: shared-volume
      mountPath: /consumer_dir
    args:
    - /bin/sh
    - -c
    - cat /consumer_dir/hello; sleep 30000
  volumes:
  - name: shared-volume
    emptyDir: {}

這里我們模擬了一個(gè) producer-consumer 場景。Pod 有兩個(gè)容器 producer和 consumer,它們共享一個(gè) Volume。producer 負(fù)責(zé)往 Volume 中寫數(shù)據(jù),consumer 則是從 Volume 讀取數(shù)據(jù)。

  • 文件最底部 volumes 定義了一個(gè) emptyDir 類型的 Volume shared-volume。
  • producer 容器將 shared-volume mount 到 /producer_dir 目錄。
  • producer 通過 echo 將數(shù)據(jù)寫到文件 hello 里。
  • consumer 容器將 shared-volume mount 到 /consumer_dir 目錄。
  • consumer 通過 cat 從文件 hello 讀數(shù)據(jù)。

執(zhí)行如下命令創(chuàng)建 Pod:

[root@master ~]# kubectl apply -f emptydir.yaml 
pod/producer-consumer created
[root@master ~]# kubectl get pods
NAME                READY   STATUS    RESTARTS   AGE
producer-consumer   2/2     Running   0          8s
[root@master ~]# kubectl logs producer-consumer consumer
hello world

kubectl logs 顯示容器 consumer 成功讀到了 producer 寫入的數(shù)據(jù),驗(yàn)證了兩個(gè)容器共享 emptyDir Volume。

emptyDir 是 Host 上創(chuàng)建的臨時(shí)目錄,其優(yōu)點(diǎn)是能夠方便地為 Pod 中的容器提供共享存儲(chǔ),不需要額外的配置。但它不具備持久性,如果 Pod 不存在了,emptyDir 也就沒有了。根據(jù)這個(gè)特性,emptyDir 特別適合 Pod 中的容器需要臨時(shí)共享存儲(chǔ)空間的場景,比如前面的生產(chǎn)者消費(fèi)者用例。

二、hostPath

hostPath Volume 的作用是將 Docker Host 文件系統(tǒng)中已經(jīng)存在的目錄 mount 給 Pod 的容器。大部分應(yīng)用都不會(huì)使用 hostPath Volume,因?yàn)檫@實(shí)際上增加了 Pod 與節(jié)點(diǎn)的耦合,限制了 Pod 的使用。不過那些需要訪問 Kubernetes 或 Docker 內(nèi)部數(shù)據(jù)(配置文件和二進(jìn)制庫)的應(yīng)用則需要使用 hostPath。

下面的例子,我們把主機(jī)上的目錄/data/pod/v1掛載到 Pod 上容器的/usr/share/nginx/html/。

apiVersion: v1
kind: Pod
metadata:
  name: pod-vol-hostPath
spec:
  containers:
  - name: mytest
    image: wangzan18/mytest:v1
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html/
  volumes:
  - name: html
    hostPath:
      path: /data/pod/v1
      type: DirectoryOrCreate

如果 Pod 被銷毀了,hostPath 對應(yīng)的目錄也還會(huì)被保留,從這點(diǎn)看,hostPath 的持久性比 emptyDir 強(qiáng)。不過一旦 Host 崩潰,hostPath 也就沒法訪問了。

三、PV & PVC

Volume 提供了非常好的數(shù)據(jù)持久化方案,不過在可管理性上還有不足。

拿前面 AWS EBS 的例子來說,要使用 Volume,Pod 必須事先知道如下信息:

  • 當(dāng)前 Volume 來自 AWS EBS。
  • EBS Volume 已經(jīng)提前創(chuàng)建,并且知道確切的 volume-id。

Pod 通常是由應(yīng)用的開發(fā)人員維護(hù),而 Volume 則通常是由存儲(chǔ)系統(tǒng)的管理員維護(hù)。開發(fā)人員要獲得上面的信息:

  • 要么詢問管理員。
  • 要么自己就是管理員。

這樣就帶來一個(gè)管理上的問題:應(yīng)用開發(fā)人員和系統(tǒng)管理員的職責(zé)耦合在一起了。如果系統(tǒng)規(guī)模較小或者對于開發(fā)環(huán)境這樣的情況還可以接受。但當(dāng)集群規(guī)模變大,特別是對于生成環(huán)境,考慮到效率和安全性,這就成了必須要解決的問題。

Kubernetes 給出的解決方案是 PersistentVolumePersistentVolumeClaim。

PersistentVolume (PV) 是外部存儲(chǔ)系統(tǒng)中的一塊存儲(chǔ)空間,由管理員創(chuàng)建和維護(hù)。與 Volume 一樣,PV 具有持久性,生命周期獨(dú)立于 Pod。

PersistentVolumeClaim (PVC) 是對 PV 的申請 (Claim)。PVC 通常由普通用戶創(chuàng)建和維護(hù)。需要為 Pod 分配存儲(chǔ)資源時(shí),用戶可以創(chuàng)建一個(gè) PVC,指明存儲(chǔ)資源的容量大小和訪問模式(比如只讀)等信息,Kubernetes 會(huì)查找并提供滿足條件的 PV。

有了 PersistentVolumeClaim,用戶只需要告訴 Kubernetes 需要什么樣的存儲(chǔ)資源,而不必關(guān)心真正的空間從哪里分配,如何訪問等底層細(xì)節(jié)信息。這些 Storage Provider 的底層信息交給管理員來處理,只有管理員才應(yīng)該關(guān)心創(chuàng)建 PersistentVolume 的細(xì)節(jié)信息。

Kubernetes 支持多種類型的 PersistentVolume,比如 AWS EBS、Ceph、NFS 等,完整列表請參考 https://kubernetes.io/docs/concepts/storage/persistent-volumes/#types-of-persistent-volumes

下節(jié)我們用 NFS 來體會(huì) PersistentVolume 的使用方法。

1、NFS PersistentVolume

作為準(zhǔn)備工作,我們已經(jīng)在 node3 節(jié)點(diǎn)上搭建了一個(gè) NFS 服務(wù)器,輸出三個(gè)目錄:

[root@datanode03 ~]# showmount -e localhost
Export list for localhost:
/data/volumes/pv003 192.168.1.0/24
/data/volumes/pv002 192.168.1.0/24
/data/volumes/pv001 192.168.1.0/24

下面創(chuàng)建PV,配置文件 nfs-pv.yaml 如下:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
spec:
  capacity:
    storage: 1Gi
  accessModes:
  - ReadWriteMany
  nfs:
    path: /data/volumes/pv001
    server: 192.168.1.203
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv002
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteMany
  nfs:
    path: /data/volumes/pv002
    server: 192.168.1.203
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv003
spec:
  capacity:
    storage: 10Gi
  accessModes:
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /data/volumes/pv003
    server: 192.168.1.203

accessModes 指定訪問模式為 ReadWriteOnce,支持的訪問模式有:

  • ReadWriteOnce – PV 能以 read-write 模式 mount 到單個(gè)節(jié)點(diǎn)。
  • ReadOnlyMany – PV 能以 read-only 模式 mount 到多個(gè)節(jié)點(diǎn)。
  • ReadWriteMany – PV 能以 read-write 模式 mount 到多個(gè)節(jié)點(diǎn)。

persistentVolumeReclaimPolicy 指定當(dāng) PV 的回收策略為 Recycle,支持的策略有:

  • Retain – 需要管理員手工回收。
  • Recycle – 清除 PV 中的數(shù)據(jù),效果相當(dāng)于執(zhí)行 rm -rf /thevolume/*。
  • Delete – 刪除 Storage Provider 上的對應(yīng)存儲(chǔ)資源,例如 AWS EBS、GCE PD、Azure Disk、OpenStack Cinder Volume 等。

創(chuàng)建我們剛剛做好的PV。

[root@master ~]# kubectl apply -f nfs-pv.yaml 
persistentvolume/pv001 created
persistentvolume/pv002 created
persistentvolume/pv003 created
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv001   1Gi        RWX            Retain           Available                                   6s
pv002   5Gi        RWX            Retain           Available                                   6s
pv003   10Gi       RWX            Recycle          Available                                   6s

2、創(chuàng)建 PVC

創(chuàng)建配置文件nfs-pvc.yaml,修改內(nèi)容如下:

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

創(chuàng)建 PVC。

[root@master ~]# kubectl apply -f nfs-pvc.yaml 
persistentvolumeclaim/pvc001 created
[root@master ~]# kubectl get pvc
[root@master ~]# kubectl get pvc
NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc001   Bound    pv001    1Gi        RWX                           9s
[root@master ~]# kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM            STORAGECLASS   REASON   AGE
pv001   1Gi        RWX            Retain           Bound       default/pvc001                           2m7s
pv002   5Gi        RWX            Retain           Available                                            2m7s
pv003   10Gi       RWX            Recycle          Available                                            2m7s

3、創(chuàng)建 Pod 進(jìn)行掛載

創(chuàng)建 pod 配置文件nfs-pvc-pod.yaml,內(nèi)容如下:

apiVersion: v1
kind: Pod
metadata:
  name: mypod1
spec:
  containers:
  - name: mypod1
    image: busybox
    args:
    - /bin/sh
    - -c
    - sleep 30000
    volumeMounts:
    - name: mydata
      mountPath: "/mydata"
  volumes:
  - name: mydata
    persistentVolumeClaim:
      claimName: pvc001

創(chuàng)建pod。

[root@master ~]# kubectl apply -f nfs-pvc-pod.yaml 
pod/mypod1 created
[root@master ~]# kubectl get pods -o wide
NAME     READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
mypod1   1/1     Running   0          17m   10.244.1.16   node01              

驗(yàn)證 PV 是否可用:

[root@master ~]# kubectl exec mypod1 touch /mydata/hello

然后在node3服務(wù)器上面查看。

[root@node03 pv001]# ll
-rw-r--r-- 1 root root 0 12月 13 19:39 hello

可見,在 Pod 中創(chuàng)建的文件 /mydata/hello 確實(shí)已經(jīng)保存到了 NFS 服務(wù)器目錄 /data/volumes/pv001 中。


新聞名稱:Kubernetes存儲(chǔ)卷管理PV&PVC(十)
網(wǎng)站網(wǎng)址:http://weahome.cn/article/geieis.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部