节点选择器与亲和性
使用节点选择器,以及表达能力更强的节点和 Pod 亲和性规则,控制 Pod 的调度位置。
节点选择器与亲和性 是 CoddyKit 上的免费 DevOps Bootcamp 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 DevOps Bootcamp 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 DevOps Bootcamp 课程共包含 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 导师)并解锁 DevOps Bootcamp 课程的其余内容,请升级到 CoddyKit PRO。 DevOps Bootcamp 课程共包含 4 节课。
「节点选择器与亲和性」这节课中我会学到什么?
使用节点选择器,以及表达能力更强的节点和 Pod 亲和性规则,控制 Pod 的调度位置。 你通过在浏览器中直接运行的动手代码来练习 DevOps Bootcamp,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 DevOps Bootcamp 需要有经验吗?
无需任何先前经验。CoddyKit 上的 DevOps Bootcamp 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「节点选择器与亲和性」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 DevOps Bootcamp 课中编写并运行代码吗?
能。每节 DevOps Bootcamp 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 资源请求与限制
- 节点选择器与亲和性
- 污点与容忍度
- Pod 优先级与抢占