色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Kubernetes存儲體系解析 淺談Volume概念的由來

454398 ? 來源:云原生技術愛好者社區 ? 作者:strict_nerd ? 2020-10-15 16:45 ? 次閱讀

Volume、PV、PVC、StorageClass由來

先思考一個問題,為什么會引入Volume這樣一個概念?

答案很簡單,為了實現數據持久化,數據的生命周期不隨著容器的消亡而消亡。

”在沒有介紹Kubernetes Volume之前,先來回顧下Docker Volume,Docker Volume常用使用方式有兩種,

volumes通過這種方式, Docker管理宿主機文件系統的一部分,默認位于 /var/lib/docker/volumes目錄中,由于在創建時沒有創建指定數據卷, docker自身會創建默認數據卷;

bind mounts通過這種方式,可以把容器內文件掛載到宿主機任意目錄。

既然有了Docker Volume,為啥Kubernetes又搞出了自己的Volume?谷歌的標新立異?

答案是否定的,Kubernetes Volume和Docker Volume概念相似,但是又有不同的地方,Kubernetes Volume與Pod的生命周期相同,但與容器的生命周期不相關。當容器終止或重啟時,Volume中的數據也不會丟失。當Pod被刪除時,Volume才會被清理。并且數據是否丟失取決于Volume的具體類型,比如emptyDir類型的Volume數據會丟失,而持久化類型的數據則不會丟失。另外Kubernetes提供了將近20種Volume類型。

”現在有了Kubernetes的Volume,我們就可以完全可以在Yaml編排文件中填寫上Volume是字段,如下nfs所示:

。。..volumes: - name: static-nfs nfs: server: 12.18.17.240 path: /nfs/data/static

如果你使用ceph作為存儲插件,你可以在編排文件中這樣定義:

volumes: - name: ceph-vol cephfs: monitors: - 12.18.17.241:6789 - 12.18.17.242:6789 user: admin secretRef: name: ceph-secret readOnly: true

當然只要是Kubernetes已經實現的數據卷類型,你都可以按照如上方式進行直接在Yaml編排文件中定義使用。

看到這里其實已經完成了80%的工作,那么為什么還要設計多此一舉的PV呢?這個問題先擱置下,后面會有說明。

在沒有說明為什么要設計多此一舉的PV PVC之前,先來看看什么是PV PVC?

PV是對持久化存儲數據卷的一種描述。

”PV通常是由運維人員提前在集群里面創建等待使用的一種數據卷。如下所示:

apiVersion: v1kind: PersistentVolumemetadata: name: nfsspec: capacity: storage: 10Gi accessModes: - ReadWriteMany nfs: server: 10.244.1.4 path: “/nfs”

PVC描述的是持久化存儲的屬性,比如大小、讀寫權限等。

”PVC通常由開發人員創建,如下所示:

apiVersion: v1kind: PersistentVolumeClaimmetadata: name: nfsspec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi

而用戶創建的PV PVC必須綁定完成之后才能被利用起來。而PV PVC綁定起來的前提是PV中spec中聲明字段大小、權限等必須滿足PVC的要求。

成功綁定之后,就可以在Pod Yaml編排文件中定義和使用。如下所示:

apiVersion: v1kind: Podmetadata: labels: role: webspec: containers: - name: web image: nginx ports: - name: web containerPort: 80 volumeMounts: - name: nfs mountPath: “/usr/share/nginx/html” volumes: - name: nfs persistentVolumeClaim: claimName: nfs

看到這里,我們還會認為僅僅是PV對Volume多了一層抽象,并不見得比直接在Yaml中聲明Volume高明多少。仔細思考下,我們為什么能夠直接在Yaml中直接定義Volume?因為Kubernetes已經幫助我們實現了這種Volume類型,如果我們有自己的存儲類型,而Kubernetes中并沒有實現,這種是沒有辦法直接在Yaml編排文件中直接定義Volume的。這個時候PV PVC面向對象的設計就體現出其價值了。這也是在軟件開發領域經常碰到的問題,開源軟件無法滿足要求,但也沒有提供出可擴展的接口,沒辦法,只能重新造輪子。

我們在開發過程中經常碰到這樣一個問題,在Pod中聲明一個PVC之后,發現Pod不能被調度成功,原因是因為PVC沒有綁定到合適的PV,這個時候要求運維人員創建一個PV,緊接著Pod調度成功。剛才上在介紹PV PVC,它們的創建過程都是手動,如果集群中需要成千上萬的PV,那么運維人員豈不累死?在實際操作中,這種方式根本行不通。所以Kubernetes給我們提供了一套自動創建PV的機制Dynamic Provisioning.在沒有介紹這套自動創建機制之前,先看看Static Provisioning,什么是Static Provisioning?剛才人工創建PV PVC的方式就是Static Provisioning。你可以在PV PVC編排文件中聲明StorageClass,如果沒有聲明,那么默認為“”。具體交互流程如下所示:

靜態分配流程

首先由集群管理員事先去規劃這個集群中的用戶會怎樣使用存儲,它會先預分配一些存儲,也就是預先創建一些 PV;然后用戶在提交自己的存儲需求(PVC)的時候,Kubernetes內部相關組件會幫助它把PVC PV 做綁定;最后pod使用存儲的時候,就可以通過PVC找到相應的PV,它就可以使用了。不足之處也非常清楚,首先繁瑣,然后運維人員無法預知開發人員的真實存儲需求,比如運維人員創建了多個100Gi的PV存儲,但是在實際開發過程中,開發人員只能使用10Gi,這就造成了資源的浪費。當然Kubernetes也為我們提供更好的使用方式,即Dynamic Provisioning它是什么呢?

Dynamic Provisioning包含了創建某種PV所需要的參數信息,類似于一個創建PV的模板。具體交互流程如下所示:

Kubernetes集群中的控制器,會結合PVC和StorageClass的信息動態生成用戶所需要的PV,將PVC PV進行綁定后,pod就可以使用PV了。通過 StorageClass配置生成存儲所需要的存儲模板,再結合用戶的需求動態創建PV對象,做到按需分配,在沒有增加用戶使用難度的同時也解放了集群管理員的運維工作。

動態PV使用Dynamic Provisioning上面提到過,運維人員不再預分配PV,而只是創建一個模板文件,這個模板文件正是StorageClass。下面以NFS為例進行說明,動態PV的整個使用過程。

安裝NFS服務

#安裝nfsyum -y install nfs-utils rpcbind#開機自啟動systemctl enable rpcbind nfs-server#配置nfs 文件echo “/nfs/data *(rw,no_root_squash,sync)” 》/etc/exports

部署置備程序

apiVersion: v1

kind: ServiceAccount

metadata:

name: nfs-provisioner

---

kind: ClusterRole

apiVersion: rbac.authorization.k8s.io/v1

metadata:

name: nfs-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: [“watch”, “create”, “update”, “patch”]

- apiGroups: [“”]

resources: [“services”, “endpoints”]

verbs: [“get”,“create”,“list”, “watch”,“update”]

- apiGroups: [“extensions”]

resources: [“podsecuritypolicies”]

resourceNames: [“nfs-provisioner”]

verbs: [“use”]

---

kind: ClusterRoleBinding

apiVersion: rbac.authorization.k8s.io/v1

metadata:

name: run-nfs-provisioner

subjects:

- kind: ServiceAccount

name: nfs-provisioner

namespace: logging

roleRef:

kind: ClusterRole

name: nfs-provisioner-runner

apiGroup: rbac.authorization.k8s.io

---

kind: Deployment

apiVersion: apps/v1

metadata:

name: nfs-client-provisioner

spec:

selector:

matchLabels:

app: nfs-client-provisioner

replicas: 1

strategy:

type: Recreate

template:

metadata:

labels:

app: nfs-client-provisioner

spec:

serviceAccount: nfs-provisioner

containers:

- name: nfs-client-provisioner

image: quay.io/external_storage/nfs-client-provisioner:latest

imagePullPolicy: IfNotPresent

volumeMounts:

- name: nfs-client

mountPath: /persistentvolumes

env:

- name: PROVISIONER_NAME

value: fuseim.pri/ifs

- name: NFS_SERVER

value: 12.18.7.20

- name: NFS_PATH

value: /nfs/data

volumes:

- name: nfs-client

nfs:

server: 12.18.7.20

path: /nfs/data

創建StorageClass模板

apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: nfs-storageprovisioner: fuseim.pri/ifsreclaimPolicy: Retain

這些參數是通過Kubernetes創建存儲的時候,需要指定的一些細節參數。對于這些參數,用戶是不需要關心的,像這里provisioner指的是使用nfs的置備程序。ReclaimPolicy就是說動態創建出來的PV,當使用方使用結束、Pod 及 PVC被刪除后,這塊PV應該怎么處理,我們這個地方寫的是Retain,意思就是說當使用方pod PVC被刪除之后,這個PV會保留。

提交完成模板文件之后,用戶只需要在 Pod yaml文件定義 PVC,即可自動創建 PV和 PVC。

apiVersion: apps/v1kind: StatefulSetmetadata: name: esspec: 。。.。。.。。 template: metadata: labels: app: elasticsearch spec: 。。.。。.。。. initContainers: 。。.。。.。。 containers: - name: elasticsearch image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2 。。.。。.。 volumeClaimTemplates: - metadata: name: data labels: app: elasticsearch spec: accessModes: [ “ReadWriteOnce” ] storageClassName: nfs-storage resources: requests: storage: 50Gi`

Capacity:存儲對象的大小;

AccessModes:也是用戶需要關心的,就是說使用這個PV的方式。它有三種使用方式:ReadWriteOnce是單node讀寫訪問;ReadOnlyMany是多個node只讀訪問,常見的一種數據共享方式;ReadWriteMany是多個node上讀寫訪問;

StorageClassName:StorageClassName這個我們剛才說了,動態Provisioning時必須指定的一個字段,就是說我們要指定到底用哪一個模板文件來生成PV。

Kubernetes存儲架構

存儲架構圖

PV Controller: 負責 PV PVC的綁定、生命周期管理,并根據需求進行數據卷的 Provision Delete操作

AD Controller:負責存儲設備的 Attach Detach操作,將設備掛載到目標節點

Volume Manager:管理卷的 Mount Unmount操作、卷設備的格式化以及掛載到一些公用目錄上的操作

Volume Plugins:它主要是對上面所有掛載功能的實現。 PV Controller、AD Controller、Volume Manager 主要是進行操作的調用,而具體操作則是由 Volume Plugins實現的。根據源碼的位置可將 Volume Plugins分為 In-Tree和 Out-of-Tree兩類: In-Tree表示源碼是放在 Kubernetes內部的(常見的 NFS、cephfs等),和 Kubernetes一起發布、管理與迭代,缺點是迭代速度慢、靈活性差; Out-of-Tree的 Volume Plugins的代碼獨立于 Kubernetes,它是由存儲 提供商實現的,目前主要有 Flexvolume CSI兩種實現機制,可以根據存儲類型實現不同的存儲插件

Scheduler:實現對 Pod的調度能力,會根據一些存儲相關的的定義去做存儲相關的調度

動態PV交互流程

Kubernetes掛載Volume過程

用戶創建一個包含 PVC的 Pod

PV Controller會觀察 ApiServer,如果它發現一個 PVC已經創建完畢但仍然是未綁定的狀態,它就會試圖把一個 PV和 PVC綁定

Provision就是從遠端上一個具體的存儲介質創建一個 Volume,并且在集群中創建一個 PV對象,然后將此 PV和 PVC進行綁定

Scheduler進行多個維度考量完成后,把 Pod調度到一個合適的 Node

Kubelet不斷 watch APIServer是否有 Pod要調度到當前所在節點

Pod調度到某個節點之后,它所定義的 PV還沒有被掛載( Attach),此時 AD Controller就會調用 VolumePlugin,把遠端的 Volume掛載到目標節點中的設備上( /dev/vdb);當 Volum Manager 發現一個 Pod調度到自己的節點上并且 Volume已經完成了掛載,它就會執行 mount操作,將本地設備(也就是剛才得到的 /dev/vdb)掛載到 Pod在節點上的一個子目錄中

啟動容器,并將已經掛載到本地的 Volume映射到容器中

總結本文主要扯了如下內容,首先介紹Kubernetes中Volume、PV、PVC、StorageClass由來,然后介紹了StorageClass使用,最后簡單介紹了Kubernetes存儲架構以及動態存儲交互流程。
編輯:hfy

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲技術
    +關注

    關注

    5

    文章

    734

    瀏覽量

    45796
  • 容器
    +關注

    關注

    0

    文章

    495

    瀏覽量

    22060
  • kubernetes
    +關注

    關注

    0

    文章

    224

    瀏覽量

    8713
收藏 人收藏

    評論

    相關推薦

    VLAN 概念解析及使用場景

    1. VLAN 概念解析 VLAN(Virtual Local Area Network,虛擬局域網)是一種在交換網絡中劃分不同廣播域的技術。VLAN 的主要目的是將一個物理局域網劃分成多個邏輯
    的頭像 發表于 11-19 09:33 ?500次閱讀

    TLV320ADC3101設置AGC后調整volume無效是怎么回事?

    各位大大:我tlv320adc3101芯片設置成功,pga和volume都能單獨操作寄存器使經dac的音量增大或減小,就是本底噪音比較大,現設置agc,雙聲道設置一樣
    發表于 10-25 08:24

    Kubernetes集群搭建容器云需要幾臺服務器?

    Kubernetes集群搭建容器云需要幾臺服務器?至少需要4臺服務器。搭建容器云所需的服務器數量以及具體的搭建步驟,會根據所選用的技術棧、業務規模、架構設計以及安全需求等因素而有所不同。以下是一個基于Kubernetes集群的容器云搭建的概述:
    的頭像 發表于 10-21 10:06 ?156次閱讀

    ZCAN PRO解析的DBC Singal 起始位與XNET解析的起始位不同;解析的信號不符合大端邏輯

    上圖中的DBC文件使用記事本打開,Data_Field信號,起始位為23,長度為48,大端方式存儲;(按照這個方式存儲,明顯已經溢出) 上圖為該信號在ZCANPRO軟件中打開,解析的起始位為23
    發表于 10-18 13:53

    tas5805m調整volume或EQ之后沒有效果是什么原因?

    我使用tas5805m,目前有聲音出來,但是調整volume或EQ之后沒有效果。可能是什么原因?之前調整過BTL/PBTL是有效的。從寄存器看是0x66設為0x87了,但是設為0x86也是沒有效果。就是無論我怎么改變volume的值都沒有效果。
    發表于 10-15 07:44

    亮亮視野AR賦能標識解析體系,開啟智能制造新篇章

    近日,亮亮視野承建的工業互聯網標識解析二級節點AR應用繼續深化,二期項目升級簽約落地。AR(增強現實)技術與工業互聯網標識解析體系的結合如同兩把鑰匙共同解鎖了智能制造新世界的大門。
    的頭像 發表于 09-13 11:47 ?534次閱讀

    閃測儀的精度概念解析

    上期,小優博士講述了和白光干涉儀相關的精度概念:上期回顧BREAKAWAY與白光干涉儀相關的精度概念都有哪些|科普篇優可測今天,小優博士為大家繼續帶來《和一鍵影像測量儀相關的精度概念》一、在單視野
    的頭像 發表于 08-30 13:01 ?583次閱讀
    閃測儀的精度<b class='flag-5'>概念</b><b class='flag-5'>解析</b>

    使用Velero備份Kubernetes集群

    Velero 是 heptio 團隊(被 VMWare 收購)開源的 Kubernetes 集群備份、遷移工具。
    的頭像 發表于 08-05 15:43 ?349次閱讀
    使用Velero備份<b class='flag-5'>Kubernetes</b>集群

    如何使用Kubeadm命令在PetaExpress Ubuntu系統上安裝Kubernetes集群

    Kubernetes,通常縮寫為K8s,是一個開源的容器編排平臺,旨在自動化容器化應用的部署、擴展和管理。有了Kubernetes,您可以輕松地部署、更新和擴展應用,而無需擔心底層基礎設施。
    的頭像 發表于 07-15 13:31 ?860次閱讀
    如何使用Kubeadm命令在PetaExpress Ubuntu系統上安裝<b class='flag-5'>Kubernetes</b>集群

    虛擬存儲器的概念和特征

    用戶提供一個比物理貯存容量大得多、可尋址的“主存儲器”,從而極大地提高了計算機系統的存儲能力。本文將詳細介紹虛擬存儲器的概念、原理、特征及其在計算機系統中的應用。
    的頭像 發表于 05-24 17:23 ?1791次閱讀

    紫光展銳提出未來6G空口“一體多翼”的技術體系概念

    在6G架構/系統設計中,紫光展銳提出了未來6G空口“一體多翼”的技術體系概念,即“Big-Lite Multi-RAT”。
    的頭像 發表于 05-11 10:12 ?513次閱讀
    紫光展銳提出未來6G空口“一體多翼”的技術<b class='flag-5'>體系</b><b class='flag-5'>概念</b>

    工業互聯網標識解析體系&quot;貫通&quot;計劃公布

    據了解,這份文件是首個關于工業互聯網標識解析體系的明確指導方針。工業互聯網作為第四次工業革命的支柱,也是連接數字經濟與實體經濟的橋梁,被視為新型工業化的重大基礎設施。
    的頭像 發表于 02-02 10:05 ?572次閱讀

    Kubernetes Gateway API攻略教程

    Kubernetes Gateway API 剛剛 GA,旨在改進將集群服務暴露給外部的過程。這其中包括一套更標準、更強大的 API資源,用于管理已暴露的服務。在這篇文章中,我將介紹 Gateway
    的頭像 發表于 01-12 11:32 ?887次閱讀
    <b class='flag-5'>Kubernetes</b> Gateway API攻略教程

    使用Jenkins和單個模板部署多個Kubernetes組件

    在持續集成和部署中,我們通常需要部署多個實例或組件到Kubernetes集群中。通過Jenkins的管道腳本,我們可以自動化這個過程。在本文中,我將演示如何使用Jenkins Pipeline及單個
    的頭像 發表于 01-02 11:40 ?761次閱讀
    使用Jenkins和單個模板部署多個<b class='flag-5'>Kubernetes</b>組件

    Kubernetes RBAC:掌握權限管理的精髓

    Kubernetes RBAC(Role-Based Access Control)是 Kubernetes 中一項關鍵的安全功能,它通過細粒度的權限控制機制,確保集群資源僅被授權的用戶或服務賬號訪問。
    的頭像 發表于 12-25 09:43 ?475次閱讀
    主站蜘蛛池模板: 少妇高潮A视频| 国产啪视频在线播放观看| 在线观看国产视频| 午夜神器老司机高清无码| 日本国产黄色片| 欧美一第一页草草影院| 暖暖 视频 在线 观看 高清| 日本一本二本三区免费免费高清| 女教师跟黑人男朋友激情过后| 久久综合中文字幕佐佐木希| 精品视频中文字幕| 国产色婷婷精品人妻蜜桃成熟| 国产精品久久人妻无码蜜| 国产精品成人无码久免费| 国产成人在线观看网站| 成人毛片大全| 草莓视频在线观看完整高清免费| 99亚洲精品| bbw极度另类孕妇| 扒开女人下面使劲桶动态图| china野外18:19| thermo脱色摇床安卓下载| 啊…嗯啊好深男男高h文| 成人免费视频在线播放| 高清日本片免费观看| 国产97精品久久久天天A片| 国产 在线 亚洲 欧美 动漫| 国产国拍精品AV在线观看| 国产午夜视频在线| 花蝴蝶在线直播观看| 久久久无码精品亚洲欧美| 理论片在线观看片免费| 嗯好舒服嗯好大好猛好爽| 彭丹吃奶门| 天天影视色欲 影视| 亚洲国产亚综合在线区尤物| 一二三四在线高清中文版免费观看电影| 伊人大香人妻在线播放| 97在线精品视频免费| 成年视频xxxxxx在线| 国产久久热99视频|