kubernetesr进阶之将容器组调度到指定的节点

概述

在 Kubernetes,您可以限定 Pod 只能在特定的节点上运行,或者优先选择在特定的节点上运行。通常您并不需要这样做,而应该交由 kubernetes 调度程序根据资源使用情况自动地为 Pod 分配节点。但是少数情况下,这种限定仍然是必要的,例如:

  • 确保某些 Pod 被分配到具有固态硬盘的节点
  • 将相互通信频繁的两个 Pod 分配到同一个高可用区的节点

Kubernetes 一共提供了四种方法,可以将 Pod 调度到指定的节点上,这些方法从简便到复杂的顺序如下:

  • 指定节点 nodeName
  • 节点选择器 nodeSelector
  • Affinity and anti-affinity

指定节点 nodeName

nodeName 是四种方法中最简单的一个,但是因为它的局限性,也是使用最少的。nodeName 是 PodSpec 当中的一个字段。如果该字段非空,调度程序直接将其指派到 nodeName 对应的节点上运行。

通过 nodeName 限定 Pod 所运行的节点有如下局限性:

  • 如果 nodeName 对应的节点不存在,Pod 将不能运行
  • 如果 nodeName 对应的节点没有足够的资源,Pod 将运行失败,可能的原因有:OutOfmemory /OutOfcpu
  • 集群中的 nodeName 通常是变化的(新的集群中可能没有该 nodeName 的节点,指定的 nodeName 的节点可能从集群中移除)

节点选择器 nodeSelector

nodeSelector 是 PodSpec 中的一个字段。指定了一组名值对。节点的 labels 中必须包含 Pod 的 nodeSelector 中所有的名值对,该节点才可以运行此 Pod。最普遍的用法中, nodeSelector 只包含一个名值对。

Node isolation/restriction

向节点对象添加标签后,可以将 Pod 指定到特定(一个或一组)的节点,以便确保某些 Pod 只在具备某些隔离性、安全性或符合管理规定的节点上运行。如果将标签用于这个目的,推荐选择那些不会被 kubelet 修改的标签。这样做可以避免节点非法使用其 kubelet credential 来设置节点自己的标签,进一步影响到调度器将工作负载调度到该节点上。

NodeRestriction 管理插件可以阻止 kubelet 设置或者修改节点上以 node-restriction.kubernetes.io/ 开头的标签。如需要使用该标签前缀作为节点隔离的目的,需要:

  1. 确保 kubenetes 已经启用了 Node authorizerNodeRestriction admission plugin
  2. 添加带 node-restriction.kubernetes.io/ 前缀的标签到节点对象,并将这些标签作为 Pod 中的节点选择器。例如: example.com.node-restriction.kubernetes.io/fips=trueexample.com.node-restriction.kubernetes.io/pci-dss=true
相关推荐
碣石潇湘无限路2 小时前
【云原生】Kubernetes CEL 速查表
容器·贪心算法·kubernetes
阿里云云原生2 小时前
大模型 Token 的消耗可能是一笔糊涂账
云原生
mingyuewu4 小时前
MAC安装docker 后提示com.docker.vmnetd”将对您的电脑造成伤害
macos·docker·容器
企鹅侠客6 小时前
Prometheus operator怎么添加targets和告警规则
运维·云原生·kubernetes·prometheus·pod
专注代码七年7 小时前
Docker运维篇
运维·docker·容器
一杯敬朝阳 一杯敬月光8 小时前
WIN11 企业版 部署Dify+Docker
运维·docker·容器
Leo Han8 小时前
k8s常用命令(持续更新中)
docker·容器·kubernetes
KubeSphere 云原生8 小时前
云原生周刊:Kubernetes v1.33 要来了
云原生·容器·kubernetes
孔令飞8 小时前
关于 LLMOPS 的一些粗浅思考
人工智能·云原生·go