自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Docker 容器健康檢查機(jī)制

云計(jì)算
對于容器而言,最簡單的健康檢查是進(jìn)程級的健康檢查,即檢驗(yàn)進(jìn)程是否存活。Docker Daemon會自動監(jiān)控容器中的PID1進(jìn)程,如果docker run命令中指明了restart policy,可以根據(jù)策略自動重啟已結(jié)束的容器。在很多實(shí)際場景下,僅使用進(jìn)程級健康檢查機(jī)制還遠(yuǎn)遠(yuǎn)不夠。比如,容器進(jìn)程雖然依舊運(yùn)行卻由于應(yīng)用死鎖無法繼續(xù)響應(yīng)用戶請求,這樣的問題是無法通過進(jìn)程監(jiān)控發(fā)現(xiàn)的。

[[201204]]

在分布式系統(tǒng)中,經(jīng)常需要利用健康檢查機(jī)制來檢查服務(wù)的可用性,防止其他服務(wù)調(diào)用時出現(xiàn)異常。

對于容器而言,最簡單的健康檢查是進(jìn)程級的健康檢查,即檢驗(yàn)進(jìn)程是否存活。Docker Daemon會自動監(jiān)控容器中的PID1進(jìn)程,如果docker run命令中指明了restart policy,可以根據(jù)策略自動重啟已結(jié)束的容器。在很多實(shí)際場景下,僅使用進(jìn)程級健康檢查機(jī)制還遠(yuǎn)遠(yuǎn)不夠。比如,容器進(jìn)程雖然依舊運(yùn)行卻由于應(yīng)用死鎖無法繼續(xù)響應(yīng)用戶請求,這樣的問題是無法通過進(jìn)程監(jiān)控發(fā)現(xiàn)的。

在Kubernetes提供了Liveness與Readness探針分別對Container及其服務(wù)健康狀態(tài)進(jìn)行檢查。阿里云容器服務(wù)也提供了類似的服務(wù)健康檢查機(jī)制。

Docker 原生健康檢查能力

而自 1.12 版本之后,Docker 引入了原生的健康檢查實(shí)現(xiàn),可以在Dockerfile中聲明應(yīng)用自身的健康檢測配置。HEALTHCHECK 指令聲明了健康檢測命令,用這個命令來判斷容器主進(jìn)程的服務(wù)狀態(tài)是否正常,從而比較真實(shí)的反應(yīng)容器實(shí)際狀態(tài)。

HEALTHCHECK 指令格式:

  • HEALTHCHECK [選項(xiàng)] CMD <命令>:設(shè)置檢查容器健康狀況的命令
  • HEALTHCHECK NONE:如果基礎(chǔ)鏡像有健康檢查指令,使用這行可以屏蔽掉

注:在Dockerfile中 HEALTHCHECK 只可以出現(xiàn)一次,如果寫了多個,只有最后一個生效。

使用包含 HEALTHCHECK 指令的dockerfile構(gòu)建出來的鏡像,在實(shí)例化Docker容器的時候,就具備了健康狀態(tài)檢查的功能。啟動容器后會自動進(jìn)行健康檢查。

HEALTHCHECK 支持下列選項(xiàng):

  • interval=<間隔>:兩次健康檢查的間隔,默認(rèn)為 30 秒;
  • timeout=<間隔>:健康檢查命令運(yùn)行超時時間,如果超過這個時間,本次健康檢查就被視為失敗,默認(rèn) 30 秒;
  • retries=<次數(shù)>:當(dāng)連續(xù)失敗指定次數(shù)后,則將容器狀態(tài)視為 unhealthy,默認(rèn) 3 次。
  • start-period=<間隔>: 應(yīng)用的啟動的初始化時間,在啟動過程中的健康檢查失效不會計(jì)入,默認(rèn) 0 秒; (從17.05)引入

在 HEALTHCHECK [選項(xiàng)] CMD 后面的命令,格式和 ENTRYPOINT 一樣,分為 shell 格式,和 exec 格式。命令的返回值決定了該次健康檢查的成功與否:

  • 0:成功;
  • 1:失敗;
  • 2:保留值,不要使用

容器啟動之后,初始狀態(tài)會為 starting (啟動中)。Docker Engine會等待 interval 時間,開始執(zhí)行健康檢查命令,并周期性執(zhí)行。如果單次檢查返回值非0或者運(yùn)行需要比指定 timeout 時間還長,則本次檢查被認(rèn)為失敗。如果健康檢查連續(xù)失敗超過了 retries 重試次數(shù),狀態(tài)就會變?yōu)?unhealthy (不健康)。

注:

  • 一旦有一次健康檢查成功,Docker會將容器置回 healthy (健康)狀態(tài)
  • 當(dāng)容器的健康狀態(tài)發(fā)生變化時,Docker Engine會發(fā)出一個 health_status 事件。

假設(shè)我們有個鏡像是個最簡單的 Web 服務(wù),我們希望增加健康檢查來判斷其 Web 服務(wù)是否在正常工作,我們可以用 curl來幫助判斷,其 Dockerfile 的 HEALTHCHECK 可以這么寫:

  1. FROM elasticsearch:5.5 
  2.  
  3. HEALTHCHECK --interval=5s --timeout=2s --retries=12 \ 
  4.   CMD curl --silent --fail localhost:9200/_cluster/health || exit 1 
  5. docker build -t test/elasticsearch:5.5 . 
  6.  
  7. docker run --rm -d \ 
  8.     --name=elasticsearch \ 
  9.     test/elasticsearch:5.5 

我們可以通過 docker ps,來發(fā)現(xiàn)過了幾秒之后,Elasticsearch容器從 starting 狀態(tài)進(jìn)入了 healthy 狀態(tài)

  1. $ docker ps 
  2. CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                            PORTS                NAMES 
  3. c9a6e68d4a7f        test/elasticsearch:5.5   "/docker-entrypoin..."   2 seconds ago       Up 2 seconds (health: starting)   9200/tcp, 9300/tcp   elasticsearch 
  4. $ docker ps 
  5. CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                    PORTS                NAMES 
  6. c9a6e68d4a7f        test/elasticsearch:5.5   "/docker-entrypoin..."   14 seconds ago      Up 13 seconds (healthy)   9200/tcp, 9300/tcp   elasticsearch 

另外一種方法是在 docker run 命令中,直接指明healthcheck相關(guān)策略。

  1. $ docker run --rm -d \ 
  2.     --name=elasticsearch \ 
  3.     --health-cmd="curl --silent --fail localhost:9200/_cluster/health || exit 1" \ 
  4.     --health-interval=5s \ 
  5.     --health-retries=12 \ 
  6.     --health-timeout=2s \ 
  7.     elasticsearch:5.5 

為了幫助排障,健康檢查命令的輸出(包括 stdout 以及 stderr)都會被存儲于健康狀態(tài)里,可以用 docker inspect 來查看。我們可以通過如下命令,來獲取過去5個容器的健康檢查結(jié)果

  1. docker inspect --format='{{json .State.Health}}' elasticsearch 

  1. docker inspect elasticsearch | jq ".[].State.Health" 

示例結(jié)果如下

  1.   "Status""healthy"
  2.   "FailingStreak": 0, 
  3.   "Log": [ 
  4.     { 
  5.       "Start""2017-08-19T09:12:53.393598805Z"
  6.       "End""2017-08-19T09:12:53.452931792Z"
  7.       "ExitCode": 0, 
  8.       "Output""..." 
  9.     }, 
  10.     ... 

由于應(yīng)用的開發(fā)者會更加了解應(yīng)用的SLA,一般建議在Dockerfile中聲明相應(yīng)的健康檢查策略,這樣可以方便鏡像的使用。對于應(yīng)用的部署和運(yùn)維人員,可以通過命令行參數(shù)和REST API針對部署場景對健康檢查策略按需進(jìn)行調(diào)整。

注:

  • 阿里云容器服務(wù)同時支持Docker原生健康檢測機(jī)制和阿里云的擴(kuò)展檢查機(jī)制
  • 目前Kubernetes還不提供對Docker原生健康檢查機(jī)制的支持。

Docker Swarm mode中的服務(wù)健康檢查能力

在Docker 1.13之后,在Docker Swarm mode中提供了對健康檢查策略的支持

可以在 docker service create 命令中指明健康檢查策略

  1. $ docker service create -d \ 
  2.     --name=elasticsearch \ 
  3.     --health-cmd="curl --silent --fail localhost:9200/_cluster/health || exit 1" \ 
  4.     --health-interval=5s \ 
  5.     --health-retries=12 \ 
  6.     --health-timeout=2s \ 
  7.     elasticsearch 

在Swarm模式下,Swarm manager會監(jiān)控服務(wù)task的健康狀態(tài),如果容器進(jìn)入 unhealthy 狀態(tài),它會停止容器并且重新啟動一個新容器來取代它。這個過程中會自動更新服務(wù)的 load balancer (routing mesh) 后端或者 DNS記錄,可以保障服務(wù)的可用性。

在1.13版本之后,在服務(wù)更新階段也增加了對健康檢查的支持,這樣在新容器完全啟動成功并進(jìn)入健康狀態(tài)之前,load balancer/DNS解析不會將請求發(fā)送給它。這樣可以保證應(yīng)用在更新過程中請求不會中斷。

下面是在服務(wù)更新過程的時序圖

 

總結(jié)

在企業(yè)生產(chǎn)環(huán)境中,合理的健康檢查設(shè)置可以保證應(yīng)用的可用性?,F(xiàn)在很多應(yīng)用框架已經(jīng)內(nèi)置了監(jiān)控檢查能力,比如Spring Boot Actuator。配合Docker內(nèi)置的健康檢測機(jī)制,可以非常簡潔實(shí)現(xiàn)應(yīng)用可用性監(jiān)控,自動故障處理,和零宕機(jī)更新。

責(zé)任編輯:武曉燕 來源: 阿里云
相關(guān)推薦

2023-05-09 07:34:25

Docker健康檢查方式

2022-09-07 09:19:49

Docker健康檢查

2024-02-27 17:30:11

2023-03-02 07:20:10

GRPC服務(wù)健康檢查協(xié)議

2020-12-07 06:29:13

SpringBoot

2023-03-03 08:19:35

KubernetesgRPC

2023-03-01 08:33:37

gRPC健康檢查代碼

2022-08-23 10:04:23

Dockerhealth健康檢查

2021-07-15 10:25:15

集群節(jié)點(diǎn)檢查

2022-02-28 07:40:23

Nacos注冊中心客戶端

2023-10-14 15:36:14

PodKubernetes

2024-10-31 15:16:35

2021-01-15 05:38:28

ASPHttp端口

2021-04-18 10:34:28

Spring Clou郵件釘釘

2021-09-18 16:10:48

Spring BootJava微服務(wù)

2021-09-21 16:31:56

Windows 11微軟PC健康檢查工具

2021-07-05 06:51:41

Nacos微服務(wù)源碼

2024-02-19 08:01:59

服務(wù)微服務(wù)授權(quán)

2023-02-18 13:34:14

Nacos健康檢查機(jī)制

2022-12-27 07:42:12

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號