开发和运维对K8S中的应用都做了什么?
開發(fā)和運(yùn)維對(duì)K8S中的應(yīng)用都做了什么
?
在應(yīng)用的整個(gè)生命周期里,開發(fā)和運(yùn)維都和它密不可分。一個(gè)塑造它 ,一個(gè)保養(yǎng)它 。
如果應(yīng)用需要部署到K8S中,開發(fā)和運(yùn)維在其中都做了什么呢 ?
開發(fā)側(cè)
從開發(fā)側(cè)來(lái)說(shuō) ,我們的應(yīng)用應(yīng)該具備以下能力:
具有健康檢測(cè)接口
具有優(yōu)雅退出能力
具有metrics接口
能夠接入鏈路追蹤系統(tǒng)
日志輸出標(biāo)準(zhǔn)統(tǒng)一
定義健康檢測(cè)接口
健康檢測(cè)接口用于檢測(cè)應(yīng)用的健康狀態(tài) ,在K8S中,使用Readiness和Liveness分別來(lái)探測(cè)應(yīng)用是否就緒和是否存活 ,如果未就緒或者未存活,K8S會(huì)采取相應(yīng)的措施來(lái)確保應(yīng)用可用 。
如果我們應(yīng)用未定義好相應(yīng)的健康檢測(cè)接口,K8S就無(wú)法判斷應(yīng)用是否正常可用,整個(gè)應(yīng)用對(duì)我們來(lái)說(shuō)就是黑匣子,也就談不上應(yīng)用穩(wěn)定性了。
定義一個(gè)簡(jiǎn)單的健康檢測(cè)接口如下:
package router
import (
"github.com/gin-gonic/gin"
v1 "go-hello-world/app/http/controllers/v1"
)
funcSetupRouter(router *gin.Engine) {
ruc := new(v1.RootController)
router.GET("/", ruc.Root)
huc := new(v1.HealthController)
router.GET("/health", huc.HealthCheck)
}
package v1
import (
"github.com/gin-gonic/gin"
"go-hello-world/app/http/controllers"
"go-hello-world/pkg/response"
"net/http"
)
type HealthController struct {
controllers.BaseController
}
func(h *HealthController)HealthCheck(c *gin.Context) {
response.WriteResponse(c, http.StatusOK, nil, gin.H{
"result": "健康檢測(cè)頁(yè)面",
"status": "OK",
})
}
如上我們定義了health接口,當(dāng)應(yīng)用啟動(dòng)后,只需要探測(cè)這個(gè)接口,如果返回OK,表示應(yīng)用是正常的。
當(dāng)然 ,上面的接口是非常簡(jiǎn)單的 ,在實(shí)際情況下,應(yīng)用本身也許還依賴起來(lái)應(yīng)用,比如redis,mysql,mq等,如果它們異常,應(yīng)用是不是異常的呢?那我們的應(yīng)用健康檢測(cè)需不需要檢測(cè)其他應(yīng)用的健康狀態(tài)呢 ?
既然我們定義好了健康檢測(cè)接口 ,那我們的YAML模板就可以增加健康檢測(cè)功能,如下:
readinessProbe:
httpGet:
path: /health
port: http
timeoutSeconds: 3
initialDelaySeconds: 20
livenessProbe:
httpGet:
path: /health
port: http
timeoutSeconds: 3
initialDelaySeconds: 30
定義優(yōu)雅下線功能
應(yīng)用發(fā)版是常規(guī)不能再常規(guī)的操作 ,通常情況下都是滾動(dòng)更新的方式上線,也就是先起一個(gè)新應(yīng)用,再刪一個(gè)老應(yīng)用。
如果這時(shí)候老應(yīng)用有部分的流量,突然把老應(yīng)用的進(jìn)程殺了 ,這部分流量就無(wú)法得到正確的處理,部分用戶也會(huì)因此受到影響。
怎么才會(huì)不受影響呢 ?
假如我們?cè)谕V箲?yīng)用之前先告訴網(wǎng)關(guān)或者注冊(cè)中心,等對(duì)方把我們應(yīng)用摘除后再下線,這樣就不會(huì)有任何流量受到影響了 。
在K8S中