由云原生平臺管理的容器化應(yīng)用,并不能控制其自身的生命周期劈猪。它們必須監(jiān)聽由管理平臺發(fā)出的事件途戒,再對生命周期做出相對應(yīng)的變更。所謂的生命周期管理件豌,即代表應(yīng)用該如何讀取和響應(yīng)這些由管理平臺發(fā)出的生命周期事件疮方。
鑒于某些管理策略或者外部環(huán)境因素,在任意時間點茧彤,管理平臺都有可能需要啟動或者終止容器中的應(yīng)用骡显。容器化應(yīng)用可以決定平臺發(fā)出的哪些事件是重要的,應(yīng)該以怎樣的行為去響應(yīng)曾掂。這實際上是一個平臺用來同應(yīng)用進行溝通惫谤、向應(yīng)用發(fā)送命令的 API,應(yīng)用可以選擇接受或者忽略遭殉。
僅僅使用進程模型來啟動和終止應(yīng)用通常是不夠的石挂,現(xiàn)實世界中的應(yīng)用往往需要更細粒度的交互控制和生命周期管理。有些應(yīng)用需要 warm up险污,有些需要一個平滑痹愚、干凈的關(guān)閉流程富岳。因而 Kubernetes 設(shè)計了如下幾種由平臺發(fā)出的事件,容器可以選擇監(jiān)聽和響應(yīng)這些事件拯腮。
SIGTERM Signal
當(dāng) Kubernetes 決定關(guān)閉某個容器時窖式,該容器會收到一個 SIGTERM 信號,之后容器會嘗試盡快完成關(guān)閉流程动壤。對于某些應(yīng)用來說萝喘,干凈的快速終止是可行的。但另外一些應(yīng)用有可能需要完成處理中的請求琼懊,釋放打開的連接阁簸,清理臨時文件等。這會耗費更多的時間哼丈。
SIGKILL Signal
當(dāng)某個容器進程在收到 SIGTERM 信號后并沒有關(guān)閉启妹,接下來它會再收到一個 SIGKILL 信號強制終止進程。默認情況下醉旦,Kubernetes 會在發(fā)出 SIGTERM 信號 30 秒后再發(fā)送 SIGKILL饶米。這個 30 秒的過渡時間可以通過 Pod 的 .spec.terminationGracePeriodSeconds
字段進行配置。
Poststart Hook
僅僅使用進程信號來管理生命周期有一定程度的限制车胡。因而 Kubernetes 又提供了 postStart
和 postStop
檬输。
postStart
示例:
apiVersion: v1
kind: Pod
metadata:
name: post-start-hook
spec:
containers:
- image: k8spatterns/random-generator:1.0
name: random-generator
lifecycle:
postStart:
exec:
command:
- sh
- -c
- sleep 30 && echo "Wake up!" > /tmp/postStart_done
postStart
指定的命令會在容器創(chuàng)建后執(zhí)行,與容器的基礎(chǔ)進程異步匈棘。postStart
是一種阻塞請求丧慈,其 handler 完成之前,容器會一直處于 Waiting 狀態(tài)主卫,同時 Pod 處于 Pending 狀態(tài)伊滋。
postStart
的這種特性可以用來延遲容器的啟動,為容器的主進程的初始化爭取時間队秩。
另一個 postStart
的使用場景就是在 Pod 不滿足特定的前提條件時,阻止容器完成啟動昼浦。當(dāng) postStart
命令返回了一個非 0 的返回值馍资,主進程會被 Kubernetes 殺掉。
類似于 Health Probe关噪,postStart 和 preStop 有如下兩種 handler 類型:
- exec:在容器中直接運行一個命令
- httpGet:向容器開放的某個端口發(fā)送 HTTP GET 請求
對于 postStart 執(zhí)行的邏輯鸟蟹,需要注意以下幾點:
- postStart 與容器進程是并行的關(guān)系,因而這個 hook 有可能在容器啟動前執(zhí)行
- postStart 有至少執(zhí)行一次的目標(biāo)使兔,需要考慮重復(fù)執(zhí)行的情況
- 對于失敗的 HTTP 請求建钥,postStart 不會重復(fù)嘗試
preStop
preStop
hook 是一個在容器終止前發(fā)送給容器的阻塞請求。
apiVersion: v1
kind: Pod
metadata:
name: pre-stop-hook
spec:
containers:
- image: k8spatterns/random-generator:1.0
name: random-generator
lifecycle:
preStop:
httpGet:
port: 8080
path: /shutdown
雖然 preStop
是阻塞的虐沥,但若它掛起或者返回一個非成功的結(jié)果熊经,并不會阻止進程被殺掉泽艘、容器被刪除。preStop
只是為了能夠平滑地關(guān)閉應(yīng)用镐依,是除 SIGTERM 之外的另一種方便的選擇匹涮。
總結(jié)
云原生平臺能提供的最大的好處之一,就是在不夠可靠的云計算基礎(chǔ)設(shè)施上槐壳,可靠地運行和擴展應(yīng)用然低。這類平臺設(shè)計了一系列應(yīng)用必須遵守的協(xié)議和約束。處理和響應(yīng)協(xié)議中的事件务唐,能夠確保應(yīng)用平穩(wěn)地啟動和關(guān)閉雳攘,對接受服務(wù)的客戶端只有最小的影響。應(yīng)用的生命周期不再由個人所控制枫笛,而是完全由平臺自動化管理吨灭。