Kubernetes的Local Persistent Volumes使用小記

2020-12-15 程式設計師欣宸

歡迎訪問我的GitHub

https://github.com/zq2599/blog_demos

內容:所有原創文章分類匯總及配套源碼,涉及Java、Docker、Kubernetes、DevOPS等;

關於Local Persistent Volumes

文中將Local Persistent Volumes簡稱為Local PV;

Kubernetes的Local PV自1.7版本進行alpha發布,在1.10版本beta發布,最終的正式發布(General Availability)是在1.14版本;一個Local PV對應指定節點上的一處本地磁碟空間;相比NFS之類的遠程存儲,Local PV提供了本地IO帶來的更好性能;和HostPath Volume的區別Local PV出現之前,使用本地磁碟的方法是HostPath Volume,同為使用本地磁碟,區別在哪呢?最重要的區別,就是Local PV和具體節點是有關聯的,這意味著使用了Local PV的pod,重啟多次都會被Kubernetes scheduler調度到同一節點,而如果用的是HostPath Volume,每次重啟都可能被Kubernetes scheduler調度到新的節點,然後使用同樣的本地路徑;當我們要用HostPath Volume的時候,既可以在PVC聲明,又可以直接寫到Pod的配置中,但是Local PV只能在PVC聲明,對於PV資源,通常都有專人管理,這樣就避免了Pod開發者擅自使用本地磁碟帶來的衝突和風險;另外要注意的是,HostPath Volume和Local PV都是在使用本地磁碟,和常見的分布式文件系統相比,本地磁碟故障會導致數據丟失,保存重要數據請勿使用HostPath Volume和Local PV;基本概念說完了,接下來實戰體驗;

實戰環境信息

作業系統:CentOS Linux release 7.8.2003 (Core)kubernetes:1.15.3helm:2.16.1體驗Local PV的步驟簡述本次實戰的目標是快速創建Local PV,並驗證該Local PV正常可用,全文由以下部分組成:創建Local PV;通過helm下載tomcat的chart;修改chart,讓tomcat使用剛才創建的Local PV;部署tomcat;在伺服器上檢查文件夾已正常寫入;參考文章如果您想了解Kubernetes和helm的更多信息,請參考:《kubespray2.11安裝kubernetes1.15》《部署和體驗Helm(2.16.1版本)》準備完畢,開始實操;

創建PV

在kubernetes工作節點創建文件夾給Local PV使用,我這是:/root/temp/202005/24/local-pv/給上述文件夾讀寫權限:chmod -R a+r,a+w /root/temp/202005/24/local-pv創建文件local-storage-pv.yaml,內容如下:apiVersion: v1kind: PersistentVolumemetadata: name: example-pvspec: capacity: storage: 10Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Delete storageClassName: local-storage local: path: /root/temp/202005/24/local-pv nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node1關於local-storage-pv.yaml有以下幾點需要注意:a. spec.storageClassName等於local-storage,後面的PVC中也要指定storageClassName等於local-storage;b. spec.nodeAffinity是必填參數,用於建立Local PV和節點的關係,spec.nodeAffinity.required,nodeSelectorTerms.matchExpressions.values的值包含node1,表示該Local PV可以在主機名為node1的節點創建;執行命令kubectl apply -f local-storage-pv.yaml,即可創建PV;執行kubectl describe pv example-pv檢查是否創建成功,如下圖紅框所示,此PV已經可用:

使用PV接下來通過helm部署tomcat,並且讓tomcat使用上述Local PV,請確保helm已經裝好;增加helm倉庫(帶有tomcat的倉庫):helm repo add bitnami https://charts.bitnami.com/bitnami下載tomcat的chart:helm fetch bitnami/tomcatchart下載成功後,當前目錄出現tomcat配置壓縮包tomcat-6.2.4.tgz,解壓:tar -zxvf tomcat-6.2.4.tgz解壓得到tomcat文件夾,進入後打開values.yaml文件,找到persistence節點,增加下圖紅框中的內容:

在tomcat目錄下執行命令:helm install --name-template tomcat001 -f values.yaml . --namespace hello-storageclass查看tomcat的pod和service情況,一切正常,並且埠映射到了宿主機的31835:

瀏覽器訪問宿主機IP:31835,出現tomcat歡迎頁面:

去目錄/root/temp/202005/24/local-pv/檢查磁碟使用情況,如下圖,可見已分配給tomcat的PVC,並且寫入了tomcat的基本數據:

再次查看Local PV,發現狀態已經改變:

至此可以確認,tomcat用上了Local PV,數據被保存在宿主機的指定文件夾;清理Local PV一般來說,清理PV要做如下操作:a. 刪除pod,或者deployment;b. 刪除pvc;c. 刪除Local PV;這裡由於用上了helm,因此通過helm將上述步驟1和2執行掉,既命令helm delete tomcat001再在local-storage-pv.yaml所在目錄執行kubectl delete -f local-storage-pv.yaml即可刪除Local PV;至此,Local PV的學習和實踐就完成了,如果您正在使用這種存儲,希望本文能給您一些參考;

你不孤單,欣宸原創一路相伴

Java系列Spring系列Docker系列kubernetes系列資料庫+中間件系列DevOps系列歡迎關注公眾號:程式設計師欣宸

微信搜索「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界...

相關焦點

  • 深入解析Kubernetes service 概念
    在Kubernetes中,每個節點都安裝了kube-proxy,kube-proxy通過kubernetes中固有的watch請求方法持續監聽apiserver。SessionAffinity在決定使用哪個後端Pod時,kube-proxy會考慮服務的設置。最後,用戶控制項代理安裝iptables規則,以獲取服務clusterIP和流量port。規則將流量重定向到代理後端Pod的埠。
  • vSphere with Kubernetes實戰之:用戶訪問控制 - 文章精選 - CTI...
    通過使用kubernetes的RBAC,「Namespace管理員」可以將集群管理員角色或更加細粒度的權限分配給其他用戶和組,這些用戶稱為「Tanzu集群開發者」,他們負責在Tanzu Kubernetes集群上開發和部署應用程式。
  • persistent什麼意思
    persistent什麼意思單詞解析per,每個。per前綴,表示徹底的、貫穿的,更多例子還有:perform, perfect, perfume, etc.persistent,持續的、頑強存在的、堅持不懈的、執意的(這裡的執意依舊是以一種不講道理的方式,畢竟是從persist發展過來的)。 學單詞,只記住意思可不行,會用才行,小夥伴們可以在評論區造句,我們一起學習哦!
  • Openstack+Kubernetes+Docker+Grafana全鏈路環境搭建演示
    彈性伸縮:        使用命令、UI或者基於CPU使用情況自動快速擴容和縮容應用程式實例,保證應用業務高峰並發時的高可用性;業務低峰時回收資源,以最小成本運行服務。    自動部署和回滾:   K8S採用滾動更新策略更新應用,一次更新一個Pod,而不是同時刪除所有Pod,如果更新過程中出現問題,將回滾更改,確保升級不受影響業務。
  • Kubernetes Operator 開發教程
    如果說 Kubernetes 是 "作業系統" 的話,Operator 是 Kubernetes 的第一層應用,它部署在 Kubernetes 裡,使用 Kubernetes "擴展資源" 接口的方式向更上層用戶提供服務。Operator的實現方式主要包括OperatorSDK和KubeBuilder,目前KubeBuilder在阿里使用的比較多。
  • 巧用 K3s 和 Traefik 快速搭建本地 Kubernetes 集群
    現在讓我們來看看如何使用 k3d 建立一個集群。使用 k3d 啟動集群首先先獲取 k3d,通過 https://github.com/rancher/k3d#get 獲取安裝方式。群集的部署沒有使用默認的 Traefik Ingress 控制器。為什麼要禁用 Traefik?因為我們可能想使用另一個 Ingress 控制器,或者因為 k3s 默認是與 Traefik 1 綁定在一起的,後面我們會安裝Traefik 2 版本。
  • 使用 IPVS 實現 Kubernetes 入口流量負載均衡
    一般情況下,很少會遇到伺服器接受非自身綁定 IP 流量的情況,所以 externalIPs 不常被使用,但配合網絡層的其他工具,它可以實現給 Service 綁定外部 IP 的效果。今天我們將使用 externalIPs 配合 IPVS 的 DR(Direct Routing )模式實現將外部流量引入到集群內部,同時實現負載均衡。
  • 使用 Kubernetes 最易犯的 10 個錯誤
    對於使用 Linux 內核中的 CPU CFS quota 來控制對 CPU 的使用,或關閉 CPU CFS quota 並用 CPU limit 設置來代替,這兩種方式到底孰優孰劣?有一個公開的討論,結論是 CPU limit 這個設置可能會導致更多的問題。內存的過量使用會給你帶來更多的麻煩。
  • ARM64 平臺基於 openEuler + iSula 環境部署 Kubernetes
    添加 Kubernetes 源在文件 /etc/yum.repos.d/openEuler.repo 中追加如下內容:[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64/enabled
  • ThreadLocal的使用和實現原理
    ThreadLocal的使用和實現原理ThreadLocal是什麼?This class provides thread-local variables.使用其實很簡單,保存值就調用set方法,獲得值調用get方法,最後調用remove方法刪除數據,防止內存洩漏和數據混亂。
  • 2020版Kubernetes快速上手指南,讓你所見即所得
    Docker引擎:底層運行環境,可以是docker、rtk或其他引擎;核心概念Pod:最小的調度分配單元使用kubeadm創建群集,命令如下:sudo kubeadm init --kubernetes-version=$(kubeadm version -o short) --pod-network-cidr=10.244.0.0/16正確執行三個步驟後,如果出現如下類似提示
  • 《蹲坑學kubernetes》之17-14:ServerAccount
    《蹲坑學kubernetes》之17-14:ServerAccountAPI Server作為Kubernetes網關,是訪問和管理資源對象的唯一入口,其各種集群組件訪問資源都需要經過網關才能進行正常訪問和管理。
  • 俠說java8-LocalDateTime等時間使用手冊(全),先mark後看
    如何更好的熟悉使用時間api也是學習java8的一個很重要的知識點,下面我們一起來學習學習。本篇文章代碼比較多,可以作為工具,需要使用時,再來查閱。目錄1.普通Date時間如何轉為LocalDateTime?以上是從普通的Date對象轉換成java8時間的操作步驟,需要特別注意下時區的問題。
  • 踢掉Docker 後,Kubernetes 還能歡快地跑 GPU?
    Kubernetes 集群中 Docker 如何使用 GPU 早就被說爛了,那麼以 Containerd 作為容器運行時的集群是如何使用 GPU的,有人知道嗎?
  • Kubernetes 1.20 發布:妙啊 - OSCHINA - 中文開源技術交流社區
    現在官方也不推薦使用 Docker 的 Container Runtime Interface(CRI)shim。由於 Docker image 遵循開放容器倡議(OCI)image 規範,因此 Docker 產生的 image 將在所有 CRI 兼容運行時中繼續在集群中工作。Exec 探針超時的長期錯誤已修復,該錯誤可能會影響到現有的 Pod 定義。
  • 將 Docker 踢出群聊後,Kubernetes 還能否歡快地蹦躂嗎?
    下面進入今天的主題,Kubernetes 具有對機器的資源進行分配和使用的能力,比如可以指定容器最多使用多少內存以及使用多少 CPU 計算資源。那麼問題來了,一般來說容器就是使用 CPU 和內存資源,那麼對於需要使用顯卡的 Pod,Kubernetes 也能夠支持嗎?答案當然是可以啦!
  • Kubernetes 1.19 發布 - OSCHINA - 中文開源技術交流社區
    無論用戶使用的是自建版還是商業發行版,情況都是如此。因此,延長支持期將導致超過 80% 的用戶使用受支持的版本,而不是現在的 50-60%。一年一度的支持期可為用戶提供所需的緩衝期,並且更符合熟悉的年度規劃周期。從 Kubernetes 1.19 版本開始,支持窗口將延長到一年。