zoukankan      html  css  js  c++  java
  • Kubernetes中Pod健康检查

    1、何为健康检查

    Kubernetes架构中,每个节点都会有kubelet,容器健康检查(Container Probe)的任务就是由Kubelet定期执行的。

    Kubelet会通过调用Pod中容器的Handler来执行检查动作,Handler有以下三种类型:

    • ExecAction:在容器中执行特定的命令,命令退出返回0(命令执行返回值:$?)表示成功
    • TCPSocketAction:根据容器IP地址及特定的端口进行TCP检查,端口访问/开放/暴露表示成功
    • HTTPGetAction:根据容器IP、端口及访问路径发起一次HTTP请求,如果返回状态码在200到400之间表示成功

    每种检查动作都可能会有三种返回状态:

    • Success:表示通过健康检查
    • Failure:表示没有通过健康检查
    • Unknown:表示检查动作失败

    2、探针分类

    创建Pod时,可通过livenessreadiness两种方式来探测Pod内容器的运行情况。

    2.1、LivenessProbe探针(存活性探测)

    判断容器是否健康(Running状态)并反馈给Kubelet。其实有很多应用长时间的后台运行后会逐渐的转为不可用状态,并且仅能通过重启Pod操作恢复,那么存活性探针机制就可以发现此类问题,并依据探测结果结合重启策略触发后续的执行。

    kubernetes存活性探针支持的检测方法为三种:ExecAction、TCPSocketAction和HTTPGetAction

    如果一个容器没有LivenessProbe探针,那么kubelet就会认为该容器的LivenessProbe探针返回的值永远都会是Success。

    2.2、ReadinessProbe探针(就绪型探测)

    判断容器服务是否可用(Ready状态)能否对外提供服务,只有达到了Ready状态的Pod才能接收请求,当容器里跑的业务起来之后容器的状态才能为Ready,负责认为容器探测失败,如果探测失败,则系统会将Service后端Endpoint列表中移除其Pod IP,后续再恢复到Ready,则探测成功会将其Pod IP加回Endpoint列表。

    3、探针实现方法

    LivenessProbeReadinessProbe都可配置以下三种探针实现方式:

    ReadinessProbe的配置和LivenessProbe类似,只需要将yaml中的livenessProbe修改为readinessProbe

    3.1、Container Exec

    创建一个容器,通过检查一个文件是否存在来判断容器运行是否正常,如果文件存在则会返回状态码为0,容器运行30秒后,会将文件删除,LivenessProbe检查失败则将重启容器。

    apiVersion: v1
    kind: Pod
    metadata:
      name: exec
    spec:
      containers:
        - name: nginx
          image: nginx:1.13
          ports:
            - containerPort: 80
          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
    

    检测到目录不存在

    [root@k8s-master01 health]# kubectl describe pod exec  |grep "Liveness"
        Liveness:       exec [cat /tmp/healthy] delay=5s timeout=1s period=5s #success=1 #failure=3
      Warning  Unhealthy  4s (x3 over 14s)  kubelet, k8s-node01  Liveness probe failed: cat: /tmp/healthy: No such file or directory
    

    3.2、HTTP Check

    创建一个Nginx容器,通过访问/index.html来判断服务是否存活,通过手动移除该文件的方式,能导致检查失败,从而重启容器

    apiVersion: v1
    kind: Pod
    metadata:
      name: httpget
    spec:
      containers:
        - name: nginx
          image: nginx:1.13
          ports:
            - containerPort: 80
          livenessProbe:
            httpGet:
              path: /index.html # 访问路径
              port: 80          # 容器端口
            initialDelaySeconds: 5
            periodSeconds: 5
    

    手动将nginx容器的index.html文件移除

    [root@k8s-master01 health]# kubectl exec -it httpget bash
    root@httpget:/# mv /usr/share/nginx/html/index.html  /tmp/
    

    当index.html访问返回状态码不为200时,就会重启容器

    [root@k8s-master01 health]# kubectl describe pod httpget |grep "Liveness"
        Liveness:       http-get http://:80/index.html delay=5s timeout=1s period=5s #success=1 #failure=3
      Warning  Unhealthy  59s (x3 over 69s)   kubelet, k8s-node01  Liveness probe failed: HTTP probe failed with statuscode: 404
    

    3.3、TCP Socket Check

    通过对IP地址(请求连接的目标IP地址,默认为Pod IP)和端口号进行TCP检查,如果可以建立TCP连接的话,则认为容器健康,它会比基于HTTP检测方式更加的高效(HTTP是七层,TCP是四层),更节约资源,但是精确度微低,能建立成功并不代表页面可展示。

    apiVersion: v1
    kind: Pod
    metadata:
      name: tcpSocket
    spec:
      containers:
        - name: nginx
          image: nginx:1.13
          ports:
            - containerPort: 80
          livenessProbe:
            tcpSocket:
              port: 80
            initialDelaySeconds: 3
            periodSeconds: 3
    

    4、探测行为参数

    initiaDelaySeconds // 容器启动之后多久开始检测,默认为0秒
    periodSeconds      // 每隔多久检测一次,默认为10秒,最小为1秒
    failureThreshold   // 检测失败几次后则认为健康检测失败,默认为3次
    successThreshold   // 从检测错误到成功需要几次才认为健康检测成功,默认为1次
    timeoutSeconds     // 执行检测命令的最长时间,默认为1秒,最小为1秒
    
    httpGet的属性
    		host:主机名或IP
    		scheme:链接类型,HTTP或HTTPS,默认为HTTP
    		path:请求路径
    		httpHeaders:自定义请求头
    		port:请求端口
    
  • 相关阅读:
    转(get和post)
    由在updatepanel中注册脚本所引发的问题
    AJAX请求时status返回状态明细表 readyState的五种状态
    谈谈Ajax中Get和Post
    跟我一起从零开始学WCF系列课程笔记(1):WCF概述
    跟我一起从零开始学WCF系列课程笔记(2):设计和实现服务协定
    ASP.NET AJAX中UpdatePanel的工作原理
    关于页面中回车键默认触发某个控件按钮事件的问题(DefaultButton)
    显示GIF格式图片遇到的问题
    关于GUID
  • 原文地址:https://www.cnblogs.com/jasonminghao/p/12575456.html
Copyright © 2011-2022 走看看