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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
可观测监控 Prometheus 版,每月50GB免费额度
简介: 本文全面探讨了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搭建和管理企业级网站应用
相关文章
|
7天前
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
【赵渝强老师】Kubernetes中Pod的基础容器
|
7天前
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
|
7天前
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Pod中的业务容器
Pod 是 Kubernetes 中的基本调度单元,由一个或多个容器组成。除了业务容器,Pod 还包括基础容器、初始化容器和临时容器。本文通过示例介绍如何创建包含业务容器的 Pod,并提供了一个视频讲解。示例中创建了一个名为 "busybox-container" 的业务容器,并使用 `kubectl create -f firstpod.yaml` 命令部署 Pod。
|
7天前
|
Kubernetes 容器 Perl
【赵渝强老师】K8s中Pod中的初始化容器
Kubernetes的Pod包含业务容器、基础容器、初始化容器和临时容器。初始化容器在业务容器前运行,用于执行必要的初始化任务。本文介绍了初始化容器的作用、配置方法及优势,并提供了一个示例。
|
22天前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
23天前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。
|
1月前
|
Kubernetes Cloud Native 云计算
云原生之旅:Kubernetes 集群的搭建与实践
【8月更文挑战第67天】在云原生技术日益成为IT行业焦点的今天,掌握Kubernetes已成为每个软件工程师必备的技能。本文将通过浅显易懂的语言和实际代码示例,引导你从零开始搭建一个Kubernetes集群,并探索其核心概念。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你打开一扇通往云原生世界的大门。
120 17
|
1月前
|
Kubernetes 应用服务中间件 nginx
搭建Kubernetes v1.31.1服务器集群,采用Calico网络技术
在阿里云服务器上部署k8s集群,一、3台k8s服务器,1个Master节点,2个工作节点,采用Calico网络技术。二、部署nginx服务到k8s集群,并验证nginx服务运行状态。
456 1
|
1月前
|
Kubernetes Cloud Native 微服务
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
105 1
|
1月前
|
负载均衡 应用服务中间件 nginx
基于Ubuntu-22.04安装K8s-v1.28.2实验(二)使用kube-vip实现集群VIP访问
基于Ubuntu-22.04安装K8s-v1.28.2实验(二)使用kube-vip实现集群VIP访问
50 1

相关产品

  • 容器服务Kubernetes版