K8s系列之:DaemonSet在每个Node上调度一个Pod
DaemonSet用于管理在集群中每个Node上仅运行一份Pod副本实例。
这种用法适合一些有这种需求的应用。
- 在每个Node上运行一个GlusterFS存储或者Ceph存储的Daemon进程。
- 在每个Node上运行一个日志采集程序,例如Logstach。
- 在每个Node上运行一个性能监控程序,采集该Node的运行性能数据,例如Prometheus等。
DaemonSet的Pod调度策略与RC类似,除了使用系统内置的算法在每台Node上进行调度,也可以在Pod的定义中使用NodeSelector或NodeAffinity来指定满足条件的Node范围进行调度。
例子:在每台Node上启动一个fluentd容器,配置文件fluentd-ds.yaml的内容如下,其中挂载了物理机的两个目录"/var/log"和"/var/lib/docker/containers"。
apiVersion: extensions/v1beta1
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.3
resources:
limits:
cpu: 100m
memory: 200Mi
env:
- name: FLUENTD_ARGS
value: -q
volumeMounts:
- name: containers
mountPath: /var/lib/docker/containers
readOnly: false
- name: varlog
mountPath: /var/log
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:
kubectl get daemonset --namespace=kube-system
NAME DESIRED CURRENT NODE_SELECTOR AGE
fluentd-cloud-logging 2 2 <none> 3s
kubectl get pods --namespace=kube-system
NAME READY STATUS RESTARTS AGE
fluentd-cloud-logging-7tw9z 1/1 Running 0 1h
fluentd-cloud-logging-aqdn1 1/1 Running 0 1h