Knative 健康检查机制分析
從頭開發一個 Serverless 引擎并不是一件容易的事情,今天咱們就從 Knative 的健康檢查說起。通過健康檢查這一個點來看看 Serverless 模式和傳統的模式都有哪些不同以及 Knative 針對 Serverless 場景都做了什么思考。
Knative Serving 模塊的核心原理如下圖所示。下圖中的 Route 可以理解成是 Istio Gateway 的角色。
- 當縮容到零時進來的流量就會指到 Activator 上面
- 當 Pod 數不為零時流量就會指到對應的 Pod 上面,此時流量不經過 Activator
- 其中 Autoscaler 模塊根據請求的 Metrics 信息實時動態的擴縮容
Knative 的 Pod 是由兩個 Container 組成的: Queue-Proxy 和業務 Container。架構如下:
咱們以 http1 為例進行說明。業務流量首先進入 Istio Gateway,然后會轉發到 Queue-Proxy 的 8012 端口,Queue-Proxy 8012 再把請求轉發到業務容器的監聽端口,至此一個業務請求的服務就算完成了。
粗略的介紹原理基本就是上面這樣,現在咱們對幾個細節進行深入的剖析看看其內部機制:
- 為什么要引入 Queue-Proxy?
- Pod 縮容到零的時候流量會轉發到 Activator 上面,那么 Activator 是怎么處理這些請求的?
- Knative 中的業務 Pod 有 Queue-Proxy 和 業務 Container,那么 Pod 的 readinessProber 和 LivenessProber 分別是怎么做的?Pod 的 readinessProber、 LivenessProber 和 業務的健康狀態是什么樣的關系?
- Istio Gateway 向 Pod 轉發流量的時候是怎么選擇 Pod 進行轉發的?
為什么要引入 Queue-Proxy
Serverless 的一個核心訴求就是把業務的復雜度下沉到基礎平臺,讓業務代碼快速的迭代并且按需使用資源。不過現在更多的還是聚焦在按需使用資源層面。
如果想要按需使用資源我們就需要收集一些資源相關的 Metrics,根據這些 Metrics 信息來指導資源的管理。Knative 首先實現的就是 KPA 策略,這個是根據請求數來判斷是否需要擴容的。所以 Knative 需要有一個機制收集業務請求數量。除了業務請求數還有如下信息也是需要統一處理了:
- 訪問日志的管理
- Tracing
- Pod 健康檢查機制
- 需要實現 Pod 和 Activator 的交互,當 Pod 縮容到零的時候如何接收 Activator 轉發過來的流量
- 其他諸如判斷 Ingress 是否 Ready 的邏輯也是基于 Queue-Proxy 實現的
為了保持和業務的低耦合關系,還需要實現上述這些功能所以就引入了 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 的檢查,然后執行相應的邏輯。
VirtualService 的健康檢查
Knative Revision 部署完成以后就會自動創建一個 Ingress(以前叫做 ClusterIngress), 這個 Ingress 最終會被 Gateway 解析,然后 Gateway 才能把相應的流量轉發給相關的 Revision。
所以每次添加一個新的 Revision 都需要同步創建 Ingress 和 Istio 的 VirtualService ,而 VirtualService 是沒有狀態表示 Istio 的管理的 Envoy 是否配置生效的能力的。所以 Ingress Controller 需要發起一個 http 請求來判斷 VirtualService 是否 ready。這個 http 的檢查最終也會打到 Pod 的 8012 端口上。標識 Header 是 K-Network-Probe=probe 。Queue-Proxy 需要基于此來判斷,然后執行相應的邏輯。
相關代碼如下所示:
Kubelet 的健康檢查
Knative 最終生成的 Pod 是需要落實到 Kubernetes 集群的,Kubernetes 中 Pod 有兩個健康檢查的機制 ReadinessProber 和 LivenessProber。其中 LivenessProber 是判斷 Pod 是否活著,如果檢查失敗 Kubelet 就會嘗試重啟 Container,ReadinessProber 是來判斷業務是否 Ready,只有業務 Ready 的情況下才會把 Pod 掛載到 Kubernetes Service 的 EndPoint 中,這樣可以保證 Pod 故障時對業務無損。
那么問題來了,Knative 的 Pod 中默認會有兩個 Container:Queue-Proxy 和 user-container 。前面兩個健康檢查機制你應該也發現了,流量的“前半路徑”需要通過 Queue-Proxy 來判斷是否可以轉發流量到當前 Pod,而在 Kubernetes 的機制中 Pod 是否加入 Service EndPoint 中完全是由 ReadinessProber 的結果決定的。而這兩個機制是獨立的,所以我們需要有一種方案來把這兩個機制協調一致。這也是 Knative 作為一個 Serverless 編排引擎是需要對流量做更精細的控制要解決的問題。所以 Knative 最終是把 user-container 的 ReadinessProber 收斂到 Queue-Proxy 中,通過 Queue-Proxy 的結果來決定 Pod 的狀態。
另外?https://github.com/knative/serving/issues/2912?這個 Issue 中也提到在啟動 istio 的情況下,kubelet 發起的 tcp 檢查可能會被 Envoy 鏈接,所以 TCP 請求無法判斷用戶的 Container 是否 ready,這也是需要把 Readiness 收斂到 Queue-Proxy 的一個動機。
Knative 收斂 user-container 健康檢查能力的方法是:
- 置空 user-container 的 ReadinessProber
- 把 user-container 的 ReadinessProber 配置的 json String 配置到 Queue-Proxy 的 env 中
- Queue-Proxy 的 Readinessprober 命令里面解析 user-container 的 ReadinessProber 的 json String 然后實現健康檢查邏輯。并且這個檢查的機制和前面提到的 Activator 的健康檢查機制合并到了一起。這樣做也保證了 Activator 向 Pod 轉發流量時 user-container 一定是 Ready 狀態
使用方法
如下所示可以在 Knative Service 中定義 Readiness
但是需要說明兩點:
從這個使用方式上來看其實 Knative 是在逐漸收斂用戶配置的靈活性,因為在 Serverless 模式中需要系統自動化處理很多邏輯。
小結
前面提到的三種健康檢查機制的對比關系:
| Activator probe requests | :8012 | With header K-Network-Probe=queue. Expected?queue?as response body. | Probe requests from Activator before it proxies external requests |
| VirtualService/Gateway probe requests | :8012 | With header K-Network-Probe=probe and non-empty K-Network-Hash header | This is used to detect which version of a VirtualService an Envoy Pod is currently serving. They are proxied from VirtualService to activator/queue-proxy. |
| Kubelet probe requests | :8012 | With non-empty K-Kubelet-Probe header or with header user-agent=kube-probe/* | I don't think currently kubectl sends probe requests to this path. We can delete it. Correct me if I was wrong. |
阿里云雙11億元補貼提前領,進入抽取iPhone 11 Pro:https://www.aliyun.com/1111/2019/home?utm_content=g_1000083110
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的Knative 健康检查机制分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ChaosBlade 发布对 C++ 应
- 下一篇: K8S从懵圈到熟练 - 节点下线姊妹篇