溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Kubernetes持久卷怎么使用

發(fā)布時(shí)間:2021-12-16 10:22:09 來源:億速云 閱讀:232 作者:iii 欄目:云計(jì)算

本篇內(nèi)容主要講解“Kubernetes持久卷怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Kubernetes持久卷怎么使用”吧!

Volume 卷

Container 中的文件在磁盤上是臨時(shí)存放的,這給 Container 中運(yùn)行的較重要的應(yīng)用程序帶來一些問題:

  • 1.當(dāng)容器崩潰時(shí),kubelet 會(huì)重新啟動(dòng)容器,但容器會(huì)以干凈的狀態(tài)重啟,造成文件的丟失。

  • 2.Pod 中運(yùn)行多個(gè)容器時(shí),希望能在多個(gè)容器中共享文件。

因此 Kubernetes 使用了卷(Volume) 這一抽象概念能夠來解決這兩個(gè)問題。Kubernetes 支持下列類型的卷:

  • hostpath:將主機(jī)節(jié)點(diǎn)文件系統(tǒng)上的文件或目錄掛載到你的 Pod 中。

  • emptyDir: 當(dāng) Pod 分派到某個(gè) Node 上時(shí),emptyDir 卷會(huì)被創(chuàng)建,并且在 Pod 在該節(jié)點(diǎn)上運(yùn)行期間,卷一直存在。 就像其名稱表示的那樣,卷最初是空的。 Pod 中的多個(gè)容器可以共享 emptyDir 卷中的文件。 當(dāng) Pod 因?yàn)槟承┰虮粡墓?jié)點(diǎn)上刪除時(shí),emptyDir 卷中的數(shù)據(jù)也會(huì)被永久刪除。 容器崩潰并不會(huì)導(dǎo)致 Pod 被從節(jié)點(diǎn)上移除,因此容器崩潰期間 emptyDir 卷中的數(shù)據(jù)是安全的。

  • Persistent Volume:persistentVolumeClaim 卷用來將持久卷(PersistentVolume) 掛載到 Pod 中。 持久卷申領(lǐng)(PersistentVolumeClaim)是用戶在不知道特定云環(huán)境細(xì)節(jié)的情況下"申領(lǐng)"持久存儲(chǔ) (例如 NFS,iSCSI)的一種方法。

Persistent Volume 持久卷

本文主要介紹持久卷的使用。Kubernetes 為了使開發(fā)人員能夠在請求存儲(chǔ)資源時(shí),避免處理存儲(chǔ)設(shè)施細(xì)節(jié),引入了持久卷(PersistentVolume,PV) 和 持久卷申領(lǐng)(PersistentVolumeClaim,PVC):

  • 持久卷(PersistentVolume,PV 是集群中的一塊存儲(chǔ),可以由管理員事先供應(yīng),或者 使用存儲(chǔ)類(Storage Class)來動(dòng)態(tài)供應(yīng)。 持久卷是集群資源,就像節(jié)點(diǎn)也是集群資源一樣。PV 持久卷和普通的 Volume 一樣,也是使用 卷插件來實(shí)現(xiàn)的,只是它們擁有獨(dú)立于任何使用 PV 的 Pod 的生命周期。 此 API 對象中記述了存儲(chǔ)的實(shí)現(xiàn)細(xì)節(jié),無論其背后是 NFS、iSCSI 還是特定于云平臺的存儲(chǔ)系統(tǒng)。

  • 持久卷申領(lǐng)(PersistentVolumeClaim,PVC 表達(dá)的是用戶對存儲(chǔ)的請求。概念上與 Pod 類似。 Pod 會(huì)耗用節(jié)點(diǎn)資源,而 PVC 申領(lǐng)會(huì)耗用 PV 資源。Pod 可以請求特定數(shù)量的資源(CPU 和內(nèi)存);同樣 PVC 申領(lǐng)也可以請求特定的大小和訪問模式 (例如,可以要求 PV 卷能夠以 ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany 模式之一來掛載)。

創(chuàng)建 PV 有兩種方式:

  • 靜態(tài)供應(yīng):一種是集群管理員通過手動(dòng)方式靜態(tài)創(chuàng)建應(yīng)用所需要的 PV。

  • 動(dòng)態(tài)供應(yīng):

    • 方式一:用戶手動(dòng)創(chuàng)建 PVC 并由 Provisioner 組件動(dòng)態(tài)創(chuàng)建對應(yīng)的 PV。

    • 方式二:在創(chuàng)建 Pod 的時(shí)候使用 volumeClaimTemplates 聲明。

PV 回收策略

  • 保留(Retain) 保留策略允許手動(dòng)回收資源,當(dāng)刪除PVC的時(shí)候,PV仍然存在,變?yōu)镽ealease狀態(tài),需要用戶手動(dòng)通過以下步驟回收卷(只有hostPath和nfs支持Retain回收策略):

    • 1.刪除PV。

    • 2.手動(dòng)清理存儲(chǔ)的數(shù)據(jù)資源。

  • 回收(Resycle) 該策略已廢棄,推薦使用dynamic provisioning,回收策略會(huì)在 volume上執(zhí)行基本擦除(rm -rf /thevolume/*),可被再次聲明使用。

  • 刪除(Delete)

    • 當(dāng)發(fā)生刪除操作的時(shí)候,會(huì)從 Kubernetes 集群中刪除 PV 對象,并執(zhí)行外部存儲(chǔ)資源的刪除操作(根據(jù)不同的provisioner 定義的刪除邏輯不同,有的是重命名而不是刪除)。

    • 動(dòng)態(tài)配置的卷繼承其 StorageClass 的回收策略,默認(rèn)為Delete,即當(dāng)用戶刪除 PVC 的時(shí)候,會(huì)自動(dòng)執(zhí)行 PV 的刪除策略。

訪問模式

訪問模式有:

  • ReadWriteOnce -- 卷可以被一個(gè)節(jié)點(diǎn)以讀寫方式掛載;

  • ReadOnlyMany -- 卷可以被多個(gè)節(jié)點(diǎn)以只讀方式掛載;

  • ReadWriteMany -- 卷可以被多個(gè)節(jié)點(diǎn)以讀寫方式掛載。

在命令行接口(CLI)中,訪問模式也使用以下縮寫形式:

  • RWO -- ReadWriteOnce

  • ROX -- ReadOnlyMany

  • RWX -- ReadWriteMany

每個(gè)卷只能同一時(shí)刻只能以一種訪問模式掛載,即使該卷能夠支持 多種訪問模式。例如,一個(gè) GCEPersistentDisk 卷可以被某節(jié)點(diǎn)以 ReadWriteOnce 模式掛載,或者被多個(gè)節(jié)點(diǎn)以 ReadOnlyMany 模式掛載,但不可以同時(shí)以兩種模式掛載。

卷綁定模式

volumeBindingMode 字段控制了 PVC 和 PV 在什么時(shí)候進(jìn)行綁定。

  • Immediate:表示一旦創(chuàng)建了 PVC 也就完成了卷綁定和動(dòng)態(tài)制備。 對于由于拓?fù)湎拗贫羌核泄?jié)點(diǎn)可達(dá)的存儲(chǔ)后端,PV 會(huì)在不知道 Pod 調(diào)度要求的情況下綁定或者制備。

  • WaitForFirstConsumer:該模式將延遲 PV 的綁定和制備,直到使用該 PVC 的 Pod 被創(chuàng)建。PV 會(huì)根據(jù) Pod 調(diào)度約束指定的拓?fù)鋪磉x擇或制備,包括但不限于 資源需求、 節(jié)點(diǎn)篩選器、 pod 親和性和互斥性、 以及污點(diǎn)和容忍度。

靜態(tài)供應(yīng)

靜態(tài)供應(yīng)需要管理員手動(dòng)創(chuàng)建 PV,然后創(chuàng)建 PVC 綁定 PV,最后創(chuàng)建 Pod 聲明使用 PVC。

創(chuàng)建 PV

apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual #靜態(tài)供應(yīng),名字可以任意取
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"  #在創(chuàng)建pod的節(jié)點(diǎn)上會(huì)新建該目錄

創(chuàng)建 PVC

fapiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: task-pv-claim
spec:
  storageClassName: manual #storageClassName要和PV中的一致
  accessModes:
    - ReadWriteOnce  #accessMode要和PV中的一致
  resources:
    requests:
      storage: 3Gi #申請3G容量,申請就近原則,如果有一個(gè)10G的和一個(gè)20G的PV滿足要求,那么使用10G的PV

創(chuàng)建 Pod 掛載 PV

apiVersion: v1
kind: Pod
metadata:
  name: task-pv-pod
spec:
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
        claimName: task-pv-claim  #使用的PVC的名字
  containers:
    - name: task-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html" #容器中掛載的目錄
          name: task-pv-storage

在宿主機(jī)上的目錄創(chuàng)建一個(gè)文件:

root@worker01:~# cd /mnt/data/
root@worker01:/mnt/data# echo "volume nginx" > index.html

嘗試訪問 Pod 的服務(wù),可以看到 nginx 的 index.html 文件已經(jīng)被修改:

root@master01:~/yaml/volume# kubectl get pod -o wide                                   
NAME          READY   STATUS    RESTARTS   AGE   IP             NODE       NOMINATED NODE   READINESS GATES
task-pv-pod   1/1     Running   0          11m   192.168.5.17   worker01   <none>           <none>
root@master01:~/yaml/volume# curl 192.168.5.17
volume nginx

刪除要按照 Pod-->PVC-->PV 的順序刪除,如果先刪除了 PVC 會(huì)等 Pod 刪除掉,才會(huì)刪除 PVC ,如果先刪除了 PV,會(huì)等 pod 和 PVC 刪除了才會(huì)刪除 PV。

動(dòng)態(tài)供應(yīng)

動(dòng)態(tài)卷供應(yīng)允許按需創(chuàng)建存儲(chǔ)卷。 如果沒有動(dòng)態(tài)供應(yīng),集群管理員必須手動(dòng)地聯(lián)系他們的云或存儲(chǔ)提供商來創(chuàng)建新的存儲(chǔ)卷, 然后在 Kubernetes 集群創(chuàng)建 PersistentVolume 對象來表示這些卷。 動(dòng)態(tài)供應(yīng)功能消除了集群管理員預(yù)先配置存儲(chǔ)的需要。 相反,它在用戶請求時(shí)自動(dòng)供應(yīng)存儲(chǔ)。

安裝 NFS

安裝NFS服務(wù)端
root@master01:/# apt-get -y install nfs-kernel-server 
root@master01:/# systemctl enable nfs-kernel-server.service && systemctl restart nfs-kernel-server.service
安裝NFS客戶端

在 worker 節(jié)點(diǎn)安裝NFS客戶端:

root@worker01:~# apt-get -y install nfs-common

配置存儲(chǔ)插件

配置RBAC
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: default
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io
部署存儲(chǔ)插件

動(dòng)態(tài)卷供應(yīng)的實(shí)現(xiàn)基于 storage.k8s.io API 組中的 StorageClass API 對象。 集群管理員可以根據(jù)需要定義多個(gè) StorageClass 對象,每個(gè)對象指定一個(gè)存儲(chǔ)插件(又名 provisioner),存儲(chǔ)插件以 Pod 的形式存在于 Kubernetes 集群中:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: quay.io/external_storage/nfs-client-provisioner:latest
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
           # 指定標(biāo)識插件的值
            - name: PROVISIONER_NAME
              value: fuseim.pri/ifs    #匹配StorageClass的provisioner
            - name: NFS_SERVER
              value: 10.0.1.31  #NFS服務(wù)器的ip地址
            - name: NFS_PATH
              value: /storage  #NFS服務(wù)器的路徑
      volumes:
        - name: nfs-client-root
          nfs:
            server: 10.0.1.31   #NFS服務(wù)器的ip地址
            path: /storage    #NFS服務(wù)器的路徑

方式一:創(chuàng)建 PVC 自動(dòng)申請 PV

配置 StorageClass

StorageClass 聲明存儲(chǔ)插件,用于自動(dòng)創(chuàng)建 PV,provisioner 參數(shù)和存儲(chǔ)插件的標(biāo)識對應(yīng)上才能動(dòng)態(tài)供應(yīng)卷 :

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-nfs-storage
provisioner: fuseim.pri/ifs #要匹配nfs deployment env PROVISIONER_NAME的值,默認(rèn)不支持nfs存儲(chǔ)需要添加插件標(biāo)識
parameters:
  archiveOnDelete: "false"
創(chuàng)建 PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pv-storage
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: managed-nfs-storage
  resources:
    requests:
      storage: 1Gi

查看創(chuàng)建的 PVC 和 PV,可以看到我們只創(chuàng)建了 PVC,PV 是存儲(chǔ)插件自動(dòng)配置的

root@master01:~/yaml/storageClass# kubectl get pvc
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
nginx-pv-storage   Bound    pvc-e52ac960-182a-4065-a6e8-6957f5c93b8a   1Gi        RWX            managed-nfs-storage   3s
root@master01:~/yaml/storageClass# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS          REASON   AGE
pvc-e52ac960-182a-4065-a6e8-6957f5c93b8a   1Gi        RWX            Delete           Bound    default/nginx-test   managed-nfs-storage            11s

Pod 使用 PVC 申請 Volume:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pv-pod
spec:
  volumes:
    - name: nginx-pv-storage
      persistentVolumeClaim:
        claimName: nginx-test
  containers:
    - name: nginx-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: "nginx-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: nginx-pv-storage

方式二:volumeClaimTemplates

除了上面創(chuàng)建 PVC 自動(dòng)創(chuàng)建 PV,然后 Pod 再聲明使用 PVC 的方式以外,還有一個(gè)更簡便的方法,就是使用 volumeClaimTemplates 直接指定 StorageClass 和 申請存儲(chǔ)的大小,動(dòng)態(tài)創(chuàng)建 PVC 和 PV:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: nginx-disk-ssd
          mountPath: /data
  volumeClaimTemplates:
  - metadata:
      name: nginx-disk-ssd
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "managed-nfs-storage"  #storageClass的名字
      resources:
        requests:
          storage: 10Gi

到此,相信大家對“Kubernetes持久卷怎么使用”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI