zoukankan      html  css  js  c++  java
  • Controller之daemonset

    一、Daemonset概念

    (1)DaemonSet 确保所有节点上运行一个 Pod 的副本。 当有节点加入集群时也会为他们新增一个 Pod 。 当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
    (2)DaemonSet 常用来部署一些集群的日志、监控或者其他系统管理应用。典型的应用包括:
    
    *日志收集,比如fluentd,logstash等
    *系统监控,比如Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond等
    *系统程序,比如kube-proxy, kube-dns, glusterd, ceph等
    

    二、Daemonset的Pod是如何被调度的?

    (1)由 DaemonSet 控制器调度
    v1.12以后默认禁用
    
    通常,Kubernetes Scheduler(调度器)决定了 Pod 在哪个节点上运行。然而 DaemonSet Controller 创建的 Pod 已经指定了 .spec.nodeName 字段,因此:
    Node 节点的 unschedulable (opens new window) 字段将被 DaemonSet Controller 忽略DaemonSet Controller 可以在 kubernetes scheduler 启动之前创建 Pod,这个特性在引导集群启动的时候非常有用(集群使用者无需关心)
    
    (2)由默认调度器调度
    v1.12以后默认启用
    
    DaemonSet 确保所以符合条件的节点运行了一个指定的 Pod。通常,Kubernetes Scheduler 决定 Pod 在哪个节点上运行。然而如果 DaemonSet 的 Pod 由 DaemonSet Controller 创建和调度,会引发如下问题:
    *Pod 的行为不一致:普通的 Pod 在创建后处于 Pending 状态,并等待被调度,但是 DaemonSet Pod 创建后,初始状态不是 Pending。这会使用户感到困惑
    *Pod 的优先权(preemption) (opens new window) 由 kubernetes 调度器处理。如果 Pod 优先权被启用,DaemonSet Controller 在创建和调度 Pod 时,不会考虑 Pod 的优先权
    
    Kubernetes v1.12 版本以后,默认通过 kubernetes 调度器来调度 DaemonSet 的 Pod。DaemonSet Controller 将会向 DaemonSet 的 Pod 添加 .spec.nodeAffinity 字段,而不是 .spec.nodeName 字段,并进一步由 kubernetes 调度器将 Pod 绑定到目标节点。如果 DaemonSet 的 Pod 已经存在了 nodeAffinity 字段,该字段的值将被替换。
    
    nodeAffinity:
    
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchFields:
          - key: metadata.name
            operator: In
            values:
            - target-host-nam
    

    此外, node.kubernetes.io/unschedulable:NoSchedule 容忍(toleration)将被自动添加到 DaemonSet 的 Pod 中。由此,默认调度器在调度 DaemonSet 的 Pod 时可以忽略节点的 unschedulable 属性

    三、创建Daemonset示例

    下面的daemonset.yaml文件描述了一个运行fluentd-elasticsearch Docker镜像的DaemonSet

    apiVersion: extensions/v1beta1
    
    kind: DaemonSet
    metadata:
      name: fluentd
    spec:
      template:
        metadata:
          labels:
            app: logging
            id: fluentd
          name: fluentd
        spec:
          containers:
          - name: fluentd-es
            image: gcr.io/google_containers/fluentd-elasticsearch:1.3
            env:
             - name: FLUENTD_ARGS
               value: -qq
            volumeMounts:
             - name: containers
               mountPath: /var/lib/docker/containers
             - name: varlog
               mountPath: /varlog
          volumes:
             - hostPath:
                 path: /var/lib/docker/containers
               name: containers
             - hostPath:
                 path: /var/log
               name: varlog
    

    *我的环境是一个master两个worknode节点,虽然yaml里并没有指定副本数,daemonset仍然在我两个节点里都起了一个pod。

    *任意到一个节点上,登录到容器里挂载的路径,有相关的日志

    kubenetes官网:https://kubernetes.io/zh/docs/concepts/workloads/controllers/daemonset/
    kubenetes社区:https://www.kubernetes.org.cn/daemonset
    kuboard.cn官网:https://kuboard.cn/learning/k8s-intermediate/workload/wl-daemonset/

  • 相关阅读:
    【ACM非算法部分】综合篇
    【解题报告】CF Round #320 (Div. 2)
    【解题报告】13级个人结业赛(二) ——动(dou)态(bu)规(hui)划(zuo)专场
    【解题报告】13级个人结业赛(一) ——涨姿势专场
    【解题报告】三校联盟专场一
    【解题报告】编程之美复赛 ——猜数字
    【解题报告】Codeforces Round #301 (Div. 2) 之ABCD
    【解题报告】编程之美初赛二 扑克牌
    【通知】
    【test】
  • 原文地址:https://www.cnblogs.com/you-xiaoqing/p/14384834.html
Copyright © 2011-2022 走看看