Knative Serving 健康檢查機制分析

2022-06-07 22:06:11 字數 3811 閱讀 7849

作者|  阿里雲智慧型事業群技術專家牛秋霖(冬島)

knative serving 模組的核心原理如下圖所示,圖中的 route 可以理解成是 istio gateway 的角色。

knative 的 pod 是由兩個 container 組成的:queue-proxy 和業務容器 user-container。架構如下:

咱們以 http1 為例進行說明:業務流量首先進入 istio gateway,然後會**到 queue-proxy 的 8012 埠,queue-proxy 8012 再把請求**到 user-container 的監聽埠,至此乙個業務請求的服務就算完成了。

粗略的介紹原理基本就是上面這樣,現在咱們對幾個細節進行深入的剖析看看其內部機制:

serverless 的乙個核心訴求就是把業務的複雜度下沉到基礎平台,讓業務**快速迭代並且按需使用資源。不過現在更多的還是聚焦在按需使用資源層面。

如果想要按需使用資源我們就需要收集相關的 metrics,並根據這些 metrics 資訊來指導資源的伸縮。knative 首先實現的就是 kpa 策略,這個策略是根據請求數來判斷是否需要擴容的。所以 knative 需要有乙個機制收集業務請求數量。除了業務請求數還有如下資訊也是需要統一處理:

為了保持和業務的低耦合關係,還需要實現上述這些功能,所以就引入了 queue-proxy 負責這些事情。這樣可以在業務無感知的情況下把 serverless 的功能實現。

當 pod 縮容到零的時候流量會指到 activator 上面,activator 接收到流量以後會主動「通知」autoscaler 做乙個擴容的操作。擴容完成以後 activator 會探測 pod 的健康狀態,需要等待第乙個 pod ready 之後才能把流量**過來。所以這裡就出現了第乙個健康檢查的邏輯:activator 檢查第乙個 pod 是否 ready。

**這個健康檢查是呼叫的 pod 8012 埠完成的,activator 會發起 http 的健康檢查,並且設定  k-network-probe=queue header,所以 queue container 中會根據 k-network-probe=queue 來判斷這是來自 activator 的檢查,然後執行相應的邏輯。

knative revision 部署完成後會自動建立乙個 ingress(以前叫做 clusteringress), 這個 ingress 最終會被 ingress controller 解析成 istio 的 virtualservice 配置,然後 istio  gateway 才能把相應的流量**給相關的 revision。

所以每新增乙個新的 revision 都需要同步建立 ingress 和 istio 的 virtualservice ,而 virtualservice 是沒有狀態表示 istio 的管理的 envoy 是否配置生性能力。所以 ingress controller 需要發起乙個 http 請求來監測 virtualservice 是否 ready。這個 http 的檢查最終也會打到 pod 的 8012 埠上。標識 header 是 k-network-probe=probe 。queue-proxy 需要基於此來判斷,然後執行相應的邏輯。

**gateway 通過這個健康檢查來判斷 pod 是否可以提供服務

knative 最終生成的 pod 是需要落實到 kubernetes 集群的,kubernetes 中 pod 有兩個健康檢查的機制:readinessprober 和 livenessprober。

那麼問題來了,knative 的 pod 中缺省會有兩個 container:queue-proxy 和 user-container 。

前面兩個健康檢查機制你應該也發現了,流量的「前半路徑」需要通過 queue-proxy 來判斷是否可以**流量到當前 pod,而在 kubernetes 的機制中,pod 是否加入 kubernetes service endpoint 完全是由 readinessprober 的結果決定的。而這兩個機制是獨立的,所以我們需要有一種方案來把這兩個機制協調一致。這也是 knative 作為乙個 serverless 編排引擎時需要對流量做更精細的控制要解決的問題。所以 knative 最終是把 user-container 的 readinessprober 收斂到 queue-proxy 中,通過 queue-proxy 的結果來決定 pod 的狀態。

另外這個 issue 中也提到在啟動 istio 的情況下,kubelet 發起的 tcp 檢查可能會被 envoy 攔截,所以給 user-container 配置 tcp 探測器判斷 user-container 是否 ready 也是不准的。這也是需要把 readiness 收斂到 queue-proxy 的乙個動機。

knative 收斂 user-container 健康檢查能力的方法是:

如下所示可以在 knative service 中定義 readiness。

需要說明兩點:

和原生的 kubernetes pod readiness 配置相比,knative 中 timeoutseconds、failurethreshold、periodseconds 和 successthreshold 如果要配置就要一起配置,並且不能為零,否則 knative webhook 校驗無法通過。並且如果設定了 periodseconds,那麼一旦出現一次 success,就再也不會去探測 user-container(不建議設定 periodseconds,應該讓系統自動處理)。

如果 periodseconds 沒有配置那麼就會使用預設的探測策略,預設配置如下:

timeoutseconds: 60

failurethreshold: 3

periodseconds: 10

successthreshold: 1

從這個使用方式上來看,其實 knative 是在逐漸收斂 user-container 配置,因為在 serverless 模式中需要系統自動化處理很多邏輯,這些「系統行為」就不需要麻煩使用者了。

前面提到的三種健康檢查機制的對比關係:

MAC終端快捷健

快捷鍵 功能ctrl a 移動到開頭 ctrl e 移動到結尾 ctrl b 向左移動乙個字元 助記back ctrl f 向右移動乙個字元 助記forward option left 向左移動乙個單詞 option right 向右移動乙個單詞 ctrl h 向左刪除乙個字元 ctrl w 向左刪...

Ubuntu TAB健作用修復

首先利用vi編輯器開啟 etc bash。bashrc檔案 需root許可權 sudo vi etc bash.bashrc 找到下列 按下i進行修改,將第二行開始的 去 enable bash completion in interactive shells if shopt oq posix t...

docker容器HEALTHCHECK 健康檢查

docker容器的健康檢測是在編寫dockerfile時,將檢測機制寫入到dockerfile中,基於此docerfile生成的映象,在執行容器時會有健康檢測的功能。dockerfile中的格式 healthcheck 指令是告訴 docker引擎應該如何進行判斷容器的狀態是否正常,這是 docke...