`
wx1568444409
  • 浏览: 14614 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Kubernetes Pod 健康检查机制 LivenessProbe 与 ReadinessProbe

 
阅读更多

目录[-]


系统环境:

  • kubernetes 版本:1.14.0

Kubernetes 官方文档地址:

一、Pod 的整个生命阶段

  • Pending: 正在创建 Pod,但是 Pod 中的容器还没有全部被创建完成,这其中也包含集群为容器创建网络,或者下载镜像的过程。
  • Running: Pod 内所有的容器都已经被创建,且至少一个容器正在处于运行状态、正在启动状态或者重启状态。
  • Succeeded: Pod 中所以容器都执行成功后退出,并且没有处于重启的容器。
  • Failed: Pod 中所以容器都已退出,但是至少还有一个容器退出时为失败状态。
  • Unknown: 由于一些原因,Pod 的状态无法获取,通常是与 Pod 通信时出错导致的。

二、Pod 重启策略

  • Always: 只要容器失效退出就重新启动容器。
  • OnFailure: 当容器以非正常退出后重新启动容器。
  • Never: 无论容器状态如何,都不重新启动容器。

如果 restartpolicy 没有设置,那么默认值是 Always。RC 和 DaemonSet 必须指定重启策略为 Always。

三、Pod 常见状态转换场景

Pod中的容器数 Pod状态 发生事件 不同重启策略下的结果状态 Always OnFailure Never
包含一个容器 Running 容器成功退出 Running Succeeded Succeeded
包含一个容器 Running 容器失败退出 Running Running Failed
包含两个容器
Running 1个容器失败退出 Running Running Running
包含两个容器 Running 容器内存溢出挂掉 Running Running Failed

四、Pod 的活性与就绪探针

1、Pod 探针机制

       在 Kubernetes 中 Pod 是最小的计算单元,而一个 Pod 又由多个容器组成,相当于每个容器就是一个应用,应用在运行期间,可能因为某也意外情况致使程序挂掉。那么如何监控这些容器状态稳定性,保证服务在运行期间不会发生问题,发生问题后进行重启等机制,就成为了重中之重的事情,考虑到这点 kubernetes 推出了活性探针机制。

       有了活性探针后能保证程序在运行中如果挂掉能够自动重启,但是还有个经常遇到的问题,比如说,在 Kubernetes 中启动 Pod,显示明明 Pod 已经启动成功,且能访问里面的端口,但是却返回错误信息。还有就是在执行滚动更新时候,总会出现一段时间,Pod 对外提供网络访问,但是访问却发生 404,这两个原因,都是因为 Pod 已经成功启动,但是 Pod 的的容器中应用程序还在启动中导致,考虑到这点 Kubernetes 推出了就绪探针机制。

2、Pod 两种探针简介

  • LivenessProbe(存活探针): 存活探针主要作用是,用指定的方式进入容器检测容器中的应用是否正常运行,如果检测失败,则认为容器不健康,那么 Kubelet 将根据 Pod 中设置的 restartPolicy (重启策略)来判断,Pod 是否要进行重启操作,如果容器配置中没有配置 livenessProbe 存活探针,Kubelet 将认为存活探针探测一直为成功状态。

  • ReadinessProbe(就绪探针): 用于判断容器中应用是否启动完成,当探测成功后才使 Pod 对外提供网络访问,设置容器 Ready 状态为 true,如果探测失败,则设置容器的 Ready 状态为 false。对于被 Service 管理的 Pod,ServicePodEndPoint 的关联关系也将基于 Pod 是否为 Ready 状态进行设置,如果 Pod 运行过程中 Ready 状态变为 false,则系统自动从 Service 关联的 EndPoint 列表中移除,如果 Pod 恢复为 Ready 状态。将再会被加回 Endpoint 列表。通过这种机制就能防止将流量转发到不可用的 Pod 上。

3、Pod 探针的探测方式与结果

目前 LivenessProbe 和 ReadinessProbe 两种探针都支持下面三种探测方法:

  • ExecAction: 在容器中执行指定的命令,如果执行成功,退出码为 0 则探测成功。
  • HTTPGetAction: 通过容器的IP地址、端口号及路径调用 HTTP Get方法,如果响应的状态码大于等于200且小于400,则认为容器 健康。
  • TCPSocketAction: 通过容器的 IP 地址和端口号执行 TCP 检 查,如果能够建立 TCP 连接,则表明容器健康。

探针探测结果有以下值:

  • Success:表示通过检测。
  • Failure:表示未通过检测。
  • Unknown:表示检测没有正常进行。

4、Pod 探针的相关属性

探针(Probe)有许多可选字段,可以用来更加精确的控制Liveness和Readiness两种探针的行为(Probe):

  • initialDelaySeconds: Pod 启动后首次进行检查的等待时间,单位“秒”。
  • periodSeconds: 检查的间隔时间,默认为 10s,单位“秒”。
  • timeoutSeconds: 探针执行检测请求后,等待响应的超时时间,默认为 1s,单位“秒”。
  • successThreshold: 探针检测失败后认为成功的最小连接成功次数,默认为 1s,在 Liveness 探针中必须为 1s,最小值为 1s。
  • failureThreshold: 探测失败的重试次数,重试一定次数后将认为失败,在 readiness 探针中,Pod会被标记为未就绪,默认为 3s,最小值为 1s。

5、两种探针的区别

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

  • readinessProbe 当检测失败后,将 Pod 的 IP:Port 从对应的 EndPoint 列表中删除。
  • livenessProbe 当检测失败后,将杀死容器并根据 Pod 的重启策略来决定作出对应的措施。

五、探针使用示例

1、LivenessProbe 探针使用示例

(1)、通过exec方式做健康探测

示例文件 liveness-exec.yaml

apiVersion: v1
kind: Pod
metadata:
  name: liveness-exec
  labels:
    app: liveness
spec:
  containers:
  - name: liveness
    image: busybox
    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

容器启动设置执行的命令:

/bin/sh -c "touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600"

容器在初始化后,首先创建一个 /tmp/healthy 文件,然后执行睡眠命令,睡眠 30 秒,到时间后执行删除 /tmp/healthy 文件命令。而设置的存活探针检检测方式为执行 shell 命令,用 cat 命令输出 healthy 文件的内容,如果能成功执行这条命令,存活探针就认为探测成功,否则探测失败。在前 30 秒内,由于文件存在,所以存活探针探测时执行 cat /tmp/healthy 命令成功执行。30 秒后 healthy 文件被删除,所以执行命令失败,Kubernetes 会根据 Pod 设置的重启策略来判断,是否重启 Pod。

(2)、通过HTTP方式做健康探测

示例文件 liveness-http.yaml

apiVersion: v1
kind: Pod
metadata:
  name: liveness-http
  labels:
    test: liveness
spec:
  containers:
  - name: liveness
    image: mydlqclub/springboot-helloworld:0.0.1
    livenessProbe:
      initialDelaySeconds: 20   #延迟加载时间
      periodSeconds: 5          #重试时间间隔
      timeoutSeconds: 10        #超时时间设置
      httpGet:
        scheme: HTTP
        port: 8081
        path: /actuator/health

上面 Pod 中启动的容器是一个 SpringBoot 应用,其中引用了 Actuator 组件,提供了 /actuator/health 健康检查地址,存活探针可以使用 HTTPGet 方式向服务发起请求,请求 8081 端口的 /actuator/health 路径来进行存活判断:

  • 任何大于或等于200且小于400的代码表示探测成功。
  • 任何其他代码表示失败。

如果探测失败,则会杀死 Pod 进行重启操作。

httpGet探测方式有如下可选的控制字段:

  • scheme: 用于连接host的协议,默认为HTTP。
  • host: 要连接的主机名,默认为Pod IP,可以在http request head中设置host头部。
  • port: 容器上要访问端口号或名称。
  • path: http服务器上的访问URI。
  • httpHeaders: 自定义HTTP请求headers,HTTP允许重复headers。

(3)、通过TCP方式做健康探测

示例文件 liveness-tcp.yaml

apiVersion: v1
kind: Pod
metadata:
  name: liveness-tcp
  labels:
    app: liveness
spec:
  containers:
  - name: liveness
    image: nginx
    livenessProbe:
      initialDelaySeconds: 15
      periodSeconds: 20
      tcpSocket:
        port: 80

TCP 检查方式和 HTTP 检查方式非常相似,在容器启动 initialDelaySeconds 参数设定的时间后,kubelet 将发送第一个 livenessProbe 探针,尝试连接容器的 80 端口,如果连接失败则将杀死 Pod 重启容器。

2、ReadinessProbe 探针使用示例

       Pod 的 ReadinessProbe 探针使用方式和 LivenessProbe 探针探测方法一样,也是支持三种,只是一个是用于探测应用的存活,一个是判断是否对外提供流量的条件。这里用一个 Springboot 项目,设置 ReadinessProbe 探测 SpringBoot 项目的 8081 端口下的 /actuator/health 接口,如果探测成功则代表内部程序以及启动,就开放对外提供接口访问,否则内部应用没有成功启动,暂不对外提供访问,直到就绪探针探测成功。

示例文件 readiness-exec.yaml

apiVersion: v1
kind: Service
metadata:
  name: springboot
  labels:
    app: springboot
spec:
  type: NodePort
  ports:
  - name: server
    port: 8080
    targetPort: 8080
    nodePort: 31180
  - name: management
    port: 8081
    targetPort: 8081
    nodePort: 31181
  selector:
    app: springboot
---
apiVersion: v1
kind: Pod
metadata:
  name: springboot
  labels:
    app: springboot
spec:
  containers:
  - name: springboot
    image: mydlqclub/springboot-helloworld:0.0.1
    ports:
    - name: server
      containerPort: 8080
    - name: management
      containerPort: 8081
    readinessProbe:
      initialDelaySeconds: 20   
      periodSeconds: 5          
      timeoutSeconds: 10   
      httpGet:
        scheme: HTTP
        port: 8081
        path: /actuator/health

3、ReadinessProbe + LivenessProbe 配合使用示例

       一般程序中需要设置两种探针结合使用,并且也要结合实际情况,来配置初始化检查时间和检测间隔,下面列一个简单的 SpringBoot 项目的 Deployment 例子。

apiVersion: v1
kind: Service
metadata:
  name: springboot
  labels:
    app: springboot
spec:
  type: NodePort
  ports:
  - name: server
    port: 8080
    targetPort: 8080
    nodePort: 31180
  - name: management
    port: 8081
    targetPort: 8081
    nodePort: 31181
  selector:
    app: springboot
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot
  labels:
    app: springboot
spec:
  replicas: 1
  selector:
    matchLabels:
      app: springboot
  template:
    metadata:
      name: springboot
      labels:
        app: springboot
    spec:
      containers:
      - name: readiness
        image: mydlqclub/springboot-helloworld:0.0.1
        ports:
        - name: server 
          containerPort: 8080
        - name: management
          containerPort: 8081
        readinessProbe:
          initialDelaySeconds: 20 
          periodSeconds: 5      
          timeoutSeconds: 10        
          httpGet:
            scheme: HTTP
            port: 8081
            path: /actuator/health
          livenessProbe:
            initialDelaySeconds: 30 
            periodSeconds: 10 
            timeoutSeconds: 5 
            httpGet:
              scheme: HTTP
              port: 8081
              path: /actuator/health

—END—

分享到:
评论

相关推荐

    3、Kubernetes pod 探测1

    在Kubernetes中,Pod是应用的基本运行单元,它包含了在一个逻辑组内紧密配合运行的一个或多个容器。在复杂的分布式系统中,...在实际应用中,根据应用的需求和行为,应合理配置探针参数,以实现最佳的健康检查效果。

    Kubernetes pod 生命周期1

    在`readiness-httpget-pod`的例子中,`readinessProbe`使用`httpGet`方法,检查`/index1.html`页面,如果请求成功,表明容器已准备就绪。 启动和退出动作也是Pod生命周期的一部分。当Pod启动时,所有Init ...

    kubernetes 部署giltab

    5. `containers` 部分定义了容器的具体配置,包括使用的镜像(`sameersbn/redis`),端口映射(6379)和健康检查(livenessProbe 和 readinessProbe)。 6. `volumes` 部分定义了持久卷挂载,确保数据在容器重启后...

    kubernetes面试题汇总详解

    * LivenessProbe探针:根据用户自定义规则来判定Pod是否健康 * ReadinessProbe探针:根据用户自定义规则来判定Pod是否健康 * StartupProbe探针:启动检查机制,应用于启动缓慢的业务 Job是一种工作类容器,用于做一...

    k8s的简介pp文件.pptx

    健康检查通过livenessProbe和readinessProbe来检查Pod的健康状况,livenessProbe确保Pod能够处理请求,而readinessProbe则检查Pod是否准备好接收流量。滚动更新支持各种参数,如更新间隔、超时时间等。 5. **Node...

    23道Kubernetes面试题.pdf

    为了实现服务的高可用和故障恢复,Kubernetes引入了健康检查机制,包括livenessProbe和readinessProbe两种探针。通过这些探针,Kubernetes可以检测容器是否存活以及是否准备好接收请求。 在数据持久化方面,...

    健康检查实验手册1

    【健康检查实验手册1】是针对HCIP-Cloud Computing-Container V1.0课程的一份实践指南,旨在帮助学习者理解和应用容器健康检查机制。健康检查在 Kubernetes 集群中至关重要,它确保了服务的高可用性和稳定性,通过...

    深入理解Pod1

    深入理解Pod,我们首先需要了解Pod的状态及其健康检查机制。 1. **Pod的状态**: - **Pending**:Pod的初始化状态,表示API Server已经创建了Pod,但其容器镜像可能还在下载中。 - **Running**:Pod内所有容器已...

    note-010-K8S v1.12 高可用nginx.rar

    7. **健康检查和探针**:设置Liveness Probe和Readiness Probe,监控Nginx Pod的健康状态。Liveness Probe用于检测Pod是否需要重启,而Readiness Probe则确定Pod是否准备好接收流量。 8. **滚动更新**:在K8S v1.12...

    CKA认证-k8s基本操作.rar

    健康检查.docx):Kubernetes提供两种健康检查机制:Liveness Probe和Readiness Probe。前者用于检测应用是否需要重启,后者判断应用是否准备好接收流量。 7. **Pod节点分配**(10.Pod节点分配.docx):Scheduler是...

    Kubernetes与Istio的技术实践.pdf

    * Readiness Probe是一个健康检查机制,帮助Kubernetes检测容器化应用程序的准备状态。 十二、 Pod 和容器 * Pod是一个逻辑主机,提供了容器化应用程序的运行环境。 * Container是一个轻量级的进程 sandbox,提供...

    wordpress及MySQL的探针和资源限制

    在Kubernetes中,探针是一种健康检查机制,分为Liveness Probe和Readiness Probe。Liveness Probe用于检测应用是否已经无响应并需要重启,以防止服务长时间不可用。Readiness Probe则判断应用是否准备好接受流量,当...

    k8s(kubernetes)常见运维面试题-专题150题

    Pod 服务健康检查 - **LivenessProbe(存活检查)**: 用于检测 Pod 是否处于正常运行状态,如果探测失败,则会触发 Pod 的重启流程。 - **ReadinessProbe(就绪检查)**: 用于确定 Pod 是否准备好接收流量。只有...

    2.K8S初体验1

    Pod还可以包含健康检查机制,如`livenessProbe`和`readinessProbe`,以确保容器服务的可用性和稳定性。`livenessProbe`用于检测容器是否崩溃,当失败次数达到阈值时,Kubernetes将重启该容器;而`readinessProbe`则...

    mongodb高可用所需yaml

    7. **健康检查与生命周期管理**:在YAML文件中,可以设置livenessProbe和readinessProbe来监控MongoDB的健康状态,确保服务的稳定性和可靠性。此外,还可以定义生命周期管理策略,如初始化容器,确保在主容器启动前...

    Helm-Chart-Java 自定义常用模版

    - **健康检查**:通过设置livenessProbe和readinessProbe,确保应用在遇到问题时能够自动重启或者标记为不可用,从而维护集群的稳定性。 - **资源限制**:设置requests和limits,定义每个容器需要的最小CPU和内存...

    阿里云k8s 一键部署nacos2.0.3

    6. **健康检查与更新**: 部署后,可以设置livenessProbe和readinessProbe来检查Nacos服务的健康状况,确保其正常运行。此外,如果需要升级Nacos版本,可以通过修改Deployment的image标签,利用k8s的滚动更新机制实现...

    springboot-kubernetes-starter

    3. **健康检查**:Starter提供了对Kubernetes readiness和liveness probe的支持。通过定义相应的端点,Kubernetes可以根据应用的健康状态决定是否接收流量或者进行重启操作。 4. **环境变量和标签**:Starter能够...

    LifeCycleTest:Kubernetes生命周期测试를存储库

    9. **健康检查(Liveness Probe)**:Kubernetes会定期执行健康检查来确定容器是否仍然可以服务。如果检查失败,容器可能被标记为不健康并重启。 10. **就绪检查(Readiness Probe)**:就绪检查确保容器已经准备好...

    0Downtime-Deployments-Kubernetes:该项目与Kubernetes部署对象有关,以学习如何使用零时区时间在Kubernetes上部署应用程序

    6. **健康检查**:在更新过程中,Kubernetes会依赖Pod的就绪探针(readiness probe)和存活探针(liveness probe)来确定Pod是否准备好接收流量或是否已经失败。这些探针确保只有健康的Pod对外提供服务。 通过熟练...

Global site tag (gtag.js) - Google Analytics