01 引言
声明:本文为《Kubernetes权威指南:从Docker到Kubernetes实践全接触(第5版)》的读书笔记
DaemonSet是 Kubernetes1.2
版本新增的一种资源对象,用于管理在集群中的每个Node
上仅运行一份Pod
的副本实例,如下图所示:
02 DaemonSet
2.1 应用场景
下面举例DaemonSet的一些使用场景:
- 在每个
Node
上都运行一个GlusterFS
存储或者Ceph
存储的Daemon
进程; - 在每个
Node
上都运行一个日志采集程序,例如Fluentd
或者Logstach
; - 在每个
Node
上都运行一个性能监控程序,采集该Node
的运行性能数据, 例如Prometheus Node Exporter
、collectd
、New Relic agent
或者Ganglia gmond
等。
DaemonSet的Pod调度策略与RC类似,除了使用系统内置的算法在每个Node上进行调度,也可以在Pod的定义中使用NodeSelector或NodeAffinity来指定满足条件的Node范围进行调度。
2.2 举例
下面的例子定义了为在每个Node上都启动一个fluentd
容器,配置文件 fluentd-ds.yaml
的内容如下 (其中挂载了物理机的两个目录"/var/log
"和 “/var/lib/docker/containers
”):
apiVersion: apps/v1 kind: DaemonSet metadata: name: fluentd-cloud-logging namespace: kube-system labels: k8s-app: fluentd-cloud-logging spec: template: metadata: namespace: kube-system labels: k8s-app: fluentd-cloud-logging spec: containers: - name: fluentd-cloud-logging image: gcr.io/google containers/fluentd-elasticsearch:1.17 resources: limits: cpu: 100m memory: 200Mi env: - name: FLUENTD ARGS value: -q volumeMounts - name: varlog mountPath: /var/log readOnly: false - name: containers mountPath: /var/lib/docker/containers readonly: false volumes: - name: containers hostPath: path: /var/lib/docker/containers - name: varlog hostPath: path: /var/log
使用kubectl create
命令创建该DaemonSet
:
kubectl create -f fluentd-ds.yaml daemonset "fluentd-cloud-logging"created
查看创建好的DaemonSet
和Pod
,可以看到在每个Node
上都创建了一个
Pod
:
2.3 注意事项
DaemonSet调度不同于普通的Pod调度,所以没有用默认的Kubernetes Scheduler
进行调度,而是通过专有的DaemonSet Controller
进行调度。但是随着Kubernetes
版本的改进和调度特性不断丰富,产生了一些难以解决的矛盾,最主要的两个矛盾如下:
- 普通的Pod是在Pending状态触发调度并被实例化的,DaemonSet Controller并不是在这个状态调度Pod的,这种不一致容易误导和迷惑用户;
- Pod优先级调度是被Kubernetes Scheduler执行的,而DaemonSet
Controller并没有考虑到Pod优先级调度的问题,也产生了不一致的结果。
从Kubernetes 1.8开始,DaemonSet
的调度默认切换到Kubernetes Scheduler
进行,从而一劳永逸地解决了以上问题及未来可能的新问题,因为默认切换到了Kubernetes Scheduler
统一调度Pod
,因此DaemonSet
也能正确处理Taints
和Tolerations
的问题。
03 文末
本文主要讲解DaemonSet的概念已经使用场景,希望能帮助到到家,谢谢大家的阅读,本文完!