深入解读kubernetes的DaemonSet原理剖析及使用指南

  • Daemonset介绍:

    • Daemonset是k8s中的一种控制器,用于确保集群中符合条件的每个节点上(或特定标签选择器匹配的节点)运行一个 Pod 的副本。当有新节点加入集群时,DaemonSet 会自动为这些节点创建 Pod;当节点从集群移除时,这些 Pod 也会被回收。
  • Daemonset使用场景:

    • 日志收集:在节点上部署 Filebeat 等日志采集工具,收集节点或容器日志,用来做分析问题,排查问题使用。
    • 监控指标:在节点上部署Prometheus Node Exporte、包括安装agent等监控组件,包括自研的监控产品所带的agent组件等。
    • 网络插件:部署 Calico、Cilium 等 CNI 插件,为节点提供网络功能。
    • 包括存储类插件等
  • Daemonset 创建:

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: fluentd-es         
      namespace: kube-system
      labels:
        k8s-app: fluentd-logging
    spec:
      selector:
        matchLabels:
          name: fluentd-es
      template:
        metadata:
          labels:
            name: fluentd-es
        spec:
          containers:
          - name: fluentd-es
            image: quay.io/fluentd_es/fluentd:v2.5.2   # 镜像名称
            resources:
              limits:
                memory: 200Mi
              requests:
                cpu: 100m
                memory: 200Mi
            volumeMounts:
            - name: varlog
              mountPath: /var/log/es
          volumes:
          - name: varlog
            hostPath:
              path: /var/log/es
              
    - Daemonset需要配置 `apiVersion`、`kind` 和 `metadata`字段,且名称必须是合法的DNS子域名。
    - `apiVersion`定义了API版本,`apps/v1`是DaemonSet资源的稳定版本。
    - `kind`指明资源类型,这里是`DaemonSet`。
    - `metadata`包含DaemonSet对象的元数据,例如名称和标签。
    - `spec`定义了DaemonSet的具体规格,包括选择器和模板。
    - `selector`:用于指定该DaemonSet管理哪些Pod。
    - `template`:定义了Pod的模板,包括容器、资源需求等。       
    
    创建Daemonset:
    
    - kubectl apply -f  es-daemonset.yaml
    
  • Daemon Pods是如何被调度的:

    • Daemonset控制器会自动将pod调度到符合条件的节点上,默认调度器也可以用于调度daemonset Pod。
  • 污点和容忍度:

    • DaemonSet 控制器会自动为 DaemonSet Pod 添加一组容忍度,允许 Pod 调度到具有特定污点的节点上。
  • 与Daemon Pod的通信:

    • 配置 Daemonset Pod将数据发送到其他服务。
    • 通过节点IP和端口访问Daemonset Pod。
    • 也可以通过服务随机访问某个节点上的Daemonset Pod。
  • DaemonSet命令:

    • 查看 DaemonSet 状态:

      • kubectl get daemonset -n <namespace>
        
    • 查看 Pod 分布:

      • kubectl get pods -l name=fluentd -o wide
        
    • 更新 DaemonSet
      修改 YAML 文件后重新应用(如更新镜像版本):

      • kubectl apply -f fluentd-daemonset.yaml
        
    • 删除 DaemonSet:

      • kubectl delete daemonset fluentd-logging
        
  • 限制Daemonset的节点范围

    通过 nodeSelector 选择特定标签的节点:

    spec:
      template:
        spec:
          nodeSelector:
            disktype: aaa  # 仅调度到带有 `disktype=aaa` 标签的节点 (替换为实际的)
    
  • 滚动更新策略

    配置更新策略(默认策略是 OnDelete,推荐使用 RollingUpdate):

    spec:
      updateStrategy:
        type: RollingUpdate
        rollingUpdate:
          maxUnavailable: 1  # 更新时最多允许不可用的 Pod 数量
    
  • 资源限制

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

    containers:
      - name: fluentd
        resources:
          requests:
            cpu: "100m"
            memory: "200Mi"
          limits:
            memory: "500Mi"
    
  • 亲和性和反亲和性

    控制 Pod 在节点上的调度策略:

    spec:
      template:
        spec:
          affinity:
            podAntiAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                - labelSelector:
                    matchExpressions:
                      - key: name
                        operator: In
                        values: [fluentd]
                  topologyKey: kubernetes.io/hostname
    

    总结:

    DaemonSet 是k8s中用于确保每个节点运行特定 Pod 的核心工具,特别适合部署系统级服务。通过合理配置节点选择器、污点容忍和资源限制,可以高效管理集群的基础设施组件。

posted @   酿酒的果实  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示