kubernetes健康檢查能力

背景: 使用k8s過程當中因爲服務存在bug致使業務中斷,因此須要增長健康檢查,主要參考k8s的文檔docker

docker提供的健康檢查能力

在容器化場景下,對於容器的健康檢查可能經過在製做docker鏡像時的dockerfile中增長HEALTHCHECK指令(僅能有一條)的方式進行,HEALTHCHECK指令主要有兩種形式:api

  • HEALTHCHECK [OPTIONS] CMD command : 經過在容器中運行命令來進行健康檢查
  • HEALTHCHECK NONE : 禁止任何健康檢查

當容器指定了健康檢查指令後,容器的狀態將多出一種健康狀態,健康狀態初始化爲starting,當健康檢查指令執行經過後,狀態轉爲healthy,若是容器健康檢查失敗了,將轉爲unhealthy 對於OPTIONS能夠指定如下的參數bash

  • --interval=DURATION (默認值: 30s)
  • --timeout=DURATION (默認值: 30s)
  • --start-period=DURATION (默認值: 0s)
  • --retries=N (默認值: 3) 健康檢查將在容器啓動後interval時間後第一次執行,並在上一次執行完後間隔interval時間執行,若是健康檢查命令執行的時間超過了timeout參數值,則會斷定執行失敗,retries參數表示連續執行retries次健康檢查均失敗後纔會判斷容器爲unhealthy,start-period表示容器啓動後的初始化時間,在這期間內的健康檢查失敗將不會計數

對於CMD命令,命令的返回值表示了容器的健康檢查狀態,一共有三種網絡

  • 0: success - the container is healthy and ready for use
  • 1: unhealthy - the container is not working correctly
  • 2: reserved - do not use this exit code 示例:
HEALTHCHECK --interval=5m --timeout=3s \
  CMD curl -f http://localhost/ || exit 1

(參考https://docs.docker.com/engine/reference/builder/)curl

k8s提供的健康檢查能力

k8s不支持經過docker的HEALTHCHECK來進行容器的健康檢查(Docker Swarm能夠-可是我沒用過),可是k8s自身提供了兩種相似於健康檢查的能力socket

  • livenessProbe 檢查是否須要重啓pod,檢查不重啓就沒法恢復的異常
  • readnessProbe 檢查容器是否就緒,若是未就緒,loadbalancer不會分發流量到這個pod的endpoint

使用方法

在pod的containers中定義livenessProbe或readnessProbetcp

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: k8s.gcr.io/busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

支持的健康檢查方式

命令(腳本)健康檢查

經過在容器中執行命令(腳本)的方式來獲取容器的狀態,腳本或命令返回0時表示成功,不然表示失敗(若是容器指定了用戶,則會以對應用戶去執行,因此注意使用腳本時須要相應的權限)ui

livenessProbe:
    exec:
      command:
        - /bin/bash
        - /home/test/healthcheck.sh
    initialDelaySeconds: 5
    periodSeconds: 5

HTTP健康檢查

經過發送HTTP GET請求的方式獲取容器狀態,返回狀態碼>=200且<400時表示狀態正常,不然表示失敗,支持自定義HTTP Header(在1.13版本前若是容器內定義了http_proxy環境變量,則在發送請求時會使用proxy,1.13及之後版本中不會再受此影響)this

livenessProbe:
      httpGet:
        path: /healthcheck
        port: 1888
        httpHeaders:
        - name: Custom-Header
          value: Test
      initialDelaySeconds: 3
      periodSeconds: 3

http檢查的一些字段url

port: 端口
path: uri
httpHeaders: 請求頭
host: 主機名,默認值時pod自身的ip地址(沒用過,也許多網絡平面場景下須要使用)
scheme: HTTP/HTTPS 默認HTTP

TCP健康檢查

經過tcp socket創建鏈接的方式去判斷容器狀態,若是可以建連成功,則判斷狀態正常,不然異常

livenessProbe:
      tcpSocket:
        port: 1888
      initialDelaySeconds: 15
      periodSeconds: 20

健康檢查的配置

除了健康檢查方式外,還有一些參數用於控制健康檢查的的行爲

  • initialDelaySeconds: 容器啓動後多長時間開始進行健康檢查
  • periodSeconds: 健康檢查的週期(默認10 最小1)
  • timeoutSeconds: 檢查的超時時間(默認1 最小1)
  • successThreshold: 健康檢查失敗後多少次成功才判斷容器狀態爲成功,默認爲1,對於livenessProbe必須爲1(對於livenessProbe沒有必要配置這個參數)
  • failureThreshold: 多少次健康檢查失敗後判斷容器狀態爲failed(默認3 最小1)

參考

https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/

相關文章
相關標籤/搜索