K3s集群指定namespace的Deployment仅运行在特定节点方案咨询
K3s集群指定Namespace工作负载强制调度到特定节点实现方案
背景说明
K3s默认未启用Kubernetes原生的PodNodeSelector准入插件,因此你找不到对应配置入口,无需额外查找第三方插件,两种原生适配方案如下:
方案1:启用原生PodNodeSelector准入插件(无需额外组件)
操作步骤
- 编辑K3s server服务配置文件(默认路径为
/etc/systemd/system/k3s.service),在ExecStart启动项的k3s server后追加参数:
注意不要遗漏默认启用的--kube-apiserver-arg=enable-admission-plugins=NodeRestriction,PodNodeSelectorNodeRestriction插件,否则会导致集群节点认证异常 - 重载配置并重启K3s server服务生效:
systemctl daemon-reload && systemctl restart k3s - 给已创建的
testing命名空间添加调度注解,替换下文中的<标签键>=<标签值>为你给节点打的实际test标签:
示例:如果节点标签为kubectl annotate namespace testing scheduler.alpha.kubernetes.io/node-selector=<标签键>=<标签值>run=test,则命令为:kubectl annotate namespace testing scheduler.alpha.kubernetes.io/node-selector=run=test
生效说明
所有后续在testing命名空间下创建的Pod,都会被自动注入上述nodeSelector配置,强制调度到符合标签要求的节点,无需单独修改Deployment配置。存量Pod需要重建后生效。
方案2:策略引擎强制注入(无需修改K3s启动参数)
如果不希望修改集群核心组件启动参数,可以部署Kyverno/Gatekeeper这类Kubernetes原生策略引擎,编写全局规则匹配testing命名空间下的所有Pod,强制注入目标nodeSelector,还可额外添加校验规则防止用户手动修改配置绕过调度限制,适合多租户、规则复杂的场景。
轻量临时方案
如果仅需要对少量Deployment做限制,可直接在Deployment的spec.template.spec字段下添加nodeSelector配置,示例:
spec: template: spec: nodeSelector: <标签键>: <标签值>
内容的提问来源于stack exchange,提问作者Tomáš Klas
相关产品推荐
相关产品推荐

