当前位置: 首页 > ops >正文

【kubernetes】--controller(DaemonSet)

Kubernetes DaemonSet 控制器详解

它确保集群中所有(或部分)节点上都运行一个 Pod 的副本。当有新节点加入集群时,DaemonSet 会自动在新节点上创建 Pod;当节点从集群中移除时,这些 Pod 也会被垃圾回收。

DaemonSet 的核心特性

  1. 每个节点一个 Pod:确保满足条件的每个节点上都运行一个 Pod 实例
  2. 自动扩展:随着集群节点的增减自动调整 Pod 数量
  3. 特定节点运行:可以通过节点选择器(nodeSelector)或节点亲和性(nodeAffinity)在特定节点上运行

DaemonSet 的典型使用场景

  1. 集群存储守护进程:如 glusterd、ceph
  2. 日志收集:如 fluentd、logstash
  3. 监控采集:如 Prometheus Node Exporter、collectd
  4. 网络插件:如 Calico、Weave 网络组件
  5. 安全控制:如安全审计、入侵检测代理

DaemonSet 的工作机制

  1. 控制器模式:DaemonSet 控制器通过监听 API 服务器获取节点和 Pod 的变化
  2. 节点匹配:根据 .spec.template 和节点选择条件确定应该在哪些节点上运行 Pod
  3. Pod 管理
    • 创建缺失的 Pod
    • 删除多余的 Pod
    • 更新需要变更的 Pod

DaemonSet 的 YAML 示例

apiVersion: apps/v1
kind: DaemonSet
metadata:name: fluentd-elasticsearchnamespace: kube-systemlabels:k8s-app: fluentd-logging
spec:selector:matchLabels:name: fluentd-elasticsearchtemplate:metadata:labels:name: fluentd-elasticsearchspec:tolerations:- key: node-role.kubernetes.io/mastereffect: NoSchedulecontainers:- name: fluentd-elasticsearchimage: quay.io/fluentd_elasticsearch/fluentd:v2.5.2resources:limits:memory: 200Mirequests:cpu: 100mmemory: 200MivolumeMounts:- name: varlogmountPath: /var/log- name: varlibdockercontainersmountPath: /var/lib/docker/containersreadOnly: trueterminationGracePeriodSeconds: 30volumes:- name: varloghostPath:path: /var/log- name: varlibdockercontainershostPath:path: /var/lib/docker/containers

DaemonSet 的关键配置

1. 节点选择

  • nodeSelector:简单选择器,匹配节点标签

    spec:template:spec:nodeSelector:disktype: ssd
    
  • nodeAffinity:更复杂的节点亲和性规则

    spec:template:spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/osoperator: Invalues:- linux
    

2. 容忍度(Tolerations)

允许 Pod 调度到带有污点的节点上:

spec:template:spec:tolerations:- key: node-role.kubernetes.io/mastereffect: NoSchedule

3. 更新策略

  • RollingUpdate(默认):滚动更新 DaemonSet Pod
  • OnDelete:手动删除旧 Pod 时才创建新 Pod

配置示例:

spec:updateStrategy:type: RollingUpdaterollingUpdate:maxUnavailable: 1

DaemonSet 与 Deployment 的区别

特性DaemonSetDeployment
调度目标每个匹配节点一个 Pod指定数量的 Pod,不考虑节点
扩展性随节点数量自动扩展手动指定副本数
使用场景节点级服务(监控、日志等)应用服务
更新策略RollingUpdate 或 OnDeleteRollingUpdate 或 Recreate
节点亲和性通常需要通常不需要

DaemonSet 的管理操作

创建 DaemonSet

kubectl apply -f daemonset.yaml

查看 DaemonSet 状态

kubectl get daemonset -n kube-system
kubectl describe daemonset fluentd-elasticsearch -n kube-system

更新 DaemonSet

  1. 修改 YAML 文件后重新应用

    kubectl apply -f daemonset-updated.yaml
    
  2. 直接编辑

    kubectl edit daemonset fluentd-elasticsearch -n kube-system
    

删除 DaemonSet

kubectl delete daemonset fluentd-elasticsearch -n kube-system

高级主题

1. 仅在某些节点上运行

通过节点标签和选择器控制:

# 给节点打标签
kubectl label nodes <node-name> <label-key>=<label-value># 然后在 DaemonSet 中配置 nodeSelector

2. 使用 initContainers

可以在主容器前运行初始化容器:

spec:template:spec:initContainers:- name: init-sysctlimage: busyboxcommand: ["sysctl", "-w", "vm.max_map_count=262144"]securityContext:privileged: true

3. 资源限制

为 DaemonSet Pod 设置资源请求和限制:

resources:limits:cpu: "1"memory: 500Mirequests:cpu: "0.5"memory: 250Mi

常见问题解决

  1. Pod 无法调度

    • 检查节点选择器和污点/容忍度配置
    • 检查节点资源是否充足
  2. 更新失败

    • 检查更新策略配置
    • 检查新镜像是否可用
  3. 权限问题

    • 可能需要配置 SecurityContext 或 PodSecurityPolicy

案列:部署守护进程DaenonSet

ds,yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:name: ds-test labels:app: filebeat
spec:selector:matchLabels:app: filebeattemplate:metadata:labels:app: filebeatspec:containers:- name: logsimage: nginx:1.27.5ports:- containerPort: 80volumeMounts:- name: varlogmountPath: /tmp/logvolumes:- name: varloghostPath:path: /var/log
  • 在每个node上运行一个pod,新加入的node也同
    样运行在一个pod里面
  • 在每个node节点安装数据采集工具
    在这里插入图片描述
http://www.xdnf.cn/news/15194.html

相关文章:

  • SD卡初始化、命令及响应命令格式(详细)讲解
  • 分层架构的C++高并发内存池性能优化
  • 无法打开windows安全中心解决方案
  • DirectX Repair修复工具下载,.NET修复,DirectX修复
  • 2025 全球酒店用品厂家竞争力排行榜发布:扬州卓韵领衔,布草工厂实力重塑行业格局
  • 关于 验证码系统 详解
  • Android音视频探索之旅 | C++层使用OpenGL ES实现音频渲染
  • Python数据容器-集合set
  • 《硬件产品经理》第八章:产品生产制造
  • Android 系统默认Launcher3 菜单模式双层改成单层-3
  • 【设计模式】适配器模式(包装器模式),缺省适配器模式,双向适配器模式
  • 带货视频评论洞察 Baseline 学习笔记 (Datawhale Al夏令营)
  • Ntfs!LfsFlushLfcb函数分析之while的循环条件NextLbcb的确定和FirstLbcb->LbcbFlags的几种情况
  • OpenVela之模拟器调试
  • Go内存分配
  • vite如何生成gzip,并在服务器上如何设置开启
  • 如何在 Windows 10 上安装 RabbitMQ
  • 如何在 Visual Studio Code 中使用 Cursor AI
  • 【嵌入式硬件实例】-555定时器实现倍压电路
  • C语言:20250712笔记
  • 系统学习Python——并发模型和异步编程:基础实例-[使用线程实现旋转指针]
  • Ruby如何采集直播数据源地址
  • tiktok 弹幕 逆向分析
  • 后端定时过期方案选型
  • Linux/Ubuntu安装go
  • ​Windows API 介绍及核心函数分类表
  • MySQL 5.7.29升5.7.42实战:等保三漏洞修复+主从同步避坑指南
  • 一分钟快速了解Apache
  • Ether and Wei
  • 【android bluetooth 协议分析 07】【SDP详解 2】【SDP 初始化】