K8S的健康检查

在Kubernetes 集群当中,通过配置liveness probe(存活探针)和 readiness probe(就绪探针)来影响容器的生存周期

kubelet 通过使用 liveness probe 来确定你的应用程序是否正在运行,通俗点将就是是否还活着。一般来说,如果你的程序一旦崩溃了, Kubernetes 就会立刻知道这个程序已经终止了,然后就会重启这个程序。而我们的 liveness probe 的目的就是来捕获到当前应用程序还 没有终止,还没有崩溃,如果出现了这些情况,那么就重启处于该状态 下的容器,使应用程序在存在 bug 的情况下依然能够继续运行下去

kubelet 使用 readiness probe 来确定容器是否已经就绪可以接收 流量过来了。这个探针通俗点讲就是说是否准备好了,现在可以开始工作了。只有当 Pod 中的容器都处于就绪状态的时候 kubelet 才会认定该 Pod 处于就绪状态,因为一个 Pod 下面可能会有多个容器。当然 Pod 如果处于非就绪状态,那么就会将它从我们的工作队列(实际 上就是后面需要重点学习的 Service)中移除出来,这样流量就不会被 路由到这个 Pod 里面来了。

exec:执行一段命令
http:检测某个 http 请求
tcpSocket:使用此配置, kubelet 将尝试在指定端口上打开容器的套接字。如果可以建立连接,容器被认为是健康的,如果不能就认为是失败的。实际上就是检查端口

例:

1.使用exec执行命令的方式来检测容器的存活

vim liveness-exec.yaml

apiVersion: v1
kind: Pod
metadata:
  name: liveness-exec
  labels:
    test: liveness
spec:
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600               #容器主应用命令
    livenessProbe:                       #在容器应用进行中使用liveness进行验证通过exec发送指令cat /tmp/healthy 如果主应用删掉/tmp/healthy,那么就会报错默认会重启容器
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5      #启动容器后等待5秒后执行
      periodSeconds: 5     #每隔5秒执行

#periodSeconds 属性表示让kubelet每隔5秒执行一次存活探针,也就是每5秒执行一次上面的cat /tmp/healthy 命令

#initialDelaySeconds 表示在第一次执行探针的时候要等待5秒,这样能够确保容器能够有足够的时间启动起来。如果第一次执行探针等候的时间太短,
很有可能容器还没正常启动起来,存活探针很可能始终都是失败的,这样就会无休止的重启下去。所以一个合理的initialDelaySeconds 非常重要

2.使用HTTP GET请求来配置存活探针

vim http.yaml

apiVersion: v1
kind: Pod
metadata:
  name: liveness-httpget
  labels:
    app: liveness-httpget
spec:
  containers:
    - name: liveness-httpget
      image: 192.168.11.14/k8s/myapp:v2
      ports:
      - name: http
        containerPort: 80
      livenessProbe:
        httpGet:
          port: http
          path: /index.html
        initialDelaySeconds: 3
        periodSeconds: 3
        timeoutSeconds: 3
  imagePullSecrets:
    - name: registry-harbor
  restartPolicy: Always

#通常来说,任何大于200小于400的返回码都会认定是成功的返回码。其他返回码都会被认为是失败的返回码

#进入容器删除首页
kubectl create -f liveness-httpget.yaml
kubectl get pod
kubectl get pod -o wide
curl <pod IP>
kubectl exec liveness-httpget -it -- /bin/sh
# rm -f /usr/share/nginx/html/index.html
# exit
curl <pod IP>
kubectl get pod
# 容器会重启一次
kubectl exec liveness-httpget -it -- rm -f
/usr/share/nginx/html/index.html
kubectl get pod -w

3.通过端口的方式来配置存活探针,使用此配置,kubelet将尝试在指定端 口上打开容器的套接字。如果可以建立连接,容器被认为是健康的,如果不能就认为是失败的。

vim port.yaml

apiVersion: v1
kind: Pod
metadata:
  name: goproxy
  labels:
    app: goproxy
spec:
  containers:
  - name: goproxy
    image: jfengz/goproxy
    ports:
    - containerPort: 8080
    readinessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 15     #容器运行后15秒后执行
      periodSeconds: 10           #容器运行时每隔10秒执行
    livenessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 10    
      periodSeconds: 20