Statefulset 實戰(zhàn) 1
上一部分與大家分享到 ?Statefulset ?與 RplicaSet 的區(qū)別,以及 Statefulset ?的特點,能做的一些事情及一些注意事項
現(xiàn)在我們來嘗試使用 Statefulset ?來部署我們的應(yīng)用,我們可以需要有應(yīng)用程序,然后有持久化卷
開始使用 Statefulset 部署應(yīng)用
Statefulset 部署應(yīng)用,我們需要完成這些資源的創(chuàng)建:
制作應(yīng)用程序和鏡像
編寫 Service
編寫 ?Statefulset 指定 pod 模板及掛載
制作應(yīng)用程序和鏡像
編寫應(yīng)用程序
此處我們可以制作一個應(yīng)用程序,會寫數(shù)據(jù)到磁盤的某個路徑下面,現(xiàn)在就用 golang 來簡單寫一個 http 服務(wù)器
監(jiān)聽 8080 端口
提供 GET ?和 POST 請求
收到 GET 請求的時候,讀取 ?/var/data/stateful.txt 中的內(nèi)容
收到 POST 請求的時候,會將請求的內(nèi)容寫入到 ? /var/data/stateful.txt ?文件中
文件目錄是這樣的

main.go 可以分為這幾個部分
http 服務(wù)器部分
const?(
?filePath?=?"/var/data/stateful.txt"
?fileDir??=?"/var/data"
)
func?main()?{
?r?:=?gin.Default()
?r.GET("/",?func(c?*gin.Context)?{
??str,?err?:=?readFileContent(filePath)
??if?err?!=?nil?{
???fmt.Println("?readFileContent?err?:?",?err)
???return
??}
??//輸出json結(jié)果給調(diào)用方
??c.JSON(200,?gin.H{
???"message":?str,
??})
?})
?r.POST("/",?func(c?*gin.Context)?{
??buf?:=?make([]byte,?1024)
??n,?_?:=?c.Request.Body.Read(buf)
??fmt.Println(string(buf[0:n]))
??err?:=?writeFileContent(filePath,?buf[0:n])
??if?err?!=?nil?{
???fmt.Println("?writeFileContent?err?:?",?err)
???return
??}
??//輸出json結(jié)果給調(diào)用方
??c.JSON(http.StatusOK,?gin.H{
???"message":?string(buf[0:n]),
??})
?})
?r.Run(":8080")
}
使用了 golang 中的 gin 框架,提供一個 GET 和 一個 POST 方法,GET 方法用于讀取文件內(nèi)容,POST 方法用于寫入文件內(nèi)容
寫文件部分
func?processFileErr(err?error,?file?string)?(*os.File,?error)?{
?var?f?*os.File
?if?os.IsNotExist(err)?{
??gErr?:=?os.MkdirAll(fileDir,?0775)
??if?gErr?!=?nil?{
???fmt.Println("MkdirAll?file?error?:?",?gErr)
???return?nil,?gErr
??}
??f,?gErr?=?os.Create(file)
??if?gErr?!=?nil?{
???fmt.Println("Create?file?error?:?",?gErr)
???return?nil,?gErr
??}
?}?else?{
??fmt.Println("OpenFile?file?error?:?",?err)
??return?nil,?err
?}
?return?f,?nil
}
func?writeFileContent(file?string,?content?[]byte)?error?{
?f,?err?:=?os.OpenFile(file,?os.O_RDWR|os.O_CREATE|os.O_TRUNC,?0775)
?if?err?!=?nil?{
??var?pErr?error
??f,?pErr?=?processFileErr(err,?file)
??if?pErr?!=?nil?{
???fmt.Println("processFileErr?error?:?",?pErr)
???return?pErr
??}
?}
?defer?f.Close()
?fmt.Println("Write?content?:?",?string(content))
?_,?err?=?f.Write(content)
?if?err?!=?nil?{
??fmt.Println("Write?file?error?:?",?err)
??return?err
?}
?return?nil
}
writeFileContent ?方法主要是用來寫入數(shù)據(jù)到文件中
processFileErr 會處理文件不存在的錯誤信息,同時會創(chuàng)建不存在的路徑和文件,并返回創(chuàng)建文件的文件指針
讀取文件信息部分
func?readFileContent(file?string)?(string,?error)?{
?f,?err?:=?os.OpenFile(file,?os.O_RDWR|os.O_CREATE,?0775)
?if?err?!=?nil?{
??var?pErr?error
??f,?pErr?=?processFileErr(err,?file)
??if?pErr?!=?nil?{
???fmt.Println("processFileErr?error?:?",?pErr)
???return?"",?pErr
??}
?}
?defer?f.Close()
?buf?:=?make([]byte,?1024)
?n,?err?:=?f.Read(buf)
?if?err?==?io.EOF?{
??return?"",?nil
?}
?if?err?!=?nil?{
??fmt.Println("Read?file?error?:?",?err)
?}
?fmt.Println("read?content?:?",?string(buf))
?return?string(buf[0:n]),?nil
}
讀取文件部分,同樣需要使用 processFileErr 處理文件不存在的錯誤信息,主要是從傳入的文件中讀取文件內(nèi)容,以字符串的形式作為函數(shù)返回值
制作鏡像
Dockerfile:
將 myhttp 可執(zhí)行程序加入到鏡像中
FROM?node:7
ADD?myhttp?/myhttp
ENTRYPOINT?["./myhttp"]
執(zhí)行如下指令制作鏡像:
看到這里的兄弟,請將鏡像傳到你自己的賬號下面,記得登錄哦
docker?build?-t?xiaomotong888/sta-kubia?.
docker?push?xiaomotong888/sta-kubia
上傳鏡像之后,我們可以通過 docker search 賬號名 來查看自己的鏡像列表,看到如下內(nèi)容,說明可以往下繼續(xù)完成其他步驟了

編寫 Service
接下來便是編寫 Service 部分的清單了,我們在玩 Statefulset 管理 pod 的時候,咱們創(chuàng)建的是有狀態(tài)的 pod,咱們還需要創(chuàng)建一個 headless Service 來給 pod 之間提供網(wǎng)絡(luò)標(biāo)識
例如,我們可以這樣來創(chuàng)建
sta-service.yaml
apiVersion:?v1
kind:?Service
metadata:
??name:?sta-kubia
spec:
??clusterIP:?None
??selector:
????app:?sta-kubia
??ports:
??-?name:?http
????port:?80
創(chuàng)建的一個 Service
名稱為 sta-kubia
選擇的 pod 標(biāo)簽是 ?sta-kubia
svc 集群內(nèi)部的端口是 80
這里需要注意的是,我們之前寫 Service 清單的時候,如果不指定 type,那么 Service 默認(rèn)是 clusterIP,但是現(xiàn)在我們是連 clusterIP 都不想要,我們需要將 clusterIP 置為 None
通過 kubectl create -f sta-service.yaml 創(chuàng)建一個 Service ,可以看到 CLUSTER-IP 一欄為 None 即為正確創(chuàng)建好 Service


curl?localhost:8001/api/v1/namespaces/default/pods/sta-kubia-0/proxy/

curl??-X?POST?-d?'helloworld?sta-kubia-0'?localhost:8001/api/v1/namespaces/default/pods/sta-kubia-0/proxy/


今天就到這里,學(xué)習(xí)所得,若有偏差,還請斧正
歡迎點贊,關(guān)注,收藏
朋友們,你的支持和鼓勵,是我堅持分享,提高質(zhì)量的動力

好了,本次就到這里
技術(shù)是開放的,我們的心態(tài),更應(yīng)是開放的。擁抱變化,向陽而生,努力向前行。
我是阿兵云原生,歡迎點贊關(guān)注收藏,下次見~