我們在做日志收集方案選型的時候,ops 給的方案是日志先落盤,然后再做收集。這樣做有一個好處,對應(yīng)用沒有影響,據(jù)說其他公司有通過網(wǎng)絡(luò)收集日志的,后來收集系統(tǒng)出故障導(dǎo)致應(yīng)用 hang 住。 ops 推薦使用了 flexvolume 插件來支持可擴展 lvm 方案
學(xué)習(xí)了解:
先推薦幾個經(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 只需要定義實現(xiàn)幾個接口即可
- init
- attach
- detach
- mount
- unmount
官網(wǎng)用的 bash 定義的 lvm driver 應(yīng)該是使用最廣泛的,這個不限于 bash, 還可以使用其他語言實現(xiàn)這些接口, 使用 bash 應(yīng)該是考慮通用性方面。
使用 xfs 文件系統(tǒng)做 lvm 遇到的坑點
雖然 lvm shell 腳本中的幾個函數(shù)非常簡單,但還是免不了遇到問題。我們再壓測創(chuàng)建 100個 deployment (每一個掛一個 xfs 的lvm volume),每次壓測會有一個 volume mount 失敗,導(dǎo)致 pod 一致再 containterCreating 狀態(tài)中,
通過日志發(fā)現(xiàn),正在 mount 的 volume type 類型是 xfs_external_log, 通過科普發(fā)現(xiàn) xfs 還有 logdev 這種 volume 類型,看一下 lvm 的實現(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 集群外部實現(xiàn)的,維護沒有那么方便,看官方已經(jīng)有 pr 在 k8s 內(nèi)部實現(xiàn)第三方 volume 插件的支持, 期待中 ...