0%

DaemonSet

DaemonSet 确保所有(或某些)节点都运行Pod的副本。Daemon 在计算机中领域的意思是守护程序。

当一个新的节点被添加集群时,DaemonSet 会在该节点上创建一个新的Pod。当一个节点从集群中删除时,这些Pod会被回收。删除DaemonSet将清除其创建的Pod。

简单的示例

在每一个Node上都运行一个nginx:1.16的Pod。Github 链接:https://raw.githubusercontent.com/chengqing-su/kubernetes-learning/master/daemon-set/nginx-daemon-set.yaml。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-daemon-set
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.16

创建/更新/删除

在此之前,我已经创建了一个3个master节点,3个worker节点的Kubernetes集群。

nodes

创建

执行命令:

1
kubectl apply -f https://raw.githubusercontent.com/chengqing-su/kubernetes-learning/master/daemon-set/nginx-daemon-set.yaml

结果:

create

DaemonSet 也是直接去管理Pod的,下面展示的是nginx-daemon-set-d6c6lmetadata.其metadata.ownerReferences指向的是上面创建的名为nginx-daemon-set的DaemonSet。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
metadata:
annotations:
cni.projectcalico.org/podIP: 10.42.5.218/32
creationTimestamp: "2020-02-25T12:27:10Z"
generateName: nginx-daemon-set-
labels:
app: nginx
controller-revision-hash: 59d5958c9f
pod-template-generation: "1"
name: nginx-daemon-set-d6c6l
namespace: default
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: DaemonSet
name: nginx-daemon-set
uid: fd40fc4d-c31f-42ca-bdc3-48c13e7348f1
resourceVersion: "11004234"
selfLink: /api/v1/namespaces/default/pods/nginx-daemon-set-d6c6l
uid: 2dde39cb-867c-46a9-b211-22d88e489d9a

更新

升级nginx容器的版本到1.17。创建了一个新的manifest,其地址是:https://raw.githubusercontent.com/chengqing-su/kubernetes-learning/master/daemon-set/nginx-daemon-set-update.yaml

执行命令:

1
kubectl apply -f https://raw.githubusercontent.com/chengqing-su/kubernetes-learning/master/daemon-set/nginx-daemon-set-update.yaml

结果:

update

DeamonSet 更新PodTemplate之后,会自动删除旧的Pod,然后再根据新的PodTemplate创建新的Pod。

删除

从DaemonSet中删除一个Pod

从上述DaemonSet中删除名为nginx-daemon-set-cpqqd的Pod

执行命令:

1
kubectl delete pod nginx-daemon-set-cpqqd

结果:

delete-a-pod

当该Pod被删除之后,DaemonSet会再旧Pod运行的节点上启动一个新的Pod。

删除 DaemonSet

执行命令:

1
kubectl delete daemonset nginx-daemon-set

结果:

delete

什么时候使用

DaemonSet的一些典型用法是:

  • 在每个节点上运行集群存储守护程序,例如glusterd,ceph。

  • 在每个节点上运行日志收集守护程序,例如fluentd或filebeat。

  • 在每个节点(例如Prometheus Node Exporter,Flowmill,Sysdig Agent,collected,Dynatrace OneAgent,AppDynamics Agent,Datadog代理,New Relic代理,Ganglia gmond,Instana代理或Elastic Metricbeat)上运行节点监视守护程序。