【云原生】Kubernetes中关于污点、亲和性和容忍度的详细用法教程与应用实战

news2024/9/21 0:28:20

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生k8s,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:云原生K8S,零基础到进阶实战
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • Kubernetes中关于污点、亲和性和容忍度的详细用法教程
    • 一、污点(Taints)
      • 1.1 污点的定义
      • 1.2 设置污点
      • 1.3 实战案例
    • 二、容忍度(Tolerations)
      • 2.1 容忍度的定义
      • 2.2 设置容忍度
      • 2.3 实战案例
    • 三、亲和性(Affinity)
      • 3.1 节点亲和性(Node Affinity)
        • 示例YAML配置
      • 3.2 Pod亲和性(Pod Affinity)和Pod反亲和性(Pod Anti-Affinity)
        • Pod亲和性示例
        • Pod反亲和性示例
    • 四、综合实战案例
      • 第一步:标记节点
      • 第二步:配置数据库Pod
      • 第三步:配置前端Pod和后端Pod的反亲和性
      • 1. 资源限制(Resource Limits)
      • 2. 存储配置(Storage Configuration)
      • 3. 网络策略(Network Policies)
      • 4. 容忍度(Tolerations)
      • 5. 使用Deployment, StatefulSet或DaemonSet等控制器
      • 6. 监控和日志
      • 7. 备份和恢复策略
      • 8. 更新和回滚策略
      • 9. 安全性

Kubernetes中关于污点、亲和性和容忍度的详细用法教程

在Kubernetes中,污点(Taints)、亲和性(Affinity)和容忍度(Tolerations)是三个强大的工具,它们允许集群管理员精细控制Pod在节点上的调度。这些机制共同工作,确保Pod被调度到最适合它们的节点上,从而提高集群的效率和稳定性。本文将结合具体案例,详细介绍污点、亲和性和容忍度的用法。

一、污点(Taints)

污点是一种标记节点的机制,用于告诉Kubernetes调度器该节点上的Pod是有问题的,或者该节点应该被保留给特定的Pod使用。当节点被标记为污点时,除非Pod明确声明它可以容忍这个污点,否则调度器不会将新的Pod调度到这个节点上。

1.1 污点的定义

污点通常是一个键值对,并附加一个效果(Effect),用于指定污点的行为。污点的常见效果有三种:

  • NoSchedule:如果节点上至少有一个未被忽略的NoSchedule污点生效,那么Kubernetes不会将新的Pod调度到这个节点上。已经存在的Pod不会受到影响,不会被驱逐或删除。
  • PreferNoSchedule:如果节点上至少有一个不可容忍的PreferNoSchedule污点生效,Kubernetes将尽量避免在这个节点上调度新的Pod。但如果找不到其他合适的节点,还是会调度到这个节点上。
  • NoExecute:如果节点上至少有一个未被忽略的NoExecute污点生效,那么已经存在的Pod会被驱逐(如果它们没有容忍这个污点),并且新的Pod不会被调度到这个节点上。

1.2 设置污点

使用kubectl taint命令可以为节点添加污点。语法如下:

kubectl taint nodes <node-name> key=value:effect

例如,为名为node1的节点添加一个污点,键为special-user,值为yes,效果为NoSchedule

kubectl taint nodes node1 special-user=yes:NoSchedule

1.3 实战案例

假设有一个名为node-special的节点,我们想将其保留给特定用户或特定类型的Pod使用。首先,我们为这个节点添加一个污点:

kubectl taint nodes node-special dedicated=userA:NoSchedule

现在,除非Pod明确声明它可以容忍dedicated=userA:NoSchedule这个污点,否则调度器不会将新的Pod调度到node-special节点上。

二、容忍度(Tolerations)

容忍度是Pod的一个属性,用于指定Pod可以容忍哪些节点上的污点。只有当节点上存在被Pod容忍的污点时,该节点才会被考虑作为Pod的运行节点。

2.1 容忍度的定义

容忍度也是一个键值对,并附加一个效果(Effect),用于与节点的污点进行匹配。容忍度还支持操作符(Operator),用于指定匹配的方式。常见的操作符有EqualExists

  • Equal:容忍度与污点必须在key、value和effect三者完全匹配。
  • Exists:容忍度与污点必须在key和effect二者完全匹配,容忍度中的value字段要使用空值。

2.2 设置容忍度

在Pod的YAML配置文件中,可以在spec.tolerations字段下设置容忍度。例如:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  tolerations:
  - key: "dedicated"
    operator: "Equal"
    value: "userA"
    effect: "NoSchedule"
  containers:
  - name: my-container
    image: my-app:v1

2.3 实战案例

现在,我们有一个Pod配置,它声明了可以容忍dedicated=userA:NoSchedule这个污点。这个Pod的YAML配置文件如下:

apiVersion: v1
kind: Pod
metadata:
  name: special-pod
spec:
  tolerations:
  - key: "dedicated"
    operator: "Equal"
    value: "userA"
    effect: "NoSchedule"
  containers:
  - name: special-container
    image: special-app:v1

当我们尝试部署这个Pod时,由于node-special节点上有dedicated=userA:NoSchedule这个污点,并且special-podPod配置了相应的容忍度,因此special-podPod会被调度到node-special节点上。

三、亲和性(Affinity)

亲和性(Affinity)是另一种用于控制Pod调度的机制,它允许Pod根据节点的标签(Labels)或Pod的标签来选择调度目标。亲和性分为节点亲和性(Node Affinity)和Pod亲和性(Pod Affinity/Pod Anti-Affinity)。

3.1 节点亲和性(Node Affinity)

节点亲和性允许Pod根据节点的标签来选择调度目标。它可以是硬亲和性(requiredDuringSchedulingIgnoredDuringExecution)或软亲和性(preferredDuringSchedulingIgnoredDuringExecution)。

  • 硬亲和性:调度器必须满足Pod的硬亲和性要求,否则Pod不会被调度。
  • 软亲和性:调度器会尽量满足Pod的软亲和性要求,但如果无法满足,Pod仍然可以被调度。
示例YAML配置
apiVersion: v1
kind: Pod
metadata:
  name: my-pod-with-node-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: disktype
            operator: In
            values:
            - ssd
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: region
            operator: In
            values:
            - us-west-1
  containers:
  - name: my-container
    image: my-app:v1

在这个例子中,Pod要求必须调度到具有disktype=ssd标签的节点上(硬亲和性),并且如果可能的话,也偏好调度到region=us-west-1的节点上(软亲和性)。

3.2 Pod亲和性(Pod Affinity)和Pod反亲和性(Pod Anti-Affinity)

Pod亲和性允许Pod根据其他Pod的标签来选择调度目标,而Pod反亲和性则允许Pod避免与具有特定标签的Pod调度到同一个节点上。

Pod亲和性示例
apiVersion: v1
kind: Pod
metadata:
  name: my-pod-with-pod-affinity
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: security
            operator: In
            values:
            - S1
        topologyKey: kubernetes.io/hostname
  containers:
  - name: my-container
    image: my-app:v1

这个例子中,Pod要求必须调度到与具有security=S1标签的Pod相同的节点上(基于kubernetes.io/hostname标签)。

Pod反亲和性示例
apiVersion: v1
kind: Pod
metadata:
  name: my-pod-with-pod-anti-affinity
spec:
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: security
            operator: In
            values:
            - S1
        topologyKey: kubernetes.io/hostname
  containers:
  - name: my-container
    image: my-app:v1

这个例子中,Pod要求不能调度到与具有security=S1标签的Pod相同的节点上,这有助于确保应用的高可用性。

四、综合实战案例

假设我们有一个Web应用,它由前端Pod和后端Pod组成。我们希望前端Pod和后端Pod能够尽可能地分散部署到不同的节点上,以提高应用的可用性。同时,我们还有一个特殊的数据库Pod,它应该只运行在具有storage=ssd标签的节点上。

第一步:标记节点

首先,我们需要为存储SSD的节点添加storage=ssd标签:

kubectl label nodes node-with-ssd storage=ssd

第二步:配置数据库Pod

apiVersion: v1
kind: Pod
metadata:
  name: database-pod
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: storage
            operator: In
            values:
            - ssd
  containers:
  - name: database-container
    image: database-image:v1

第三步:配置前端Pod和后端Pod的反亲和性

# 前端Pod
apiVersion: v1
kind: Pod
metadata:
  name: frontend-pod
spec:
  affinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values:
              - backend
          topologyKey: kubernetes.io/hostname
  containers:
  - name: frontend-container
    image: frontend-image:v1

# 后端Pod
apiVersion: v1
kind: Pod
metadata:
  name: backend-pod
spec:
  affinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values:
              - frontend
          topologyKey: kubernetes.io/hostname
  containers:
  - name: backend-container
    image: backend-image:v1
    labels:
      app: backend

在这个例子中,前端Pod和后端Pod都配置了Pod反亲和性(Pod Anti-Affinity),使用preferredDuringSchedulingIgnoredDuringExecution来指定调度时的偏好,但不是强制性的。weight字段用于指定偏好的强度,这里都设置为100,表示尽可能分散部署。podAffinityTerm中的labelSelector用于选择具有特定标签的Pod(在这里是对方Pod的标签),而topologyKey则设置为kubernetes.io/hostname,表示调度器会尝试将Pod调度到与指定标签的Pod不在同一主机上的节点。

注意,虽然这里使用了preferredDuringSchedulingIgnoredDuringExecution,即调度时的偏好,但它并不是强制性的。如果集群中没有足够的节点来满足这个偏好,Pod仍然会被调度到其他节点上。

另外,注意到后端Pod的YAML配置中添加了labels字段,这是为了前端Pod能够通过标签选择器找到后端Pod。然而,在这个特定的反亲和性配置中,实际上并不需要后端Pod显式地给自己打上标签,因为前端Pod的反亲和性规则是基于后端Pod可能存在的标签来编写的。但在实践中,给Pod打上适当的标签通常是一个好习惯,因为它们可以用于多种用途,如服务发现、日志收集等。

最后,请注意,在实际部署时,您可能还需要考虑其他因素,如节点的资源限制、网络策略、存储配置等,这些都会影响到Pod的调度和部署。

当然,除了上述的Pod亲和性和反亲和性配置外,还有几个关键方面和最佳实践需要考虑,以确保Kubernetes集群中的Pod能够高效且可靠地运行。

1. 资源限制(Resource Limits)

为Pod设置资源请求(requests)和限制(limits)是非常重要的,这有助于确保Pod在运行时能够获得足够的资源,同时也防止单个Pod占用过多资源而影响其他Pod的性能。

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
  - name: example-container
    image: example-image:v1
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

2. 存储配置(Storage Configuration)

对于需要持久存储的Pod,可以使用PersistentVolumes(PV)和PersistentVolumeClaims(PVC)来管理存储资源。

# PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: example-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

# Pod中引用PVC
apiVersion: v1
kind: Pod
metadata:
  name: example-pod-with-storage
spec:
  containers:
  - name: example-container
    image: example-image:v1
    volumeMounts:
    - name: example-volume
      mountPath: /data
  volumes:
  - name: example-volume
    persistentVolumeClaim:
      claimName: example-pvc

3. 网络策略(Network Policies)

网络策略允许您定义Pod之间的通信规则,从而增强集群的安全性。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: example-network-policy
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 3306

4. 容忍度(Tolerations)

容忍度允许Pod在具有特定污点(taints)的节点上运行。这可以用于确保只有特定的Pod可以运行在某些节点上,例如专用节点或具有特殊硬件的节点。

apiVersion: v1
kind: Pod
metadata:
  name: example-pod-with-toleration
spec:
  tolerations:
  - key: "example-key"
    operator: "Equal"
    value: "special-value"
    effect: "NoSchedule"
  containers:
  - name: example-container
    image: example-image:v1

5. 使用Deployment, StatefulSet或DaemonSet等控制器

直接使用Pod进行部署通常不是最佳实践,因为Pod是单次运行的实例,不具备自动恢复、扩展或更新的能力。相反,您应该使用更高级的控制器,如Deployment、StatefulSet或DaemonSet,这些控制器提供了额外的功能和灵活性。

6. 监控和日志

确保您的Kubernetes集群和Pod都有适当的监控和日志记录解决方案。这有助于您及时发现并解决问题,优化集群性能,并确保应用的稳定运行。

7. 备份和恢复策略

对于关键数据和状态,确保有适当的备份和恢复策略。这可以包括定期备份PersistentVolume的内容,或者配置集群和应用的快照。

8. 更新和回滚策略

当更新应用时,考虑使用Deployment的滚动更新功能,并准备好在出现问题时回滚到旧版本的策略。

9. 安全性

确保您的Kubernetes集群和应用都遵循最佳安全实践,包括使用HTTPS、更新到最新版本、配置RBAC(基于角色的访问控制)等。

通过结合这些最佳实践和配置,您可以构建一个高效、可靠且安全的Kubernetes集群,以支持您的应用和服务。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在峡江的转弯处:陈行甲人生笔记 读书笔记

书籍信息 在峡江的转弯处&#xff1a;陈行甲人生笔记 书名&#xff1a; 在峡江的转弯处&#xff1a;陈行甲人生笔记作者&#xff1a; 陈行甲简介&#xff1a; 《在峡江的转弯处&#xff1a;陈行甲人生笔记》是陈行甲的自传体随笔&#xff0c;从童年岁月写起&#xff0c;写母亲…

html+css+js hover流光效果按钮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽效果&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 文…

记录某次“有趣的“挖矿木马排查

挖矿木马是什么&#xff1f; 挖矿木马是一种恶意软件&#xff0c;它在用户不知情或未经同意的情况下&#xff0c;利用受害者的计算机资源进行加密货币挖矿。这类软件通过执行大量运算来挖掘数字货币&#xff0c;如比特币或门罗币等。挖矿木马通常通过漏洞利用、弱口令爆破或非…

探索电商 API 接口的创新应用与接入技巧

在当今数字化的商业环境中&#xff0c;电商 API 接口已成为推动业务增长和创新的关键因素。它们不仅为企业提供了与电商平台高效交互的途径&#xff0c;还开启了无数创新应用的可能性。本文将深入探讨电商 API 接口的创新应用&#xff0c;并分享一些实用的接入技巧&#xff0c;…

python---为某个项目使用虚拟环境

目录 为什么要为项目建立虚拟环境建立步骤打开终端&#xff08;Terminal&#xff09;进入项目文件夹所在目录该目录下创建虚拟环境激活新建的虚拟环境安装本项目所需要的库 过程完整截图未来再次使用本虚拟环境先导航到项目目录然后激活虚拟环境 为什么要为项目建立虚拟环境 为…

Excel 通过函数实现数据透视表

函数技巧演示系列。深入介绍 Excel 函数的使用技巧。 本篇通过函数的方式&#xff0c;实现数据透视表&#xff0c;部分函数需要 Office 2021版本或者 Office 365 版。 示例数据 要求&#xff1a;基于产品名称&#xff08;E列&#xff09;和销售渠道&#xff08;G列&#xff09…

代码随想录——买卖股票最佳时机Ⅲ(Leetcode 123)

题目链接 动态规划 动态规划思路&#xff1a; 确定dp数组以及下标的含义 一天一共就有五个状态&#xff0c; 没有操作 &#xff08;其实我们也可以不设置这个状态&#xff09;第一次持有股票第一次不持有股票第二次持有股票第二次不持有股票 dp[i][j]中 i表示第i天&#xf…

医院综合绩效核算系统,绩效核算系统源码,采用springboot+avue+MySQL技术开发,可适应医院多种绩效核算方式。

一、系统概述 作为医院用综合绩效核算系统&#xff0c;系统需要和his系统进行对接&#xff0c;按照设定周期&#xff0c;从his系统获取医院科室和医生、护士、其他人员工作量&#xff0c;对没有录入信息化系统的工作量&#xff0c;绩效考核系统设有手工录入功能&#xff08;可…

论文速递|Management Science 6月文章合集

编者按&#xff1a; 在本系列文章中&#xff0c;我们梳理了运筹学顶刊MSOM在2024年6月份发布的7篇文章的基本信息&#xff0c;旨在帮助读者快速洞察行业最新动态。 文章1 题目 Promotional Inventory Displays: An Empirical Analysis Using IoT Data促销库存展示&#xff1…

dubbo调用知多少?

一 dubbo超时时间的设置 定义&#xff1a;这里说的超时&#xff0c;是针对dubbo provider调用方来说的&#xff0c;比如提供方执行需要3秒&#xff0c;设置了超时时间1秒&#xff08;默认&#xff09;&#xff0c;则consumer调用方会报超时错误&#xff0c;但实际上服务提供方…

抖音短视频矩阵管理:就靠它,让运营更高效

在数字化时代&#xff0c;短视频已成为连接创作者与观众的重要桥梁。抖音作为全球领先的短视频平台&#xff0c;汇聚了海量的创作者和用户。然而&#xff0c;随着个人或品牌账号的增多&#xff0c;如何高效地管理这些抖音短视频矩阵&#xff0c;成为了一个亟待解决的问题。本文…

气膜游乐园:孩子们的新乐园—轻空间

随着科技的发展和人们对健康、安全娱乐环境的重视&#xff0c;气膜建筑逐渐成为游乐休闲项目中的新选择。作为这种创新建筑的一种应用形式&#xff0c;气膜游乐园正在越来越多地受到家庭和孩子们的欢迎。它不仅提供了一个安全、舒适的玩乐空间&#xff0c;还创造了丰富多样的活…

什么牌子的洗地机好用?推荐多款质量好洗地机的品牌

近些年大家对家庭生活环境的舒适和健康越来越重视&#xff0c;然而家务活的种类繁多&#xff0c;每次都要耗费大量的时间和精力&#xff0c;就拿擦地来说&#xff0c;每次都需要先扫地&#xff0c;再擦地&#xff0c;然后中间可能还要多次洗拖布等&#xff0c;十分繁琐。 因此…

数据分析:两组数据的T检验power评估

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 介绍 功效分析&#xff08;power analysis&#xff09;是在实验设计阶段进行的&#xff0c;用于确定在给定的效应量、显著性水平和样本大小下&#xff0c;实验能…

mysql进阶语法

mysql高阶语句 高级语法的查询语句 先创建库和表 排序语法&#xff0c;关键字排序 升序和降序 默认的排序方式就是降序 升&#xff1a;ASC 降序&#xff1a;DESC 配合&#xff1a;order by语法 降序排列&#xff1a;要指定列 select * from 数字 多个列升序 如果以…

三星电子推出性能更强、容量更大的升级版1TB microSD 存储卡

microSD 存储卡 PRO Plus 和 EVO Plus 采用三星先进的 V-NAND 技术&#xff0c;可安全可靠地捕捉和存储日常瞬间 性能提升后&#xff0c;顺序读取速度高达 180MB/s&#xff0c;传输速度达 160MB/s&#xff0c;可轻松处理较大文件 韩国首尔--2024年7月31日--三星电子宣布推出1…

中职软件测试实训室

在当今信息化高速发展的时代&#xff0c;软件作为信息技术的核心&#xff0c;其质量直接关系到用户的使用体验和企业的市场竞争力。因此&#xff0c;软件测试作为保障软件质量的重要环节&#xff0c;越来越受到业界的重视。为了满足社会对软件测试人才的需求&#xff0c;中职教…

springboot闲置图书分享boot--论文源码调试讲解

第2章 程序开发技术 2.1 Mysql数据库 开发的程序面向用户的只是程序的功能界面&#xff0c;让用户操作程序界面的各个功能&#xff0c;那么很多人就会问&#xff0c;用户使用程序功能生成的数据信息放在哪里的&#xff1f;这个就需要涉及到数据库的知识了&#xff0c;一般来说…

object的defineProperty与Proxy对比

Object.defineProperty 循环执行Object.defineProperty方法遍历对象的每一个属性&#xff0c;给每一个属性增加get和set方法&#xff0c;使得我们在读取和设置属性值的时候都会被Vue给监听到&#xff0c;从而去做一些其他的操作。 代码示例&#xff1a; let obj {a:1,b:2,c:…

善于运用facebook自动化规则,将节省你50%的时间

许多facebook广告投手都会花大量时间在盯盘看数据上&#xff0c;从而导致没有太多时间和精力去做广告素材的优化&#xff0c;其实常规的一些数据盯盘都可以交给facebook自动化规则&#xff0c;包括增减预算&#xff0c;暂停广告等&#xff0c;合理运用自动化规则&#xff0c;可…