文章目录
- 01 引言
- 02 DaemonSet
- 2.1 应用场景
- 2.2 举例
- 2.3 注意事项
- 03 文末
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的概念已经使用场景,希望能帮助到到家,谢谢大家的阅读,本文完!