KnativeServing健康檢查機(jī)制分析-創(chuàng)新互聯(lián)

Knative Serving 健康檢查機(jī)制分析

站在用戶的角度思考問題,與客戶深入溝通,找到昭通網(wǎng)站設(shè)計(jì)與昭通網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋昭通地區(qū)。

作者|??阿里云智能事業(yè)群技術(shù)專家牛秋霖(冬島)

導(dǎo)讀:從頭開發(fā)一個(gè) Serverss 引擎并不是一件容易的事情,今天咱們就從 Knative 的健康檢查說起。通過健康檢查這一個(gè)點(diǎn)來看看 Serverless 模式和傳統(tǒng)的模式都有哪些不同,以及 Knative 針對(duì) Serverless 場景都做了什么思考。

Knative Serving 模塊的核心原理如下圖所示,圖中的 Route 可以理解成是 Istio Gateway 的角色。

  • 當(dāng)縮容到零時(shí)進(jìn)來的流量就會(huì)指到 Activator 上面;
  • 當(dāng) Pod 數(shù)不為零時(shí)流量就會(huì)指到對(duì)應(yīng)的 Pod 上面,此時(shí)流量不經(jīng)過 Activator;
  • 其中 Autoscaler 模塊根據(jù)請(qǐng)求的 Metrics 信息實(shí)時(shí)動(dòng)態(tài)的擴(kuò)縮容。

Knative Serving 健康檢查機(jī)制分析

Knative 的 Pod 是由兩個(gè) Container 組成的:Queue-Proxy 和業(yè)務(wù)容器 user-container。架構(gòu)如下:

Knative Serving 健康檢查機(jī)制分析

咱們以 http1 為例進(jìn)行說明:業(yè)務(wù)流量首先進(jìn)入 Istio Gateway,然后會(huì)轉(zhuǎn)發(fā)到 Queue-Proxy 的 8012 端口,Queue-Proxy 8012 再把請(qǐng)求轉(zhuǎn)發(fā)到 user-container 的監(jiān)聽端口,至此一個(gè)業(yè)務(wù)請(qǐng)求的服務(wù)就算完成了。

粗略的介紹原理基本就是上面這樣,現(xiàn)在咱們對(duì)幾個(gè)細(xì)節(jié)進(jìn)行深入的剖析看看其內(nèi)部機(jī)制:

  • 為什么要引入 Queue-Proxy?
  • Pod 縮容到零的時(shí)候流量會(huì)轉(zhuǎn)發(fā)到 Activator 上面,那么 Activator 是怎么處理這些請(qǐng)求的?
  • Knative 中的業(yè)務(wù) Pod 有 Queue-Proxy 和 user-container,那么 Pod 的 readinessProber 和 LivenessProber 分別是怎么做的?Pod 的 readinessProber、 LivenessProber 和業(yè)務(wù)的健康狀態(tài)是什么樣的關(guān)系?
  • Istio Gateway 向 Pod 轉(zhuǎn)發(fā)流量的時(shí)候是怎么選擇 Pod 進(jìn)行轉(zhuǎn)發(fā)的?

為什么要引入 Queue-Proxy

Serverless 的一個(gè)核心訴求就是把業(yè)務(wù)的復(fù)雜度下沉到基礎(chǔ)平臺(tái),讓業(yè)務(wù)代碼快速迭代并且按需使用資源。不過現(xiàn)在更多的還是聚焦在按需使用資源層面。

如果想要按需使用資源我們就需要收集相關(guān)的 Metrics,并根據(jù)這些 Metrics 信息來指導(dǎo)資源的伸縮。Knative 首先實(shí)現(xiàn)的就是 KPA 策略,這個(gè)策略是根據(jù)請(qǐng)求數(shù)來判斷是否需要擴(kuò)容的。所以 Knative 需要有一個(gè)機(jī)制收集業(yè)務(wù)請(qǐng)求數(shù)量。除了業(yè)務(wù)請(qǐng)求數(shù)還有如下信息也是需要統(tǒng)一處理:

  • 訪問日志的管理;
  • Tracing;
  • Pod 健康檢查機(jī)制;
  • 需要實(shí)現(xiàn) Pod 和 Activator 的交互,當(dāng) Pod 縮容到零的時(shí)候如何接收 Activator 轉(zhuǎn)發(fā)過來的流量;
  • 其他諸如判斷 Ingress 是否 Ready 的邏輯也是基于 Queue-Proxy 實(shí)現(xiàn)的。

為了保持和業(yè)務(wù)的低耦合關(guān)系,還需要實(shí)現(xiàn)上述這些功能,所以就引入了 Queue-Proxy 負(fù)責(zé)這些事情。這樣可以在業(yè)務(wù)無感知的情況下把 Serverless 的功能實(shí)現(xiàn)。

從零到一的過程

當(dāng) Pod 縮容到零的時(shí)候流量會(huì)指到 Activator 上面,Activator 接收到流量以后會(huì)主動(dòng)“通知”Autoscaler 做一個(gè)擴(kuò)容的操作。擴(kuò)容完成以后 Activator 會(huì)探測 Pod 的健康狀態(tài),需要等待第一個(gè) Pod ready 之后才能把流量轉(zhuǎn)發(fā)過來。所以這里就出現(xiàn)了第一個(gè)健康檢查的邏輯:Activator 檢查第一個(gè) Pod 是否 ready。

這個(gè)健康檢查是調(diào)用的 Pod 8012 端口完成的,Activator 會(huì)發(fā)起 HTTP 的健康檢查,并且設(shè)置 ?K-Network-Probe=queue Header,所以 Queue Container 中會(huì)根據(jù) K-Network-Probe=queue 來判斷這是來自 Activator 的檢查,然后執(zhí)行相應(yīng)的邏輯。

參考閱讀

  • Activator to perform health checks before forwarding real requests
  • Activator: Retry on Get Revision error
  • Retry on Get Revision error?
  • Always pass Healthy dests to the throttler
  • Consolidate queue-proxy probe handlers
  • Queue proxy logging, metrics and end to end traces
  • End to end traces from queue proxy

VirtualService 的健康檢查

Knative Revision 部署完成后會(huì)自動(dòng)創(chuàng)建一個(gè) Ingress(以前叫做 ClusterIngress), 這個(gè) Ingress 最終會(huì)被 Ingress Controller 解析成 Istio 的 VirtualService 配置,然后 Istio ?Gateway 才能把相應(yīng)的流量轉(zhuǎn)發(fā)給相關(guān)的 Revision。

所以每添加一個(gè)新的 Revision 都需要同步創(chuàng)建 Ingress 和 Istio 的 VirtualService ,而 VirtualService 是沒有狀態(tài)表示 Istio 的管理的 Envoy 是否配置生效能力。所以 Ingress Controller 需要發(fā)起一個(gè) http 請(qǐng)求來監(jiān)測 VirtualService 是否 ready。這個(gè) http 的檢查最終也會(huì)打到 Pod 的 8012 端口上。標(biāo)識(shí) Header 是 K-Network-Probe=probe 。Queue-Proxy 需要基于此來判斷,然后執(zhí)行相應(yīng)的邏輯。

相關(guān)代碼如下所示:

Knative Serving 健康檢查機(jī)制分析

圖片來源

Knative Serving 健康檢查機(jī)制分析

圖片來源

參考閱讀

Gateway 通過這個(gè)健康檢查來判斷 Pod 是否可以提供服務(wù)。

  • New probe handling in Queue-Proxy & Activator
  • Extend VirtualService/Gateway probing to HTTPS
  • Probe Envoy pods to determine when a ClusterIngress is actually deployed
  • ClusterIngress Status
  • Consolidate queue-proxy probe handlers

Kubelet 的健康檢查

Knative 最終生成的 Pod 是需要落實(shí)到 Kubernetes 集群的,Kubernetes 中 Pod 有兩個(gè)健康檢查的機(jī)制:ReadinessProber 和 LivenessProber。

  • 其中 LivenessProber 是判斷 Pod 是否活著,如果檢查失敗 Kubelet 就會(huì)嘗試重啟 Container;
  • ReadinessProber 是來判斷業(yè)務(wù)是否 Ready,只有業(yè)務(wù) Ready 的情況下才會(huì)把 Pod 掛載到 Kubernetes Service 的 EndPoint 中,這樣可以保證 Pod 故障時(shí)對(duì)業(yè)務(wù)無損。

那么問題來了,Knative 的 Pod 中默認(rèn)會(huì)有兩個(gè) Container:Queue-Proxy 和 user-container 。

前面兩個(gè)健康檢查機(jī)制你應(yīng)該也發(fā)現(xiàn)了,流量的“前半路徑”需要通過 Queue-Proxy 來判斷是否可以轉(zhuǎn)發(fā)流量到當(dāng)前 Pod,而在 Kubernetes 的機(jī)制中,Pod 是否加入 Kubernetes Service EndPoint 完全是由 ReadinessProber 的結(jié)果決定的。而這兩個(gè)機(jī)制是獨(dú)立的,所以我們需要有一種方案來把這兩個(gè)機(jī)制協(xié)調(diào)一致。這也是 Knative 作為一個(gè) Serverless 編排引擎時(shí)需要對(duì)流量做更精細(xì)的控制要解決的問題。所以 Knative 最終是把 user-container 的 ReadinessProber 收斂到 Queue-Proxy 中,通過 Queue-Proxy 的結(jié)果來決定 Pod 的狀態(tài)。

另外這個(gè) Issue 中也提到在啟動(dòng) istio 的情況下,kubelet 發(fā)起的 tcp 檢查可能會(huì)被 Envoy 攔截,所以給 user-container 配置 TCP 探測器判斷 user-container 是否 ready 也是不準(zhǔn)的。這也是需要把 Readiness 收斂到 Queue-Proxy 的一個(gè)動(dòng)機(jī)。

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

  • 置空 user-container 的 ReadinessProber;
  • 把 user-container 的 ReadinessProber 配置的 json String 配置到 Queue-Proxy 的 env 中;
  • Queue-Proxy 的 Readinessprober 命令里面解析 user-container 的 ReadinessProber 的 json String 然后實(shí)現(xiàn)健康檢查邏輯,且這個(gè)檢查的機(jī)制和前面提到的 Activator 的健康檢查機(jī)制合并到了一起。這樣做也保證了 Activator 向 Pod 轉(zhuǎn)發(fā)流量時(shí) user-container 一定是 ?Ready 狀態(tài)。

參考閱讀

  • Consolidate queue-proxy probe handlers
  • Use user-defined readinessProbe in queue-proxy
  • Apply default livenessProbe and readinessProbe to the user container
  • Good gRPC deployment pods frequently fail at least one health check
  • Fix invalid helloworld example<br />
    這里面有比較詳細(xì)的方案討論,最終社區(qū)選擇的方案也是在這里介紹的。
  • Allow probes to run on a more granular timer.
  • Merge 8022/health to 8012/8013
  • TCP probe the user-container from the queue-proxy before marking the pod ready.
  • Use user-defined readiness probes through queue-proxy
  • queue-proxy /heatlth to perform TCP connect to user container

使用方法

如下所示可以在 Knative Service 中定義 Readiness。

apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  name: readiness-prober
spec:
  template:
    metadata:
      labels:
        app: helloworld-go
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:160e4db7
          readinessProbe:
            httpGet:
              path: /
            initialDelaySeconds: 3

需要說明兩點(diǎn):

  1. 和原生的 Kubernetes Pod Readiness 配置相比,Knative 中 timeoutSeconds、failureThreshold、periodSeconds 和 successThreshold 如果要配置就要一起配置,并且不能為零,否則 Knative webhook 校驗(yàn)無法通過。并且如果設(shè)置了 periodSeconds,那么一旦出現(xiàn)一次 Success,就再也不會(huì)去探測 user-container(不建議設(shè)置 periodSeconds,應(yīng)該讓系統(tǒng)自動(dòng)處理)。

  2. 如果 periodSeconds 沒有配置那么就會(huì)使用默認(rèn)的探測策略,默認(rèn)配置如下:
timeoutSeconds: 60
            failureThreshold: 3
            periodSeconds: 10
            successThreshold: 1

從這個(gè)使用方式上來看,其實(shí) Knative 是在逐漸收斂 user-container 配置,因?yàn)樵?Serverless 模式中需要系統(tǒng)自動(dòng)化處理很多邏輯,這些“系統(tǒng)行為”就不需要麻煩用戶了。

小結(jié)

前面提到的三種健康檢查機(jī)制的對(duì)比關(guān)系:

Knative Serving 健康檢查機(jī)制分析

“ 阿里巴巴云×××icloudnative×××erverless、容器、Service Mesh等技術(shù)領(lǐng)域、聚焦云原生流行技術(shù)趨勢、云原生大規(guī)模的落地實(shí)踐,做最懂云原生開發(fā)×××

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

當(dāng)前名稱:KnativeServing健康檢查機(jī)制分析-創(chuàng)新互聯(lián)
路徑分享:http://muchs.cn/article12/dphsgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、移動(dòng)網(wǎng)站建設(shè)響應(yīng)式網(wǎng)站、電子商務(wù)、服務(wù)器托管、域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)