Deployment和污点、容忍度

2024-08-23 18:52
文章标签 deployment 容忍度 污点

本文主要是介绍Deployment和污点、容忍度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、污点、容忍度
    • 污点(Taints)
    • 污点容忍(Tolerations)
      • 应用场景
    • 实际操作
  • 二、Deployment
    • 核心组件
    • 特性和功能
    • 应用场景
    • 实际操作
      • 创建deployment
      • 判断deployment升级
        • 比较期望状态和现有状态
        • 如何确定需要升级
        • 检测和执行升级
      • 滚动更新
      • 滚动更新策略
      • 用法解释
      • 常见命令


一、污点、容忍度

Kubernetes(k8s)中的“污点”(Taints)和“污点容忍”(Tolerations)是用于节点调度控制的一种机制。它们提供了一种方法来影响 Pod 被调度到节点上的策略,通过这种方式,你可以防止特定的 Pod 被调度到不合适的节点,或仅允许特定的 Pod 被调度到指定的节点。

污点(Taints)

污点是应用在节点上的属性,它告诉调度器不可以将 Pods 安排到这个节点上,除非该 Pod 可以容忍该污点。每个污点包含三个属性:

  1. 键(Key) :一个唯一标识污点的名称。

  2. 值(Value) :键的附加信息。

  3. 效应(Effect) :当污点存在而 Pod 无法容忍时,会产生的影响。主要有以下三种类型:

    • NoSchedule: 调度器不会将 Pod 调度到有此污点的节点上。
    • PreferNoSchedule: 调度器会尽量不将 Pod 调度到有此污点的节点上,但不是绝对的。
    • NoExecute: 除了不允许新的 Pod 调度到节点上,还会驱逐当前不容忍此污点的 Pod。

污点容忍(Tolerations)

Pod 可以有相应的容忍来匹配节点的污点,这允许 Pod 在有污点的节点上运行。容忍由键、值和效果组成,并必须匹配节点上的污点才能调度 Pod 到该节点。

应用场景

  1. 隔离工作负载:通过使用污点和容忍,可以确保特定类型的工作负载不会混合在同一节点上。例如,隔离开发和生产环境下的负载。
  2. 优先处理关键任务:可以通过设置污点来保护关键节点,使得只有特定的关键任务 Pod 可以被调度到这些节点上。
  3. 管理资源和节点健康状况:用来限制访问资源紧张的节点或正在进行维护的节点。
  4. 节点动态维护:在节点需要维护时,使用 NoExecute 污点来驱逐不需要的工作负载。

实际操作

配置污点
标记污点

kubectl taint node slave node-type=production:NoShchedule注意需要选择污点类型。

删除污点

kubectl taint node slave node-type=production:NoShchedule-

查看污点

kubectl describe node slave1|grep -i Taints

在这里插入图片描述
当我在slave1上配置了污点之后,master主动将pod全部调度到slave2上。

在这里插入图片描述
配置容忍度

apiVersion: apps/v1  
kind: ReplicaSet  
metadata:  name: my-replicaset  
spec:  replicas: 10  selector:  matchLabels:  app: myapp  template:  metadata:  labels:  app: myapp  spec:  containers:  - name: mycontainer  image: harbor.hiuiu.com/nginx/nginx:1.21.5  ports:  - containerPort: 80tolerations:- key: "node-type"operator: "Equal"value: "production"effect: "NoSchedule"

由于node2节点并没有配置污点,所以master会随机调度到两个节点上。
在这里插入图片描述

二、Deployment

在 Kubernetes 中,Deployment 是一种用于部署和管理应用程序的控制器,它提供了一种声明式的方式来创建和管理 Pod 和集群的相关资源。Deployment 是应用管理中最常用的资源类型之一,因为它提供了许多强大的功能用来维护和更新应用程序的状态。

核心组件

  1. 控制器模式(Controller Pattern)

    • Kubernetes 使用控制器模式来实现资源的自动化管理。Deployment 控制器是 Kubernetes 控制平面的一部分,负责监视 Deployment 对象的状态,并确定需要进行哪些操作以达到期望状态。
  2. 副本集(ReplicaSet)

    • Deployment 的主要作用是管理 Pod 的副本集。ReplicaSet 确保指定数量的 Pod 副本在任何给定时间内都是运行的。Deployment 创建并管理这些 ReplicaSet。
    • 每次更新 Deployment 时,Deployment 控制器创建一个新的 ReplicaSet,并通过控制旧的和新的 ReplicaSet 的标签选择器来逐步增加新 Pod 的副本数量,减少旧 Pod 的副本数量。

特性和功能

  1. 声明式更新Deployment 允许用户声明所需的状态(如应用程序版本或副本数),Kubernetes 将自动调整集群以匹配这个状态。这种机制能够确保更新过程是一致的并且易于管理。
  2. 滚动更新:将应用程序从一个版本更新到另一个版本是 Deployment 最常用的功能之一。Deployment 可以以控制的速度逐步替换旧版本的 Pod,以便在发生问题时可以轻松回滚。
  3. 回滚更新:如果新版本的更新出现问题,可以轻松地滚回到之前的一个稳定版本。Kubernetes 会自动记录 Deployment 的历史版本,以便于回滚。
  4. 扩展和缩减:使用 Deployment 可以轻松调整应用的副本数,这意味着可以轻松地应对流量的变化。
  5. 自愈(自愈合) :如果一个 Pod 出现故障,Deployment 会基于定义的状态即刻进行恢复操作,确保应用程序始终处于所需的状态。
  6. 多副本控制:确保集群中始终有指定数量的 Pod 正在运行,此功能对于负载均衡和高可用性至关重要。

应用场景

  1. 持续交付和集成:在 CI/CD 流水线中,Deployment 常用于自动发布新应用版本,利用其滚动更新和回滚功能简化管理和发布过程。
  2. 负载扩展:对于流量波动较大的应用程序,可以通过调整 Deployment 的副本数量来快速扩容或缩容。
  3. 高可用性:使用 Deployment 保证跨多个节点部署 Pod,增加应用的冗余性和可用性。
  4. 测试和实验:可以快速部署新版本的应用以进行测试和实验,同时确保即便在实验中出现问题也可以快速回滚。
  5. 应用稳定性管理:以自愈能力来增强应用的鲁棒性,在节点或 Pod 故障时自动恢复到正常状态。

Deployment 在 Kubernetes 集群管理中占据核心位置,它为开发和运维人员提供了一种简化且高效的方式来管理容器化应用的生命周期。它不仅能简化应用的部署流程,还能带来稳健性和灵活性。

实际操作

创建deployment

创建deployment一般是用yaml文件创建的。
查看配置

kubectl describe deployments.apps  +名字

在这里插入图片描述

查看状态

kubectl rollout status deployment/名字

在这里插入图片描述

查看当前命名空间下的deployment对象资源

kubectl get deployments.apps
kubectl get rs
kubectl get pod

配置文件

apiVersion: apps/v1  
kind: Deployment  
metadata:  name: nginx-deployment  labels:  app: nginx-dep  
spec:  replicas: 10  selector:  matchLabels:  app: nginx  template:  metadata:  labels:  app: nginx  spec:  containers:  - name: nginx  image: harbor.hiuiu.com/nginx/nginx:1.21.5  ports:  - containerPort: 80

在这里插入图片描述
这里构建pod的流程是先构建ReplicaSet,然后由副本集构建下面的pod。观察各个资源对象的名字就可以知道。

判断deployment升级

在 Kubernetes 中,Deployment 判断是否需要升级及进行升级的过程是通过对比期望状态和当前状态来实现的。该过程涉及以下几个关键环节:

比较期望状态和现有状态
  1. 期望状态:由用户通过 YAML/JSON 文件定义,描述应用的期望状态(包括镜像版本、配置、环境变量等)。
  2. 当前状态:由 Kubernetes 控制平面实时维护,表示集群中相关资源的实际状态。

当这两者之间存在差异时(例如改变镜像版本、修改副本数量或调整环境变量等),Kubernetes 就会认为需要进行一次更新或升级操作。

如何确定需要升级
  • 版本变更:如果 Deployment 配置的容器镜像版本有所变化(即 .spec.template.spec.containers[].image 发生变化)。
  • 配置变更:任何 Pod 模板中的配置变更(如环境变量、端口定义、资源限制等)都会触发新的 ReplicaSet 的创建。
  • 副本数变更:改变 .spec.replicas(Pod副本数)会直接导致 Deployment 动态调整正在运行的 Pod 数量。
检测和执行升级
  1. 检测变更Deployment 控制器会监控与 Deployment 关联的所有资源。当检测到变更时,控制器会开始执行升级过程。

  2. 滚动更新

    • Deployment 创建一个新的 ReplicaSet 来部署新的 Pod 模板版本。
    • 逐渐增加新的 ReplicaSet 中 Pod 的数量,同时减少旧 ReplicaSet 中 Pod 的数量,从而实现平滑过渡。
  3. 回滚支持:在升级过程中,如果检测到任何问题(例如健康检查失败、Pod 启动失败等),可以自动或手动回滚到前一个稳定的版本。
    使用该命令kubectl rollout status deployment/nginx-deployment查看升级状态

滚动更新

方法:

  1. vim 修改 YAML 文件

    • 使用命令行文本编辑器 vim 编辑一个 YAML 文件,通常是用来手动更新 Kubernetes 资源的配置。编辑器打开后,你可以手动更改 Deployment 的配置,例如更新镜像版本。
  2. kubectl set image deployment.v1.apps/nginx-deployment nginx1=镜像名

    • 这个命令使用 kubectl 直接在命令行中更新 Deployment 中指定容器的镜像版本。
    • deployment.v1.apps/nginx-deployment 指定了要更新的 Deployment 资源的类型和名称。
  3. kubectl edit deployment/nginx-deployment

    • 这个命令使用默认的命令行文本编辑器(通常是 vim)来直接编辑 Kubernetes 中现有的 Deployment 资源。
    • 它会拉取当前集群中 nginx-deployment 的 YAML 配置文件,你可以手动修改例如镜像版本、资源限制等部署配置。
    • 保存并退出编辑器后,Kubernetes 会应用这些更改。
      在这里插入图片描述

使用场景

  • kubectl set image
    用于快速更新 Deployment 中的镜像版本。这种方式快捷且减少可能的手动错误,但只是更新镜像,不能进行其他更复杂的配置更改。
  • kubectl edit
    用于需要对 Deployment 进行更细粒度的修改时,不仅可以更新镜像,还有更多关于应用配置的控制,类似于直接修改配置文件。

实验效果
滚动更新前:
在这里插入图片描述

滚动更新:
在这里插入图片描述
滚动更新后:
在这里插入图片描述

滚动更新策略

在 Kubernetes 中,自定义更新策略可以决定在应用更新过程中 Pod 的替换方式。这些策略是通过 Deployment 中的 strategy 字段配置的,主要有两种类型:Recreate 和 RollingUpdate。

  1. Recreate 策略
    在使用 Recreate 策略时,Kubernetes 会先终止旧版本的所有 Pod 然后再创建新版本的 Pod。这种策略适用于不需要保持服务可用性或在旧版本终止后新版本启动间允许短暂停机的情况。

    spec:  strategy:  type: Recreate  
    
  2. RollingUpdate 策略
    RollingUpdate 策略通过逐步替换旧版本的 Pod 为新版本来更新服务,确保在整个更新过程中,服务始终保持可用状态。这是默认的更新策略,通常适用于需要保持高可用性的应用。

    • maxSurge: 控制在更新过程中可超出的最大副本数量。可以是绝对数量,或是占期望副本数的百分比。
    • maxUnavailable: 控制在更新过程中允许的最大不可用副本数量。同样可以是绝对数量或百分比。

    例如,配置为:

    spec:  strategy:  type: RollingUpdate  rollingUpdate:  maxSurge: 50%         # 超过的最大副本数允许是总副本数的 50%  maxUnavailable: 50%   # 更新过程中允许有 50% 的副本不可用  
    

用法解释

  • Recreate:

    • 适合于没有客户端访问的应用,或者可以承受短暂中断的情况。
    • 更新过程中会出现停机,因为旧的全部停止后再启动新的。
  • RollingUpdate:

    • 适合于需要提供持续服务的应用。
    • 最大努力保持服务的可用性,通过逐步替换 Pod 的方式进行。
    • maxSurgemaxUnavailable 可以灵活配置,以优化更新速度与服务可用性之间的平衡。

常见命令

  1. 查看升级历史

    kubectl rollout history deployment/nginx-deployment  
    
    • 用于查看指定 Deployment 的版本历史记录,包括每个版本的修订号和一些摘要信息。
  2. 回滚到指定版本

    kubectl rollout undo deployment/nginx-deployment --to-revision=1  
    
    • 用于将 Deployment 回滚到指定的历史版本。--to-revision=1 指定回滚到版本 1。
  3. 动态缩放

    kubectl scale deployment/nginx-deployment --replicas=10  
    
    • 用于动态调整 Deployment 的 Pod 副本数,将其修改为 10 个。
    • 也可以通过修改配置文件来更改。
  4. 锁定当前版本

    kubectl rollout pause deployment/nginx-deployment  
    
    • 用于暂停 Deployment 的滚动更新。暂停后可以安全地进行检查或其他批量操作,而不会触发新的滚动更新。
  5. 解除锁定

    kubectl rollout resume deployment/nginx-deployment  
    
    • 用于恢复 Deployment 的更新过程。如果之前暂停了 Deployment 的更新,恢复后更新会继续进行。

这篇关于Deployment和污点、容忍度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1100218

相关文章

k8s调度(pod亲和、反亲和、污点、容忍度)

pod亲和性 针对对象为Pod,目的是实现,新建Pod和目标Pod调度到一起,在同一个Node上。 示例: apiVersion: v1kind: Podmetadata:name: testpod01labels:app: myapp01env: test1spec:containers:- name: testpod01image: nginx:1.23.2---apiVersio

K8s高可用集群部署----超详细(Detailed Deployment of k8s High Availability Cluster)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页,持续学习,不断总结,共同进步,活到老学到老 导航剑指大厂系列:全面总结 运维核心技术:系统基础、数据库、网路技术、系统安全、自动化运维、容器技术、监控工具、脚本编程、云服务等。 常用运维工具系列:

k8s调度、污点、容忍、不可调度、排水、数据卷挂载

一、Kubernetes的list-watch机制 1、List-watch K8S集群中,通过List-watch机制进行每个组件的协作,保持数据同步。这种设计可以实现每个组件之间的解耦 kubectl配置文件,统一向集群内部apiserver发送命令——通过apiserver把命令发送到各个组件 创建成功之后,kubectl get pod,kubectl describe pod n

污点、容忍、不可调度、排水、数据卷

目录 污点taint 污点的格式 1. key:effect    键名:污点类型 2. key=value:effect   键名=数值:污点类型 污点的类型 1.  NoSchedule 2.  PreferNoSchedule 3. NoExecute(驱逐) 设置污点(主节点操作) 查看污点 删除污点 修改污点 容忍tolerations Equal类型 No

kubernetes Deployment介绍

一、deployment Deployment在继承Pod和Replicaset的所有特性的同时, 它可以实现对template模板进行实时滚动更新并具备我们线上的Application life circle的特性. 二、操作命令 1. 创建deployment vi deployment.yaml apiVersion: apps/v1kind: Deploymentm

【kubernetes】Deployment介绍和应用

一,Deployment介绍 概述 Deployment是k8s中最常用的资源对象,它为ReplicaSet和Pod的创建提供了一种声明式的定义方法。 在Deployment对象中描述一个期望的状态,Deployment控制器就会按照一定的控制速率把实际状态改成期望状态。 通过定义一个Deployment控制器,会创建一个新的ReplicaSet控制器,通过ReplicaSet创建pod,

pycharm ssh连接远程服务器报错:can’t get remote credentials for deployment server

将下图中visible only for this preject  前 选中状态 的勾去掉即可。

Kubernetes中的守护者与管家:ReplicaSet与Deployment的协同工作

引言 在Kubernetes集群中,ReplicaSet和Deployment是两种至关重要的资源对象,它们共同维护着应用程序的稳定性和可用性。虽然它们各自承担着不同的职责,但它们之间的关系密切,相互协作以确保应用程序的平滑运行和弹性伸缩。本文将详细探讨ReplicaSet和Deployment之间的关系,以及它们如何在Kubernetes生态系统中协同工作。 Kubernetes中的Repl

深入解析:Kubernetes StatefulSet与Deployment的比较与应用场景

引言 在Kubernetes生态系统中,StatefulSet和Deployment是两种常用的工作负载抽象,它们都用于管理一组容器化应用程序的生命周期。然而,它们在设计哲学和使用场景上存在明显差异。本文将深入探讨StatefulSet和Deployment的区别,并通过实际代码示例,展示它们在不同场景下的应用。 StatefulSet与Deployment概述 StatefulSet 是K