0
点赞
收藏
分享

微信扫一扫

k8s教程(18)-pod之DaemonSet(每个node上只调度一个pod)


文章目录

  • ​​01 引言​​
  • ​​02 DaemonSet​​
  • ​​2.1 应用场景​​
  • ​​2.2 举例​​
  • ​​2.3 注意事项​​
  • ​​03 文末​​

01 引言

声明:本文为《Kubernetes权威指南:从Docker到Kubernetes实践全接触(第5版)》的读书笔记

DaemonSet是 ​​Kubernetes1.2​​ 版本新增的一种资源对象,用于管理在集群中的每个Node上仅运行一份​Pod​的副本实例,如下图所示:

k8s教程(18)-pod之DaemonSet(每个node上只调度一个pod)_kubernetes

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​​:

k8s教程(18)-pod之DaemonSet(每个node上只调度一个pod)_容器化技术_02

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的概念已经使用场景,希望能帮助到到家,谢谢大家的阅读,本文完!


举报

相关推荐

0 条评论