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

K8s DaemonSet的介绍

1. 什么是 DaemonSet?

DaemonSet 是 Kubernetes 中的一种控制器,用于确保每个(或某些指定的)节点上运行一个 Pod 副本。它是为部署守护进程设计的,例如需要在每个节点上运行的任务或工具。

  • 特点
    • Pod 会随着节点的加入或移除而动态创建或销毁。
    • 确保在集群中每个符合条件的节点上都有一个 Pod。
    • 可用来运行与节点级别功能相关的任务。

2. DaemonSet 的常见使用场景

  1. 日志收集

    • 部署日志收集代理,例如 Fluentd 或 Filebeat,在每个节点上收集日志并发送到中央存储或日志系统(如 Elasticsearch)。
  2. 监控代理

    • 在每个节点上运行监控代理,例如 Prometheus Node Exporter 或 Datadog Agent,收集节点的性能指标和状态信息。
  3. 网络组件

    • 运行网络插件或代理,例如 CNI 插件(如 Calico、Flannel)或者 kube-proxy。
  4. 节点管理

    • 部署节点的系统级别管理工具,如磁盘清理工具、节点健康检查器等。
  5. 安全代理

    • 在每个节点上部署安全组件,例如防火墙代理或入侵检测系统(IDS)。
  6. 存储管理

    • 用于在节点上运行与存储相关的代理,如 Ceph、GlusterFS 客户端,或其他存储卷管理工具。

3. 配置 DaemonSet 时的调度策略

在部署 DaemonSet 时,可以配置节点的**亲密性(Affinity)排斥性(Toleration)**属性来控制 Pod 的调度行为。

3.1 节点选择器(Node Selector)
  • 通过 nodeSelector 指定 Pod 只能调度到带有特定标签的节点上。
  • 示例
spec:
  template:
    spec:
      nodeSelector:
        disktype: ssd
3.2 节点亲和性(Node Affinity)
  • 更灵活的节点调度方式,分为硬性规则requiredDuringSchedulingIgnoredDuringExecution)和软性规则preferredDuringSchedulingIgnoredDuringExecution)。
  • 示例
spec:
  template:
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: disktype
                operator: In
                values:
                - ssd
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 1
              preference:
                matchExpressions:
                - key: region
                  operator: In
                  values:
                  - us-west
3.3 污点容忍(Tolerations)
  • 配置 Pod 容忍节点的污点(Taints),允许 Pod 调度到被标记为“不接受常规工作负载”的节点上。
  • 示例
spec:
  template:
    spec:
      tolerations:
      - key: "dedicated"
        operator: "Equal"
        value: "special"
        effect: "NoSchedule"
3.4 Pod 亲和性和反亲和性(Pod Affinity/Anti-Affinity)
  • Pod Affinity:指定 Pod 调度到与其他特定 Pod 相邻的节点上。
  • Pod Anti-Affinity:指定 Pod 避免调度到与其他特定 Pod 相邻的节点上。
  • 示例
spec:
  template:
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - security-agent
              topologyKey: "kubernetes.io/hostname"
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 1
              podAffinityTerm:
                labelSelector:
                  matchExpressions:
                  - key: app
                    operator: In
                    values:
                    - logger
                topologyKey: "kubernetes.io/hostname"

4. DaemonSet 的注意事项

  1. 更新策略

    • 默认使用 RollingUpdate 策略逐步更新 DaemonSet 中的 Pod。
    • 如果需要立即替换所有 Pod,可以选择 OnDelete 策略,手动删除旧 Pod。
  2. 节点的变化

    • 如果新增节点,DaemonSet 会自动在新节点上创建 Pod。
    • 如果节点被删除,DaemonSet 对应的 Pod 也会被移除。
  3. 与其他控制器的对比

    • 与 Deployment 不同,DaemonSet 不支持副本数的配置,因为每个符合条件的节点上只能运行一个 Pod。
  4. 性能开销

    • 注意 DaemonSet 容器对每个节点资源的消耗,尤其是在大型集群中部署时。

5. DaemonSet 示例

以下是一个典型的 DaemonSet 配置示例,用于在所有节点上运行一个日志收集器:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: log-collector
  labels:
    app: log-collector
spec:
  selector:
    matchLabels:
      app: log-collector
  template:
    metadata:
      labels:
        app: log-collector
    spec:
      containers:
      - name: fluentd
        image: fluent/fluentd:latest
        resources:
          limits:
            memory: "200Mi"
            cpu: "500m"
        volumeMounts:
        - name: varlog
          mountPath: /var/log
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
  updateStrategy:
    type: RollingUpdate

6. 总结

  • DaemonSet 适用于运行每个节点所需的守护进程,如日志收集、监控、网络插件等。
  • 可以通过 nodeSelectoraffinitytolerations 配置特定节点的调度策略。
  • 在部署之前,充分考虑每个 Pod 的资源消耗及调度规则,确保资源合理分配。

http://www.kler.cn/a/454481.html

相关文章:

  • Android WebView 与 H5 双向通信实现详解
  • 【商城源码的开发环境】
  • VSCode 插件开发实战(三):插件配置项自定义设置
  • 如何在服务器上克隆、pull、push GitHub私有项目
  • GraalVM完全指南:云原生时代下使用GraalVM将Spring Boot 3应用转换为高效Windows EXE文件
  • 12.24 k8s yaml文件类型和介绍
  • 通过WSL 在 Windows 11中实现Linux虚拟环境并连接给项目部署使用的办法
  • FlaskAPI-初识
  • IP地址怎么切换到别的省份?ip可以用什么办法切换
  • #渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
  • 【LeetCode 面试经典150题】详细题解之滑动窗口篇
  • [数据结构]图——C++描述
  • 青少年编程与数学 02-004 Go语言Web编程 21课题、应用部署
  • Java重要面试名词整理(五):Redis
  • Linux网络功能 - 服务和客户端程序CS架构和简单web服务示例
  • #B1630. 数字走向4
  • 华为云计算HCIE笔记05
  • Conda使用命令大全
  • 海康RGBD相机使用C++和Opencv采集图像记录
  • vue3入门教程:Class和Style绑定