在使用Kubernetes的时候,有些场景,比如监控各个节点的状态,使用 Deployment 或者 StatefulSet 都无法满足我们的需求,因为这个时候我们可能会有以下这些需求。
-
希望每个节点上都可以运行一个副本,且只运行一个副本。虽然通过调整 spec.replicas 的数值,可以使之等于节点数目,再配合一些调度策略(我们后面讲调度原理的时候会深入解释)可以实现这一点。但是如果节点数目发生了变化呢?
-
希望在新节点上也快速拉起副本。比如集群扩容,这个时候会有一些新节点加入进来,如何立即感知到这些节点,并在上面部署新的副本。
-
希望节点下线的时候,对应的 Pod 也可以被删除。
-
…
Kubernetes 提供的 DaemonSet 就可以完美地解决上述问题,其主要目的就是可以在集群内的每个节点上(或者指定的一堆节点上)都只运行一个副本,即 Pod 和 Node 是一一对应的关系。
DaemonSet使用场景
- 监控数据收集,比如可以将节点信息收集上报给 Prometheus;
- 日志的收集、轮转和清理;
- 监控节点状态,比如运行 node-problem-detector 来监测节点的状态,并上报给 APIServer;
- 负责在每个节点上网络、存储等组件的运行,比如 glusterd、ceph、flannel 等;
部署一个DaemonSet
创建 fluentd-elasticsearch-ds.yaml
文件
apiVersion: apps/v1 # 这个地方已经不是 extension/v1beta1 了,在1.16版本已经废弃了,请使用 apps/v1
kind: DaemonSet # 这个是类型名
metadata:
name: fluentd-elasticsearch # 对象名
namespace: kube-system # 所属的命名空间
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
restartPolicy: Always
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
使用命令kubectl apply -f fluentd-elasticsearch-ds.yaml
进行创建
创建完成后,使用命令kubectl get pod -n kube-system -l name=fluentd-elasticsearch
查看DaemonSet与Pod关联情况
[root@kubernetes yaml]# kubectl get pod -n kube-system -l name=fluentd-elasticsearch
NAME READY STATUS RESTARTS AGE
fluentd-elasticsearch-d9b46 0/1 ContainerCreating 0 9s
fluentd-elasticsearch-lmj9c 0/1 ContainerCreating 0 9s
fluentd-elasticsearch-xlmrt 0/1 ContainerCreating 0 9s
使用命令kubectl get ds -n kube-system fluentd-elasticsearch
查看DaemonSet整体状态
[root@kubernetes yaml]# kubectl get ds -n kube-system fluentd-elasticsearch
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
fluentd-elasticsearch 3 3 0 3 0 <none> 32s
在此处,DaemonSet缩写成了ds
输出的信息某些含义如下:
名称 | 含义 |
---|---|
DESIRED | 期望要创建的Pod个数 |
CURRENT | 当前已经存在的Pod个数 |
READY | 当前已经就绪的Pod个数 |
UP-TO-DATE | 最新创建的个数 |
AVAILABLE | 目前可用的Pod个数 |
NODE SELECTOR | 节点选择标签, 有时候我们只希望在部分节点上运行一些 Pod,比如我们只节点上带有 app=logging-node 的节点上运行一些服务,就可以通过这个标签选择器来实现 |