溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

k8s探測(cè)機(jī)制之pod健康檢查

發(fā)布時(shí)間:2020-06-26 20:58:20 來(lái)源:網(wǎng)絡(luò) 閱讀:894 作者:wx5b9c94b17c62a 欄目:云計(jì)算

一:需求來(lái)源:

首先來(lái)看一下,整個(gè)需求的來(lái)源:當(dāng)把應(yīng)用遷移到 Kubernetes 之后,要如何去保障應(yīng)用的健康與穩(wěn)定呢?其實(shí)很簡(jiǎn)單,可以從兩個(gè)方面來(lái)進(jìn)行增強(qiáng):

1,首先是提高應(yīng)用的可觀測(cè)性;
2,第二是提高應(yīng)用的可恢復(fù)能力。

從可觀測(cè)性上來(lái)講,可以在三個(gè)方面來(lái)去做增強(qiáng):

1,首先是應(yīng)用的健康狀態(tài)上面,可以實(shí)時(shí)地進(jìn)行觀測(cè);
2,第二個(gè)是可以獲取應(yīng)用的資源使用情況;
3,第三個(gè)是可以拿到應(yīng)用的實(shí)時(shí)日志,進(jìn)行問(wèn)題的診斷與分析。

當(dāng)出現(xiàn)了問(wèn)題之后,首先要做的事情是要降低影響的范圍,進(jìn)行問(wèn)題的調(diào)試與診斷。最后當(dāng)出現(xiàn)問(wèn)題的時(shí)候,理想的狀況是:可以通過(guò)和 K8s 集成的自愈機(jī)制進(jìn)行完整的恢復(fù)。

二:介紹兩種探測(cè)方式:livenessProbe和ReadnessProbe

  • livenessProbe:[活躍度探測(cè)],就是根據(jù)用戶自定義的規(guī)則判斷容器是否健康。也叫存活指針,如果 Liveness 指針判斷容器不健康,此時(shí)會(huì)通過(guò) kubelet 殺掉相應(yīng)的 pod,并根據(jù)重啟策略來(lái)判斷是否重啟這個(gè)容器。如果默認(rèn)不配置 Liveness 指針,則默認(rèn)情況下認(rèn)為它這個(gè)探測(cè)默認(rèn)返回是成功的。

  • ReadnessProbe:[敏捷探測(cè)],用來(lái)判斷這個(gè)容器是否啟動(dòng)完成,即 pod 的 狀態(tài)(期望值)是否 為ready。如果探測(cè)的一個(gè)結(jié)果是不成功,那么此時(shí)它會(huì)從 pod 上 Endpoint 上移除,也就是說(shuō)從接入層上面會(huì)把前一個(gè) pod 進(jìn)行摘除(設(shè)置pod為不可用的狀態(tài)),直到下一次判斷成功,這個(gè) pod 才會(huì)再次掛到相應(yīng)的 endpoint 之上。

什么是Endpoint?
Endpoint是k8s集群中的一個(gè)資源對(duì)象,存儲(chǔ)在etcd中,用來(lái)記錄一個(gè)service對(duì)應(yīng)的所有pod的訪問(wèn)地址。

2,Liveness和Readness兩種探測(cè)機(jī)制的使用場(chǎng)景:
Liveness 指針適用場(chǎng)景是支持那些可以重新拉起的應(yīng)用,而 Readiness 指針主要應(yīng)對(duì)的是啟動(dòng)之后無(wú)法立即對(duì)外提供服務(wù)的這些應(yīng)用。

3,,Liveness和Readness兩種探測(cè)機(jī)制的相同點(diǎn)和不同點(diǎn):
相同點(diǎn)是根據(jù)探測(cè)pod內(nèi)某個(gè)應(yīng)用或文件,來(lái)檢查pod的健康狀況,不同點(diǎn)是liveness如果探測(cè)失敗會(huì)重啟pod,而readliness則在連續(xù)3次探測(cè)失敗之后,會(huì)將pod設(shè)置為不可用的狀態(tài),并不會(huì)重啟pod。

4,Liveness 指針和 Readiness 指針支持三種不同的探測(cè)方式:

  • 1,第一種是 httpGet。它是通過(guò)發(fā)送 http Get 請(qǐng)求來(lái)進(jìn)行判斷的,當(dāng)返回碼是 200-399 之間的狀態(tài)碼時(shí),標(biāo)識(shí)這個(gè)應(yīng)用是健康的;
  • 2,第二種探測(cè)方式是 Exec。它是通過(guò)執(zhí)行容器中的一個(gè)命令來(lái)判斷當(dāng)前的服務(wù)是否是正常的,當(dāng)命令行的返回結(jié)果是 0,則標(biāo)識(shí)容器是健康的;
  • 3,第三種探測(cè)方式是 tcpSocket 。它是通過(guò)探測(cè)容器的 IP 和 Port 進(jìn)行 TCP 健康檢查,如果這個(gè) TCP 的鏈接能夠正常被建立,那么標(biāo)識(shí)當(dāng)前這個(gè)容器是健康的。

第一種探測(cè)方式和第三種非常相似,一般常用的是第一和第二種的探測(cè)方式。

三,探測(cè)機(jī)制應(yīng)用實(shí)例:

1,LivenessProbe:

方法1:使用exec探測(cè)方式,查看pod內(nèi)某個(gè)指定的文件是否存在,如果存在則認(rèn)為狀態(tài)為健康的,否則會(huì)根據(jù)設(shè)置的重啟重啟策略重啟pod。

###pod的配置文件:

[root@sqm-master yaml]# vim livenss.yaml
kind: Pod
apiVersion: v1
metadata:
  name: liveness
  labels:
    name: liveness
spec:
  restartPolicy: OnFailure    ##定義重啟策略,僅在pod對(duì)象出現(xiàn)錯(cuò)誤時(shí)才重啟
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/test; sleep 30; rm -rf /tmp/test; sleep 300  #創(chuàng)建文件,并且在30秒后將文件進(jìn)行刪除
    livenessProbe:      #執(zhí)行活躍度探測(cè)
      exec:
        command:
        - cat              #探測(cè)/tmp目錄下是有test文件,如果有則代表健康,如果沒(méi)有則執(zhí)行重啟pod策略。
        - /tmp/test
      initialDelaySeconds: 10        #當(dāng)容器運(yùn)行多久之后開(kāi)始探測(cè)(單位是s)
      periodSeconds: 5     #探測(cè)頻率(單位s),每隔5秒探測(cè)一次。

探測(cè)機(jī)制中其他的可選字段:

  • initialDelaySeconds:容器啟動(dòng)后第一次執(zhí)行探測(cè)是需要等待多少秒。
  • periodSeconds:執(zhí)行探測(cè)的頻率。默認(rèn)是10秒,最小1秒。
  • timeoutSeconds:探測(cè)超時(shí)時(shí)間。默認(rèn)1秒,最小1秒。
  • successThreshold:探測(cè)失敗后,最少連續(xù)探測(cè)成功多少次才被認(rèn)定為成功。默認(rèn)是1。對(duì)于liveness必須是1。最小值是1。
  • failureThreshold:探測(cè)成功后,最少連續(xù)探測(cè)失敗多少次才被認(rèn)定為失敗。默認(rèn)是3。最小值是1。
//運(yùn)行該pod進(jìn)行測(cè)試:
[root@sqm-master yaml]# kubectl  apply -f  livenss.yaml 
pod/liveness created

//監(jiān)測(cè)pod的狀態(tài):
會(huì)在容器啟動(dòng)10秒后開(kāi)始探測(cè),且每5s探測(cè)一次。
k8s探測(cè)機(jī)制之pod健康檢查
我們可以看到pod一直在重啟中,從上圖看到RESTARTS
的次數(shù)已經(jīng)為7次了,原因是在啟動(dòng)pod時(shí)執(zhí)行了該命令:

/bin/sh -c "touch /tmp/test; sleep 30; rm -rf /tmp/test; sleep 300"

在容器生命的最初30秒內(nèi)有一個(gè) /tmp/test 文件,在這30秒內(nèi) cat /tmp/test命令會(huì)返回一個(gè)成功的返回碼。但30秒后, cat /tmp/test 將返回失敗的返回碼,會(huì)觸發(fā)pod的重啟策略。

//我們來(lái)查看一下pod的Events信息:
[root@sqm-master ~]# kubectl  describe  pod liveness 

k8s探測(cè)機(jī)制之pod健康檢查
從上面的事件中可以發(fā)現(xiàn),探測(cè)失敗,將重啟容器,原因是在指定的目錄下沒(méi)有發(fā)現(xiàn)該文件。

方法2:使用httpGet探測(cè)方式,運(yùn)行一個(gè)web服務(wù),探測(cè)web網(wǎng)頁(yè)的根目錄下是否有指定的文件,也就等同于 “curl -I 容器ip地址:/healthy”。(這里的目錄/,指定的是容器內(nèi)提供web服務(wù)的主目錄。)

//pod的yaml文件:

[root@sqm-master yaml]# vim http-livenss.yaml
apiVersion: v1
kind: Pod
metadata:
  name: web
  labels:
    name: mynginx
spec:
  restartPolicy: OnFailure      #定義pod重啟策略
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    livenessProbe:       #定義探測(cè)機(jī)制
      httpGet:               #探測(cè)方式為httpGet
        scheme: HTTP    #指定協(xié)議
        path: /healthy       #指定路徑下的文件,如果不存在,探測(cè)失敗
        port: 80
      initialDelaySeconds: 10       #當(dāng)容器運(yùn)行多久之后開(kāi)始探測(cè)(單位是s)
      periodSeconds: 5       #探測(cè)頻率(單位s),每隔5秒探測(cè)一次
---
apiVersion: v1       #關(guān)聯(lián)一個(gè)service對(duì)象
kind: Service
metadata:
  name: web-svc
spec:
  selector:
    name: mynginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

httpGet探測(cè)方式有如下可選的控制字段:

  • host:連接的主機(jī)名,默認(rèn)連接到pod的IP。你可能想在http header中設(shè)置”Host”而不是使用IP。
  • scheme:連接使用的schema,默認(rèn)HTTP。
  • path: 訪問(wèn)的HTTP server的path。
  • httpHeaders:自定義請(qǐng)求的header。HTTP運(yùn)行重復(fù)的header。
  • port:訪問(wèn)的容器的端口名字或者端口號(hào)。端口號(hào)必須介于1和65525之間。
//運(yùn)行該pod:
[root@sqm-master yaml]# kubectl  apply -f  http-livenss.yaml 
pod/web created
service/web-svc created

##查看pod運(yùn)行10秒前的情況:
k8s探測(cè)機(jī)制之pod健康檢查
##最開(kāi)始的10秒該容器是活著的,且返回的狀態(tài)碼為200.
k8s探測(cè)機(jī)制之pod健康檢查

###10秒后當(dāng)探測(cè)機(jī)制開(kāi)始探測(cè)時(shí)再次查看pod的情況:
k8s探測(cè)機(jī)制之pod健康檢查

//查看的pod的events:
[root@sqm-master yaml]# kubectl describe  pod web 

k8s探測(cè)機(jī)制之pod健康檢查

可以看到返回的狀態(tài)碼為404,表示在網(wǎng)頁(yè)的根目錄下并沒(méi)有找到指定的文件,表示探測(cè)失敗,且重啟4次,狀態(tài)是completed(完成的狀態(tài)),說(shuō)明pod是存在問(wèn)題的。

2)接下來(lái)我們繼續(xù)進(jìn)行檢測(cè),使其最終探測(cè)成功:
修改pod的配置文件:
[root@sqm-master yaml]# vim http-livenss.yaml
k8s探測(cè)機(jī)制之pod健康檢查

//重新運(yùn)行pod:
[root@sqm-master yaml]# kubectl  delete -f  http-livenss.yaml 
pod "web" deleted
service "web-svc" deleted
[root@sqm-master yaml]# kubectl apply -f  http-livenss.yaml 
pod/web created
service/web-svc created
//最終我們查看pod的狀態(tài)及Events信息:
[root@sqm-master yaml]# kubectl  get pod -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
web    1/1     Running   0          5s    10.244.1.11   node01   <none>           <none>
[root@sqm-master yaml]# kubectl  describe  pod web 
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  71s   default-scheduler  Successfully assigned default/web to node01
  Normal  Pulling    71s   kubelet, node01    Pulling image "nginx"
  Normal  Pulled     70s   kubelet, node01    Successfully pulled image "nginx"
  Normal  Created    70s   kubelet, node01    Created container nginx
  Normal  Started    70s   kubelet, node01    Started container nginx

可以看到pod的狀態(tài)時(shí)正常運(yùn)行的。

##測(cè)試訪問(wèn)網(wǎng)頁(yè)頭部信息:
[root@sqm-master yaml]# curl -I 10.244.1.11

k8s探測(cè)機(jī)制之pod健康檢查
返回的狀態(tài)碼為200,表示這個(gè)pod的狀況時(shí)健康的。

ReadnessProbe探測(cè):

方法1:使用exec探測(cè)方式,與iveness相同,探測(cè)某個(gè)文件是否存在。
//pod的配置文件如下:

[root@sqm-master yaml]# vim readiness.yaml
kind: Pod
apiVersion: v1
metadata:
  name: readiness
  labels:
    name: readiness
spec:
  restartPolicy: OnFailure
  containers:
  - name: readiness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/test; sleep 30; rm -rf /tmp/test; sleep 300;
    readinessProbe:   #定義readiness探測(cè)方式
      exec:
        command:
        - cat
        - /tmp/test
      initialDelaySeconds: 10
      periodSeconds: 5
//運(yùn)行該pod:
[root@sqm-master yaml]# kubectl apply -f  readiness.yaml 
pod/readiness created

//檢測(cè)pod的狀態(tài):
k8s探測(cè)機(jī)制之pod健康檢查

//查看pod的Events:
[root@sqm-master yaml]# kubectl  describe  pod readiness 

k8s探測(cè)機(jī)制之pod健康檢查
可以看到找不到該文件,表示探測(cè)失敗,但是readiness機(jī)制與liveness機(jī)制不同,它并不會(huì)重啟pod,而是連續(xù)探測(cè)3次失敗后,則將容器設(shè)置為不可用的狀態(tài)。

方法二:httpGet方式。

[root@sqm-master yaml]# vim http-readiness.yaml
apiVersion: v1
kind: Pod
metadata:
  name: web2
  labels:
    name: web2
spec:
  containers:
  - name: web2
    image: nginx
    ports:
    - containerPort: 81
    readinessProbe:
      httpGet:
        scheme: HTTP    #指定協(xié)議
        path: /healthy    #指定路徑,如果不存在,則需要進(jìn)行創(chuàng)建,否則探測(cè)失敗
        port: 81
      initialDelaySeconds: 10
      periodSeconds: 5
---     
apiVersion: v1       
kind: Service
metadata:
  name: web-svc
spec:
  selector:
    name: web2
  ports:
  - protocol: TCP
    port: 81             
    targetPort: 81
//運(yùn)行pod:
[root@sqm-master yaml]# kubectl apply -f  http-readiness.yaml 
pod/web2 created
service/web-svc created
//查看pod的狀態(tài):
[root@sqm-master yaml]# kubectl  get pod -o wide
NAME        READY   STATUS      RESTARTS   AGE     IP            NODE     NOMINATED NODE   READINESS GATES
readiness   0/1     Completed   0          37m     10.244.2.12   node02   <none>           <none>
web         1/1     Running     0          50m     10.244.1.11   node01   <none>           <none>
web2        0/1     Running     0          2m31s   10.244.1.14   node01   <none>           <none>

k8s探測(cè)機(jī)制之pod健康檢查
查看pod的Events信息,通過(guò)探測(cè),可以知道pod是不健康的,且http訪問(wèn)失敗。
它并不會(huì)重啟,而是直接將pod設(shè)置為不可用的狀態(tài)。

健康檢測(cè)在滾動(dòng)更新過(guò)程中的應(yīng)用:

首先我們通過(guò)explain工具來(lái)查看更新使用的字段:

[root@sqm-master ~]#  kubectl  explain deploy.spec.strategy.rollingUpdate

k8s探測(cè)機(jī)制之pod健康檢查
可以看到在滾動(dòng)更新的過(guò)程中有兩個(gè)參數(shù)可用:

  • maxSurge:此參數(shù)控制滾動(dòng)更新過(guò)程中,副本總數(shù)超過(guò)預(yù)期pod數(shù)量的上限??梢允前俜直?,也可以是具體的值,默認(rèn)為1。如果該值設(shè)置為3,則在更新的過(guò)程中,一來(lái)則會(huì)直接增加三個(gè)pod進(jìn)行更新(當(dāng)然還要進(jìn)行探測(cè)機(jī)制的驗(yàn)證是否更新成功)。該值設(shè)置得越大、升級(jí)速度越快,但會(huì)消耗更多的系統(tǒng)資源。
  • maxUnavailable:此參數(shù)控制滾動(dòng)更新過(guò)程中,不可用的pod的數(shù)量,注意是在原pod數(shù)量中進(jìn)行減少,不會(huì)計(jì)算maxSurge值的范圍。若當(dāng)該值為3時(shí),如果探測(cè)失敗則在升級(jí)的過(guò)程中會(huì)有3個(gè)pod不可用。該值設(shè)置得越大、升級(jí)速度越快,但會(huì)消耗更多的系統(tǒng)資源。

maxSurge和maxUnavailable的適用場(chǎng)景:
1,如果您希望在保證系統(tǒng)可用性和穩(wěn)定性的前提下盡可能快地進(jìn)行升級(jí),可以將 maxUnavailable 設(shè)置為 0,同時(shí)為 maxSurge 賦予一個(gè)較大值。
2,如果系統(tǒng)資源比較緊張,pod 負(fù)載又比較低,為了加快升級(jí)速度,可以將 maxSurge 設(shè)置為 0,同時(shí)為 maxUnavailable 賦予一個(gè)較大值。需要注意的是,如果 maxSurge 為 0maxUnavailable 為 DESIRED,可能造成整個(gè)服務(wù)的不可用,此時(shí) RollingUpdate 將退化成停機(jī)發(fā)布
1)首先我們創(chuàng)建一個(gè)deployment資源對(duì)象:

[root@sqm-master ~]# vim app.v1.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-web
spec:
  replicas: 10              #定義副本數(shù)量為10個(gè)
  template:
    metadata:
      labels:
        name: my-web
    spec:
       containers:
        - name: my-web
          image: nginx
          args:
          - /bin/sh
          - -c
          - touch /usr/share/nginx/html/test.html; sleep 300000; #創(chuàng)建文件,使其在探測(cè)時(shí)保持pod為健康狀態(tài)
          ports:
          - containerPort: 80
          readinessProbe:       #使用readiness機(jī)制
            exec:
              command:
              - cat
              - /usr/share/nginx/html/test.html
            initialDelaySeconds: 10
            periodSeconds: 10
//運(yùn)行該pod后,查看pod數(shù)量(10個(gè)):
[root@sqm-master yaml]# kubectl  get pod -o wide
NAME                      READY   STATUS      RESTARTS   AGE     IP            NODE     NOMINATED NODE   READINESS GATES
my-web-7bbd55db99-2g6tp   1/1     Running     0          2m11s   10.244.2.44   node02   <none>           <none>
my-web-7bbd55db99-2jdbz   1/1     Running     0          118s    10.244.2.45   node02   <none>           <none>
my-web-7bbd55db99-5mhcv   1/1     Running     0          2m53s   10.244.1.40   node01   <none>           <none>
my-web-7bbd55db99-77b4v   1/1     Running     0          2m      10.244.1.44   node01   <none>           <none>
my-web-7bbd55db99-h888n   1/1     Running     0          2m53s   10.244.2.41   node02   <none>           <none>
my-web-7bbd55db99-j5tgz   1/1     Running     0          2m38s   10.244.2.42   node02   <none>           <none>
my-web-7bbd55db99-kjgm2   1/1     Running     0          2m25s   10.244.1.42   node01   <none>           <none>
my-web-7bbd55db99-kkmh3   1/1     Running     0          2m38s   10.244.1.41   node01   <none>           <none>
my-web-7bbd55db99-lr896   1/1     Running     0          2m13s   10.244.1.43   node01   <none>           <none>
my-web-7bbd55db99-rpd8v   1/1     Running     0          2m23s   10.244.2.43   node02   <none>       

探測(cè)成功,10個(gè)副本全部運(yùn)行。

2)第一次更新:
更新nginx鏡像版本,且設(shè)置滾動(dòng)更新策略:

[root@sqm-master yaml]# vim app.v1.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-web
spec: 
  strategy:       #設(shè)置滾動(dòng)更新策略,通過(guò)該字段下的rollingUpdate的子屬性來(lái)設(shè)置
    rollingUpdate:
      maxSurge: 3                 #指定在滾動(dòng)更新過(guò)程中最多可創(chuàng)建3個(gè)額外的 pod
      maxUnavailable: 3     #- 指定在滾動(dòng)更新過(guò)程中最多允許3 pod 不可用
  replicas: 10              
  template:
    metadata:
      labels:
        name: my-web
    spec:
       containers:
        - name: my-web
          image: 172.16.1.30:5000/nginx:v2.0    #更新的鏡像為私有倉(cāng)庫(kù)中的鏡像nginx:v2.0
          args:
          - /bin/sh
          - -c
          - touch /usr/share/nginx/html/test.html; sleep 300000; 
          ports:
          - containerPort: 80
          readinessProbe:       
            exec:
              command:
              - cat
              - /usr/share/nginx/html/test.html
            initialDelaySeconds: 10
            periodSeconds: 10
//執(zhí)行yaml文件后,查看pod數(shù)量:
[root@sqm-master yaml]# kubectl  get pod -o wide
NAME                      READY   STATUS      RESTARTS   AGE     IP            NODE     NOMINATED NODE   READINESS GATES
my-web-7db8b88b94-468zv   1/1     Running     0          3m38s   10.244.2.57   node02   <none>           <none>
my-web-7db8b88b94-bvszs   1/1     Running     0          3m24s   10.244.1.60   node01   <none>           <none>
my-web-7db8b88b94-c4xvv   1/1     Running     0          3m38s   10.244.2.55   node02   <none>           <none>
my-web-7db8b88b94-d5fvc   1/1     Running     0          3m38s   10.244.1.58   node01   <none>           <none>
my-web-7db8b88b94-lw6nh   1/1     Running     0          3m21s   10.244.2.59   node02   <none>           <none>
my-web-7db8b88b94-m9gbh   1/1     Running     0          3m38s   10.244.1.57   node01   <none>           <none>
my-web-7db8b88b94-q5dqc   1/1     Running     0          3m38s   10.244.1.59   node01   <none>           <none>
my-web-7db8b88b94-tsbmm   1/1     Running     0          3m38s   10.244.2.56   node02   <none>           <none>
my-web-7db8b88b94-v5q2s   1/1     Running     0          3m21s   10.244.1.61   node01   <none>           <none>
my-web-7db8b88b94-wlgwb   1/1     Running     0          3m25s   10.244.2.58   node02   <none>           <none>
//查看pod的版本信息:
[root@sqm-master yaml]# kubectl  get deployments. -o wide
NAME     READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                        SELECTOR
my-web   10/10   10           10          49m   my-web       172.16.1.30:5000/nginx:v2.0   name=my-web

探測(cè)成功,10個(gè)pod版本全部更新成功。

3)第二次更新:
將鏡像版本更新為3.0版本,且設(shè)置滾動(dòng)更新策略。(探測(cè)失?。?br/>pod的配置文件如下:

[root@sqm-master yaml]# vim app.v1.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-web
spec:
  strategy:
    rollingUpdate:
      maxSurge: 3                  #定義更新策略,數(shù)量依然都是保持3個(gè)
      maxUnavailable: 3
  replicas: 10                       #pod數(shù)量依然是10個(gè)
  template:
    metadata:
      labels:
        name: my-web
    spec:
       containers:
        - name: my-web
          image: 172.16.1.30:5000/nginx:v3.0   #測(cè)試鏡像版本更新為3.0
          args:
          - /bin/sh
          - -c
          - sleep 300000;        #不在創(chuàng)建指定文件,使其探測(cè)失敗
          ports:
          - containerPort: 80
          readinessProbe:       
            exec:
              command:
              - cat
              - /usr/share/nginx/html/test.html
            initialDelaySeconds: 10
            periodSeconds: 5
//重新運(yùn)行pod配置文件:
[root@sqm-master yaml]# kubectl apply -f  app.v1.yaml 
deployment.extensions/my-web configured
//查看pod更新后的數(shù)量:
[root@sqm-master yaml]# kubectl  get pod  -o wide
NAME                      READY   STATUS      RESTARTS   AGE    IP            NODE     NOMINATED NODE   READINESS GATES
my-web-7db8b88b94-468zv   1/1     Running     0          12m    10.244.2.57   node02   <none>           <none>
my-web-7db8b88b94-c4xvv   1/1     Running     0          12m    10.244.2.55   node02   <none>           <none>
my-web-7db8b88b94-d5fvc   1/1     Running     0          12m    10.244.1.58   node01   <none>           <none>
my-web-7db8b88b94-m9gbh   1/1     Running     0          12m    10.244.1.57   node01   <none>           <none>
my-web-7db8b88b94-q5dqc   1/1     Running     0          12m    10.244.1.59   node01   <none>           <none>
my-web-7db8b88b94-tsbmm   1/1     Running     0          12m    10.244.2.56   node02   <none>           <none>
my-web-7db8b88b94-wlgwb   1/1     Running     0          12m    10.244.2.58   node02   <none>           <none>
my-web-849cc47979-2g59w   0/1     Running     0          3m9s   10.244.1.63   node01   <none>           <none>
my-web-849cc47979-2lkb6   0/1     Running     0          3m9s   10.244.1.64   node01   <none>           <none>
my-web-849cc47979-762vb   0/1     Running     0          3m9s   10.244.1.62   node01   <none>           <none>
my-web-849cc47979-dv7x8   0/1     Running     0          3m9s   10.244.2.61   node02   <none>           <none>
my-web-849cc47979-j6nwz   0/1     Running     0          3m9s   10.244.2.60   node02   <none>           <none>
my-web-849cc47979-v5h7h   0/1     Running     0          3m9s   10.244.2.62   node02   <none>           <none>

我們可以看到當(dāng)前pod的總數(shù)量為13個(gè),(包括maxSurge增加額外的數(shù)量)因?yàn)樘綔y(cè)失敗,則設(shè)置為將3個(gè)pod(包括額外的pod)為不可用的狀態(tài),但還剩下7個(gè)pod可用( 因?yàn)閙axUnavailable設(shè)置為3個(gè)),但注意:這7個(gè)pod的版本并沒(méi)有更新成功,還是上一個(gè)的版本。

//查看pod的更新后的版本信息:
[root@sqm-master yaml]# kubectl  get deployments. -o wide
NAME     READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                        SELECTOR
my-web   7/10    6            7           58m   my-web       172.16.1.30:5000/nginx:v3.0   name=my-web

參數(shù)解釋?zhuān)?br/>READY :表示用戶的期望值
UP-TO-DATE:表示已更新的
AVAILABLE:表示可用的

我們可以發(fā)現(xiàn)已更新的鏡像版本數(shù)量為6個(gè)(包括額外的3個(gè)pod),但是為不可用的狀態(tài),但是確??捎玫牡膒od數(shù)量為7個(gè),但是版本并沒(méi)有更新。

總結(jié):
描述在滾動(dòng)更新過(guò)程中,探測(cè)機(jī)制有什么作用?

如果在公司中需要對(duì)某個(gè)應(yīng)用中的pod進(jìn)行更新操作,如果沒(méi)有探測(cè)機(jī)制,無(wú)論該pod是不是當(dāng)你已經(jīng)做好更新工作準(zhǔn)備要進(jìn)行更新的,它都會(huì)將該應(yīng)用中所有的pod進(jìn)行更新,這樣會(huì)造成嚴(yán)重的后果,雖然更新后你發(fā)現(xiàn)pod的狀態(tài)是正常的,為了達(dá)到controller manager的期望值,READY的值依然是1/1, 但是pod已經(jīng)是重新生成的pod了,表示pod內(nèi)的數(shù)據(jù)將會(huì)全部丟失。
如果加上探測(cè)機(jī)制的話,會(huì)探測(cè)容器內(nèi)你指定的文件或其他應(yīng)用是否存在,如果達(dá)到你指定的條件,則探測(cè)成功,則會(huì)對(duì)你的pod進(jìn)行更新,如果探測(cè)失敗則會(huì)設(shè)置pod(容器)為不可用,雖然探測(cè)失敗的容器不可用了,但至少該模塊中還有其他之前版本的pod可用,確保該公司該服務(wù)的正常運(yùn)行??梢?jiàn)探測(cè)機(jī)制是多么的重要啊。

———————— 本文至此結(jié)束,感謝閱讀 ————————

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI