我們?cè)谧鋈罩臼占桨高x型的時(shí)候,ops 給的方案是日志先落盤老翘,然后再做收集芹啥。這樣做有一個(gè)好處,對(duì)應(yīng)用沒有影響铺峭,據(jù)說其他公司有通過網(wǎng)絡(luò)收集日志的墓怀,后來收集系統(tǒng)出故障導(dǎo)致應(yīng)用 hang 住。 ops 推薦使用了 flexvolume 插件來支持可擴(kuò)展 lvm 方案
學(xué)習(xí)了解:
先推薦幾個(gè)經(jīng)典的教程:
https://diamanti.com/flexvolume-explored/
https://github.com/kubernetes/kubernetes/tree/master/examples/volumes/flexvolume
http://leebriggs.co.uk/blog/2017/03/12/kubernetes-flexvolumes.html
官網(wǎng)的例子在 https://github.com/kubernetes/community/blob/master/contributors/devel/flexvolume.md
簡單說卫键,flexvolume 支持用戶自定義 volume driver, 這種方式非常靈活傀履,driver 只需要定義實(shí)現(xiàn)幾個(gè)接口即可
- init
- attach
- detach
- mount
- unmount
官網(wǎng)用的 bash 定義的 lvm driver 應(yīng)該是使用最廣泛的,這個(gè)不限于 bash, 還可以使用其他語言實(shí)現(xiàn)這些接口莉炉, 使用 bash 應(yīng)該是考慮通用性方面钓账。
使用 xfs 文件系統(tǒng)做 lvm 遇到的坑點(diǎn)
雖然 lvm shell 腳本中的幾個(gè)函數(shù)非常簡單,但還是免不了遇到問題絮宁。我們?cè)賶簻y(cè)創(chuàng)建 100個(gè) deployment (每一個(gè)掛一個(gè) xfs 的lvm volume)梆暮,每次壓測(cè)會(huì)有一個(gè) volume mount 失敗,導(dǎo)致 pod 一致再 containterCreating 狀態(tài)中,
通過日志發(fā)現(xiàn)绍昂,正在 mount 的 volume type 類型是 xfs_external_log, 通過科普發(fā)現(xiàn) xfs 還有 logdev 這種 volume 類型惕蹄,看一下 lvm 的實(shí)現(xiàn)中
VOLFSTYPE=`blkid -o udev ${DMDEV} 2>/dev/null|grep "ID_FS_TYPE"|cut -d"=" -f2`
if [ "${VOLFSTYPE}" == "" ]; then
mkfs -t ${FSTYPE} ${DMDEV} >/dev/null 2>&1
if [ $? -ne 0 ]; then
err "{ \"status\": \"Failure\", \"message\": \"Failed to create fs ${FSTYPE} on device ${DMDEV}\"}"
exit 1
fi
fi
如果發(fā)現(xiàn) volume type 為空就做格式化,但是缺漏掉了 xfs_external_log 這種類型,xfs_external_log 類型也需要做初始化才能 mount 成功. 可以更改為
if [ "${VOLFSTYPE}" == "" ] || [ "${VOLFSTYPE}" == "xfs_external_log" ]
這樣就避免了 xfs_external_log 類型的 volume mount 失敗卖陵。
flexvolume 的插件是都在 k8s 集群外部實(shí)現(xiàn)的遭顶,維護(hù)沒有那么方便,看官方已經(jīng)有 pr 在 k8s 內(nèi)部實(shí)現(xiàn)第三方 volume 插件的支持, 期待中 ...