K8s Pod亲和性、污点、容忍度、生命周期与健康探测详解(下)

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
容器镜像服务 ACR,镜像仓库100个 不限时长
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: 本文全面探讨了Kubernetes集群中Pod的四种关键机制——Pod亲和性、污点(Taints)、容忍度(Tolerations)、生命周期以及健康探测,为读者提供了深入理解并有效应用这些特性的指南。

 

image.gif 编辑

🐇明明跟你说过:个人主页

🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅

🔖行路有良友,便是天堂🔖

目录

五、健康探测

1、健康探测的概念

2、Pod启动探测(Startup Probe)

3、Pod存活探测(Liveness Probe)

4、Pod就绪探测(Readiness Probe)

5、Pod健康探测在故障转移与扩缩容中的应用

六、总结

1、Pod亲和性、污点、容忍度、生命周期与健康探测

2、如何更好地利用这些特性优化Kubernetes集群的性能与稳定性


五、健康探测

1、健康探测的概念

Pod健康探测是 Kubernetes 中一种用于监测容器内应用程序状态的机制。通过健康探测,Kubernetes 可以了解容器内应用程序的运行情况,并在应用程序出现故障或不健康状态时采取适当的措施。

Pod健康探测通常包括以下三种类型:

  • 存活探测(Liveness Probe)
  • 就绪探测(Readiness Probe)
  • 启动探测(Startup Probe)

image.gif 编辑

2、Pod启动探测(Startup Probe)

Pod启动探测(Startup Probe)是一种用于检测容器内应用程序是否已经启动的探测机制。与存活探测(Liveness Probe)不同,启动探测只在容器启动时执行一次,并且仅在探测成功后才会开始执行存活探测。这有助于在应用程序启动期间等待一段时间,以确保应用程序已经完全启动。

示例:

startupProbe:

 exec:

   command:

   - cat

   - /tmp/ready

 failureThreshold: 30

 periodSeconds: 10

在上面的示例中,

exec 指定了一个执行命令的探测方式,它会定期执行 cat /tmp/ready 命令来检查应用程序是否已经启动。如果命令的退出状态为0,则认为启动探测成功。

failureThreshold 指定了失败阈值,表示如果连续失败的次数达到了指定的阈值,就认为启动探测失败。

periodSeconds 指定了探测之间的间隔时间。

※启动探测通常用于确保应用程序在容器启动后已经准备就绪,以避免将流量引导到尚未完全启动的应用程序上。

image.gif 编辑

3、Pod存活探测(Liveness Probe)

存活探测用于检测容器内的应用程序是否正在运行。如果存活探测失败,Kubernetes 将重启容器,以尝试恢复应用程序的运行状态。存活探测通常通过发送定期的 HTTP 请求或执行应用程序特定的命令来实现。

示例:

1. HTTP GET 探测Kubernetes 将定期向容器发送 HTTP GET 请求,并检查响应的状态码。如果状态码不在指定的成功范围内(通常为200到399),则认为存活探测失败。

livenessProbe:

 httpGet:

   path: /healthz

   port: 8080

 initialDelaySeconds: 15

 periodSeconds: 10

上面的 livenessProbe 使用了 httpGet 作为检查机制,意味着它将向容器发送HTTP GET请求来检查容器的存活状态。

  • path: /healthz:这指定了HTTP请求的路径,即容器应该提供一个在/healthz路径上的端点来响应探针的检查。这个端点通常是一个轻量级的检查,可以快速返回容器的健康状态。
  • port: 8080:这指定了HTTP请求应该发送到容器的哪个端口。在这个例子中,探针将向容器的8080端口发送请求。
  • initialDelaySeconds: 15:容器启动后,将等待15秒才开始执行存活探针检查。这对于那些需要一些时间来启动和初始化的容器非常有用,确保在容器准备好之前不会进行任何不必要的重启。
  • periodSeconds: 10:这指定了探针检查的频率,即每10秒执行一次存活探针检查。如果容器在连续几次检查中没有响应,Kubernetes将认为容器已经死亡,并重新启动它。

image.gif 编辑

2. TCP 探测Kubernetes 将尝试建立 TCP 连接到容器的指定端口。如果连接失败,则认为存活探测失败。

livenessProbe:

 tcpSocket:

   port: 3306

 initialDelaySeconds: 15

 periodSeconds: 10

  • tcpSocket: 指示Kubernetes使用TCP套接字作为检查方法。
  • port: 3306: 指定了TCP连接应该尝试连接到的端口号。在这个例子中,探针将尝试连接到容器的3306端口,这通常是MySQL数据库的默认端口。
  • initialDelaySeconds: 15: 容器启动后,将等待15秒才开始执行存活探针检查。这对于那些需要一些时间来启动和初始化的容器(如数据库服务)特别有用。
  • periodSeconds: 10: 这指定了探针检查的频率,即每10秒执行一次存活探针检查。如果在这段时间内探针无法建立到指定端口的TCP连接,则Kubernetes会认为容器已经死亡,并尝试根据重启策略重启容器。

3. 执行命令探测:Kubernetes 将定期执行容器内指定的命令,并检查命令的退出状态。如果退出状态不为0,则认为存活探测失败。

livenessProbe:

 exec:

   command:

   - cat

   - /tmp/healthy

 initialDelaySeconds: 15

 periodSeconds: 10

  • exec: 指示Kubernetes执行一个命令来检查容器的存活状态。
  • command: 指定要执行的命令及其参数。在这个例子中,命令是 cat /tmp/healthy,这意味着探针将尝试在容器内部执行 cat 命令来读取 /tmp/healthy 文件的内容。如果文件存在且可读,cat 命令将成功执行,探针会认为容器是存活的。
  • initialDelaySeconds: 15: 容器启动后,将等待15秒才开始执行存活探针检查。这允许容器有足够的时间来完成启动和初始化过程。
  • periodSeconds: 10: 这指定了探针检查的频率,即每10秒执行一次存活探针检查。如果命令执行失败(例如,文件不存在或不可读),则Kubernetes会认为容器已经死亡,并尝试根据重启策略重启容器。

image.gif 编辑

4、Pod就绪探测(Readiness Probe)

Pod就绪探测(Readiness Probe)是一种用于检测容器内应用程序是否已经准备好接受流量的探测机制。当就绪探测失败时,Kubernetes不会将流量发送到该容器。这有助于确保只有在容器已经完全启动并且应用程序已经准备好处理流量时,才将流量引导到该容器上。

readinessProbe:

 httpGet:

   path: /healthz

   port: 8080

 initialDelaySeconds: 5

 periodSeconds: 10

在上面的示例中,

httpGet 指定了一个HTTP GET请求的探测方式,它会定期发送一个请求到容器内的 /healthz 路径,并检查返回的状态码是否为200。如果状态码为200,则认为就绪探测成功。

initialDelaySeconds 指定了容器启动后首次执行探测之前的等待时间。

periodSeconds 指定了探测之间的间隔时间。

※就绪探测通常用于确保应用程序已经完成启动并且已经加载了所有必要的资源,以便正确处理流量。

5、Pod健康探测在故障转移与扩缩容中的应用

Pod健康探测在故障转移与扩缩容中起着关键作用。通过定期检查容器内应用程序的健康状态,健康探测可以及时发现应用程序是否处于可用状态,从而在故障发生时进行快速的故障转移或者触发自动扩缩容。

  1. 故障转移(Failover): 当健康探测检测到某个容器内应用程序的健康状态异常时,Kubernetes会将该容器标记为不健康,并且会立即停止向该容器发送流量。然后,Kubernetes会自动将新的副本启动在其他健康的节点上,以确保应用程序的高可用性。
  2. 扩缩容(Autoscaling): 在自动扩缩容的情况下,健康探测可以根据应用程序的负载情况来动态调整Pod的副本数量。如果健康探测检测到应用程序的负载过高或过低,可以触发自动扩缩容机制,从而增加或减少Pod的副本数量,以满足应用程序的需求。

image.gif 编辑

六、总结

1、Pod亲和性、污点、容忍度、生命周期与健康探测

  1. Pod亲和性(Pod Affinity): 用于指定Pod之间的关系,例如让相关的Pod尽可能地被调度到同一节点,或者避免相关的Pod被调度到同一节点。这可以通过节点标签和Pod标签之间的匹配规则来实现。
  2. Pod污点(Pod Taints): 用于在节点上设置污点,限制哪些Pod可以被调度到该节点。Pod需要具有与节点污点匹配的容忍度,才能被调度到该节点上。
  3. Pod容忍度(Pod Tolerations): 用于指定Pod对节点污点的容忍程度。Pod可以设置容忍度来匹配节点的污点,以确保Pod可以被调度到带有特定污点的节点上。
  4. Pod生命周期与健康探测(Pod Lifecycle and Probes): Pod生命周期包括启动、运行和终止三个阶段。健康探测用于在运行阶段监视Pod内应用程序的健康状态,并在必要时触发故障转移或扩缩容。健康探测包括存活探测(Liveness Probe)、就绪探测(Readiness Probe)和启动探测(Startup Probe)。

image.gif 编辑

2、如何更好地利用这些特性优化Kubernetes集群的性能与稳定性

  1. 合理规划节点资源: 根据应用程序的需求和性能特征,合理规划节点的资源配置,包括 CPU、内存、存储等,以确保集群中的每个节点都能够满足应用程序的需求,并避免资源过度分配或不足的情况。
  2. 优化调度策略: 利用Pod亲和性和反亲和性、污点和容忍度等特性,优化调度策略,将相关的Pod调度到同一节点,避免节点资源浪费和通信延迟,同时保证Pod之间的隔离性。
  3. 健康探测与自动故障恢复: 配置适当的存活探测和就绪探测,监控Pod的健康状态,并实现自动故障转移和恢复。当Pod发生故障时,Kubernetes可以及时将其重新调度到健康的节点上,保证应用程序的可用性和稳定性。
  4. 优化存储和网络性能: 针对存储和网络性能瓶颈,选择合适的存储和网络方案,例如使用高性能存储卷、网络策略和服务网格等,以提升集群的性能和稳定性。
  5. 监控与调优: 定期监控集群的性能和健康状况,及时发现和解决问题,调优资源分配、调度策略和健康探测配置,以不断优化集群的性能和稳定性。

image.gif 编辑

💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Kubernetes的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!  

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
JSON Kubernetes Shell
【Azure K8S | AKS】在不丢失文件/不影响POD运行的情况下增加PVC的大小
【Azure K8S | AKS】在不丢失文件/不影响POD运行的情况下增加PVC的大小
|
2月前
|
Kubernetes Shell Perl
【Azure K8S|AKS】进入AKS的POD中查看文件,例如PVC Volume Mounts使用情况
【Azure K8S|AKS】进入AKS的POD中查看文件,例如PVC Volume Mounts使用情况
|
8天前
|
Kubernetes Docker Python
dockercompose与k8s的pod文件的爱恨情仇
dockercompose与k8s的pod文件的爱恨情仇
|
2月前
|
Kubernetes Docker Perl
在K8S中,如果是因为开发写的镜像问题导致pod起不来该怎么排查?
在K8S中,如果是因为开发写的镜像问题导致pod起不来该怎么排查?
|
2月前
|
Kubernetes 安全 Docker
在K8S中,在服务上线的时候Pod起不来怎么进行排查?
在K8S中,在服务上线的时候Pod起不来怎么进行排查?
|
2月前
|
存储 Kubernetes 调度
在K8S中,⼀个pod的不同container能够分开被调动到不同的节点上吗?
在K8S中,⼀个pod的不同container能够分开被调动到不同的节点上吗?
|
2月前
|
消息中间件 Kubernetes 容器
在K8S中,同⼀个Pod的不同容器互相可以访问是怎么做到的?
在K8S中,同⼀个Pod的不同容器互相可以访问是怎么做到的?
|
2月前
|
存储 Kubernetes 数据中心
在K8S中,同⼀个Pod内不同容器哪些资源是共用的,哪些资源是隔离的?
在K8S中,同⼀个Pod内不同容器哪些资源是共用的,哪些资源是隔离的?
|
2月前
|
Kubernetes 负载均衡 网络协议
在K8S中,Pod的探针有哪些及用途?
在K8S中,Pod的探针有哪些及用途?
|
2月前
|
Kubernetes 监控 Perl
在K8S中,Pod⼀直处于Init状态,如何排查?
在K8S中,Pod⼀直处于Init状态,如何排查?

相关产品

  • 容器服务Kubernetes版
  • 下一篇
    无影云桌面