k8s-探针

本次讲的是k8s中比较常用的探针


首先我们 先要了解什么是探针,它是用来做什么的,可以提供什么作用。

探针是由kubelet对容器执行的定时诊断,以保证Pod的状态始终处于运行状态,要执行诊断,kubelet调用由容器实现的Handler(处理程序),有三种处理类型的处理程序:

  1. ExecAction #在容器内执行指定的命令,如果命令的返回码为0则认为诊断成功
  2. TCPSocketAction #对指定端口上的容器的IP地址进行TCP检查,如果端口打开,则诊断成功
  3. HTTPGetAction #对指定的端口和独立上的容器IP地址或者url地址进行HTTPGet请求,如果相应的状态码大于等于200且小于400,则诊断被认为成功

每次探针都将获得以下三种结果之一:

  1. 成功:容器通过了诊断
  2. 失败:容器未通过诊断
  3. 未知:诊断失败,不会采取任何行动

探针的类型:

以上所说的都是探针去诊断是方法,下面来说一下探针的使用

常用探针的类型分为两种:

  1. livenessProbe #存活探针,检测容器是否正在运行,如果检查失败kubelet将会杀死容器,并容器将受到重启策略的影响,如果容器不配置存活探针,默认状态为Success,livenessProbe用于控制是否重启Pod.
  2. readinessProbe #就绪探针,如果就绪探针失败,该Pod将从所有匹配的SVC中删除地址不在调用,如果容器不配置就绪探针,默认为Success,readinessProbe用于控制Pod是否添加至SVC中

探针的配置:

刚刚说了探针的类型使用诊断方式来处理操作,现在跟着步伐来说一下探针的常用配置都有哪些:

探针有多种配置字段,可以使用这些字段精确的控制存活和就绪的行为:

  • initialDelaySeconds:120 #初始化延迟时间,告诉kubelet第一次执行探针前应该等待多少秒,默认是0秒,最小是0秒,如果配置时间较短则一直探测失败,一般根据服务启动时间来写这个第一次探测时间
  • periodSeconds:60 #探针的周期间隔时间,告诉kubelet多久执行一次探测,默认是10秒,最少1秒 ,这个时间可以根据haproxy的时间来配置
  • timeoutSeconds:5 #单次探针超时时间,探测失败后等待5秒,如果还是失败就认为失败,默认为1秒,最小1秒
  • successThreshold: 1 #从失败转为成功的重试次数,探测失败后连续探测*次判定为成功,这个值必须是1,默认为1次,最小1次,等于健康性检查连续几次成功加入调度
  • failureThreshold:3 #从成功转为失败的重试次数,正常运行的Pod启动了探针并探测到失败,存活探针连续探测失败*次就重启容器,就绪探针连续探测失败*次就从SVC中去掉,默认为3次,最小1次

探针的结构我们就说完了,下面我们来实操一把。

首先我们创建一个就绪探针的yaml文件

kind: Deployment
apiVersion: apps/v1
metadata: 
  labels:
    app: lhl-nginx-app1
  name: bhb-nginx
  namespace: lhl
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-app1
  template:
    metadata:
      labels:
        app: nginx-app1
    spec:
      containers:
      - name: nginx-lhl-app1
        image: 10.0.0.109/lhl/nginx:v2
        imagePullPolicy: Always
        resources:
          limits:
            cpu: 1
            memory: 1Gi
          requests:
            cpu: 200m
            memory: 512Mi
        readinessProbe:   #就绪探针
          httpGet:       #使用httpGet诊断是否就绪
            path: /index.html    #诊断的文件
            port: 80         #端口
          initialDelaySeconds: 5   #第一次检查时间
          periodSeconds: 3   #间隔时间
          timeoutSeconds: 5  #超时5秒为失败
          successThreshold: 1 #探测失败转成功1次等于就绪
          failureThreshold: 3  #探测成功转失败3次为失败

kubectl apply -f app1-deployment.yaml #执行文件开始创建

kubectl get ep -nlhl #查询svc中在线的pod的ip,目前为两个nginx

接下来我们把探针所诊断pod内的文件移走

再次查看svc中的pod的IP是否下线,变成一个则为成功

下面我们就写一些其他的方法

########基于TCPSocketAction诊断
kind: Deployment
apiVersion: apps/v1
metadata: 
  labels:
    app: lhl-nginx-app1
  name: bhb-nginx
  namespace: lhl
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-app1
  template:
    metadata:
      labels:
        app: nginx-app1
    spec:
      containers:
      - name: nginx-lhl-app1
        image: 10.0.0.109/lhl/nginx:v2
        imagePullPolicy: Always
        resources:
          limits:
            cpu: 1
            memory: 1Gi
          requests:
            cpu: 200m
            memory: 512Mi
		#livenessProbe:   #存活探针
        readinessProbe:   #就绪探针
          tcpSocket:       #使用tcp诊断端口是否就绪
            port: 80         #端口
          initialDelaySeconds: 5   #第一次检查时间
          periodSeconds: 3   #间隔时间
          timeoutSeconds: 5  #超时5秒为失败
          successThreshold: 1 #探测失败转成功1次等于就绪
          failureThreshold: 3  #探测成功转失败3次为失败
##########基于ExecAction诊断 
kind: Deployment
apiVersion: apps/v1
metadata: 
  labels:
    app: lhl-nginx-app1
  name: bhb-nginx
  namespace: lhl
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-app1
  template:
    metadata:
      labels:
        app: nginx-app1
    spec:
      containers:
      - name: nginx-lhl-app1
        image: 10.0.0.109/lhl/nginx:v2
        imagePullPolicy: Always
        resources:
          limits:
            cpu: 1
            memory: 1Gi
          requests:
            cpu: 200m
            memory: 512Mi
		#livenessProbe:   #存活探针
        readinessProbe:   #就绪探针
          exec:       #在容器内执行命令的返回值判断是否就绪
            command:         #命令
			  - /usr/loca/nginx/bin/nginx     #执行的命令
			  - /usr/bin/ls /usr/local/nginx/html/index.html
          initialDelaySeconds: 5   #第一次检查时间
          periodSeconds: 3   #间隔时间
          timeoutSeconds: 5  #超时5秒为失败
          successThreshold: 1 #探测失败转成功1次等于就绪
          failureThreshold: 3  #探测成功转失败3次为失败

我们来总结一下:

  • 探针的作用:存活探针重启pod,就绪探针把pod加入SVC
  • 诊断方法:在容器内执行命令的返回值诊断是否成功,检查容器是否开启诊断的端口,通过curl容器的index文件诊断是否成
  • 探测配置:根据各种探测的字段更精准的控制存活和就绪检测的行为