K8S学习之基础十二:容器的三种探测

发布于:2025-03-06 ⋅ 阅读:(16) ⋅ 点赞:(0)

容器的三种探测:

startupprobe:探测容器中的应用是否已经启动。如果启动则禁用其他所有探测,知道它成功为止,如果启动探测失败,kubelet将杀死容器,按照重启策略进行。如果没有提供启动探测,默认状态为成功success

livenessporbe:用指定的方式(exec、tcp、http)检测pod中容器是否正常运行,如果失败则任务不健康,根据重启策略进行。如果没有配置linenessprobe,默认状态为成功success

readinessporbe:用于检测容器中的应用是否可以接受请求,当探针成功后才使pod对外提供网络访问,将容器标记为就绪状态,可以加到pod前段负载,如果失败,则将容器标记为未就绪,把pod从前端移除

顺序:先startupprobe,后livenessprobe和livenessprobe,存货和就绪无前后顺序

三种探针:

exec:容器中执行指定命令,成功退出码为0,则探测成功

TCPSocket:通过容器ip+port执行TCP,如果能建立了链接,表明容器健康

HTTPSocket:通过ip+port+dir调用HTTPGet方法,如果[200,400),容器健康

探针检测结果:

success:通过检测

failure:未通过检测

unknown:检测没有正常进行

pod探针相关属性

探针(Probe)有许多可选字段,可以用来更加精确的控制Liveness和Readiness两种探针的行为 initialDelaySeconds:容器启动后要等待多少秒后探针开始工作,单位“秒”,默认是 0 秒,最小值是 0 

periodSeconds: 执行探测的时间间隔(单位是秒),默认为 10s,单位“秒”,最小值是1

timeoutSeconds: 探针执行检测请求后,等待响应的超时时间,默认为1,单位“秒”。

successThreshold:连续探测几次成功,才认为探测成功,默认为 1,在 Liveness 探针中必须为1,最小值为1。

failureThreshold: 探测失败的重试次数,重试一定次数后将认为失败,在 readiness 探针中,Pod会被标记为未就绪,默认为 3,最小值为 1

 两种探针区别:

ReadinessProbe 和 livenessProbe 可以使用相同探测方式,只是对 Pod 的处置方式不同:

readinessProbe 当检测失败后,将 Pod 的 IP:Port 从对应的 EndPoint 列表中删除。

livenessProbe 当检测失败后,将杀死容器并根据 Pod 的重启策略来决定作出对应的措施。

1、启动探测startuprpobe

1.1、exec模式
vi startup-exec.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: startupprobe
spec:
  containers:
  - name: startup
image: 172.16.80.140/tomcat/tomcat:v1
imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 8080
    startupProbe:
     exec:
       command:
       - "/bin/sh"
       - "-c"
       - "ps aux | grep tomcat1"
     initialDelaySeconds: 5 #容器启动后多久开始探测
     periodSeconds: 5 #执行探测的时间间隔
     timeoutSeconds: 3 #探针执行检测请求后,等待响应的超时时间
     successThreshold: 1 #成功多少次才算成功
     failureThreshold: 3 #失败多少次才算失败
# 由于命令ps aux | grep tomcat1 没有返回结果

9.1.2 tcpSocket模式
vi startup-tcp.yaml
apiVersion: v1
kind: Pod
metadata:
  name: startupprobe
spec:
  containers:
  - name: startup
image: 172.16.80.140/tomcat/tomcat:v1
imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 8080
    startupProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 5 #容器启动后多久开始探测
      periodSeconds: 5 #执行探测的时间间隔
      timeoutSeconds: 3 #探针执行检测请求后,等待响应的超时时间
      successThreshold: 1 #成功多少次才算成功
      failureThreshold: 3 #失败多少次才算失败
# 由于tcp8081无返回结果

9.1.3 httpget模式
vi startup-httpget
apiVersion: v1
kind: Pod
metadata:
  name: startupprobe
spec:
  containers:
  - name: startup
image: 172.16.80.140/tomcat/tomcat:v1
imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 8080
    startupProbe:
      httpGet:
        path: /
        port: 8081
      initialDelaySeconds: 5 #容器启动后多久开始探测
      periodSeconds: 5 #执行探测的时间间隔
      timeoutSeconds: 3 #探针执行检测请求后,等待响应的超时时间
      successThreshold: 1 #成功多少次才算成功
      failureThreshold: 3 #失败多少次才算失败

9.2 存活探测livenessprobe

9.2.1 exec模式
vi liveness-exec.yaml
apiVersion: v1
kind: Pod
metadata:
  name: liveness-exec
  labels:
    app: liveness
spec:
  containers:
  - name: liveness
  image: 172.16.80.140/busybox/busybox:1.28
  imagePullPolicy: IfNotPresent
    args:                       #创建测试探针探测的文件
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    livenessProbe:
      initialDelaySeconds: 10   #延迟检测时间
      periodSeconds: 5          #检测时间间隔
      exec:
        command:
        - cat
        - /tmp/healthy
# 10s开始检测,每隔5s检测一次,默认三次失败根据重启策略重启pod

9.2.2 tcpsocket模式
vi liveness-tcp.yaml
apiVersion: v1
kind: Pod
metadata:
  name: liveness-tcp
  labels:
    app: liveness
spec:
  containers:
  - name: liveness
    image: 172.16.80.140/nginx/nginx:1.26
    imagePullPolicy: IfNotPresent
    livenessProbe:
      initialDelaySeconds: 15
      periodSeconds: 20
      tcpSocket:
        port: 80
# 进入pod停掉容器nginx,由于配置了存活探测,根据重启策略会重启

9.2.3 httpget模式

vi liveness-httpget.yaml
apiVersion: v1
kind: Pod
metadata:
  name: liveness-http
  labels:
    test: liveness
spec:
  containers:
  - name: liveness
image: 172.16.80.140/tomcat/tomcat:v1
imagePullPolicy: IfNotPresent
    livenessProbe:
      initialDelaySeconds: 20   #延迟加载时间
      periodSeconds: 5          #重试时间间隔
      timeoutSeconds: 10        #超时时间设置
      httpGet:
        scheme: HTTP
        port: 8081
        path: /
# 存活探针每15s探测一次,如果失败就重启

9.3 就绪探测livenessprobe

9.3.1 httpget模式
vi readiness-exec.yaml
apiVersion: v1
kind: Service
metadata:
  name: tomcat
  labels:
    app: tomcat
spec:
  type: NodePort
  ports:
  - name: server
    port: 8080
    targetPort: 8080
    nodePort: 31180
  selector:
    app: tomcat
---
apiVersion: v1
kind: Pod
metadata:
  name: tomcat
  labels:
    app: tomcat
spec:
  containers:
  - name: tomcat
    image: 172.16.80.140/tomcat/tomcat:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: tomcat
      containerPort: 8080
    readinessProbe:
      initialDelaySeconds: 20   
      periodSeconds: 5          
      timeoutSeconds: 10   
      httpGet:
        scheme: HTTP
        port: 8080
        path: /
# 创建一个配置有就绪探测的pod,一个绑定pod的service,
# 通过浏览器访问service

9.3.2 tcpsocket模式

        略,同httpget

9.3.3 exec模式

        略,同httpget