首頁 資訊 Kubernetes

Kubernetes

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

簡介

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

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

什么是探針

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

Liveness Probe(存活探針)

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

Readiness Probe(就緒探針)

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

Startup Probe(啟動探針)

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

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

什么時候使用探針?

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

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

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

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

何時使用啟動探針(Startup Probe)

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

容器探測方法

exec

highlighter- makefile

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

httpGet

highlighter- properties

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

tcpSocket

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

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

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

容器探測使用

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端口,由于啟動容器時并沒有啟動nginx,而是去使用tail指令去查看一個文件內(nèi)容達(dá)到阻塞容器的目的,因此在容器啟動10后就開始第一次檢查,而后每個3秒檢查1次,達(dá)到指定次數(shù)后會觸發(fā)重啟操作,可以看到55秒內(nèi)探測了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

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

Liveness Probe 失敗觸發(fā)了容器重啟。此探針用于檢測容器是否健康,不健康時會重啟容器。 Readiness Probe 失敗使得 Pod 從 Service 的 Endpoints 列表中移除,導(dǎo)致 Pod 無法接收流量。這表示 Pod 當(dā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 簡介什么是探針    Liveness Probe(存活探針)    Readiness Probe(就緒探針)    Startup Probe(啟動探針)什么時候使用探針?    何時使用存活探針(Liveness Probe)    何時使用就緒探針(Readiness Probe)    何時使用啟動探針(Startup Probe)容器探測方法    exec    httpGet    tcpSocket容器探測使用    livenessProbe使用        exec使用        httpGet使用        tcpSocket    readinessProbe使用        exec使用        httpGet使用        tcpSocket使用    startupProbe使用        httpGet使用        tcpSocket使用

__EOF__

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

相關(guān)知識

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

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

推薦資訊