0Pricing
Kubernetes Basics · 课时

节点选择器与亲和性

使用节点选择器,以及表达能力更强的节点和 Pod 亲和性规则,控制 Pod 的调度位置。

节点选择器与亲和性 是 CoddyKit 上的免费 Kubernetes Basics 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kubernetes Basics 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kubernetes Basics 课程共包含 4 节课。

控制容器组的部署位置

默认情况下,Kubernetes 会将容器组调度到任意可用节点上。但如果您需要更精细的控制呢?

有时,您需要让容器组运行在指定节点上。这些节点可能配备特殊硬件、拥有特定许可证,或位于特定可用区。

本课将介绍如何使用节点选择器和节点亲和性来指导 Kubernetes 的调度器。

为什么要引导调度器?

假设您有一个数据库容器组,需要运行在配备高性能 SSD 的节点上;或者您有一个大量使用 GPU 的应用,需要特定硬件。

您可能还希望让某些容器组彼此分开,以提高容错能力,或确保它们运行在使用特定操作系统的节点上。

Kubernetes 提供了用于表达这些调度偏好的工具。

节点具有标签

在告诉容器组应该去哪里之前,节点需要先拥有身份标识!Kubernetes 使用标签,根据节点的特征识别节点。

  • 标签是键值对,例如 disk=ssd 或 gpu=true。
  • 您可以使用 kubectl label nodes <node-name> <key>=<value> 为节点添加自定义标签。
  • 我们正是通过这些标签来指定容器组应部署到哪些节点。

节点选择器:简单匹配

将容器组限制在一组特定节点上的最简单方法,是使用 nodeSelector。

它是容器组规范中的一个字段,接收由键值对组成的映射。容器组只会被调度到具有这些全部标签的节点上。

这就像是在说:“我需要一个完全符合这些条件的节点。”

节点选择器实战

假设我们有一些带有 disk=ssd 标签的节点。以下是让容器组仅运行在这些节点上的写法:

apiVersion: v1
kind: Pod
metadata:
  name: ssd-app
spec:
  containers:
  - name: my-container
    image: nginx
  nodeSelector:
    disk: ssd

节点亲和性:高级匹配

nodeSelector 简单直接,但限制也很严格。如果您想指定“首选”节点,或使用更复杂的匹配规则,该怎么办?

节点亲和性提供了更大的灵活性。它允许您表达容器组运行到带有特定标签的节点上的“软性”或“硬性”要求。

它使用功能更强的语法,并支持 In、NotIn、Exists、DoesNotExist、Gt、Lt 等运算符。

必需与首选亲和性

节点亲和性主要有两种类型:

  • requiredDuringSchedulingIgnoredDuringExecution:容器组必须被调度到符合规则的节点上。如果不存在这样的节点,容器组就不会被调度。
  • preferredDuringSchedulingIgnoredDuringExecution:调度器会尝试寻找符合规则的节点;但如果没有可用节点,仍会将容器组调度到其他位置。这是一种“尽力而为”的方式。

必需的节点亲和性

以下容器组要求节点带有 env=production 标签。如果不存在这样的节点,容器组就会保持等待状态。

apiVersion: v1
kind: Pod
metadata:
  name: prod-app
spec:
  containers:
  - name: my-container
    image: httpd
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: env
            operator: In
            values:
            - production

容器组亲和性:其他容器组也很重要

如果您想根据其他容器组的运行位置来调度容器组,该怎么办?

  • 容器组亲和性:将容器组吸引到其他带有特定标签的容器组已经运行的节点上。适用于将频繁通信的服务部署在一起。
  • 容器组反亲和性:让容器组避开其他带有特定标签的容器组正在运行的节点。适合将副本分散到不同节点,以实现高可用性。

容器组反亲和性实战

这个清单确保带有 app=my-web 标签的任意两个容器组都不会被调度到同一个节点上,从而提高容错能力。

topologyKey 指定反亲和性所适用的范围(例如节点或可用区)。

apiVersion: v1
kind: Pod
metadata:
  name: web-app-pod
  labels:
    app: my-web
spec:
  containers:
  - name: web-container
    image: busybox
    command: ["sh", "-c", "echo 'Hello from web-app'; sleep 3600"]
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchLabels:
              app: my-web
          topologyKey: "kubernetes.io/hostname"

检验您的知识

您希望确保关键数据库容器组绝不能被调度到带有 zone=dev 标签的节点上。对于这种基于节点标签的严格排除,您会使用哪种调度规则?

回顾:调度控制

做得很好!您已经学习了控制容器组运行位置的强大方法:

  • 节点标签:用于标识节点特征的键值对。
  • 节点选择器:简单而严格的匹配方式,可将容器组调度到带有特定标签的节点上。
  • 节点亲和性:使用运算符,通过更灵活的规则(必需或首选)选择节点。
  • 容器组亲和性/反亲和性:根据其他容器组的位置,将容器组部署在一起或彼此分开。

这些工具对于优化资源使用、确保容错能力以及满足特定应用需求至关重要。

常见问题解答

「节点选择器与亲和性」课时是免费的吗?

是的 — 「节点选择器与亲和性」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kubernetes Basics 课程的其余内容,请升级到 CoddyKit PRO。 Kubernetes Basics 课程共包含 4 节课。

「节点选择器与亲和性」这节课中我会学到什么?

使用节点选择器,以及表达能力更强的节点和 Pod 亲和性规则,控制 Pod 的调度位置。 你通过在浏览器中直接运行的动手代码来练习 Kubernetes Basics,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Kubernetes Basics 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Kubernetes Basics 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「节点选择器与亲和性」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Kubernetes Basics 课中编写并运行代码吗?

能。每节 Kubernetes Basics 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 资源请求与限制
  2. 节点选择器与亲和性
  3. 污点与容忍度
  4. Pod 优先级与抢占
← 返回 Kubernetes Basics