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

简介: 本文全面探讨了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的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

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

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
存储 Kubernetes 调度
【赵渝强老师】什么是Kubernetes的Pod
Pod 是 Kubernetes 中的基本逻辑单位,代表集群上的一个应用实例。它可以由一个或多个容器组成,并包含数据存储和网络配置等资源。Pod 支持多种容器执行环境,如 Docker。Kubernetes 使用 Pod 管理容器,具有简化部署、方便扩展和调度管理等优点。视频讲解和图示详细介绍了 Pod 的组成结构和使用方式。
456 1
|
Kubernetes API 调度
k8s中节点无法启动Pod
【10月更文挑战第3天】
753 6
|
Prometheus Kubernetes 监控
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
610 25
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
576 12
|
Perl
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
339 1
【赵渝强老师】Kubernetes中Pod的基础容器
|
弹性计算 Kubernetes Perl
k8s 设置pod 的cpu 和内存
在 Kubernetes (k8s) 中,设置 Pod 的 CPU 和内存资源限制和请求是非常重要的,因为这有助于确保集群资源的合理分配和有效利用。你可以通过定义 Pod 的 `resources` 字段来设置这些限制。 以下是一个示例 YAML 文件,展示了如何为一个 Pod 设置 CPU 和内存资源请求(requests)和限制(limits): ```yaml apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image:
2028 3
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
412 1
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Pod中的业务容器
Pod 是 Kubernetes 中的基本调度单元,由一个或多个容器组成。除了业务容器,Pod 还包括基础容器、初始化容器和临时容器。本文通过示例介绍如何创建包含业务容器的 Pod,并提供了一个视频讲解。示例中创建了一个名为 "busybox-container" 的业务容器,并使用 `kubectl create -f firstpod.yaml` 命令部署 Pod。
312 1

相关产品

  • 容器服务Kubernetes版
  • 推荐镜像

    更多