Kubernetes 之liveness和readness

默認(rèn)情況下庐船,kubernetes(以后簡稱k8s)當(dāng)pod中所有container一“啟動(dòng)”昆庇,就向其發(fā)送通信請求歇万,并在pod崩潰后重啟他們。通常來說這已經(jīng)夠好了勋陪。但是k8s提供了一種更直接明了的方式贪磺。
那就是readiness和liveness探測器。

1 HealthChecks 分類

健康檢查(health check)是用于檢測應(yīng)用實(shí)例是否正常工作诅愚,對應(yīng)用狀態(tài)的監(jiān)控缘挽,保障業(yè)務(wù)高可用的一種機(jī)制。
k8s健康檢測主要分為以下三種

1.存活性探測(Liveness probes) :主要是探測應(yīng)用是否還活著呻粹。如果檢測到應(yīng)用沒有存活就殺掉當(dāng)前pod并重啟;

2. 就緒性探測(Readiness probes):只要是探測應(yīng)用是否準(zhǔn)備好接受請求訪問,如果檢測應(yīng)用準(zhǔn)備好了苏研,就把請求流量放進(jìn)來等浊;反之,則把應(yīng)用節(jié)點(diǎn)從注冊中心拿掉摹蘑。

3. 啟動(dòng)探測(Startup Probes):對于舊應(yīng)用需要更長的啟動(dòng)時(shí)間筹燕,這時(shí)候既不想重啟應(yīng)用也不想讓請求訪問進(jìn)來,可以設(shè)置啟動(dòng)探測給足夠的啟動(dòng)時(shí)間保證應(yīng)用啟動(dòng)成功

1.1 Readiness

Readiness Probe的設(shè)計(jì)目的是讓Kubernetes明確知道Pod 何時(shí)已經(jīng)完全正版就緒衅鹿。在向POD發(fā)送請求通信之前,首先進(jìn)行Readiness Probe測試撒踪。如果測試沒有通過,Kubernetes 停止向其發(fā)送通信請求,直到測試通過大渤。


readiness.gif

1.2 Liveness

Liveness Probe 是為了讓k8s知道pod是否存活(而不一定可用)制妄。如果POD死掉,則k8s會(huì)將其remove并啟動(dòng)一個(gè)新的POD 取而代之泵三。


Liveness.gif

1.3 啟動(dòng)探測

startupProbe: 指示容器中的應(yīng)用是否已經(jīng)啟動(dòng)耕捞。如果提供了啟動(dòng)探測(startup probe),則禁用所有其他探測烫幕,直到它成功為止俺抽。如果啟動(dòng)探測失敗,kubelet 將殺死容器较曼,容器服從其重啟策略進(jìn)行重啟磷斧。如果容器沒有提供啟動(dòng)探測,則默認(rèn)狀態(tài)為成功Success
可以自定義在pod啟動(dòng)時(shí)是否執(zhí)行這些檢測捷犹,如果不設(shè)置弛饭,則檢測結(jié)果均默認(rèn) 為通過,如果設(shè)置伏恐,則順序?yàn)閟tartupProbe>readinessProbe>livenessProbe

2 HealthCheck 工作原理

2.1 Readiness

    當(dāng)POD剛剛開始啟動(dòng),對應(yīng)的服務(wù)并不一定完全啟動(dòng),正常提供服務(wù),默認(rèn)情況下Kubernetes會(huì)立刻向POD發(fā)送請求一旦進(jìn)程啟動(dòng)(但此刻服務(wù)不一定可用),因此運(yùn)用Readiness Probe孩哑,Kubernetes 會(huì)等待POD 完全ready后才會(huì)向其發(fā)送請求

2.2 Liveness

當(dāng)POD 因特殊狀況下一直處于掛起狀態(tài)且不能響應(yīng)任何請求,然后此時(shí)進(jìn)程卻存在,Kubernetes 會(huì)認(rèn)認(rèn)為服務(wù)一切正常并持續(xù)向掛起的POD發(fā)送請求.
若運(yùn)用Liveness Probe,Kubernetes 會(huì)發(fā)現(xiàn)該P(yáng)OD意見停止響應(yīng),進(jìn)而重啟異常的POD

3 Kubernetes Probe 類型

Kubernetes 支持三種方式來執(zhí)行探針
exec:在容器中執(zhí)行一個(gè)命令翠桦,如果命令退出碼返回0則表示探測成功横蜒,否則表示失敗
tcp:對指定的容IP及端口執(zhí)行一個(gè)TCP檢查胳蛮,如果端口是開放的則表示探測成功,否則表示失敗
http:對指定的容器IP丛晌、端口及路徑執(zhí)行一個(gè)HTTP Get請求仅炊,如果返回的狀態(tài)碼在 [200,400)之間則表示探測成功,否則表示失敗

3.1 HTTP Probe

基于HTTP的探測(HTTPGetAction)向目標(biāo)容器發(fā)起一個(gè)HTTP請求澎蛛,根據(jù)其相應(yīng)碼進(jìn)行結(jié)果判定抚垄,響應(yīng)碼如2xx或3xx時(shí)表示檢測通過。

#cat   liveness-http.yaml                   
apiVersion : v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-http
spec:
  containers:
  - name: liveness-http
    image: nginx
    ports:
    - name: http
      containerPort: 80
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh" ,"-c","echo liveness-http test > /usr/share/nginx/html/health"]
    livenessProbe:
      httpGet:
        path: /health
        port: http
        scheme: HTTP
  initialDelaySeconds: 30  #表示延遲30S開始第一次探測谋逻,默認(rèn)值是0呆馁,最小值是0
  timeoutSeconds: 35        #表示每次探測的超時(shí)時(shí)間,35S后如果沒返回結(jié)果就認(rèn)為超時(shí)失敗毁兆,默認(rèn)值是1浙滤,最小值是1
  periodSeconds: 30  #表示在探測失敗后,最小的連續(xù)成功被認(rèn)為是成功的气堕,默認(rèn)值是1纺腊,最小值是1
  successThreshold: 1   #表示當(dāng)探測失敗時(shí),Kubernetes將在認(rèn)為失敗前嘗試failureThreshold次數(shù)茎芭。默認(rèn)值是3揖膜,最小值是1;Liveness認(rèn)為失敗的操作是重啟pod,而readiness認(rèn)為失敗的操作是把pod標(biāo)記為 Unready
  failureThreshold: 3 #表示多久進(jìn)行一次探測梅桩,默認(rèn)是10S壹粟,最小值是1

3.2 TCP Probe

基于TCP的存活性探測(TCPSocketAction)用于向容器的特定端口發(fā)起TCP請求并嘗試建立連接,連接成功即為通過檢測摘投。

iveness-tcp.yaml             
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-tcp
spec:
  containers:
  - name: liveness-tcp
    image: nginx
    ports:
    - name: http
      containerPort: 80
    livenessProbe:
      tcpSocket:
        port: http
        initialDelaySeconds: 50    # 延遲探測時(shí)間(秒) 【 在k8s第一次探測前等待秒 】
        periodSeconds: 10          # 執(zhí)行探測頻率(秒) 【 每隔秒執(zhí)行一次 】
        timeoutSeconds: 1          # 超時(shí)時(shí)間
        uccessThreshold: 1        # 健康閥值 
        failureThreshold: 3        # 不健康閥值 

3.3 exec Probe

exec類型的探針通過在目標(biāo)容器中執(zhí)行由用戶自定義的命令來判斷容器的監(jiān)控狀態(tài)煮寡,若命令狀態(tài)返回值為0則表示“成功”通過檢測,其他值則均為“失敗”狀態(tài)

#cat  liveness-exec.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness-exec 
  name: liveness-exec 
spec:
  restartPolicy: OnFailure
  containers:
  - name: liveness-exec 
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 10; rm -rf /tmp/healthy; sleep 600
    livenessProbe: 
      exec:
        command: ["test","-e","/tmp/healthy"]
      initialDelaySeconds: 5    #探測延時(shí)時(shí)長犀呼,第一次探測前等待5秒幸撕,默認(rèn)為0
      periodSeconds: 5          #每5秒執(zhí)行一次liveness探測,默認(rèn)值10秒,最小1秒 
      timeoutSeconds: 2         #超長時(shí)長外臂,默認(rèn)為1s,最小值也為1s
      failureThreshold: 3       #處于成功狀態(tài)時(shí)坐儿,探測操作至少連續(xù)多少次的失敗才被視為檢測不通過,默認(rèn)為3宋光,最小為1

3 啟動(dòng)探測(Startup Probes)

#cat  startup-probe.yml
ports:
- name: liveness-port
  containerPort: 8080
  hostPort: 8080

livenessProbe:
  httpGet:
    path: /healthz
    port: liveness-port
  failureThreshold: 1
  periodSeconds: 10

startupProbe:
  httpGet:
    path: /healthz
    port: liveness-port
  failureThreshold: 30
  periodSeconds: 10

由于啟動(dòng)探測貌矿,應(yīng)用最多有5分鐘(30 * 10 = 300秒)來完成它的啟動(dòng)。一旦啟動(dòng)探測成功一次罪佳,活性探測(Livenees probes)將接管以提供對容器死鎖的快速響應(yīng)逛漫。如果啟動(dòng)探測從未成功,容器將在300秒后被殺死赘艳,并遵循pod的重啟策略 restartPolicy
restartPolicy 主要有以下三種策略

Always: 當(dāng)容器終止退出后酌毡,總是重啟容器克握,默認(rèn)策略
Onfailure: 當(dāng)容器異常退出后(退出碼非0)時(shí),才重啟容器
Never: 當(dāng)容器終止退出時(shí)枷踏,不重啟容器

每次探測都是以下三種結(jié)果之一:

成功:容器通過了探測
失斊邪怠:容器未通過探測
未知:容器探測失敗,不采取任何操作

4 liveness和readiness對比及區(qū)別

Liveness_readiness.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旭蠕,一起剝皮案震驚了整個(gè)濱河市停团,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掏熬,老刑警劉巖佑稠,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異旗芬,居然都是意外死亡讶坯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門岗屏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漱办,你說我怎么就攤上這事这刷。” “怎么了娩井?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵暇屋,是天一觀的道長。 經(jīng)常有香客問我洞辣,道長咐刨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任扬霜,我火速辦了婚禮定鸟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘著瓶。我一直安慰自己联予,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布材原。 她就那樣靜靜地躺著沸久,像睡著了一般。 火紅的嫁衣襯著肌膚如雪余蟹。 梳的紋絲不亂的頭發(fā)上卷胯,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機(jī)與錄音威酒,去河邊找鬼窑睁。 笑死挺峡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卵慰。 我是一名探鬼主播沙郭,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼裳朋!你這毒婦竟也來了病线?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鲤嫡,失蹤者是張志新(化名)和其女友劉穎送挑,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暖眼,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惕耕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诫肠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片司澎。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖栋豫,靈堂內(nèi)的尸體忽然破棺而出挤安,到底是詐尸還是另有隱情,我是刑警寧澤丧鸯,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布蛤铜,位于F島的核電站,受9級(jí)特大地震影響丛肢,放射性物質(zhì)發(fā)生泄漏围肥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一蜂怎、第九天 我趴在偏房一處隱蔽的房頂上張望穆刻。 院中可真熱鬧,春花似錦杠步、人聲如沸蛹批。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腐芍。三九已至,卻和暖如春试躏,著一層夾襖步出監(jiān)牢的瞬間猪勇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工颠蕴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泣刹,地道東北人助析。 一個(gè)月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像椅您,于是被迫代替她去往敵國和親外冀。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 今天感恩節(jié)哎掀泳,感謝一直在我身邊的親朋好友雪隧。感恩相遇!感恩不離不棄员舵。 中午開了第一次的黨會(huì)脑沿,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,567評論 0 11
  • 彩排完,天已黑
    劉凱書法閱讀 4,220評論 1 3
  • 表情是什么马僻,我認(rèn)為表情就是表現(xiàn)出來的情緒庄拇。表情可以傳達(dá)很多信息。高興了當(dāng)然就笑了韭邓,難過就哭了措近。兩者是相互影響密不可...
    Persistenc_6aea閱讀 125,137評論 2 7