時間:2023-06-28 01:00:01 | 來源:網(wǎng)站運營
時間:2023-06-28 01:00:01 來源:網(wǎng)站運營
2020 kubernetes講座(上)-CKA考試指南(九)容器探針Probe:livenessProbe
:指示容器是否正在運行。如果存活探測失敗,則 kubelet 會殺死容器,并且容器將受到重啟策略
的影響。如果容器不提供存活探針,則默認狀態(tài)為 Success
。readinessProbe
:指示容器是否準(zhǔn)備好服務(wù)請求。如果就緒探測失敗,端點控制器將從與 Pod 匹配的所有 Service 的端點中刪除該 Pod 的 IP 地址。初始延遲之前的就緒狀態(tài)默認為 Failure
。如果容器不提供就緒探針,則默認狀態(tài)為 Success
。startupProbe
: 指示容器中的應(yīng)用是否已經(jīng)啟動。如果提供了啟動探測(startup probe),則禁用所有其他探測,直到它成功為止。如果啟動探測失敗,kubelet 將殺死容器,容器服從其重啟策略進行重啟。如果容器沒有提供啟動探測,則默認狀態(tài)為成功Success
。restartPolicy
字段,可能的值為 Always、OnFailure 和 Never。默認為 Always。 restartPolicy
適用于 Pod 中的所有容器。restartPolicy
僅指通過同一節(jié)點上的 kubelet 重新啟動容器。失敗的容器由 kubelet 以五分鐘為上限的指數(shù)退避延遲(10秒,20秒,40秒…)重新啟動,并在成功執(zhí)行十分鐘后重置。Pod一旦綁定到一個節(jié)點,他將永遠不會重新綁定到另一個節(jié)點。restartPolicy
自動執(zhí)行正確的操作。如果您希望容器在探測失敗時被殺死并重新啟動,那么請指定一個存活探針,并指定restartPolicy
為 Always 或 OnFailure。k8s.gcr.io/busybox
鏡像的容器。下面是這個 Pod 的配置文件。apiVersion: v1kind: Podmetadata: labels: test: liveness name: liveness-execspec: containers: - name: liveness image: k8s.gcr.io/busybox args: - /bin/sh - -c - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600 livenessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 5 periodSeconds: 5
在這個配置文件中,可以看到 Pod 中只有一個容器。periodSeconds
字段指定了 kubelet 應(yīng)該每 5 秒執(zhí)行一次存活探測。initialDelaySeconds
字段告訴 kubelet 在執(zhí)行第一次探測前應(yīng)該等待 5 秒。kubelet 在容器內(nèi)執(zhí)行命令 cat /tmp/healthy
來進行探測。如果命令執(zhí)行成功并且返回值為 0,kubelet 就會認為這個容器是健康存活的。如果這個命令返回非 0 值,kubelet 會殺死這個容器并重新啟動它。/bin/sh -c "touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600"
這個容器生命的前 30 秒, /tmp/healthy
文件是存在的。所以在這最開始的 30 秒內(nèi),執(zhí)行命令 cat /tmp/healthy
會返回成功碼。30 秒之后,執(zhí)行命令 cat /tmp/healthy
就會返回失敗碼。$ kubectl apply -f https://k8s.io/examples/pods/probe/exec-liveness.yaml
在 30 秒內(nèi),查看 Pod 的事件:$ kubectl describe pod liveness-exec
輸出結(jié)果顯示還沒有存活探測器失?。?br>FirstSeen LastSeen Count From SubobjectPath Type Reason Message--------- -------- ----- ---- ------------- -------- ------ -------24s 24s 1 {default-scheduler } Normal Scheduled Successfully assigned liveness-exec to worker023s 23s 1 {kubelet worker0} spec.containers{liveness} Normal Pulling pulling image "k8s.gcr.io/busybox"23s 23s 1 {kubelet worker0} spec.containers{liveness} Normal Pulled Successfully pulled image "k8s.gcr.io/busybox"23s 23s 1 {kubelet worker0} spec.containers{liveness} Normal Created Created container with docker id 86849c15382e; Security:[seccomp=unconfined]23s 23s 1 {kubelet worker0} spec.containers{liveness} Normal Started Started container with docker id 86849c15382e
35 秒之后,再來看 Pod 的事件:$ kubectl describe pod liveness-exec
在輸出結(jié)果的最下面,有信息顯示存活探測器失敗了,這個容器被殺死并且被重建了。FirstSeen LastSeen Count From SubobjectPath Type Reason Message--------- -------- ----- ---- ------------- -------- ------ -------37s 37s 1 {default-scheduler } Normal Scheduled Successfully assigned liveness-exec to worker036s 36s 1 {kubelet worker0} spec.containers{liveness} Normal Pulling pulling image "k8s.gcr.io/busybox"36s 36s 1 {kubelet worker0} spec.containers{liveness} Normal Pulled Successfully pulled image "k8s.gcr.io/busybox"36s 36s 1 {kubelet worker0} spec.containers{liveness} Normal Created Created container with docker id 86849c15382e; Security:[seccomp=unconfined]36s 36s 1 {kubelet worker0} spec.containers{liveness} Normal Started Started container with docker id 86849c15382e2s 2s 1 {kubelet worker0} spec.containers{liveness} Warning Unhealthy Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory
再等另外 30 秒,檢查看這個容器被重啟了:$ kubectl get pod liveness-exec
輸出結(jié)果顯示 RESTARTS
的值增加了 1。NAME READY STATUS RESTARTS AGEliveness-exec 1/1 Running 1 1m
readinessProbe
字段,而不是 livenessProbe
字段。readinessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 5 periodSeconds: 5
HTTP 和 TCP 的就緒探測器配置也和存活探測器的配置一樣的。initialDelaySeconds
:容器啟動后要等待多少秒后存活和就緒探測器才被初始化,默認是 0 秒,最小值是 0。periodSeconds
:執(zhí)行探測的時間間隔(單位是秒)。默認是 10 秒。最小值是 1。timeoutSeconds
:探測的超時后等待多少秒。默認值是 1 秒。最小值是 1。successThreshold
:探測器在失敗后,被視為成功的最小連續(xù)成功數(shù)。默認值是 1。存活探測的這個值必須是 1。最小值是 1。failureThreshold
:當(dāng) Pod 啟動了并且探測到失敗,Kubernetes 的重試次數(shù)。存活探測情況下的放棄就意味著重新啟動容器。就緒探測情況下的放棄 Pod 會被打上未就緒的標(biāo)簽。默認值是 3。最小值是 1。httpGet
上配置額外的字段:host
:連接使用的主機名,默認是 Pod 的 IP。也可以在 HTTP 頭中設(shè)置 “Host” 來代替。scheme
:用于設(shè)置連接主機的方式(HTTP 還是 HTTPS)。默認是 HTTP。path
:訪問 HTTP 服務(wù)的路徑。httpHeaders
:請求中自定義的 HTTP 頭。HTTP 頭字段允許重復(fù)。port
:訪問容器的端口號或者端口名。如果數(shù)字必須在 1 ~ 65535 之間。httpGet
中的 host
字段設(shè)置了,否則 kubelet 默認是給 Pod 的 IP 地址發(fā)送探測。如果 scheme
字段設(shè)置為了 HTTPS
,kubelet 會跳過證書驗證發(fā)送 HTTPS 請求。大多數(shù)情況下,不需要設(shè)置host
字段。這里有個需要設(shè)置 host
字段的場景,假設(shè)容器監(jiān)聽 127.0.0.1,并且 Pod 的 hostNetwork
字段設(shè)置為了 true
。那么 httpGet
中的 host
字段應(yīng)該設(shè)置為 127.0.0.1。可能更常見的情況是如果 Pod 依賴虛擬主機,你不應(yīng)該設(shè)置 host
字段,而是應(yīng)該在 httpHeaders
中設(shè)置 Host
。host
參數(shù)上配置 service name,因為 kubelet 不能解析 service name。readinessGates
,并且在其中定義一些條件,供kubelet來判定pod是否就緒。status.condition
的狀態(tài)來判定,如果kubernetes不能夠在pod中找到status.conditons
中的字段,而condition
的默認狀態(tài)是False
kind: Pod...spec: readinessGates: - conditionType: "www.example.com/feature-1"status: conditions: - type: Ready # a built in PodCondition status: "False" lastProbeTime: null lastTransitionTime: 2018-01-01T00:00:00Z - type: "www.example.com/feature-1" # an extra PodCondition status: "False" lastProbeTime: null lastTransitionTime: 2018-01-01T00:00:00Z containerStatuses: - containerID: docker://abcd... ready: true...
關(guān)鍵詞:容器,指南,考試,講座
微信公眾號
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。