官术网_书友最值得收藏!

3.8 Pod健康檢查和服務(wù)可用性檢查

Kubernetes對(duì)Pod的健康狀態(tài)可以通過(guò)兩類探針來(lái)檢查: LivenessProbe和ReadinessProbe,kubelet定期執(zhí)行這兩類探針來(lái)診斷容器的健康狀況。

(1)LivenessProbe探針:用于判斷容器是否存活(Running狀態(tài)),如果LivenessProbe探針探測(cè)到容器不健康,則kubelet將殺掉該容器,并根據(jù)容器的重啟策略做相應(yīng)的處理。如果一個(gè)容器不包含LivenessProbe探針,那么kubelet認(rèn)為該容器的LivenessProbe探針?lè)祷氐闹涤肋h(yuǎn)是Success。

(2)ReadinessProbe探針:用于判斷容器服務(wù)是否可用(Ready狀態(tài)),達(dá)到Ready狀態(tài)的Pod才可以接收請(qǐng)求。對(duì)于被Service管理的Pod,Service與Pod Endpoint的關(guān)聯(lián)關(guān)系也將基于Pod是否Ready進(jìn)行設(shè)置。如果在運(yùn)行過(guò)程中Ready狀態(tài)變?yōu)镕alse,則系統(tǒng)自動(dòng)將其從Service的后端Endpoint列表中隔離出去,后續(xù)再把恢復(fù)到Ready狀態(tài)的Pod加回后端Endpoint列表。這樣就能保證客戶端在訪問(wèn)Service時(shí)不會(huì)被轉(zhuǎn)發(fā)到服務(wù)不可用的Pod實(shí)例上。

LivenessProbe和ReadinessProbe均可配置以下三種實(shí)現(xiàn)方式。

(1)ExecAction:在容器內(nèi)部執(zhí)行一個(gè)命令,如果該命令的返回碼為0,則表明容器健康。

在下面的例子中,通過(guò)執(zhí)行“cat /tmp/health”命令來(lái)判斷一個(gè)容器運(yùn)行是否正常。在該P(yáng)od運(yùn)行后,將在創(chuàng)建/tmp/health文件10s后刪除該文件,而LivenessProbe健康檢查的初始探測(cè)時(shí)間(initialDelaySeconds)為15s,探測(cè)結(jié)果是Fail,將導(dǎo)致kubelet殺掉該容器并重啟它:

        apiVersion: v1
        kind: Pod
        metadata:
          labels:
            test: liveness
          name: liveness-exec
        spec:
          containers:
          - name: liveness
            image: gcr.io/google_containers/busybox
            args:
            - /bin/sh
            - -c
            - echo ok > /tmp/health; sleep 10; rm -rf /tmp/health; sleep 600
            livenessProbe:
              exec:
              command:
              - cat
              - /tmp/health
              initialDelaySeconds: 15
              timeoutSeconds: 1

(2)TCPSocketAction:通過(guò)容器的IP地址和端口號(hào)執(zhí)行TCP檢查,如果能夠建立TCP連接,則表明容器健康。

在下面的例子中,通過(guò)與容器內(nèi)的localhost:80建立TCP連接進(jìn)行健康檢查:

        apiVersion: v1
        kind: Pod
        metadata:
          name: pod-with-healthcheck
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
            livenessProbe:
              tcpSocket:
                port: 80
              initialDelaySeconds: 30
              timeoutSeconds: 1

(3)HTTPGetAction:通過(guò)容器的IP地址、端口號(hào)及路徑調(diào)用HTTP Get方法,如果響應(yīng)的狀態(tài)碼大于等于200且小于400,則認(rèn)為容器健康。

在下面的例子中,kubelet定時(shí)發(fā)送HTTP請(qǐng)求到localhost:80/_status/healthz來(lái)進(jìn)行容器應(yīng)用的健康檢查:

        apiVersion: v1
        kind: Pod
        metadata:
          name: pod-with-healthcheck
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
            livenessProbe:
              httpGet:
              path: /_status/healthz
              port: 80
              initialDelaySeconds: 30
              timeoutSeconds: 1

對(duì)于每種探測(cè)方式,都需要設(shè)置initialDelaySeconds和timeoutSeconds兩個(gè)參數(shù),它們的含義分別如下。

initialDelaySeconds:?jiǎn)?dòng)容器后進(jìn)行首次健康檢查的等待時(shí)間,單位為s。

timeoutSeconds:健康檢查發(fā)送請(qǐng)求后等待響應(yīng)的超時(shí)時(shí)間,單位為s。當(dāng)超時(shí)發(fā)生時(shí),kubelet會(huì)認(rèn)為容器已經(jīng)無(wú)法提供服務(wù),將會(huì)重啟該容器。

Kubernetes的ReadinessProbe機(jī)制可能無(wú)法滿足某些復(fù)雜應(yīng)用對(duì)容器內(nèi)服務(wù)可用狀態(tài)的判斷,所以Kubernetes從1.11版本開(kāi)始,引入Pod Ready++特性對(duì)Readiness探測(cè)機(jī)制進(jìn)行擴(kuò)展,在1.14版本時(shí)達(dá)到GA穩(wěn)定版,稱其為Pod Readiness Gates。

通過(guò)Pod Readiness Gates機(jī)制,用戶可以將自定義的ReadinessProbe探測(cè)方式設(shè)置在Pod上,輔助Kubernetes設(shè)置Pod何時(shí)達(dá)到服務(wù)可用狀態(tài)(Ready)。為了使自定義的ReadinessProbe生效,用戶需要提供一個(gè)外部的控制器(Controller)來(lái)設(shè)置相應(yīng)的Condition狀態(tài)。

Pod的Readiness Gates在Pod定義中的ReadinessGate字段進(jìn)行設(shè)置。下面的例子設(shè)置了一個(gè)類型為www.example.com/feature-1的新Readiness Gate:

        Kind: Pod
        ......
        spec:
          readinessGates:
            - conditionType: "www.example.com/feature-1"
        status:
          conditions:
            - type: Ready  # Kubernetes系統(tǒng)內(nèi)置的名為Ready的Condition
              status: "True"
              lastProbeTime: null
              lastTransitionTime: 2018-01-01T00:00:00Z
            - type: "www.example.com/feature-1"   # 用戶自定義Condition
              status: "False"
              lastProbeTime: null
              lastTransitionTime: 2019-03-01T00:00:00Z
          containerStatuses:
            - containerID: docker://abcd...
              ready: true
        ......

新增的自定義Condition的狀態(tài)(status)將由用戶自定義的外部控制器設(shè)置,默認(rèn)值為False。Kubernetes將在判斷全部readinessGates條件都為True時(shí),才設(shè)置Pod為服務(wù)可用狀態(tài)(Ready為True)。

主站蜘蛛池模板: 定陶县| 忻城县| 久治县| 河池市| 浦城县| 库车县| 东平县| 剑河县| 桐庐县| 奉新县| 亚东县| 灵山县| 建始县| 合作市| 贵溪市| 同仁县| 杭州市| 佳木斯市| 丽江市| 巍山| 文水县| 永城市| 汶上县| 金乡县| 桂阳县| 奉新县| 维西| 康保县| 彰化县| 双辽市| 莫力| 隆子县| 辰溪县| 乌拉特中旗| 甘孜| 瑞金市| 唐山市| 合山市| 军事| 韶关市| 于田县|