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

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

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

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

在上一章节中,我们详细探讨了Pod的概念、创建、生命周期、网络和存储等,本期将作为上期文章的补充,详细介绍 Pod亲和性、污点、容忍度、生命周期与健康探测等

目录

一、引言

1、Kubernetes与Pod的基本概述

2、Pod亲和性、污点、容忍度的重要性

3、Pod生命周期与健康探测的意义

二、Pod亲和性

1、Pod亲和性的概念与作用

2、节点亲和性与Pod间亲和性的区别

3、如何配置节点亲和性

4、如何配置Pod间亲和性

5、如何配置Pod间反亲和性

6、Pod亲和性的应用场景


一、引言

1、Kubernetes与Pod的基本概述

Kubernetes(常简称为K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。它提供了许多功能,如自我修复、水平扩展、服务发现和负载均衡等,使得在集群环境中运行容器化应用程序变得更加简单和高效。

Pod是Kubernetes中最小的部署单元,也是其他Kubernetes对象的基本构建块。一个Pod可以包含一个或多个紧密相关的容器,这些容器共享存储、网络、运行时配置等资源,并且一起被调度到集群中的一个节点上运行。Pod中的容器共享相同的网络命名空间,因此它们可以通过localhost进行通信。同时,Pod也作为集群管理的最小单位,提供了更高的管理粒度。

2、Pod亲和性、污点、容忍度的重要性

Pod亲和性:Pod亲和性允许用户根据特定规则将Pod调度到集群中的节点上。这有助于优化资源利用、提高性能并满足应用程序的特定需求。

污点(Taints):污点是定义在节点上的键值对,用于表示节点上的某些不期望的特性或限制。这使得节点能够主动拒绝不符合条件的Pod的调度,从而确保节点资源不被不适合的Pod占用。

容忍度(Tolerations):容忍度是定义在Pod上的键值对,允许Pod容忍节点的污点,从而可以被调度到带有污点的节点上。这增加了Pod调度的灵活性,使其能够适应集群中不同节点的特性。

3、Pod生命周期与健康探测的意义

Pod生命周期在Kubernetes中指的是Pod从创建到终止的整个过程,包括初始化容器、主容器的运行、容器启动后和终止前的钩子执行,以及容器的存活性探测和就绪性探测等阶段。每个阶段都有其特定的作用和目的,共同确保了Pod在集群中的正常运行和有效管理。

健康探测则是Kubernetes保证Pod及其中容器运行状态的重要手段。通过存活性探针和就绪性探针,Kubernetes能够实时检测Pod及容器的运行状态,一旦发现异常,便采取相应的措施,如重启容器或剔除异常实例,以保证服务的可用性和稳定性。

二、Pod亲和性

1、Pod亲和性的概念与作用

Pod 亲和性(Affinity)是 Kubernetes 中的一个重要概念,它用来指定 Pod 与节点之间的关系,即规定 Pod 应该被调度到哪些节点上运行。Pod 亲和性可以分为两种类型:Node Affinity(节点亲和性)Pod Affinity(Pod 亲和性)

1. 节点亲和性(Node Affinity): 通过节点亲和性,可以指定 Pod 与节点的关系,使得 Pod 被调度到满足指定条件的节点上运行。Node Affinity 可以分为以下几种类型:

  • requiredDuringSchedulingIgnoredDuringExecution:表示 Pod 必须被调度到满足指定条件的节点上运行,如果没有满足条件的节点,则 Pod 将一直处于 Pending 状态。
  • preferredDuringSchedulingIgnoredDuringExecution:表示 Pod 倾向于被调度到满足指定条件的节点上运行,但如果没有满足条件的节点,也可以被调度到其他节点上运行。

2. Pod 亲和性(Pod Affinity): 通过 Pod 亲和性,可以指定 Pod 与其他 Pod 的关系,使得同一组或相关的 Pod 被调度到同一节点上运行,或者避免相互冲突的 Pod 被调度到同一节点上运行。Pod Affinity 可以分为以下几种类型:

  • requiredDuringSchedulingIgnoredDuringExecution:表示 Pod 必须与满足指定条件的其他 Pod 被调度到同一节点上运行,如果没有满足条件的其他 Pod,则 Pod 将一直处于 Pending 状态。
  • preferredDuringSchedulingIgnoredDuringExecution:表示 Pod 倾向于与满足指定条件的其他 Pod 被调度到同一节点上运行,但如果没有满足条件的其他 Pod,也可以被调度到其他节点上运行。

※require表示必须有节点满足这个位置定义的亲和性,这是个硬性条件,硬亲和性

※prefered表示有节点尽量满足这个位置定义的亲和性,这不是一个必须的条件,软亲和性

3. 节点反亲和性(Node Anti-Affinity): 通过节点反亲和性,可以指定 Pod 应该避免被调度到满足指定条件的节点上运行。与节点亲和性相似,节点反亲和性也可以分为 requiredDuringSchedulingIgnoredDuringExecution 和 preferredDuringSchedulingIgnoredDuringExecution 两种类型。

4. Pod 反亲和性(Pod Anti-Affinity): 通过 Pod 反亲和性,可以指定 Pod 应该避免与满足指定条件的其他 Pod 被调度到同一节点上运行。与 Pod 亲和性相似,Pod 反亲和性也可以分为 requiredDuringSchedulingIgnoredDuringExecution 和 preferredDuringSchedulingIgnoredDuringExecution 两种类型。

Pod 亲和性的作用主要体现在以下几个方面:

  • 性能优化: 可以将相关的 Pod 部署到同一节点上,从而提高数据访问的效率和性能。
  • 故障隔离: 可以将同一应用程序的多个副本部署到不同的节点上,以实现故障隔离和高可用性。
  • 资源利用: 可以根据节点的硬件配置和资源使用情况,将 Pod 部署到最合适的节点上,以实现资源的最优分配和利用。

2、节点亲和性与Pod间亲和性的区别

节点亲和性(Node Affinity)和 Pod间亲和性(Pod Affinity)是 Kubernetes 中两种不同的调度策略,它们分别用于指定 Pod 与节点之间的关系和 Pod 与其他 Pod 之间的关系。

1. 节点亲和性(Node Affinity):

  • 作用: 用于指定 Pod 应该被调度到哪些节点上运行。
  • 类型: 包括 requiredDuringSchedulingIgnoredDuringExecution 和 preferredDuringSchedulingIgnoredDuringExecution 两种类型。
  • 使用场景: 当需要控制 Pod 在集群中的调度位置时,可以使用节点亲和性。例如,根据节点的硬件配置、地理位置或其他属性,将 Pod 调度到满足指定条件的节点上运行。

2. Pod间亲和性(Pod Affinity):

  • 作用: 用于指定 Pod 与其他 Pod 之间的关系,即 Pod 应该与哪些其他 Pod 被调度到同一节点上运行。
  • 类型: 包括 requiredDuringSchedulingIgnoredDuringExecution 和 preferredDuringSchedulingIgnoredDuringExecution 两种类型。
  • 使用场景: 当需要将相关的 Pod 部署到同一节点上运行时,可以使用 Pod间亲和性。例如,将同一应用程序的多个副本部署到同一节点上,以实现故障隔离、性能优化或其他目的。

3、如何配置节点亲和性

要配置节点亲和性(Node Affinity),可以在 Pod 的定义中使用 affinity 字段,并在其中指定 nodeAffinity 字段。以下是一个示例 YAML 文件,展示了如何配置节点亲和性:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: <node-label-key>
            operator: In
            values:
            - <node-label-value>

  •  <node-label-key><node-label-value> 表示要匹配的节点标签的键和值。可以根据需要设置节点标签,例如节点的地理位置、硬件类型等。
  • requiredDuringSchedulingIgnoredDuringExecution 表示 Pod 必须满足指定的节点亲和性条件才能被调度。如果没有满足条件的节点,则 Pod 将一直处于 Pending 状态,直到满足条件的节点可用为止。

通过配置节点亲和性,可以控制 Pod 被调度到哪些节点上运行,从而实现资源的最优分配和利用。请根据您的实际需求和集群环境进行配置。

4、如何配置Pod间亲和性

要配置 Pod 间亲和性(Pod Affinity),可以在 Pod 的定义中使用 affinity 字段,并在其中指定 podAffinity 字段。以下是一个示例 YAML 文件,展示了如何配置 Pod 间亲和性:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: <pod-label-key>
            operator: In
            values:
            - <pod-label-value>
        topologyKey: <topology-key>

  • <pod-label-key> <pod-label-value> 表示您要匹配的 Pod 标签的键和值。您可以根据需要设置 Pod 标签,例如应用程序类型、部门信息等。
  • <topology-key> 表示拓扑域的键,用于指定在哪个拓扑域内查找匹配的 Pod。拓扑域可以是节点、机架、区域等。
  • requiredDuringSchedulingIgnoredDuringExecution 表示 Pod 必须满足指定的条件才能被调度或保持运行。如果没有满足条件的 Pod,则 Pod 将一直处于 Pending 状态或者被驱逐。

5、如何配置Pod间反亲和性

配置Pod间反亲和性与上面的Pod间亲和性YAML写法基本一致,不同的是将podAffinity更换成了podAntiAffinity

下面是一个示例:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: <pod-label-key>
            operator: In
            values:
            - <pod-label-value>
        topologyKey: <topology-key>

通过配置 Pod 间反亲和性,可以控制相关的 Pod 是否应该被调度到同一节点上运行,以实现故障隔离、性能优化或其他目的。

6、Pod亲和性的应用场景

  1. 高可用性: 将同一应用程序的多个副本部署到不同的节点上,以提高应用程序的可用性。通过配置 Pod 间亲和性,可以将相关的 Pod 部署到同一节点上,从而实现故障隔离和容错能力。
  2. 性能优化: 将需要频繁通信或共享资源的相关应用程序部署到同一节点上,以减少网络延迟和资源访问时间。通过配置 Pod 间亲和性,可以将相关的 Pod 部署到同一节点上,提高应用程序的性能和响应速度。
  3. 数据局部性: 在分布式系统中,经常需要处理大量的数据和计算任务。通过配置 Pod 间亲和性,可以将相关的数据处理任务部署到同一节点上,以减少数据传输和计算开销,提高系统的数据局部性和处理效率。
  4. 资源隔离: 在多租户环境中,不同的应用程序可能会共享同一集群资源。通过配置 Pod 间反亲和性,可以将不同应用程序的相关 Pod 部署到不同的节点上,以避免资源竞争和性能干扰,实现资源的有效隔离和管理。

假设有一个微服务架构的应用程序,其中包括多个服务,如用户服务、订单服务和支付服务等。这些服务之间需要频繁通信和共享数据。为了提高系统的性能和可用性,可以将相关服务的 Pod 配置为具有亲和性,使它们被调度到同一节点上运行。例如,将用户服务和订单服务的 Pod 配置为具有亲和性,以减少服务之间的网络延迟和通信开销,提高系统的响应速度和性能。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/288756.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

逐步学习Go-协程goroutine

参考&#xff1a;逐步学习Go-协程goroutine – FOF编程网 什么是线程&#xff1f; 简单来说线程就是现代操作系统使用CPU的基本单元。线程基本包括了线程ID&#xff0c;程序计数器&#xff0c;寄存器和线程栈。线程共享进程的代码区&#xff0c;数据区和操作系统的资源。 线…

数据结构——排序算法

1、排序的概念 排序是指的是将一组数据&#xff08;如数字、单词、记录等&#xff09;按照某种特定的顺序&#xff08;升序或降序&#xff09;进行排列的过程。排序算法是实现排序的程序或方法&#xff0c;它们在软件开发和数据处理中扮演着至关重要的角色。 排序算法可以根据…

servlet开发详解

一、什么是servlet&#xff0c;干什么用的&#xff1f;&#xff1f;&#xff1f; tomcat作为一个web服务器&#xff0c;也称作servlet容器。servlet只有放在web服务器中才能运行&#xff0c;不能独立运行。tomcat这个容器要做三件事&#xff1a;接收请求、处理请求和响应请求。…

文生视频大模型Sora的复现经验

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

java调用jacob进行文件转换ppt转pdf或者png

java调用jacob进行文件转换ppt转pdf或者png 前情提要 最近项目上&#xff0c;遇到一个复杂的ppt&#xff0c;最终要求是要将ppt每一页转成图片原本这个是不难&#xff0c;网上一搜一大堆案例&#xff0c;外加我本身也比较精通aspose&#xff0c;那还不是分分钟搞定。结果就是…

Healix Protocol 的 HLX 通证预售:医疗领域的未来展望

Healix Protocol推出 HLX 通证预售&#xff0c;将带来医疗领域的重要变革。通过其区块链技术&#xff0c;Healix Protocol致力于重新定义医疗服务的可及性与负担性&#xff0c;成为医疗行业的希望之光。该项目旨在增强透明度、可及性和效率&#xff0c;推动医疗体系向更加公平和…

Hadoop面试重点

文章目录 1. Hadoop 常用端口号2.Hadoop特点3.Hadoop1.x、2.x、3.x区别 1. Hadoop 常用端口号 hadoop2.xhadoop3.x访问HDFS 端口500709870访问 MR 执行情况端口80888088历史服务器1988819888客户端访问集群端口90008020 2.Hadoop特点 高可靠&#xff1a;Hadoop底层维护多个数…

Rust语言中Regex正则表达式,匹配和查找替换等

官方仓库&#xff1a;https://crates.io/crates/regex 文档地址&#xff1a;regex - Rust github仓库地址&#xff1a;GitHub - rust-lang/regex: An implementation of regular expressions for Rust. This implementation uses finite automata and guarantees linear tim…

LoadBalance 负载均衡服务调用

前身:Ribbon LB负载均衡(Load Balance)是什么 简单的说就是将用户的请求平摊的分配到多个服务上&#xff0c;从而达到系统的HA&#xff08;高可用&#xff09;&#xff0c;常见的负载均衡有软件Nginx&#xff0c;LVS&#xff0c;硬件 F5等 spring-cloud-starter-loadbalancer组…

OSG编程指南<二十一>:OSG视图与相机视点更新设置及OSG宽屏变形

1、概述 什么是视图?在《OpenGL 编程指南》中有下面的比喻,从笔者开始学习图形学就影响深刻,相信对读者学习场景管理也会非常有帮助。 产生目标场景视图的变换过程类似于用相机进行拍照,主要有如下的步骤: (1)把照相机固定在三脚架上,让它对准场景(视图变换)。 (2)…

【办公类-21-11】 20240327三级育婴师 多个二级文件夹的docx合并成docx有页码,转PDF

背景展示&#xff1a;有页码的操作题 背景需求&#xff1a; 实操课终于全部结束了&#xff0c;把考试内容&#xff08;docx&#xff09;都写好了 【办公类-21-10】三级育婴师 视频转文字docx&#xff08;等线小五单倍行距&#xff09;&#xff0c;批量改成“宋体小四、1.5倍行…

洛谷day3

B2053 求一元二次方程 - 洛谷 掌握printf用法&#xff1b; #include <iostream> #include <cmath> using namespace std; double a,b,c; double delta; double x1,x2;int main() {cin>>a>>b>>c;delta b*b-4*a*c;if(delta>0){x1 (-bsqrt…

从根本上优雅地解决 VSCode 中的 Python 模块导入问题

整体概述&#xff1a; 在我尝试运行 test_deal_file.py 时&#xff0c;我遇到了一个 ModuleNotFoundError 错误&#xff0c;Python告诉我找不到名为 controllers 的模块。这意味着我无法从 deal_file.py 中导入 read_excel 函数。 为了解决这个问题&#xff0c;我尝试了几种方法…

JAVA面试大全之JVM和调优篇

目录 1、类加载机制 1.1、类加载的生命周期&#xff1f; 1.2、类加载器的层次? 1.3、Class.forName()和ClassLoader.loadClass()区别? 1.4、JVM有哪些类加载机制&#xff1f; 2、内存结构 2.1、说说JVM内存整体的结构&#xff1f;线程私有还是共享的&#xff1f; 2.2…

Rust使用原始字符串字面量实现Regex双引号嵌套双引号正则匹配

rust使用Regex实现正则匹配的时候&#xff0c;如果想实现匹配双引号&#xff0c;就需要使用原始字符串字面量&#xff0c;不然无法使用双引号嵌套的。r#"..."# 就表示原始字符串字面量。 比如使用双引号匹配&#xff1a; use regex::Regex;fn main() {println!(&qu…

【性能优化】 【回溯】 【字符串】1307. 口算难题

作者推荐 视频算法专题 本文涉及知识点 数学 回溯 字符串 性能优化 LeetCode1307. 口算难题 给你一个方程&#xff0c;左边用 words 表示&#xff0c;右边用 result 表示。 你需要根据以下规则检查方程是否可解&#xff1a; 每个字符都会被解码成一位数字&#xff08;0 - …

2024年云计算使用报告,89%组织用多云,25%广泛使用生成式AI,45%需要跨云数据集成,节省成本是云首要因素

备注&#xff1a;本文来自Flexera2024年的云现状调研报告的翻译。原报告地址&#xff1a; https://info.flexera.com/CM-REPORT-State-of-the-Cloud Flexera是一家专注于做SaaS的IT解决方案公司&#xff0c;有30年发展历史&#xff0c;5万名客户&#xff0c;1300名员工。Flex…

夜莺浏览日志、filebeat采集日志(四)

文章目录 一、elasticsearch二、filebeat三、日志分析 一、elasticsearch docker启动 docker run -d -p 9200:9200 -p 9300:9300 --restartalways -e ES_JAVA_OPTS"-Xms512m -Xmx512m" \ -e discovery.typesingle-node -e xpack.security.enabledtrue -e ELASTIC_P…

使用GO对PostgreSQL进行有意思的多线程压测

前言 针对PostgreSQL进行压缩&#xff0c;有很多相关的工具。有同学又要问了&#xff0c;为何还要再搞一个&#xff1f;比如&#xff0c;pgbench, sysbench之类的&#xff0c;已经很强大了。是的&#xff0c;它们都很强大。但有时候&#xff0c;在一些特殊的场景&#xff0c;可…

Django开发复盘

一、URL 对于一个不会写正则表达式的蒟蒻来说&#xff0c;在urls.py中就只能傻傻的写死名字&#xff0c;但是即便这样&#xff0c;还会有很多相对路径和绝对路径的问题&#xff08;相对ip端口的路径&#xff09;&#xff0c;因为我们网页中涉及到页面跳转&#xff0c;涉及到发送…