开发和运维对K8S中的应用都做了什么?
開發(fā)和運維對K8S中的應用都做了什么
?
在應用的整個生命周期里 ,開發(fā)和運維都和它密不可分。一個塑造它 ,一個保養(yǎng)它。
如果應用需要部署到K8S中 ,開發(fā)和運維在其中都做了什么呢?
開發(fā)側
從開發(fā)側來說 ,我們的應用應該具備以下能力:
具有健康檢測接口
具有優(yōu)雅退出能力
具有metrics接口
能夠接入鏈路追蹤系統(tǒng)
日志輸出標準統(tǒng)一
定義健康檢測接口
健康檢測接口用于檢測應用的健康狀態(tài) ,在K8S中,使用Readiness和Liveness分別來探測應用是否就緒和是否存活,如果未就緒或者未存活 ,K8S會采取相應的措施來確保應用可用 。
如果我們應用未定義好相應的健康檢測接口 ,K8S就無法判斷應用是否正??捎?,整個應用對我們來說就是黑匣子,也就談不上應用穩(wěn)定性了 。
定義一個簡單的健康檢測接口如下 :
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": "健康檢測頁面",
"status": "OK",
})
}
如上我們定義了health接口,當應用啟動后
,只需要探測這個接口,如果返回OK
,表示應用是正常的。
當然 ,上面的接口是非常簡單的,在實際情況下 ,應用本身也許還依賴起來應用,比如redis,mysql ,mq等,如果它們異常 ,應用是不是異常的呢?那我們的應用健康檢測需不需要檢測其他應用的健康狀態(tài)呢?
既然我們定義好了健康檢測接口,那我們的YAML模板就可以增加健康檢測功能,如下:
readinessProbe:
httpGet:
path: /health
port: http
timeoutSeconds: 3
initialDelaySeconds: 20
livenessProbe:
httpGet:
path: /health
port: http
timeoutSeconds: 3
initialDelaySeconds: 30
定義優(yōu)雅下線功能
應用發(fā)版是常規(guī)不能再常規(guī)的操作 ,通常情況下都是滾動更新的方式上線