You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/concepts/workloads/controllers/daemonset.md
+59-47Lines changed: 59 additions & 47 deletions
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,10 @@
1
1
---
2
2
approvers:
3
+
- enisoc
3
4
- erictune
5
+
- foxish
6
+
- janetkuo
7
+
- kow3ns
4
8
title: Daemon Sets
5
9
---
6
10
@@ -9,9 +13,9 @@ title: Daemon Sets
9
13
10
14
## What is a DaemonSet?
11
15
12
-
A _DaemonSet_ ensures that all (or some) nodes run a copy of a pod. As nodes are added to the
13
-
cluster, pods are added to them. As nodes are removed from the cluster, those pods are garbage
14
-
collected. Deleting a DaemonSet will clean up the pods it created.
16
+
A _DaemonSet_ ensures that all (or some) Nodes run a copy of a Pod. As nodes are added to the
17
+
cluster, Pods are added to them. As nodes are removed from the cluster, those Pods are garbage
18
+
collected. Deleting a DaemonSet will clean up the Pods it created.
15
19
16
20
Some typical uses of a DaemonSet are:
17
21
@@ -47,20 +51,26 @@ A DaemonSet also needs a [`.spec`](https://git.k8s.io/community/contributors/dev
47
51
48
52
### Pod Template
49
53
50
-
The `.spec.template` is the only required field of the`.spec`.
54
+
The `.spec.template` is one of the required fields in`.spec`.
51
55
52
-
The `.spec.template` is a [pod template](/docs/concepts/workloads/pods/pod-overview/#pod-templates). It has exactly the same schema as a [pod](/docs/concepts/workloads/pods/pod/), except it is nested and does not have an `apiVersion` or `kind`.
56
+
The `.spec.template` is a [pod template](/docs/concepts/workloads/pods/pod-overview/#pod-templates). It has exactly the same schema as a [Pod](/docs/concepts/workloads/pods/pod/), except it is nested and does not have an `apiVersion` or `kind`.
53
57
54
-
In addition to required fields for a pod, a pod template in a DaemonSet has to specify appropriate
58
+
In addition to required fields for a Pod, a Pod template in a DaemonSet has to specify appropriate
55
59
labels (see [pod selector](#pod-selector)).
56
60
57
-
A pod template in a DaemonSet must have a [`RestartPolicy`](/docs/user-guide/pod-states)
61
+
A Pod Template in a DaemonSet must have a [`RestartPolicy`](/docs/user-guide/pod-states)
58
62
equal to `Always`, or be unspecified, which defaults to `Always`.
59
63
60
64
### Pod Selector
61
65
62
66
The `.spec.selector` field is a pod selector. It works the same as the `.spec.selector` of
63
-
a [Job](/docs/concepts/jobs/run-to-completion-finite-workloads/) or other new resources.
67
+
a [Job](/docs/concepts/jobs/run-to-completion-finite-workloads/).
68
+
69
+
As of Kubernetes 1.8, you must specify a pod selector that matches the labels of the
70
+
`.spec.template`. The pod selector will no longer be defaulted when left empty. Selector
71
+
defaulting was not compatible with `kubectl apply`. Also, once a DaemonSet is created,
72
+
its `spec.selector` can not be mutated. Mutating the pod selector can lead to the
73
+
unintentional orphaning of Pods, and it was found to be confusing to users.
64
74
65
75
The `spec.selector` is an object consisting of two fields:
66
76
@@ -73,32 +83,34 @@ When the two are specified the result is ANDed.
73
83
If the `.spec.selector` is specified, it must match the `.spec.template.metadata.labels`. If not
74
84
specified, they are defaulted to be equal. Config with these not matching will be rejected by the API.
75
85
76
-
Also you should not normally create any pods whose labels match this selector, either directly, via
77
-
another DaemonSet, or via other controller such as ReplicationController. Otherwise, the DaemonSet
78
-
controller will think that those pods were created by it. Kubernetes will not stop you from doing
79
-
this. One case where you might want to do this is manually create a pod with a different value on
86
+
Also you should not normally create any Pods whose labels match this selector, either directly, via
87
+
another DaemonSet, or via other controller such as ReplicaSet. Otherwise, the DaemonSet
88
+
controller will think that those Pods were created by it. Kubernetes will not stop you from doing
89
+
this. One case where you might want to do this is manually create a Pod with a different value on
80
90
a node for testing.
81
91
92
+
If you attempt to create a DaemonSet such that
93
+
82
94
### Running Pods on Only Some Nodes
83
95
84
96
If you specify a `.spec.template.spec.nodeSelector`, then the DaemonSet controller will
85
-
create pods on nodes which match that [node
97
+
create Pods on nodes which match that [node
86
98
selector](/docs/concepts/configuration/assign-pod-node/). Likewise if you specify a `.spec.template.spec.affinity`,
87
-
then DaemonSet controller will create pods on nodes which match that [node affinity](/docs/concepts/configuration/assign-pod-node/).
88
-
If you do not specify either, then the DaemonSet controller will create pods on all nodes.
99
+
then DaemonSet controller will create Pods on nodes which match that [node affinity](/docs/concepts/configuration/assign-pod-node/).
100
+
If you do not specify either, then the DaemonSet controller will create Pods on all nodes.
89
101
90
102
## How Daemon Pods are Scheduled
91
103
92
-
Normally, the machine that a pod runs on is selected by the Kubernetes scheduler. However, pods
93
-
created by the Daemon controller have the machine already selected (`.spec.nodeName` is specified
94
-
when the pod is created, so it is ignored by the scheduler). Therefore:
104
+
Normally, the machine that a Pod runs on is selected by the Kubernetes scheduler. However, Pods
105
+
created by the DaemonSet controller have the machine already selected (`.spec.nodeName` is specified
106
+
when the Pod is created, so it is ignored by the scheduler). Therefore:
95
107
96
108
- The [`unschedulable`](/docs/admin/node/#manual-node-administration) field of a node is not respected
97
109
by the DaemonSet controller.
98
-
- DaemonSet controller can make pods even when the scheduler has not been started, which can help cluster
110
+
-The DaemonSet controller can make Pods even when the scheduler has not been started, which can help cluster
99
111
bootstrap.
100
112
101
-
Daemon pods do respect [taints and tolerations](/docs/concepts/configuration/assign-pod-node/#taints-and-tolerations-beta-feature),
113
+
Daemon Pods do respect [taints and tolerations](/docs/concepts/configuration/assign-pod-node/#taints-and-tolerations-beta-feature),
102
114
but they are created with `NoExecute` tolerations for the following taints with no `tolerationSeconds`:
103
115
104
116
-`node.alpha.kubernetes.io/notReady`
@@ -122,32 +134,32 @@ Note that all above `NoSchedule` taints above are created only in version 1.8 or
122
134
123
135
## Communicating with Daemon Pods
124
136
125
-
Some possible patterns for communicating with pods in a DaemonSet are:
137
+
Some possible patterns for communicating with Pods in a DaemonSet are:
126
138
127
139
-**Push**: Pods in the DaemonSet are configured to send updates to another service, such
128
140
as a stats database. They do not have clients.
129
-
-**NodeIP and Known Port**: Pods in the DaemonSet can use a `hostPort`, so that the pods are reachable via the node IPs. Clients know the list of node IPs somehow, and know the port by convention.
130
-
-**DNS**: Create a [headless service](/docs/user-guide/services/#headless-services) with the same pod selector,
141
+
-**NodeIP and Known Port**: Pods in the DaemonSet can use a `hostPort`, so that the Pods are reachable via the node IPs. Clients know the list of node IPs somehow, and know the port by convention.
142
+
-**DNS**: Create a [headless service](/docs/user-guide/services/#headless-services) with the same Pod selector,
131
143
and then discover DaemonSets using the `endpoints` resource or retrieve multiple A records from
132
144
DNS.
133
-
-**Service**: Create a service with the same pod selector, and use the service to reach a
145
+
-**Service**: Create a service with the same Pod selector, and use the service to reach a
134
146
daemon on a random node. (No way to reach specific node.)
135
147
136
148
## Updating a DaemonSet
137
149
138
-
If node labels are changed, the DaemonSet will promptly add pods to newly matching nodes and delete
139
-
pods from newly not-matching nodes.
150
+
If node labels are changed, the DaemonSet will promptly add Pods to newly matching nodes and delete
151
+
Pods from newly not-matching nodes.
140
152
141
-
You can modify the pods that a DaemonSet creates. However, pods do not allow all
153
+
You can modify the Pods that a DaemonSet creates. However, Pods do not allow all
142
154
fields to be updated. Also, the DaemonSet controller will use the original template the next
143
155
time a node (even with the same name) is created.
144
156
145
157
146
-
You can delete a DaemonSet. If you specify `--cascade=false` with `kubectl`, then the pods
158
+
You can delete a DaemonSet. If you specify `--cascade=false` with `kubectl`, then the Pods
147
159
will be left on the nodes. You can then create a new DaemonSet with a different template.
148
-
the new DaemonSet with the different template will recognize all the existing pods as having
149
-
matching labels. It will not modify or delete them despite a mismatch in the pod template.
150
-
You will need to force new pod creation by deleting the pod or deleting the node.
160
+
The new DaemonSet with the different template will recognize all the existing Pods as having
161
+
matching labels. It will not modify or delete them despite a mismatch in the Pod template.
162
+
You will need to force new Pod creation by deleting the Pod or deleting the node.
151
163
152
164
In Kubernetes version 1.6 and later, you can [perform a rolling update](/docs/tasks/manage-daemon/update-daemon-set/) on a DaemonSet.
153
165
@@ -162,35 +174,35 @@ It is certainly possible to run daemon processes by directly starting them on a
162
174
running such processes via a DaemonSet:
163
175
164
176
- Ability to monitor and manage logs for daemons in the same way as applications.
165
-
- Same config language and tools (e.g. pod templates, `kubectl`) for daemons and applications.
177
+
- Same config language and tools (e.g. Pod templates, `kubectl`) for daemons and applications.
166
178
- Future versions of Kubernetes will likely support integration between DaemonSet-created
167
-
pods and node upgrade workflows.
179
+
Pods and node upgrade workflows.
168
180
- Running daemons in containers with resource limits increases isolation between daemons from app
169
-
containers. However, this can also be accomplished by running the daemons in a container but not in a pod
181
+
containers. However, this can also be accomplished by running the daemons in a container but not in a Pod
170
182
(e.g. start directly via Docker).
171
183
172
184
### Bare Pods
173
185
174
-
It is possible to create pods directly which specify a particular node to run on. However,
175
-
a DaemonSet replaces pods that are deleted or terminated for any reason, such as in the case of
186
+
It is possible to create Pods directly which specify a particular node to run on. However,
187
+
a DaemonSet replaces Pods that are deleted or terminated for any reason, such as in the case of
176
188
node failure or disruptive node maintenance, such as a kernel upgrade. For this reason, you should
177
-
use a DaemonSet rather than creating individual pods.
189
+
use a DaemonSet rather than creating individual Pods.
178
190
179
191
### Static Pods
180
192
181
-
It is possible to create pods by writing a file to a certain directory watched by Kubelet. These
193
+
It is possible to create Pods by writing a file to a certain directory watched by Kubelet. These
182
194
are called [static pods](/docs/concepts/cluster-administration/static-pod/).
183
-
Unlike DaemonSet, static pods cannot be managed with kubectl
184
-
or other Kubernetes API clients. Static pods do not depend on the apiserver, making them useful
185
-
in cluster bootstrapping cases. Also, static pods may be deprecated in the future.
195
+
Unlike DaemonSet, static Pods cannot be managed with kubectl
196
+
or other Kubernetes API clients. Static Pods do not depend on the apiserver, making them useful
197
+
in cluster bootstrapping cases. Also, static Pods may be deprecated in the future.
186
198
187
-
### Replication Controller
199
+
### Deployments
188
200
189
-
DaemonSet are similar to [Replication Controllers](/docs/user-guide/replication-controller) in that
190
-
they both create pods, and those pods have processes which are not expected to terminate (e.g. web servers,
201
+
DaemonSets are similar to [Deployments](/docs/concepts/workloads/controllers/deployment.md) in that
202
+
they both create Pods, and those Pods have processes which are not expected to terminate (e.g. web servers,
191
203
storage servers).
192
204
193
-
Use a replication controller for stateless services, like frontends, where scaling up and down the
205
+
Use a Deployment for stateless services, like frontends, where scaling up and down the
194
206
number of replicas and rolling out updates are more important than controlling exactly which host
195
-
the pod runs on. Use a Daemon Controller when it is important that a copy of a pod always run on
196
-
all or certain hosts, and when it needs to start before other pods.
207
+
the Pod runs on. Use a DaemonSet when it is important that a copy of a Pod always run on
208
+
all or certain hosts, and when it needs to start before other Pods.
0 commit comments