在 Kubernetes 中使用 Taints 和 Tolerations 进行调度

在 Kubernetes 中,Taints 和 Tolerations 是两个非常重要的概念,它们可以帮助我们在调度 Pod 时,控制哪些节点可以被分配,哪些不能被分配。本文将会对 Taints 和 Tolerations 进行详细介绍,并给出使用场景和示例代码。

Taints 和 Tolerations 是什么?

在 Kubernetes 中,Taints 是一种标记,可以被添加到节点上。每个 Taint 由三部分组成:一个 key、一个 value 和一个 Effect。key 和 value 通常被用于对节点进行分类,而 Effect 则指定了这个 Taint 对节点分配的影响。

在一个节点上,Taint 可以被添加多个,并且不同的 Taint 可以设置不同的 Effect。常见的 Taint Effect 有以下三种:

  • NoSchedule:如果一个节点被添加了 NoSchedule 的 Taint,那么任何没有设置对应 Tolerations 的 Pod 都不能被分配到该节点上。
  • PreferNoSchedule:如果一个节点被添加了 PreferNoSchedule 的 Taint,那么任何没有设置对应 Tolerations 的 Pod 都不会优先被分配到该节点上,但并非不能被分配。
  • NoExecute:如果一个节点被添加了 NoExecute 的 Taint,那么任何没有设置对应 Tolerations 的 Pod 都不能在该节点上运行,同时如果一个已经在该节点上运行的 Pod 没有在对应的时限内设置 Tolerations,那么该 Pod 会被删除。

与 Taint 对应的是 Tolerations,Tolerations 可以被设置在 Pod 上,用于标记哪些节点可以被分配。每个 Tolerations 由两部分组成:一个 key 和一个 operator。如果一个 Tolerations 的 key 与一个节点上的 Taint 的 key 相等并且 operator 相当,那么这个 Pod 就可以被分配到这个节点上。

在 Pod 中设置 Tolerations 时,还可以设置效果的时限,可以指定一个过渡时间,在这个时间内,即使一个节点被添加了 NoExecute 的 Taint,如果一个已经在该节点上运行的 Pod 设置了对应的 Tolerations,那么这个 Pod 也不会被删除。

Taints 和 Tolerations 的使用场景

Taints 和 Tolerations 通常被用于以下三种情况:

  1. 在一个集群中,有一些节点的硬件配置比其他节点要好,我们希望将一些高负载的 Pod 分配到这些节点上。可以通过在这些节点上添加 Taint,并在一些需要用到这些节点的 Pod 上设置对应的 Tolerations。

  2. 在一个集群中,有一些节点是专门用于运行一些调试或测试的任务,这些任务通常比较占用资源,为了避免影响正式任务的运行,可以给这些节点添加一些 Taint 并设置对应的 Tolerations,在调试或测试任务中设置这些 Tolerations。

  3. 在集群中有一些节点用于管理任务,如 etcd、kube-apiserver,通常不希望其他任务被分配到这些节点上,可以设置 NoSchedule 的 Taint 来避免这个问题。

Taints 和 Tolerations 的实践

下面我们将通过一个例子来讲解如何在 Kubernetes 中使用 Taints 和 Tolerations 进行调度。

首先我们需要创建一个集群,这里使用 Minikube 来创建一个本地测试集群:

-------- ----- ------ - -------- --

然后我们可以通过 kubectl 命令来添加一个 Taint,给当前运行的节点添加一个 key 为 "special",value 为 "true",Effect 为 "NoSchedule" 的 Taint:

------- ----- ----- --------- --- ----- ---------------------------------------- -----------------------

这里我们选择给当前唯一的节点添加 Taint,这个 Taint 的作用是禁止运行没有设置对应 Tolerations 的 Pod。

接下来我们创建一个包含 Tolerations 的 Pod,并进行测试:

----------- --
----- ---
---------
  ----- ---------------
-----
  -----------
  - ----- -----
    ------ ------------
  ------------
  - ---- ---------
    --------- -------
    ------ ------
    ------- ------------

在上面的 YAML 文件中,我们定义了一个 Pod,给这个 Pod 增加一个 Tolerations,这个 Tolerations 的 key 等于上面添加 Taint 时的 key,而且它的 operator 和 value 分别等于上面添加 Taint 时的 operator 和 value,即它可以被分配到被添加了 Taint 的节点上。

通过 kubectl apply 命令来创建该 Pod:

------- ----- -- --------------------

然后我们可以通过 kubectl get pod 查看该 Pod 的状态,可以看到该 Pod 已经被分配到了被添加了 Taint 的节点上:

----               -----   ------    --------   ---
---------------    ---     -------   -          --

如果我们尝试创建一个没有设置 Tolerations 的 Pod,可以看到该 Pod 会被调度到一个没有被 Taint 的节点上:

----------- --
----- ---
---------
  ----- ------------------
-----
  -----------
  - ----- -----
    ------ ------------

使用 kubectl apply 创建该 Pod,然后通过 kubectl get pod 查看状态:

----                   -----   ------     --------   ---
------------------     ---     -------    -          ---
---------------        ---     -------    -          ---

可以看到该 Pod 已经被成功调度到了没有被 Taint 的节点上。

总结

本文对 Kubernetes 中的 Taints 和 Tolerations 进行了详细的介绍,并给出了具体的使用场景和示例代码。在实际的项目中,Taints 和 Tolerations 可以帮助我们实现更精细的调度策略,避免资源的浪费和任务的阻塞。如果你对 Kubernetes 的调度机制感兴趣,Taints 和 Tolerations 的深入学习是非常值得推荐的。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/66470cbfd3423812e454b74d


猜你喜欢

  • Deno 中如何处理 HTTP 响应头部

    简介 Deno 是一个安全的 TypeScript 运行环境,类似于 Node.js,它也有很多内置模块来处理文件 I/O 和网络通信等任务。其中包括可以使用 HTTP 协议进行通信的模块。

    5 个月前
  • Serverless Framework:如何使用本地存储?

    在 Serverless 应用程序中使用本地存储是一项必要的技能,因为它可以为您的应用程序提供快速的读取和写入操作。Serverless Framework 提供了一种简单而有效的方法,使您可以轻松地...

    5 个月前
  • 在 Kubernetes 中使用 Job 和 CronJob 进行后台任务处理

    前言 Kubernetes 是一个非常流行的容器编排工具,它可以自动化部署、扩展和管理容器化的应用程序和服务。Job 和 CronJob 是 Kubernetes 中常用的两种控制器,用于处理后台任务...

    5 个月前
  • 解析 Webpack 中的 alias 配置项

    在使用 Webpack 进行前端工程化开发时,我们常常使用 alias 配置项来简化模块的导入路径,以提高模块的可读性和可维护性。本文将对 Webpack 中的 alias 配置项进行详细的解析,并通...

    5 个月前
  • 解决 Jest 测试中遇到的 "SyntaxError: Unexpected token import" 问题

    在前端开发中,我们经常需要写一些测试用例来保证代码的质量和稳定性。而 Jest 是一个流行的 JavaScript 测试框架,它具有简单易用、快速、可靠的特点。但在使用 Jest 进行测试时,有时会遇...

    5 个月前
  • ES11 优化:JavaScript 如何调用 Webassembly

    前言 在现代 Web 应用程序中,JavaScript 毫无疑问是一种最流行,最广泛使用的编程语言。然而,由于历史原因,JavaScript 并不是一种特别高效的语言——特别是在密集计算、高性能的场景...

    5 个月前
  • 利用 Lighthouse 检测 PWA 性能问题及修改方案

    随着移动应用的普及,越来越多的企业开始关注 PWA(Progressive Web Apps),它能够让移动应用具备原生应用的体验。但是,对于一些初学者或者没有太多 PWA 经验的开发者来说,如何检测...

    5 个月前
  • Tailwind 中的响应式间距处理技巧

    在前端开发中,响应式设计已经成为了必备的技能之一。而在实现响应式设计时,间距处理也是一个非常重要的部分。Tailwind 是一个非常流行的 CSS 框架,它提供了一些非常实用的响应式间距处理技巧,本文...

    5 个月前
  • ECMAScript 2021 中的全局对象 globalThis

    随着 JavaScript 的不断发展和演进,ECMAScript 2021 标准引入了全局对象 globalThis,它为开发者提供了一种跨环境获取全局对象的方式,从而更简单地编写跨平台的代码。

    5 个月前
  • 如何使用 LESS 编写 CSS3 边框效果?

    在前端开发中,CSS3 边框效果是常用的样式之一,它可以让页面元素更加美观,同时也可以提高用户的交互体验。但是,为了实现不同的边框效果,我们需要编写大量的 CSS 代码,这会让代码变得混乱且难以维护。

    5 个月前
  • 如何在 Mocha 测试中使用 Superagent 进行 API 测试

    在前端开发中,API 测试是非常重要的一项工作。使用 Mocha 和 Superagent 可以轻松地进行 API 测试,并且可以在测试中模拟各种场景,确保 API 的正确性和稳定性。

    5 个月前
  • Socket.io 如何处理连接超时的情况

    在前端开发中,我们经常会使用 Socket.io 作为实时通信的工具。但是在使用过程中,我们有时会遇到连接超时的情况,这时候我们该如何处理呢?本文将详细介绍 Socket.io 处理连接超时的方法。

    5 个月前
  • SPA 应用中如何实现长列表懒加载

    在 SPA(Single Page Application)开发中,长列表的懒加载是一个常见的需求。懒加载可以提高页面加载速度和性能,减少不必要的网络请求,同时也可以提高用户体验。

    5 个月前
  • 使用 Webpack 优化图片加载

    在现代 Web 开发中,图片是不可或缺的一部分。但是,加载大量的图片可能会导致网站变慢,影响用户体验。因此,我们需要使用一些技术来优化图片加载。其中,使用 Webpack 是一种非常有效的方式。

    5 个月前
  • PWA 中图片优化的具体实现方法

    什么是 PWA PWA,即 Progressive Web Apps,是一种新型的 Web 应用程序。它结合了 Web 和 Native 技术的优点,能够提供类似原生应用程序的用户体验。

    5 个月前
  • Fastify 如何处理 URL 参数

    Fastify 是一个快速、低开销且高效的 Web 框架,它是 Node.js 生态系统中最快的框架之一。Fastify 可以轻松处理 HTTP 请求和响应,同时提供了许多高级功能,如路由、中间件、插...

    5 个月前
  • 如何使用 Headless CMS 规划企业级网站内容

    随着互联网技术的不断发展,企业级网站的建设也变得越来越复杂。为了满足不同平台和设备的需求,企业需要将网站内容进行多样化的管理和发布。而 Headless CMS 技术的出现,为企业级网站的内容管理和发...

    5 个月前
  • ES10 中后台 Javascript 解决方案

    ES10 是 Javascript 的最新版本,它带来了一些新的特性和语法。这些特性和语法可以帮助开发者更方便地编写高效的代码,特别是在中后台应用中。 在这篇文章中,我们将介绍一些 ES10 的特性和...

    5 个月前
  • Web Components 的使用及优化技巧分享

    Web Components 是一种新的 Web 技术,它可以让开发者创建自定义的 HTML 标签和组件,使得 Web 应用的开发更加模块化和可重用。本文将介绍 Web Components 的基本概...

    5 个月前
  • Docker 容器快速搭建 Redis 集群及实际应用

    前言 Redis 是一种非常流行的内存数据存储系统,它被广泛应用于缓存、消息队列、计数器、排行榜等场景中。在实际应用中,我们通常需要使用 Redis 集群来提高性能和可用性。

    5 个月前

相关推荐

    暂无文章