网站空间做邮箱,帝国cms做淘宝客网站,无锡网站制作价格多少,网站建设三网目录 Pod容器健康探测 为什么要对容器做探测#xff1f;
启动探测startupprobe
存活性探测livenessProbe
就绪性探测readinessProbe ReadinessProbe LivenessProbe startupProbe配合使用示例一般程序中需要设置三种探针结合使用#xff0c;并且也要结合实际情况#xff…目录 Pod容器健康探测 为什么要对容器做探测
启动探测startupprobe
存活性探测livenessProbe
就绪性探测readinessProbe ReadinessProbe LivenessProbe startupProbe配合使用示例一般程序中需要设置三种探针结合使用并且也要结合实际情况来配置初始化检查时间和检测间隔下面列一个简单的 SpringBoot 项目的例子。 文档中的YAML文件配置直接复制粘贴可能存在格式错误故实验中所需要的YAML文件以及本地包均打包至网盘
链接https://pan.baidu.com/s/1FRbgxf-O7ZxOnmS5SE-0Kw 提取码693j
作者韩先超老师 Pod容器健康探测 为什么要对容器做探测
在 Kubernetes 中 Pod 是最小的计算单元而一个 Pod 又由多个容器组成相当于每个容器就是一个应用应用在运行期间可能因为某些意外情况致使程序挂掉。那么如何监控这些容器状态稳定性保证服务在运行期间不会发生问题发生问题后进行重启等机制就成为了重中之重的事情考虑到这点 kubernetes 推出了活性探针机制。有了存活性探针能保证程序在运行中如果挂掉能够自动重启但是还有个经常遇到的问题比如说在Kubernetes 中启动Pod显示明明Pod已经启动成功且能访问里面的端口但是却返回错误信息。还有就是在执行滚动更新时候总会出现一段时间Pod对外提供网络访问但是访问却发生404这两个原因都是因为Pod已经成功启动但是 Pod 的的容器中应用程序还在启动中导致考虑到这点Kubernetes推出了就绪性探针机制。 1、默认的健康检查
Kubernetes默认的健康检查机制 每个容器启动时都会执行一个进程 此进程由Dockerfile的CMD或ENTRYPOINT指定。 如果进程退出时返回码非零 则认为容器发生故障 Kubernetes就会根据restartPolicy策略决定是否重启容器。
[rootxianchaomaster1]# cat check.yaml
apiVersion: v1
kind: Pod
metadata: name: check namespace: default labels: app: check
spec: containers: - name: check image: busybox:1.28 imagePullPolicy: IfNotPresent command: - /bin/sh - -c - sleep 10;exit [rootxianchaomaster1 ~]# kubectl get pods -w
NAME READY STATUS RESTARTS AGE
check 0/1 Pending 0 0s
check 0/1 Pending 0 0s
check 0/1 ContainerCreating 0 0s
check 0/1 ContainerCreating 0 1s
check 1/1 Running 0 1s
check 0/1 Completed 0 11s
check 1/1 Running 1 (1s ago) 12s
check 0/1 Completed 1 (11s ago) 22s
check 0/1 CrashLoopBackOff 1 (13s ago) 34s
check 1/1 Running 2 (13s ago) 34s
check 0/1 Completed 2 (23s ago) 44s 在上面的例子中 容器进程返回值非零 Kubernetes则认为容器发生故障 需要重启。 有不少情况是发生了故障 但进程并不会退出。 比如访问Web服务器时显示500内部错误 可能是系统超载 也可能是资源死锁 此时httpd进程并没有异常退出 在这种情况下重启容器可能是最直接、 最有效的解决方案。 k8s 提供了三种来实现容器探测的方法分别是 1、startupProbe探测容器中的应用是否已经启动。如果提供了启动探测(startup probe)则禁用所有其他探测直到它成功为止。如果启动探测失败kubelet 将杀死容器容器服从其重启策略进行重启。如果容器没有提供启动探测则默认状态为成功Success。 2、livenessprobe用指定的方式exec、tcp、http检测pod中的容器是否正常运行如果检测失败则认为容器不健康那么Kubelet将根据Pod中设置的 restartPolicy策略来判断Pod 是否要进行重启操作如果容器配置中没有配置 livenessProbeKubelet 将认为存活探针探测一直为success成功状态。 3、readnessprobe就绪性探针用于检测容器中的应用是否可以接受请求当探测成功后才使Pod对外提供网络访问将容器标记为就绪状态可以加到pod前端负载如果探测失败则将容器标记为未就绪状态会把pod从前端负载移除。 可以自定义在pod启动时是否执行这些检测如果不设置则检测结果均默认为通过如果设置则顺序为startupProbereadinessProbe和livenessProbereadinessProbe和livenessProbe是并发关系
真正的启动顺序
官方文档Caution: Liveness probes do not wait for readiness probes to succeed. If you want to wait before executing a liveness probe you should use initialDelaySeconds or a startupProbe
也就是 Liveness probes 并不会等到 Readiness probes 成功之后才运行根据上面的官方文档Liveness 和 readiness 应该是某种并发的关系。 目前LivenessProbe和ReadinessProbe、startupprobe探测都支持下面三种探针
1、exec在容器中执行指定的命令如果执行成功退出码为 0 则探测成功。
2、TCPSocket通过容器的 IP 地址和端口号执行 TCP 检 查如果能够建立 TCP 连接则表明容器健康。
3、HTTPGet通过容器的IP地址、端口号及路径调用 HTTP Get方法如果响应的状态码大于等于200且小于400则认为容器健康 探针探测结果有以下值
1、Success表示通过检测。
2、Failure表示未通过检测。
3、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 的重启策略来决定作出对应的措施。 启动探测startupprobe
1、exec模式
[rootxianchaomaster1]# cat startup-exec.yaml
apiVersion: v1
kind: Pod
metadata: name: startupprobe
spec: containers: - name: startup
image: xianchao/tomcat-8.5-jre8:v1
imagePullPolicy: IfNotPresent ports: - containerPort: 8080 startupProbe: exec: command: - /bin/sh - -c - aa ps aux | grep tomcat initialDelaySeconds: 20 #容器启动后多久开始探测 periodSeconds: 20 #执行探测的时间间隔 timeoutSeconds: 10 #探针执行检测请求后等待响应的超时时间 successThreshold: 1 #成功多少次才算成功 failureThreshold: 3 #失败多少次才算失败 2、tcpsocket模式
[rootxianchaomaster1]# cat startup-tcpsocket.yaml
apiVersion: v1
kind: Pod
metadata: name: startupprobe
spec: containers: - name: startup
image: xianchao/tomcat-8.5-jre8:v1
imagePullPolicy: IfNotPresent ports: - containerPort: 8080 startupProbe: tcpSocket: port: 8080 initialDelaySeconds: 20 #容器启动后多久开始探测 periodSeconds: 20 #执行探测的时间间隔 timeoutSeconds: 10 #探针执行检测请求后等待响应的超时时间 successThreshold: 1 #成功多少次才算成功 failureThreshold: 3 #失败多少次才算失败 3、httpget模式
[rootxianchaomaster1]# cat startup-httpget.yaml
apiVersion: v1
kind: Pod
metadata: name: startupprobe
spec: containers: - name: startup
image: xianchao/tomcat-8.5-jre8:v1
imagePullPolicy: IfNotPresent ports: - containerPort: 8080 startupProbe: httpGet: path: / port: 8080 initialDelaySeconds: 20 #容器启动后多久开始探测 periodSeconds: 20 #执行探测的时间间隔 timeoutSeconds: 10 #探针执行检测请求后等待响应的超时时间 successThreshold: 1 #成功多少次才算成功 failureThreshold: 3 #失败多少次才算失败 存活性探测livenessProbe 官网地址配置存活、就绪和启动探针 | Kubernetes这篇文章介绍如何给容器配置存活Liveness、就绪Readiness和启动Startup探针。kubelet 使用存活探针来确定什么时候要重启容器。 例如存活探针可以探测到应用死锁应用在运行但是无法继续执行后面的步骤情况。 重启这种状态下的容器有助于提高应用的可用性即使其中存在缺陷。存活探针的常见模式是为就绪探针使用相同的低成本 HTTP 端点但具有更高的 failureThreshold。 这样可以确保在硬性终止 Pod 之前将观察到 Pod 在一段时间内处于非就绪状态。kubelet 使用就绪探针可以知道容器何时准备好接受请求流量当一个 Pod 内的所有容器都就绪时才能认为该 Pod 就绪。 这种信号的一个用途就是控制哪个 Pod 作为 Service 的后端。 若 Pod 尚未就绪会被从 Service 的负载均衡器中剔除。kubelet 使用启动探针来了解应用容器何时启动。 如果配置了这类探针存活探针和就绪探针成功之前不会重启确保这些探针不会影响应用的启动。 启动探针可以用于对慢启动容器进行存活性检测避免它们在启动运行之前就被杀掉。注意 存活探针是一种从应用故障中恢复的强劲方式但应谨慎使用。 你必须仔细配置存活探针确保它能真正标示出不可恢复的应用故障例如死锁。说明 错误的存活探针可能会导致级联故障。 这会导致在高负载下容器重启例如由于应用无法扩展导致客户端请求失败以及由于某些 Pod 失败而导致剩余 Pod 的工作负载增加。了解就绪探针和存活探针之间的区别 以及何时为应用配置使用它们非常重要。准备开始 你必须拥有一个 Kubernetes 的集群且必须配置 kubectl 命令行工具让其与你的集群通信。 建议运行本教程的集群至少有两个节点且这两个节点不能作为控制平面主机。 如果你还没有集群你可以通过 Minikube 构建一个你自己的集群或者你可以使用下面的 Kubernetes 练习环境之一Killercoda 玩转 Kubernetes 定义存活命令 许多长时间运行的应用最终会进入损坏状态除非重新启动否则无法被恢复。 Kubernetes 提供了存活探针来发现并处理这种情况。在本练习中你会创建一个 Pod其中运行一个基于 registry.k8s.io/busybox 镜像的容器。 下面是这个 Pod 的配置文件。https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/ 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: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 容器启动设置执行的命令 /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方式做健康探测
[rootxianchaonode1 ~]# ctr -n k8s.io images import springboot.tar.gz
[rootxianchaonode2 ~]# ctr -n k8s.io images import springboot.tar.gz 示例文件 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
imagePullPolicy: IfNotPresent 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容器上要访问端口号或名称。
pathhttp服务器上的访问URI。
httpHeaders自定义HTTP请求headersHTTP允许重复headers。 3、通过TCP方式做健康探测 示例文件 liveness-tcp.yaml
apiVersion: v1
kind: Pod
metadata: name: liveness-tcp labels: app: liveness
spec: containers: - name: liveness
image: docker.io/xianchao/nginx:v1
imagePullPolicy: IfNotPresent livenessProbe: initialDelaySeconds: 15 periodSeconds: 20 tcpSocket: port: 80 TCP 检查方式和 HTTP 检查方式非常相似在容器启动 initialDelaySeconds 参数设定的时间后kubelet 将发送第一个 livenessProbe 探针尝试连接容器的 80 端口如果连接失败则将杀死 Pod 重启容器。 就绪性探测readinessProbe 1、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
imagePullPolicy: IfNotPresent ports: - name: server containerPort: 8080 - name: management containerPort: 8081 readinessProbe: initialDelaySeconds: 20 periodSeconds: 5 timeoutSeconds: 10 httpGet: scheme: HTTP port: 8081 path: /actuator/health ReadinessProbe LivenessProbe startupProbe配合使用示例 一般程序中需要设置三种探针结合使用并且也要结合实际情况来配置初始化检查时间和检测间隔下面列一个简单的 SpringBoot 项目的例子。
[rootxianchaomaster1]# cat start-read-live.yaml
apiVersion: v1
kind: Service
metadata: name: springboot-live 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-live labels: app: springboot
spec: containers: - name: springboot image: mydlqclub/springboot-helloworld:0.0.1 imagePullPolicy: IfNotPresent 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: 20 periodSeconds: 5 timeoutSeconds: 10 httpGet: scheme: HTTP port: 8081 path: /actuator/health startupProbe: initialDelaySeconds: 20 periodSeconds: 5 timeoutSeconds: 10 httpGet: scheme: HTTP port: 8081 path: /actuator/health