首頁(yè) 資訊 Kubernetes

Kubernetes

來(lái)源:泰然健康網(wǎng) 時(shí)間:2024年12月29日 15:43
簡(jiǎn)介什么是探針Liveness Probe(存活探針)Readiness Probe(就緒探針)Startup Probe(啟動(dòng)探針)什么時(shí)候使用探針?何時(shí)使用存活探針(Liveness Probe)何時(shí)使用就緒探針(Readiness Probe)何時(shí)使用啟動(dòng)探針(Startup Probe)容器探測(cè)方法exechttpGettcpSocket容器探測(cè)使用livenessProbe使用exec使用httpGet使用tcpSocketreadinessProbe使用exec使用httpGet使用tcpSocket使用startupProbe使用httpGet使用tcpSocket使用

簡(jiǎn)介

在Pod的生命周期中,可以執(zhí)行多種操作如下圖:

初始化容器:主容器啟動(dòng)前,可以先運(yùn)行一個(gè)或多個(gè)初始化容器。初始化容器是串行執(zhí)行的,必須全部成功完成后才會(huì)啟動(dòng)主容器。初始化容器運(yùn)行結(jié)束后即退出,不再占用資源。 Post Start鉤子:主容器啟動(dòng)后,可以指定一個(gè)Post Start鉤子,用于在主容器啟動(dòng)后執(zhí)行一些額外的操作。 Pre Stop鉤子:在主容器終止之前,可以指定一個(gè)Pre Stop鉤子,用于在主容器結(jié)束前執(zhí)行必要的清理或其他操作。 健康探針:Pod啟動(dòng)后,其健康狀態(tài)由以下幾類探針進(jìn)行檢測(cè): Startup Probe(啟動(dòng)探針):用于確保容器成功啟動(dòng),在啟動(dòng)完成前其他探針不會(huì)干擾容器的啟動(dòng)過(guò)程。 Liveness Probe(存活探針):用于檢測(cè)容器是否存活。如果探測(cè)失敗,Kubernetes會(huì)重啟該容器。 Readiness Probe(就緒探針):用于檢測(cè)容器是否已準(zhǔn)備好接收流量。如果探測(cè)失敗,該P(yáng)od將暫時(shí)從服務(wù)端點(diǎn)中移除,直到其恢復(fù)就緒狀態(tài)。

什么是探針

在Kubernetes中,探針(Probe)用于管理容器的生命周期,主要包括以下三種類型:

Liveness Probe(存活探針)

作用:判斷容器是否處于運(yùn)行狀態(tài)(即容器是否存活)。 行為: 如果Liveness Probe探測(cè)到容器處于非健康狀態(tài),kubelet會(huì)殺掉該容器,并根據(jù)容器的重啟策略進(jìn)行處理。 如果未配置Liveness Probe,kubelet會(huì)默認(rèn)認(rèn)為容器始終處于“成功”狀態(tài)。 場(chǎng)景:Liveness Probe用于捕捉容器死鎖等問(wèn)題。例如,當(dāng)應(yīng)用程序雖然運(yùn)行但無(wú)法處理請(qǐng)求時(shí),探針會(huì)檢測(cè)到這個(gè)問(wèn)題,并重啟容器,使應(yīng)用在存在bug的情況下依然能夠繼續(xù)運(yùn)行。

Readiness Probe(就緒探針)

作用:判斷容器是否已啟動(dòng)完成并準(zhǔn)備好接受請(qǐng)求。 行為: 如果Readiness Probe探測(cè)失敗,Pod的狀態(tài)會(huì)被修改,Endpoint Controller會(huì)將該P(yáng)od從Service的Endpoint中移除。 如果未配置Readiness Probe,kubelet會(huì)默認(rèn)認(rèn)為容器處于“成功”狀態(tài)。 場(chǎng)景:Readiness Probe用于控制哪些Pod可以作為Service的后端。如果Pod處于非就緒狀態(tài),它將被從Service的負(fù)載均衡中移除。

Startup Probe(啟動(dòng)探針)

作用:檢測(cè)應(yīng)用程序是否已完全啟動(dòng)。 行為: 在Startup Probe成功之前,其他探針(Liveness和Readiness)將被禁用。 如果Startup Probe探測(cè)失敗,kubelet將終止容器并根據(jù)重啟策略重啟它。 如果未配置Startup Probe,kubelet會(huì)默認(rèn)認(rèn)為容器已成功啟動(dòng)。 場(chǎng)景:Startup Probe適用于啟動(dòng)時(shí)間較長(zhǎng)的應(yīng)用程序,確保應(yīng)用完全啟動(dòng)后再啟用其他探針。

通過(guò)合理配置這三類探針,可以確保Kubernetes中的容器在生命周期的各個(gè)階段都處于健康狀態(tài),并能夠及時(shí)處理異常情況。

什么時(shí)候使用探針?

何時(shí)使用存活探針(Liveness Probe)

容器可能卡死或無(wú)響應(yīng):如果你的應(yīng)用程序在遇到問(wèn)題時(shí)可能卡死或進(jìn)入無(wú)響應(yīng)狀態(tài),而不會(huì)自行崩潰,那么就應(yīng)該使用存活探針。Liveness Probe 可以檢測(cè)到這些狀態(tài),并觸發(fā) kubelet 終止并重啟容器。 確保自動(dòng)重啟:如果你希望容器在探測(cè)失敗時(shí)被殺死并重新啟動(dòng),以確保應(yīng)用的持續(xù)可用性,那么應(yīng)配置存活探針。此時(shí),可以將 restartPolicy 設(shè)置為 Always 或 OnFailure,以確保在探針檢測(cè)到問(wèn)題時(shí)容器能夠自動(dòng)重啟。

何時(shí)使用就緒探針(Readiness Probe)

控制流量路由:如果你希望只有在探測(cè)成功時(shí)才開(kāi)始向 Pod 發(fā)送請(qǐng)求流量,就需要指定就緒探針。就緒探針常與存活探針相同,但它確保 Pod 在啟動(dòng)階段不會(huì)接收任何數(shù)據(jù),只有探測(cè)成功后才開(kāi)始接收流量。 維護(hù)狀態(tài):如果希望容器能自行進(jìn)入維護(hù)狀態(tài),可以使用就緒探針,檢查與存活探針不同的特定端點(diǎn)。對(duì)于依賴于后端服務(wù)的應(yīng)用程序,可以同時(shí)使用存活探針和就緒探針。存活探針檢測(cè)容器本身的健康狀況,而就緒探針則確保所需的后端服務(wù)可用,避免將流量導(dǎo)向出錯(cuò)的 Pod。 Pod 刪除:注意,如果只是想在 Pod 被刪除時(shí)排空請(qǐng)求,通常不需要使用就緒探針。Pod 在刪除時(shí)會(huì)自動(dòng)進(jìn)入未就緒狀態(tài),無(wú)論是否有就緒探針,直到容器停止為止。

何時(shí)使用啟動(dòng)探針(Startup Probe)

應(yīng)用啟動(dòng)慢:如果容器在啟動(dòng)期間需要加載大型數(shù)據(jù)或配置文件,可以使用啟動(dòng)探針。它確保在啟動(dòng)完成前不會(huì)觸發(fā)其他探針。

容器探測(cè)方法

exec

highlighter- makefile

執(zhí)行一段命令,根據(jù)返回值判斷執(zhí)行結(jié)果。返回值為0, 非0兩種結(jié)果,可以理解為"echo $?"。

httpGet

highlighter- properties

通過(guò)發(fā)起HTTTP協(xié)議的GET請(qǐng)求檢測(cè)某個(gè)http請(qǐng)求的返回狀態(tài)碼,從而判斷服務(wù)是否正常。 常見(jiàn)的狀態(tài)碼分為很多類,比如: "2xx,3xx"正常, "4xx,5xx"錯(cuò)誤。200: 返回狀態(tài)碼成功。301: 永久跳轉(zhuǎn),會(huì)將跳轉(zhuǎn)信息緩存到瀏覽器本地。302: 臨時(shí)跳轉(zhuǎn),并不會(huì)將本次跳轉(zhuǎn)緩存到本地。401: 驗(yàn)證失敗。403: 權(quán)限被拒絕。404: 文件找不到。413: 文件上傳過(guò)大。500: 服務(wù)器內(nèi)部錯(cuò)誤。502: 無(wú)效的請(qǐng)求。504: 后端應(yīng)用網(wǎng)關(guān)相應(yīng)超時(shí)。

tcpSocket

測(cè)試某個(gè)TCP端口是否能夠連接,類似于telnet這樣的工具。

每次探測(cè)都將獲得以下三種結(jié)果之一:

Success(成功):容器通過(guò)了診斷。 Failure(失敗):容器未通過(guò)診斷。 Unknown(未知):診斷失敗,因此不會(huì)采取任何行動(dòng)。

容器探測(cè)使用

livenessProbe使用

exec使用

yaml

apiVersion: v1 kind: Pod metadata: name: livenessprobe-exec spec: containers: - name: nginx image: nginx:1.18 ports: - containerPort: 80 args: - /bin/sh - -c - touch /tmp/healthy; sleep 10; rm -rf /tmp/healthy; sleep 600 livenessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 15 periodSeconds: 5 timeoutSeconds: 1 successThreshold: 1 failureThreshold: 3

httpGet使用

yaml

apiVersion: v1 kind: Pod metadata: name: livenessprobe-httpGet spec: containers: - name: nginx image: nginx:1.18 ports: - containerPort: 80 livenessProbe: httpGet: path: /index.html port: 80 initialDelaySeconds: 15 periodSeconds: 5 timeoutSeconds: 1 successThreshold: 1 failureThreshold: 3

tcpSocket

yaml

apiVersion: apps/v1 kind: Deployment metadata: name: livenessprobe-tcpsocket spec: replicas: 1 selector: matchLabels: app: livenessprobe-tcpsocket template: metadata: labels: app: livenessprobe-tcpsocket spec: containers: - name: nginx image: registry.cn-guangzhou.aliyuncs.com/jiajia-k8s/nginx:1.21 ports: - containerPort: 80 args: - /bin/sh - -c - tail -f /etc/hosts livenessProbe: tcpSocket: port: 80 initialDelaySeconds: 10 periodSeconds: 3 successThreshold: 1 failureThreshold: 2

highlighter- llvm

很明顯,上述案例暴露了80端口,由于啟動(dòng)容器時(shí)并沒(méi)有啟動(dòng)nginx,而是去使用tail指令去查看一個(gè)文件內(nèi)容達(dá)到阻塞容器的目的,因此在容器啟動(dòng)10后就開(kāi)始第一次檢查,而后每個(gè)3秒檢查1次,達(dá)到指定次數(shù)后會(huì)觸發(fā)重啟操作,可以看到55秒內(nèi)探測(cè)了4次,52秒內(nèi)重啟了兩次

readinessProbe使用

exec使用

yaml

apiVersion: apps/v1 kind: Deployment metadata: name: readinessProbe-exec labels: apps: nginx spec: replicas: 3 selector: matchLabels: apps: nginx template: metadata: name: nginx labels: apps: nginx spec: containers: - name: nginx image: nginx:1.18 command: - /bin/bash - -c - touch /tmp/nginx-healthy; sleep 60; rm -f /tmp/nginx-healthy; sleep 60; livenessProbe: exec: command: - cat - /tmp/nginx-healthy failureThreshold: 3 initialDelaySeconds: 15 periodSeconds: 1 successThreshold: 1 timeoutSeconds: 1 readinessProbe: exec: command: - cat - /tmp/nginx-healthy-2023 failureThreshold: 3 initialDelaySeconds: 15 periodSeconds: 1 successThreshold: 1 timeoutSeconds: 1

從事件日志來(lái)看,Liveness Probe 和 Readiness Probe 都因?yàn)闊o(wú)法找到 /tmp/nginx-healthy 文件而失敗。這是由于容器中的命令在 60 秒后刪除了該文件,導(dǎo)致探針在檢查時(shí)無(wú)法訪問(wèn)該文件。

Liveness Probe 失敗觸發(fā)了容器重啟。此探針用于檢測(cè)容器是否健康,不健康時(shí)會(huì)重啟容器。 Readiness Probe 失敗使得 Pod 從 Service 的 Endpoints 列表中移除,導(dǎo)致 Pod 無(wú)法接收流量。這表示 Pod 當(dāng)前無(wú)法處理請(qǐng)求。



httpGet使用

yaml

apiVersion: apps/v1 kind: Deployment metadata: name: readinessprobe-httpget spec: replicas: 1 selector: matchLabels: app: readinessprobe-httpget template: metadata: labels: app: readinessprobe-httpget spec: containers: - name: nginx image: nginx:1.21 ports: - containerPort: 80 readinessProbe: httpGet: path: /healthz port: 80 initialDelaySeconds: 15 periodSeconds: 5 failureThreshold: 3 successThreshold: 1 timeoutSeconds: 1

tcpSocket使用

yaml

apiVersion: apps/v1 kind: Deployment metadata: name: readinessprobe-tcpsocket spec: replicas: 1 selector: matchLabels: app: readinessprobe-tcpsocket template: metadata: labels: app: readinessprobe-tcpsocket spec: containers: - name: nginx image: nginx:1.21 ports: - containerPort: 80 livenessProbe: tcpSocket: port: 80 failureThreshold: 3 initialDelaySeconds: 30 periodSeconds: 1 successThreshold: 1 timeoutSeconds: 1 readinessProbe: tcpSocket: port: 80 initialDelaySeconds: 15 periodSeconds: 5 failureThreshold: 3 successThreshold: 1 timeoutSeconds: 1

startupProbe使用

httpGet使用

yaml

apiVersion: apps/v1 kind: Deployment metadata: name: startupprobe-httpget spec: replicas: 1 selector: matchLabels: app: startupprobe-httpget template: metadata: labels: app: startupprobe-httpget spec: containers: - name: nginx image: nginx:1.21 ports: - containerPort: 80 startupProbe: httpGet: path: /startup port: 80 initialDelaySeconds: 30 periodSeconds: 10 failureThreshold: 10 timeoutSeconds: 5

tcpSocket使用

yaml

apiVersion: apps/v1 kind: Deployment metadata: name: startupprobe-tcpsocket spec: replicas: 1 selector: matchLabels: app: startupprobe-tcpsocket template: metadata: labels: app: startupprobe-tcpsocket spec: containers: - name: nginx image: nginx:1.21 ports: - containerPort: 80 startupProbe: tcpSocket: port: 80 initialDelaySeconds: 30 periodSeconds: 10 failureThreshold: 10 timeoutSeconds: 5 簡(jiǎn)介什么是探針    Liveness Probe(存活探針)    Readiness Probe(就緒探針)    Startup Probe(啟動(dòng)探針)什么時(shí)候使用探針?    何時(shí)使用存活探針(Liveness Probe)    何時(shí)使用就緒探針(Readiness Probe)    何時(shí)使用啟動(dòng)探針(Startup Probe)容器探測(cè)方法    exec    httpGet    tcpSocket容器探測(cè)使用    livenessProbe使用        exec使用        httpGet使用        tcpSocket    readinessProbe使用        exec使用        httpGet使用        tcpSocket使用    startupProbe使用        httpGet使用        tcpSocket使用

__EOF__

本文作者: Unstoppable9527 本文鏈接: https://www.cnblogs.com/Unstoppable9527/p/18352747 關(guān)于博主: 評(píng)論和私信會(huì)在第一時(shí)間回復(fù)。或者直接私信我。 版權(quán)聲明: 除特殊說(shuō)明外,轉(zhuǎn)載請(qǐng)注明出處~[知識(shí)共享署名-相同方式共享 4.0 國(guó)際許可協(xié)議] 聲援博主: 如果您覺(jué)得文章對(duì)您有幫助,可以點(diǎn)擊文章右下角【推薦】一下。

相關(guān)知識(shí)

[云原生] Kubernetes(k8s)健康檢查詳解與實(shí)戰(zhàn)演示(就緒性探針 和 存活性探針)
Docker安全性:最佳實(shí)踐和常見(jiàn)安全考慮
《西爾斯懷孕百科》威廉·西爾斯/全新升級(jí)典藏版
spring boot 應(yīng)用在 k8s 中的健康檢查(一)
k8s健康檢查 spring k8s健康檢查探針多個(gè)地址
要想Pod好
ASP.NET Core 中的健康狀態(tài)檢查
如何為托管到SAE的應(yīng)用配置健康檢查
健康狀態(tài)監(jiān)視
[健康] 大健康行業(yè)概述

網(wǎng)址: Kubernetes http://www.u1s5d6.cn/newsview905352.html

推薦資訊