偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

在Docker中巧用Healthcheck檢查健康狀態(tài)

云計算
自 1.12 版本之后,Docker 引入了原生的健康檢查實現(xiàn)。對于容器而言,最簡單的健康檢查是進程級的健康檢查,即檢驗進程是否存活。

Docker 原生健康檢查能力

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

當一個容器有指定健康檢查 (HEALTHCHECK) 時,它除了普通的容器狀態(tài)之外,還有以下幾種狀態(tài):

  • starting:容器仍在啟動時的初始狀態(tài)
  • healthy:如果命令成功,則容器是健康的
  • unhealthy:如果單次運行時間超過指定的超時時間,則認為它不健康。如果運行狀況檢查失敗,則將運行重試次數(shù),如果仍然失敗,將被宣布為不健康。

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

注:

一旦有一次健康檢查成功,Docker會將容器置回 healthy (健康)狀態(tài)

當容器的健康狀態(tài)發(fā)生變化時,Docker Engine會發(fā)出一個 health_status 事件。通過檢查容器監(jiān)控狀態(tài)有以下兩種方式:

1. Dockerfile 方式

可以在Dockerfile中聲明應(yīng)用自身的健康檢測配置。HEALTHCHECK指令聲明了健康檢測命令,用這個命令來判斷容器主進程的服務(wù)狀態(tài)是否正常,從而比較真實的反應(yīng)容器實際狀態(tài)。

HEALTHCHECK指令格式:

HEALTHCHECK [選項] CMD <命令>:設(shè)置檢查容器健康狀況的命令

HEALTHCHECK NONE:如果基礎(chǔ)鏡像有健康檢查指令,使用這行可以屏蔽掉

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

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

HEALTHCHECK 支持下列選項:

--interval=<間隔>:兩次健康檢查的間隔,默認為 30 秒;

--timeout=<間隔>:健康檢查命令運行超時時間,如果超過這個時間,本次健康檢查就被視為失敗,默認 30 秒;

--retries=<次數(shù)>:當連續(xù)失敗指定次數(shù)后,則將容器狀態(tài)視為 unhealthy,默認 3 次。

--start-period=<間隔>: 應(yīng)用的啟動的初始化時間,在啟動過程中的健康檢查失效不會計入,默認 0 秒;

參數(shù)作用解釋如下:

運行狀態(tài)檢查首先會在容器啟動后的 interval 秒內(nèi)運行,然后在前一次檢查完成后的 interval 秒內(nèi)再次運行。

如果一次狀態(tài)檢查花費的時間超過 timeout 秒,則認為這次檢查失敗。

容器的運行狀態(tài)檢查連續(xù)失敗 retries 次才會被視為不健康。

start period 為需要時間啟動的容器提供初始化時間。在此期間的探測失敗將不計入最大重試次數(shù)。

但是,如果在啟動期間健康檢查成功,則認為容器已啟動,所有連續(xù)失敗的情況都將計算到最大重試次數(shù)。

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

0:成功;

1:失敗;

2:保留值,不要使用

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

FROM nginx:1.23
HEALTHCHECK --interval=5s --timeout=3s  --retries=3 \
    CMD curl -fs http://localhost/ || exit 1

這里設(shè)置了每 5 秒檢查一次(這里為了試驗所以間隔非常短,實際應(yīng)該相對較長),如果健康檢查命令超過 3 秒沒響應(yīng),并且重試3次都沒響應(yīng)就視為失敗,并且使用curl -fs http://localhost/ || exit 1作為健康檢查命令。

使用docker build來構(gòu)建這個鏡像:

docker build -t myweb:v1 .

構(gòu)建好后啟動容器:

docker run -d --name web myweb:v1

當運行該鏡像后,可以通過docker container ls看到最初的狀態(tài)為(health: starting):

docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                            PORTS               NAMES
7068d793c6e4        myweb:v1            "/docker-entrypoint.…"   3 seconds ago       Up 2 seconds (health: starting)   80/tcp              web

在等待幾秒鐘后,再次docker container ls,就會看到健康狀態(tài)變化為了(healthy):

$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS               NAMES
7068d793c6e4        myweb:v1            "/docker-entrypoint.…"   18 seconds ago      Up 16 seconds (healthy)   80/tcp               web

如果健康檢查連續(xù)失敗超過了重試次數(shù),狀態(tài)就會變?yōu)?unhealthy)。

為了幫助排障,健康檢查命令的輸出(包括stdout以及stderr)都會被存儲于健康狀態(tài)里,可以用 docker inspect來查看。

2. docker run 方式

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

$ docker run  -d \
    --name=myweb \
    --health-cmd="curl -fs http://localhost/ || exit 1" \
    --health-interval=5s \
    --health-retries=12 \
    --health-timeout=2s \
    nginx:1.23

通過執(zhí)行docker run --help | grep health命令查看相關(guān)的參數(shù)及解釋如下:

--health-cmd string:運行檢查健康狀況的命令

--health-interval duration:運行間隔時間(ms|s|m|h)(缺省為0s)

--health-retries int:需要報告不健康的連續(xù)失敗次數(shù)

--health-start-period duration :容器在開始健康重試倒計時之前初始化的起始周期(ms|s|m|h)(默認0)

--health-timeout duration:允許一次檢查運行的最大時間(ms|s|m|h)(默認為0s)

--no-healthcheck:禁用任何容器指定的HEALTHCHECK,會使得Dockerfile構(gòu)建出來的HEALTHCHECK功能失效。

如果是以supervisor來管理容器的多個服務(wù),想通過子服務(wù)的狀態(tài)來判斷容器的監(jiān)控狀態(tài),可以使用supervisorctl status來做判斷,比如:

$ docker run --rm -d \
    --name=myweb \
    --health-cmd="supervisorctl status" \
    --health-interval=5s \
    --health-retries=3 \
    --health-timeout=2s \
    nginx:v1

按照此參數(shù)的設(shè)置,如果supervisorctl status檢查子服務(wù)有一個不為正常的RUNNING狀態(tài),那么在等待大約15秒左右,容器的健康狀態(tài)就會從(healthy)變?yōu)?unhealthy)。

3. docker-compose 方式

在docker-compose中,healthcheck聲明運行該檢查以確定此服務(wù)的容器是否“正?!?。這將覆蓋由服務(wù)的 Docker 映像設(shè)置的 HEALTHCHECK Dockerfile 指令。參考:healthcheck

以通過supervisor管理子進程的容器為例:

version: '3.8'
services:
  web:
    image: nginx:v1
    container_name: web
    healthcheck:
      test: ["CMD", "supervisorctl", "status"]
      interval: 5s
      timeout: 2s
      retries: 3
      start_period: 10s

注意:start_period參數(shù),在Version 2.3和Version 3.4中引入,如果在yml文件中的開頭寫的是version: ‘3’,這相當于是3.0版本,會導(dǎo)致啟動失敗,出現(xiàn)類似信息:services.web.healthcheck value Additional properties are not allowed ('start_period' was unexpected)。因此需要把docker-compose的version指定2.3或者3.4之后的版本。Compose版本及Docker Engine的兼容版本對應(yīng)關(guān)系參考:compatibility-matrix

執(zhí)行成功后,等待數(shù)秒查詢?nèi)萜鞯臓顟B(tài):

$ docker-compose ps
Name              Command                  State                 Ports          
--------------------------------------------------------------------------------
web    supervisord -c /etc/superv ...   Up (healthy)   443/tcp, 80/tcp

當通過手動supervisorctl stop停掉里面的一些子服務(wù),導(dǎo)致里面的子服務(wù)狀態(tài)不全為RUNNING狀態(tài)時,再查看容器的狀態(tài):

$ docker-compose ps
Name              Command                   State                  Ports          
----------------------------------------------------------------------------------
web    supervisord -c /etc/superv ...   Up (unhealthy)   443/tcp, 80/tcp

容器的健康狀態(tài)也會從(healthy)變?yōu)?unhealthy)。

也可以通過設(shè)置disable: true來禁用鏡像設(shè)置的運行狀況檢查:

healthcheck:
  disable: true


責任編輯:華軒 來源: 微技術(shù)之家
相關(guān)推薦

2022-08-23 10:04:23

Dockerhealth健康檢查

2017-08-25 10:20:46

Docker容器機制

2023-03-03 08:19:35

KubernetesgRPC

2023-05-09 07:34:25

Docker健康檢查方式

2021-07-15 10:25:15

集群節(jié)點檢查

2023-03-02 07:20:10

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

2013-11-20 14:46:43

PowerShellPowerShell Windows Ser

2013-11-20 14:41:08

PowerShellPowerShell Windows Ser

2022-09-07 09:19:49

Docker健康檢查

2017-05-17 14:51:31

DNS架構(gòu)負載均衡

2023-03-01 08:33:37

gRPC健康檢查代碼

2021-01-15 05:38:28

ASPHttp端口

2019-12-26 14:00:01

AI人工智能太空旅行

2020-10-30 10:49:37

DockerGPULinux

2023-10-14 15:36:14

PodKubernetes

2024-02-27 17:30:11

2020-12-24 17:10:54

DockerLinux微信

2020-12-07 06:29:13

SpringBoot

2010-08-10 10:15:01

思科路由器Nipper

2009-04-29 15:57:53

點贊
收藏

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