Kubernetes CKA課程筆記 54

Configure Data Persistence — 設計建立HostPath Volume取用

ZONGRU Li
9 min readNov 16, 2021

如前面介紹的,我們可以設計各種不同的Volume提供給應用程式使用:

link

Volume的種類則大致由data儲存在哪,來加以區分為三類:

  1. Cloud Storage
  2. Remote Storage(這個也會是正式環境最常用的,儲存重要的Data)
  3. Local Storage(通常用在Data沒那麼重要的測試環境)

Local Storage中的其中一種 — hostPath

hostPath:

  • 很容易設定(因為碰不到遠端介面/平台)
  • →通常只用來做單一Node測試
  • 若是Multi-Node建議用其他的Local Volume
  • →並且有許多的安全性問題,盡量能不用就不用

但是hostPathCKA考試測驗的一個題目

本篇筆記重點將示範使用hostPath:

  • 1.首先建立PersistentVolume(PV),並且以hostPath做為背後儲存Storage
  • 亦即以local機器(如後面範例就是隨意worker node)
  • worker node機台上指定的一個路徑當作儲存位置來提供給應用程式使用
  • 2.上述PV建好後,接著就是建立PVC(PersistentVolumeClaim)
  • PVC將對PV進行儲存空間的請求
  • 若當PV有很多個,則PVC會對合適的那一個PV進行空間請求
  • 3.接著就是建立Deployment裡面定義的Pod來取用Volume
  • 正確來說是Pod取用PVC

建立PersistentVolume(PV):

首先嘗試透過指令查詢如何建立PV,執行:

kubectl create --help

也就是並不是所有物件在kubectl create指令都有包含

這時候就要轉往官網找相關Configuration File範例

link

接著開始嘗試建立PersistentVolumeConfiguration檔:

先填到name

下圖我找出背後不同實體Storage的spec寫法範例,都不一樣!!!

這邊只找到OCP doc有範例,其他少有看到awsElasticBlockStore的storage的PV寫法範例

接著參考下圖hostPath的寫法決定路徑與size:

link
填好hostPath的路徑與大小

接著參考下表來看看Access Mode:

link
儲存後建立

查看建立的PersistentVolume(PV)執行:

kubectl get pv

link

建立PersistentVolumeClaim(PVC):

一樣建立Configuration檔案:

同樣官網找一個範例:

link

接著spec內容要定義幾個項目:

1.透過PVC要提供給Pod多少physical storage

這邊要注意,因為PVC與PV是分開建立的

我們暫時不管Cluster提供多少Volume可供調用或Volume種類也先不管

我們將建立一個(PVC)claim,將會自動的找到適合的PV

亦即我們是定義一個wish(願望)般

讓這個claim自動對應PV及其背後的storage

2.接著accessModes即完成!

完成後儲存!

接著就是執行建立,並執行以下指令確認PVC:

kubectl get pvc

再來看看原本PV的狀態:

PV的狀態由Available轉為Bound!

這邊可以注意,PV提供10G,但是PVC只要求5G

兩個PVPVC已完成綁定,代表PV就算剩餘5G,仍無法提供給下一個PVC取用

除非這個PVC釋放!!!(如下圖,其實有一半空間浪費了)

PV:10G, PVC:只要5G,但是PV另外剩的5G就沒法給人

所以盡量想辦法讓PVPVC提供與要求大小一致會比較好!!

建立Deployment裡面的Pod來調用上述的PVC:

貼上基本Deployment Configuration File的範例:

在上圖Deployment Configuration File內容底下

1.在container同階層處插入PVC:

2.接著要讓Container取用上述插入的PVC,並綁定給Container內某個路徑

如上圖,將方才插入的db-data這個volume導入給container使用

並指定到路徑:/var/lib/mqsql目錄下

對於這個PodContainer來說其實根本不在意這個Volume實際實體在哪裡

最後還要幫mqsql透過環境變數建立密碼,參考:

link

完成如下

儲存並建立!

接著做一些確認:

Pod有出來!

實際要看看Pod是否有插入Volume則要使用describe指令,執行:

kubectl describe pod {pod name}

太長,看下一張圖

接著當然就是進到Pod的Container裡面看看,執行:

kubectl exec -it {Pod name} -- bash

該路徑下的檔案都是mqsql建立的檔案

如上圖

亦即mysql建立在/var/lib/mysql目錄下的檔案,即便現在這個mysql Pod掛了

該目錄下的檔案都還會在!

至於在哪呢? 當然就是前面PV的指定路徑拉:

至於實體哪一台的這個路徑呢?

我們可以在看一次describe Pod:

所以我們嘗試去到worker2機台上找找看!!!

然後就會見到:

比對圖如下:

我們嘗試也看看另一台worker1該目錄:

以上即完成整個示範!

但是還是要強調建議只將hostPath用做測試,或是存放不重要的資料

並且K8s官網也是不建議使用hostPath

更別把它用在正式環境!

另外就是完成以上範例後知曉Pod去插入PVCContainer使用

PVC去請求PV

當哪一天更換儲存的Storage的時候,就只要改改PV的設定就好

其他ContainerPVC基本不用調整

也就是開發者不用異動Deployment Configuration File或說裡面的Pod

次日補充:

由於上完課後我都會關閉wokrer機,後來隔天上課開機後Pod長到worker1

然後真的看到worker1內有:

但是當然要回頭看看前一天worker2的相同目錄:

也都還在

比對檔案時間好像都沒差:

worker1
worker2

改天放個檔案在重啟試看看

2021/11/20周末:

一樣使用mysql-deployment.yaml內容如下:

先以上述deployment檔案直接建立:

確認當下Pod長在哪裡:

是在worker2!

確認worker2/mnt/data目錄:

同理確認worker1

接著嘗試直接進到mysql Container內echo一個檔案出來:

實驗結束移除:

參考課程(reference)

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet