Kubernetes存儲(chǔ)卷介紹-創(chuàng)新互聯(lián)

今天小編就為大家?guī)?lái)一篇有關(guān)Kubernetes存儲(chǔ)卷介紹的文章。小編覺(jué)得內(nèi)容挺豐富全面的,為此分享給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供滑縣網(wǎng)站建設(shè)、滑縣做網(wǎng)站、滑縣網(wǎng)站設(shè)計(jì)、滑縣網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、滑縣企業(yè)網(wǎng)站模板建站服務(wù),10余年滑縣做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

第一章、前言

默認(rèn)情況下容器的數(shù)據(jù)都是非持久化的, 在容器消亡以后數(shù)據(jù)也跟著丟失, 所以 Docker 提供了 Volume 機(jī)制以便將數(shù)據(jù)持久化存儲(chǔ)。 類似的, Kubernetes 提供了更強(qiáng)大的 Volume 機(jī)制和豐富的插件, 解決了容器數(shù)據(jù)持久化和容器間共享數(shù)據(jù)的問(wèn)題。
與 Docker 不同, Kubernetes Volume 的生命周期與 Pod 綁定容器掛掉后 Kubelet 再次重啟容器時(shí), Volume 的數(shù)據(jù)依然還在而 Pod 刪除時(shí), Volume 才會(huì)清理。
數(shù)據(jù)是否丟失取決于具體的 Volume 類型, 比如 emptyDir 的數(shù)據(jù)會(huì)丟失, 而 PV 的數(shù)據(jù)則不會(huì)丟
PersistentVolume(pv)和PersistentVolumeClaim(pvc)是k8s提供的兩種API資源,用于抽象存儲(chǔ)細(xì)節(jié)。管理員關(guān)注于如何通過(guò)pv提供存儲(chǔ)功能而無(wú)需關(guān)注用戶如何使用,同樣的用戶只需要掛載pvc到容器中而不需要關(guān)注存儲(chǔ)卷采用何種技術(shù)實(shí)現(xiàn)。
pvc和pv的關(guān)系與pod和node關(guān)系類似,前者消耗后者的資源。pvc可以向pv申請(qǐng)指定大小的存儲(chǔ)資源并設(shè)置訪問(wèn)模式。

第二章、pv pvc相關(guān)知識(shí)

生命周期

pv和pvc遵循以下生命周期:
1.供應(yīng)準(zhǔn)備。管理員在集群中創(chuàng)建多個(gè)pv供用戶使用。
2.綁定。用戶創(chuàng)建pvc并指定需要的資源和訪問(wèn)模式。在找到可用pv之前,pvc會(huì)保持未綁定狀態(tài)。
3.使用。用戶可在pod中像volume一樣使用pvc。
4.釋放。用戶刪除pvc來(lái)回收存儲(chǔ)資源,pv將變成“released”狀態(tài)。由于還保留著之前的數(shù)據(jù),這些數(shù)據(jù)需要根據(jù)不同的策略來(lái)處理,否則這些存儲(chǔ)資源無(wú)法被其他pvc使用。
5.回收。pv可以設(shè)置三種回收策略:保留(Retain),回收(Recycle)和刪除(Delete)。
保留策略允許人工處理保留的數(shù)據(jù)。
刪除策略將刪除pv和外部關(guān)聯(lián)的存儲(chǔ)資源,需要插件支持。
回收策略將執(zhí)行清除操作,之后可以被新的pvc使用,需要插件支持。

pv屬性

pv擁有以下屬性:
容量。目前僅支持存儲(chǔ)大小,未來(lái)可能支持IOPS和吞吐量等。
訪問(wèn)模式。ReadWriteOnce:?jiǎn)蝹€(gè)節(jié)點(diǎn)讀寫(xiě)。ReadOnlyMany:多節(jié)點(diǎn)只讀。ReadWriteMany:多節(jié)點(diǎn)讀寫(xiě)。掛載時(shí)只能使用一種模式。
回收策略。目前NFS和HostPath支持回收。 AWS、EBS、GCE、PD和Cinder支持刪除。
階段。分為Available(未綁定pvc)、Bound(已綁定)、Released(pvc已刪除但資源未回收)、Failed(自動(dòng)回收失敗)</pre>

pvc屬性

訪問(wèn)模式。與pv的語(yǔ)義相同。在請(qǐng)求資源時(shí)使用特定模式。
資源。申請(qǐng)的存儲(chǔ)資源數(shù)量</pre>

pv類型

emptyDir
hostPath
gcePersistentDisk
awsElasticBlockStore
nfs
iscsi
flocker
glusterfs
rbd
cephfs
gitRepo
secret
persistentVolumeClaim
downwardAPI
azureFileVolume
................
........(以下省略)

目前常用Volume 類型 

emptyDir

如果 Pod 設(shè)置了 emptyDir 類型 Volume, Pod 被分配到 Node 上時(shí)候, 會(huì)創(chuàng)建emptyDir, 只要 Pod 運(yùn)行在 Node 上, emptyDir 都會(huì)存在( 容器掛掉不會(huì)導(dǎo)致emptyDir 丟失數(shù)據(jù)) , 但是如果 Pod 從 Node 上被刪除( Pod 被刪除, 或者 Pod 發(fā)生遷移) , emptyDir 也會(huì)被刪除, 并且永久丟失。

hostPath

hostPath 允許掛載 Node 上的文件系統(tǒng)到 Pod 里面去。 如果 Pod 需要使用 Node 上的文件, 可以使用 hostPath</pre>

NFS

NFS 是 Network File System 的縮寫(xiě), 即網(wǎng)絡(luò)文件系統(tǒng)。 Kubernetes 中通過(guò)簡(jiǎn)單地配置就可以掛載 NFS 到 Pod 中, 而 NFS 中的數(shù)據(jù)是可以永久保存的, 同時(shí) NFS 支持同時(shí)寫(xiě)操作。

gcePersistentDisk

gcePersistentDisk 可以掛載 GCE 上的永久磁盤(pán)到容器, 需要 Kubernetes 運(yùn)行在 GCE的 VM 中

awsElasticBlockStore

awsElasticBlockStore 可以掛載 AWS 上的 EBS 盤(pán)到容器, 需要 Kubernetes 運(yùn)行在AWS 的 EC2 上。

gitRepo

gitRepo volume 將 git 代碼下拉到指定的容器路徑中

Projected Volume

Projected volume 將多個(gè) Volume 源映射到同一個(gè)目錄中, 支持 secret、 downwardAPI和 configMap </pre>

第三章、簡(jiǎn)單示例

1、emptyDir (節(jié)點(diǎn)級(jí)存儲(chǔ),生命周期與pod相同)

# cat emptydir.yaml  #pod中有兩個(gè)container掛載同一個(gè)emptyDir,nginx提供web服務(wù),busybox則循環(huán)向掛載目錄下的index.html文件寫(xiě)入數(shù)據(jù)
apiVersion: v1
kind: Pod
metadata:
  name: emptydir
  namespace: default
  labels:
   app: myapp
   tier: frontend
spec:
  containers:
  - name: myapp
   image: ikubernetes/myapp:v1
   ports:
   - name: myapp
    containerPort: 80
   volumeMounts:
   - name: html
    mountPath: /usr/share/nginx/html
  - name: busybox
   image: busybox:latest
   volumeMounts:     #見(jiàn)pod的volume掛載到container中
   - name: html      #名稱需要和 volumes中的name一致
    mountPath: /data  #掛載volume在container中的路徑
   command:
   - "/bin/sh"
   - "-c"
   - "while true; do echo $(date) >> /data/index.html; sleep 2; done"
  volumes:    #創(chuàng)建pod可以使用的volume,可以有多個(gè)
  - name: html  
   emptyDir: {}  #volume類型,默認(rèn)不限制使用空間

查看pod運(yùn)行狀態(tài),并訪問(wèn)

# kubectl apply -f emptydir.yaml
pod/emptydir created

# kubectl get pods -o wide
NAME    READY  STATUS   RESTARTS  AGE  IP       NODE        
emptydir  2/2   Running  0      76s  10.244.3.34  huoban-k8s-node01

# while true; do curl 10.244.3.34; sleep 1; done
Fri Sep 20 03:34:38 UTC 2019
Fri Sep 20 03:34:40 UTC 2019
Fri Sep 20 03:34:42 UTC 2019
......

2、hostPath (節(jié)點(diǎn)級(jí)存儲(chǔ),生命周期和node相同)

#cat host-path.yaml
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-hostpath
  namespace: default 
spec:
  containers: - name: myapp
   image: ikubernetes/myapp:v1
   volumeMounts: - name: html
    mountPath: /usr/share/nginx/html
  volumes: - name: html
   hostPath:
    path: "/data/pod/volumel"  #依據(jù)type的值來(lái)確定掛載路徑是否需要?jiǎng)?chuàng)建 type: DirectoryOrCreate  #掛載目錄不存在則創(chuàng)建

# kubectl apply -f host-path.yaml
pod/pod-hostpath created

# kubectl get pods -o wide
NAME      READY  STATUS   RESTARTS  AGE  IP       NODE        
pod-hostpath  1/1   Running  0      58s  10.244.5.11  huoban-k8s-node03

手動(dòng)創(chuàng)建目錄并添加html文件測(cè)試

# ssh node3 "ls -l /data/pod/volumel"
.
# ssh node03 "touch /data/pod/volumel/index.html"
# ssh node03 "ls -al /data/pod/volumel"
total 8
drwxr-xr-x 2 root root 4096 Sep 20 15:00 .
drwxr-xr-x 3 root root 4096 Sep 20 14:56 ..
-rw-r--r-- 1 root root   0 Sep 20 15:00 index.html

# echo "node03" > /data/pod/volumel/index.html  #在node03服務(wù)器上執(zhí)行
# cat /data/pod/volumel/index.html
node03

# curl 10.244.5.11
node03

#刪除服務(wù),數(shù)據(jù)還在
# kubectl delete -f host-path.yaml
pod "pod-hostpath" deleted
# ssh node03 "ls -al /data/pod/volumel"
total 12
drwxr-xr-x 2 root root 4096 Sep 20 15:00 .
drwxr-xr-x 3 root root 4096 Sep 20 14:56 ..
-rw-r--r-- 1 root root   7 Sep 20 15:04 index.html

3、NFS (永久存儲(chǔ),生命周期與NFS server相同,不會(huì)刪除)

1、在master上操作
# cat pod-nfs-vol.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-nfs
  namespace: default
spec:
  containers:
  - name: myapp
   image: ikubernetes/myapp:v1
   volumeMounts:
   - name: html
    mountPath: /usr/share/nginx/html
  volumes:
  - name: html
   nfs:
    path: "/data/volumes/v1"  #該目錄在NFS server上必須存在并可以被集群中node節(jié)點(diǎn)可以掛載,node節(jié)點(diǎn)需要安裝nfs-utils,可以執(zhí)行NFS 掛載操作    
    server: 172.16.17.10 #該server需要安裝NFS 服務(wù),并共享path中的目錄或文件

2、在其中一臺(tái)node節(jié)點(diǎn)上做測(cè)試
# mount -t nfs 172.16.17.10:/data/volumes/v1 /mnt  在任意一節(jié)點(diǎn)上進(jìn)行掛載測(cè)試,確定可以掛載是否可以成功,需要安裝nfs-utils工具包
# df -h |grep mnt  #查看掛載狀態(tài)
172.16.17.10:/data/volumes/v1 77G 3.5G 74G 5% /mnt
# umount /mnt  #確認(rèn)沒(méi)有問(wèn)題后卸載

3、測(cè)試運(yùn)行
# kubectl apply -f pod-nfs-vol.yaml #創(chuàng)建pod
pod "pod-nfs" created
# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
pod-nfs 1/1 Running 0 17s 10.244.1.154 huoban-k8s-node01 

4、在節(jié)點(diǎn)上測(cè)試創(chuàng)建文件
#在NFS server上添加一個(gè)測(cè)試HTML文件
# cd /data/volumes/v1/  #掛載目錄
# echo "<h2>NFS Server volume v1</h2>" > index.html

5、訪問(wèn)一下并測(cè)試數(shù)據(jù)是否丟失
# curl 10.244.1.154
<h2>NFS Server volume v1</h2>
# kubectl delete pod pod-nfs  #刪除剛剛創(chuàng)建的pod
pod "pod-nfs" deleted
# kubectl apply -f pod-nfs-vol.yaml  #再重新創(chuàng)建
pod "pod-nfs" created

# kubectl get pod -o wide #查看新創(chuàng)建后pod所在的node節(jié)點(diǎn)級(jí)IP地址
NAME READY STATUS RESTARTS AGE IP NODE
pod-nfs 1/1 Running 0 17s 10.244.2.192 huoban-k8s-node02

# curl 10.244.2.192  #再次訪問(wèn)一下,文件依然存在,文件不會(huì)隨著pod的終結(jié)而銷毀
<h2>NFS Server volume v1</h2>

4、創(chuàng)建PV和PVC(用NFS創(chuàng)建)

NFS server上創(chuàng)建多個(gè)掛載目錄,并共享

# cat /etc/exports
/data/volumes/v1  172.16.0.0/16(rw,no_root_squash)
/data/volumes/v2  172.16.0.0/16(rw,no_root_squash)
/data/volumes/v3  172.16.0.0/16(rw,no_root_squash)
/data/volumes/v4  172.16.0.0/16(rw,no_root_squash)
/data/volumes/v5  172.16.0.0/16(rw,no_root_squash)

# ll /data/volumes/
總用量 0
drwxr-xr-x 2 root root 24 2019-09-20 16:28 v1
drwxr-xr-x 2 root root 24 2019-09-20 16:28 v2
drwxr-xr-x 2 root root 24 2019-09-20 16:28 v3
drwxr-xr-x 2 root root 24 2019-09-20 16:28 v4
drwxr-xr-x 2 root root 24 2019-09-20 16:28 v5

# exportfs 
/data/volumes/v1 172.16.0.0/16
/data/volumes/v2 172.16.0.0/16
/data/volumes/v3 172.16.0.0/16
/data/volumes/v4 172.16.0.0/16
/data/volumes/v5 172.16.0.0/16
# showmount -e
Export list for huoban-k8s-nfs:
/data/volumes/v5 172.16.0.0/16
/data/volumes/v4 172.16.0.0/16
/data/volumes/v3 172.16.0.0/16
/data/volumes/v2 172.16.0.0/16
/data/volumes/v1 172.16.0.0/16

將NFS server共享的目錄創(chuàng)建為PV
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-vol-001  #不允許定義名稱空間,應(yīng)為pv是屬于集群級(jí)別的
spec:
  capacity: #pv的大小
   storage: 5Gi
  accessModes:   #訪問(wèn)的模型,具體訪問(wèn)模型官方文檔鏈接: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes
   - ReadWriteOnce  #支持的訪問(wèn)模型與具體的共享存儲(chǔ)設(shè)備類型有關(guān),具體見(jiàn)上方鏈接
   - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
   path: /data/volumes/v1
   server: 172.16.17.10
---
apiVersion: v1
kind: PersistentVolume
metadata: 
  name: nfs-vol-02
spec:
  capacity: 
   storage: 5Gi
  accessModes:
   - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  nfs:
   path: /data/volumes/v2
   server: 172.16.17.10
---  
apiVersion: v1
kind: PersistentVolume
metadata: 
  name: nfs-vol-03
spec:
  capacity: 
   storage: 10Gi
  accessModes:
   - ReadWriteOnce
   - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
   path: /data/volumes/v3
   server: 172.16.17.10
---  
apiVersion: v1
kind: PersistentVolume
metadata: 
  name: nfs-vol-04
spec:
  capacity: 
   storage: 15Gi
  accessModes:
   - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  nfs:
   path: /data/volumes/v4
   server: 172.16.17.10
---  
apiVersion: v1
kind: PersistentVolume
metadata: 
  name: nfs-vol-05
spec:
  capacity: 
   storage: 20Gi
  accessModes:
   - ReadWriteOnce
   - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
   path: /data/volumes/v5
   server: 172.16.17.10

# kubectl apply -f nfs-vol.yaml 
persistentvolume "nfs-vol-01" created
persistentvolume "nfs-vol-02" created
persistentvolume "nfs-vol-03" created
persistentvolume "nfs-vol-04" created
persistentvolume "nfs-vol-05" created

# kubectl get pv
NAME        CAPACITY  ACCESS MODES  RECLAIM POLICY  STATUS     CLAIM            STORAGECLASS  REASON   AGE
nfs-vol-01     5Gi     RWO,RWX     Recycle      Available                              7s
nfs-vol-02     5Gi     RWO       Recycle      Available                              7s
nfs-vol-03     10Gi    RWO,RWX     Recycle      Available                              7s
nfs-vol-04     15Gi    RWO       Recycle      Available                              7s
nfs-vol-05     20Gi    RWO,RWX     Recycle      Available                              7s

#創(chuàng)建一個(gè)PVC
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
  namespace: default
spec:
  accessModes: ["ReadWriteOnce"] #pvc的訪問(wèn)模式一定是pv訪問(wèn)模式的子集
  resources:
   requests:
    storage: 5Gi

---
apiVersion: v1
kind: Pod
metadata:
  name: pod-pvc
  namespace: default
spec:
  containers:
  - name: myapp
   image: ikubernetes/myapp:v1
   volumeMounts:
   - name: html
    mountPath: /usr/share/nginx/html
  volumes:
  - name: html
   persistentVolumeClaim:
    claimName: my-pvc

# kubectl apply -f pod-pvc-vol.yaml
persistentvolumeclaim "my-pvc" created
pod "pod-pvc" created

# kubectl get pvc
NAME    STATUS   VOLUME    CAPACITY  ACCESS MODES  STORAGECLASS  AGE
my-pvc   Bound   nfs-vol-02  5Gi     RWO              1m

# kubectl get pv  #查看pv狀態(tài)的變化,nfs-vol-02被 default名稱空間下my-pvc申請(qǐng)并綁定
NAME     CAPACITY  ACCESS MODES  RECLAIM POLICY  STATUS    CLAIM       STORAGECLASS  REASON   A
nfs-vol-01  5Gi     RWO,RWX     Recycle      Available                       9
nfs-vol-02  5Gi     RWO       Recycle      Bound    default/my-pvc               9
nfs-vol-03  10Gi    RWO,RWX     Recycle      Available                       9
nfs-vol-04  15Gi    RWO       Recycle      Available                       9
nfs-vol-05  20Gi    RWO,RWX     Recycle      Available                    

# 查看下pod的創(chuàng)建信息
# kubectl describe pod pod-pvc 
......
Volumes:
  html:
   Type:    PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
   ClaimName:  my-pvc
   ReadOnly:  false
  default-token-tcwjz:
   Type:     Secret (a volume populated by a Secret)
   SecretName:  default-token-tcwjz
   Optional:   false
QoS Class:    BestEffort
Node-Selectors:  <none>
Tolerations:   node.kubernetes.io/not-ready:NoExecute for 300s
         node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type   Reason         Age        From         Message
  ----   ------         ----       ----         -------
  Warning  FailedScheduling    8m (x2 over 8m)  default-scheduler   pod has unbound PersistentVolumeClaims (repeated 2 times)
  Normal  Scheduled        8m        default-scheduler   Successfully assigned pod-pvc to huoban-k8s-node01
  Normal  SuccessfulMountVolume  8m        kubelet, huoban-k8s-node01  MountVolume.SetUp succeeded for volume "default-token-tcwjz"
  Normal  SuccessfulMountVolume  8m        kubelet, huoban-k8s-node01  MountVolume.SetUp succeeded for volume "nfs-vol-02"
  Normal  Pulled         8m        kubelet, huoban-k8s-node01  Container image "ikubernetes/myapp:v1" already present on machine
  Normal  Created         7m        kubelet, huoban-k8s-node01  Created container
  Normal  Started         7m        kubelet, huoban-k8s-node01  Started container

#注意:處于綁定狀態(tài)下的pv無(wú)法直接被刪除,如果需要?jiǎng)h除被綁定的pv,需要先刪除申請(qǐng)綁定的PVC

以上就是Kubernetes存儲(chǔ)卷的知識(shí)匯總,內(nèi)容較為全面,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ骺赡軙?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

文章標(biāo)題:Kubernetes存儲(chǔ)卷介紹-創(chuàng)新互聯(lián)
URL標(biāo)題:http://muchs.cn/article42/deooec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈電子商務(wù)、企業(yè)建站、品牌網(wǎng)站設(shè)計(jì)、關(guān)鍵詞優(yōu)化網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)