当前位置:   article > 正文

K8S的pod探针(livenessProbe,readinessProbe),kubelet对pod的状态检查(kubelet-exec,httpGet,tcpSocket)

livenessprobe

1、kubelet的探测方式

搭建K8S文档:yum安装K8S
ansible搭建K8S集群:ansible搭建K8S
准备至少3个机器搭建好K8S集群测试调度

节点名称IP
k8s-master192.168.116.130
k8s-node1192.168.116.131
k8s-node2192.168.116.132

官网探针介绍:K8S-探针
探针配置介绍:K8S-配置探针

原理:在K8S集群中,为了测试pod是否正常运行,可以通过kubelet定期对pod进行健康检查,从而保证服务正常运行。
kubelet检查机制:

  • exec: 在容器内执行指定命令,当返回码为0表示检测成功。在 Kubernetes 1.20 版本之前,exec 探针会忽略 timeoutSeconds: 探针会无限期地持续运行,甚至可能超过所配置的限期,直到返回结果为止。
  • grpc:使用 gRPC 执行一个远程过程调用。 目标应该实现 gRPC健康检查。 如果响应的状态是 “SERVING”,则认为诊断成功。gRPC 探针是一个 alpha 特性,只有在你启用了"GRPCContainerProbe" 特性门控时才能使用。
  • httpGet:对容器的IP和URL进行HTTP的GET请求,当响应码为大于等于200且小于400,表示容器正常运行。
  • tcpSocket:对容器内的端口或socket进行TCP检查,如果端口成功打开,证明容器正常运行。

探针的返回结果:

  • Success(成功):容器通过了诊断。
  • Failure(失败):容器未通过诊断。
  • Unknown(未知):诊断失败,因此不会采取任何行动。

探针的类型:

  • livenessProbe(存活探针):判断容器是否正常运行。如果存活探测失败,那么kubelet就会把老的容器删除,然后根据重启策略对容器做操作。如果容器没有存活探针,默认状态为Success。
  • readinessProbe(就绪探针):判断容器的是否就绪。比如:应用在启动时可能需要加载大量的数据或配置文件,或是启动后要依赖等待外部服务。在这种情况下,既不想杀死应用,也不想给它发送请求。这个时候就需要用到这个探针。
    当就绪探测失败,端点控制器将从与 Pod匹配的所有服务的端点列表中删除该 Pod 的 IP 地址(如果是用nodeport映射端口到外网,这个时候就不能访问网站了,但是容器不会被删除),初始延迟之前的就绪态的状态值默认为 Failure。 如果容器不提供就绪态探针,则默认状态为 Success。
  • startupProbe(启动探针):指示容器中的应用是否已经启动。如果提供了启动探针,则所有其他探针都会被禁用,直到此探针成功为止。如果启动探测失败,kubelet 将删除容器,而容器依其重启策略进行重启。如果容器没有提供启动探测,则默认状态为 Success。

探针主要字段解析:

  • (initialDelaySeconds: 5):初始化延迟时间,主要是告诉kubelet,容器启动需要的时间,当过了这个时间再进行探测,要不然容器可能还没启动就会删除了。
  • (periodSeconds: 5):探测周期间隔时间,主要是指定kubelet对容器进行探针的时间周期,也就是第一次探测结束后,等待多少时间后对容器进行探测。默认值为10秒,最小值为1秒。
  • (timeoutSeconds: 5):单次探测超时时间,指定kubelet对容器探测的最大时间,超过这个时间证明容器探测失败。默认为1秒,最小为1秒。
  • (successThreshold: 5):探测失败到成功的重试次数,当kubelet对某个容器第一次探测失败后,重新进行探测的次数,比如指定为1,那么就会直接将容器删除。如果使用的探针是livenessProbe,那么只能配置为1,最小值为1次。
  • (failureThreshold: 5):探测成功到失败的重试次数,当kubelet对某个容器进行探测过程中,允许失败的次数,当用于readinessProbe探针,默认是3次,最小值为1次。也就是说当3次探测失败后,容器会被删除。当用于startupProbe探针,如果还设置了periodSeconds时间,那么等待容器启动的时间为failureThreshold的时间乘以periodSeconds时间的值,在这段时间内,容器没有启动,那么就会删除容器。

2、livenessProbe探针

2.1、livenessProbe和kubelet-exec

在master创建容器

vi nginx.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx-deployment
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: docker.io/library/nginx:1.18.0-alpine
        livenessProbe:
          exec:                    #定义探测方式
            command:               #不断查看文件是否存在,文件必须是镜像原本存在的文件
            - cat
            - /usr/share/nginx/html/index.html
          initialDelaySeconds: 5   #指定探针多少秒后启动
          periodSeconds: 5         #指定探针探测周期时间

kubectl apply -f nginx-exec.yml   创建容器
kubectl get pod -A                查看容器状态
kubectl exec -it nginx-deployment-b8b54fbc4-l26kg /bin/sh  连接容器

cd /usr/share/nginx/html/         进入目录,可以看到文件存在
ls
mv index.html index1.html         删除文件,这样探针就会被触发
ls

kubectl get pod -A                可以看到RESTARTS变成了1,证明容器重启过了
kubectl exec -it nginx-deployment-b8b54fbc4-l26kg /bin/sh  再次连接容器

cd /usr/share/nginx/html/         可以看到文件又存在了,证明容器被重建了。
ls
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

在这里插入图片描述

2.2、livenessProbe和kubelet-httpGet

在master创建容器

vi nginx-httpGet.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx-deployment
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: docker.io/library/nginx:1.18.0-alpine
        livenessProbe:
          httpGet:                  #指定探针探测方式
            path: /index.html       #定义请求的URL
            port: 80                #定义GET的端口
          initialDelaySeconds: 3    #指定探针多少秒后启动
          periodSeconds: 3          #指定探针的探测周期
          
kubectl apply -f nginx-httpGet.yml   创建容器
kubectl get pod -A                   查看状态

kubectl exec -it nginx-deployment-7bfddd86d7-247jn /bin/sh  连接容器
cd /usr/share/nginx/html/         进入目录,可以看到文件存在
ls
mv index.html index1.html         删除文件,这样探针就会被触发
ls

kubectl get pod -A                可以看到RESTARTS变成了1,证明容器重启过了
kubectl exec -it nginx-deployment-7bfddd86d7-247jn /bin/sh 再次连接容器

cd /usr/share/nginx/html/         可以看到文件又存在了,证明容器被重建了。
ls
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

在这里插入图片描述

2.3、livenessProbe和kubelet-tcpSocket

在master创建容器

vi nginx-tcp.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx-deployment
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: docker.io/library/nginx:1.18.0-alpine
        ports:
          - containerPort: 80
        livenessProbe:             #指定探针
          tcpSocket:               #指定探针探测方式
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5

kubectl apply -f nginx-tcp.yml           创建容器
kubectl get pod -A                       查看pod
kubectl exec -it nginx-deployment-575f4cf6cf-nv9cv /bin/sh  连接容器

vi /etc/nginx/conf.d/default.conf        修改配置文件

server {
    listen       8080;    #把80都改为8080
    listen  [::]:8080;
    
nginx -s reload                          重新加载配置文件

kubectl get pod -A                       查看pod,可以看到RESTARTS,证明容器重启过
kubectl exec -it nginx-deployment-575f4cf6cf-nv9cv /bin/sh  连接容器
head -n 10 /etc/nginx/conf.d/default.conf  可以看到配置被还原了,证明容器重建了

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

在这里插入图片描述

3、readinessProbe探针

3.1、readinessProbe和kubelet-exec

在master创建容器

vi nginx-re-exec.yml 

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: docker.io/library/nginx:1.18.0-alpine
        ports:
        - containerPort: 80
        readinessProbe:  #指定探针
          exec:          #指定探针探测方式
            command:
            - cat
            - /usr/share/nginx/html/index.html
          initialDelaySeconds: 5
          periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  labels:
    svc: nginx-svc-nodeport
  name: nginx-svc-nodeport
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080
  selector:
    app: nginx

kubectl apply -f nginx-re-exec.yml        创建容器
kubectl get pod -A -o wide                查看容器的创建节点
kubectl get svc -o wide                   查看service
kubectl describe svc nginx-svc-nodeport   查看pod和service绑定
curl -I http://192.168.116.132:30080      访问网站成功

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

在这里插入图片描述
在master连接容器删除文件测试

kubectl get pod -A -o wide     查看容器名字,可以看到原本READY是1/1
kubectl exec -it nginx-86d859557f-vw87x /bin/sh  连接容器

cd /usr/share/nginx/html/   修改探针指定探测的文件名字,让探针触发
ls
mv index.html index1.html 
exit

kubectl get pod -A -o wide  可以看到READY变成了0/1,证明探针被触发了,容器没有被删除,也没有重建
curl -I http://192.168.116.132:30080  可以看到网站访问不了
kubectl describe svc nginx-svc-nodeport  可以看到Endpoints没有值,证明探针把service和pod解除绑定了
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述
在这里插入图片描述

3.2、readinessProbe和kubelet-httpGet

在master创建容器

vi nginx-re-httpGet.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: docker.io/library/nginx:1.18.0-alpine
        ports:
        - containerPort: 80
        readinessProbe:             #指定探针
          httpGet:                  #指定探针方式
            path: /index.html       
            port: 80                
          initialDelaySeconds: 5
          periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  labels:
    svc: nginx-svc-nodeport
  name: nginx-svc-nodeport
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080
  selector:
    app: nginx

kubectl apply -f nginx-re-httpGet.yml        创建容器
curl -I http://192.168.116.132:30080      和上面一样,访问网站成功

kubectl get pod -A -o wide     查看容器名字,可以看到原本READY是1/1
kubectl exec -it nginx-75f8cfd9d-6x8jz /bin/sh  连接容器

cd /usr/share/nginx/html/   修改探针指定探测的文件名字,让探针触发
ls
mv index.html index1.html 
exit

kubectl get pod -A -o wide  可以看到READY变成了0/1,证明探针被触发了,容器没有被删除,也没有重建
curl -I http://192.168.116.132:30080  可以看到网站访问不了
kubectl describe svc nginx-svc-nodeport  可以看到Endpoints没有值,证明探针把service和pod解除绑定了
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

在这里插入图片描述
在这里插入图片描述

3.3、readinessProbe和kubelet-tcpSocket

在master创建容器

vi nginx-re-tcpSocket.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: docker.io/library/nginx:1.18.0-alpine
        ports:
        - containerPort: 80
        readinessProbe:                 #指定探针
          tcpSocket:                    #指定探测方式
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  labels:
    svc: nginx-svc-nodeport
  name: nginx-svc-nodeport
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080
  selector:
    app: nginx

kubectl apply -f nginx-re-tcpSocket.yml        创建容器
curl -I http://192.168.116.132:30080      和上面一样,访问网站成功

kubectl get pod -A                       查看pod
kubectl exec -it nginx-6bf8bf8577-9skvn /bin/sh  连接容器

vi /etc/nginx/conf.d/default.conf        修改配置文件

server {
    listen       8080;    #把80都改为8080
    listen  [::]:8080;
    
nginx -s reload                          重新加载配置文件

kubectl get pod -A  可以看到READY变成了0/1,证明探针被触发了,容器没有被删除,也没有重建
curl -I http://192.168.116.132:30080  可以看到因为探针触发,外网是访问不了容器了
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

在这里插入图片描述
就绪探针不会影响pod和pod之间的访问,新建测试容器测试

kubectl run net-test1 --image=alpine sleep 360000  创建容器
kubectl get pod -A -o wide              查看pod的IP
kubectl exec -it net-test1 /bin/sh      连接容器

可以看到只要指定改过的pod的端口,pod和pod之间还是可以访问的
wget http://20.0.1.36:8080    
ls
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/247233
推荐阅读
相关标签
  

闽ICP备14008679号