解决在Kubernetes中DaemonSet无法在master节点调度的问题

简介: 通过以上步骤和注意事项,您能够有效解决DaemonSet不能在Kubernetes master节点上调度的问题,同时保证集群的高可用性和稳健性。

在Kubernetes中,DaemonSet确保全部(或某些特定)Node运行一个Pod的副本。当有Node加入集群时,DaemonSet会自动在新加入的Node上部署Pod。这对于运行像日志收集器、监控代理或其他形式的守护进程非常有用。

默认情况下,出于安全性的考虑,Kubernetes master节点不允许调度普通Pod。但在某些场景中,可能需要在master节点上也部署DaemonSet。要在master节点上调度DaemonSet,通常需要两个步骤:移除master节点的 NoSchedule污点(taint),以及对DaemonSet的Pod模板添加容忍(toleration)。

移除Master节点的 NoSchedule污点

每个Kubernetes节点都可以被打上一个或多个污点(taint),以防止Pod被调度到这些节点上。默认情况下,master节点带有 node-role.kubernetes.io/master:NoSchedule 的污点。可以通过以下命令查看所有节点的污点:

kubectl get nodes -o json | jq '.items[].spec.taints'
​

要允许Pod在master节点调度运行,需要移除该污点。可以通过以下命令移除master节点的污点:

kubectl taint nodes <master-node-name> node-role.kubernetes.io/master:NoSchedule-
​

其中 <master-node-name> 是您的master节点的名称。移除污点后,该节点能允许任何Pod进行调度。

对DaemonSet的Pod模板添加容忍

即使移除了master节点的污点,但为了确保DaemonSet的Pod能够被调度到master节点上,需要更新DaemonSet的Pod模板,添加相应的容忍。

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: your-daemonset
spec:
  selector:
    matchLabels:
      ...
  template:
    metadata:
      labels:
        ...
    spec:
      tolerations:
      - key: "node-role.kubernetes.io/master"
        operator: "Exists"
        effect: "NoSchedule"
      ...
​

这里的tolerations部分会告诉Kubernetes调度器,这个DaemonSet的Pod可以容忍 node-role.kubernetes.io/master这个污点。

在DaemonSet定义中添加了以上容忍后,重新应用DaemonSet配置:

kubectl apply -f your-daemonset.yaml
​

确保您的DaemonSet使用的是最新的配置,并检查Pod是否开始在master节点上运行:

kubectl get pods -o wide
​

返回结果会展示所有Pod的运行情况以及它们所在的节点。

注意事项

  • 确保您了解调度Pod到master节点上的潜在风险,包括安全性和资源竞争的问题。master节点应专注于管理工作。
  • 通常,您的应用程序应该设计得足够鲁棒,不需要在master节点上运行服务,尽量将应用服务的Pod调度到工作(worker)节点。
  • 每次修改DaemonSet配置时,请确认您的更改不会对现有的服务造成中断。

通过以上步骤和注意事项,您能够有效解决DaemonSet不能在Kubernetes master节点上调度的问题,同时保证集群的高可用性和稳健性。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
10月前
|
存储 缓存 NoSQL
阿里云 Tair 联手 SGLang 共建 HiCache,构建面向“智能体式推理”的缓存新范式
针对智能体式推理对KVCache的挑战,阿里云Tair KVCache团队联合SGLang社区推出HiCache技术,通过多级存储卸载与全局共享机制,实现缓存命中率翻倍、TTFT降低56%、QPS提升2倍,构建面向长上下文、高并发、多智能体协作的下一代推理缓存基础设施。
1687 27
阿里云 Tair 联手 SGLang 共建 HiCache,构建面向“智能体式推理”的缓存新范式
|
Prometheus 监控 Kubernetes
K8s 容器监控的关键指标与最佳实践
K8s 容器监控的关键指标与最佳实践
1532 153
|
人工智能 API 数据库
MCP Server 开发实战 | 大模型无缝对接 Grafana
以 AI 世界的“USB-C”标准接口——MCP(Model Context Protocol)为例,演示如何通过 MCP Server 实现大模型与阿里云 Grafana 服务的无缝对接,让智能交互更加高效、直观。
4405 124
|
Ubuntu 关系型数据库 MySQL
MySQL二进制包安装
本文详细介绍了在多种Linux系统上通过二进制包安装MySQL 8.0和8.4版本的完整过程,涵盖用户创建、glibc版本匹配、程序解压、环境变量配置、初始化数据库及服务启动等步骤,并提供支持多发行版的一键安装脚本,助力高效部署MySQL环境。
2050 4
MySQL二进制包安装
|
10月前
|
Linux Docker 容器
docker下部署 vLLM 启动Qwen3-VL-32B-Instruct模型
本文介绍在CentOS系统、A10 6×24G显卡环境下,通过Docker部署vLLM并启动Qwen3-VL-32B-Instruct大模型的完整流程,涵盖镜像拉取、容器配置、多卡并行与显存优化设置,支持32K上下文,附带启动脚本及调用验证示例。
9642 2
|
消息中间件 运维 Java
搭建Zookeeper、Kafka集群
本文详细介绍了Zookeeper和Kafka集群的搭建过程,涵盖系统环境配置、IP设置、主机名设定、防火墙与Selinux关闭、JDK安装等基础步骤。随后深入讲解了Zookeeper集群的安装与配置,包括数据目录创建、节点信息设置、SASL认证配置及服务启动管理。接着描述了Kafka集群的安装,涉及配置文件修改、安全认证设置、生产消费认证以及服务启停操作。最后通过创建Topic、发送与查看消息等测试验证集群功能。全网可搜《小陈运维》获取更多信息。
1205 1
|
缓存 Kubernetes 应用服务中间件
k8s学习--helm的详细解释及安装和常用命令
k8s学习--helm的详细解释及安装和常用命令
796 0
k8s学习--helm的详细解释及安装和常用命令
|
存储 Kubernetes 应用服务中间件
Ingress-Nginx使用指南上篇
关于Ingress-Nginx在Kubernetes中的使用指南,涵盖了从基础安装到高级特性配置的详细步骤和实战案例。
5937 3
Ingress-Nginx使用指南上篇
|
负载均衡 监控 网络协议
在Linux中,LVS-DR模式原理是什么?
在Linux中,LVS-DR模式原理是什么?