您好,登錄后才能下訂單哦!
首先來(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ù)。
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)返回是成功的。
什么是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è)方式:
第一種探測(cè)方式和第三種非常相似,一般常用的是第一和第二種的探測(cè)方式。
方法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è)一次。
我們可以看到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
從上面的事件中可以發(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秒前的情況:
##最開(kāi)始的10秒該容器是活著的,且返回的狀態(tài)碼為200.
###10秒后當(dāng)探測(cè)機(jī)制開(kāi)始探測(cè)時(shí)再次查看pod的情況:
//查看的pod的events:
[root@sqm-master yaml]# kubectl describe pod web
可以看到返回的狀態(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
//重新運(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
返回的狀態(tài)碼為200,表示這個(gè)pod的狀況時(shí)健康的。
方法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):
//查看pod的Events:
[root@sqm-master yaml]# kubectl describe pod readiness
可以看到找不到該文件,表示探測(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>
查看pod的Events信息,通過(guò)探測(cè),可以知道pod是不健康的,且http訪問(wèn)失敗。
它并不會(huì)重啟,而是直接將pod設(shè)置為不可用的狀態(tài)。
首先我們通過(guò)explain工具來(lái)查看更新使用的字段:
[root@sqm-master ~]# kubectl explain deploy.spec.strategy.rollingUpdate
可以看到在滾動(dòng)更新的過(guò)程中有兩個(gè)參數(shù)可用:
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é)束,感謝閱讀 ————————
免責(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)容。