<p>DaemonSet is a Kubernetes beta resource that can ensure that exactly one pod is scheduled to a group of nodes. The group of nodes is all nodes by default, but can be limited to a subset using nodeSelector or the Alpha feature of node affinity/anti-affinity.</p>

<p>It seems that DaemonSet functionality can be achieved with replication controllers/replica sets with proper node affinity and anti-affinity.</p>

<p>Am I missing something? If that's correct should DaemonSet be deprecated before it even leaves Beta?</p>

<p>As you said, DaemonSet guarantees one pod per node for a subset of the nodes in the cluster. If you use ReplicaSet instead, you need to</p>

<ol>
<li>use the node affinity/anti-affinity and/or node selector to control the set of nodes to run on (similar to how DaemonSet does it).</li>
<li>use <a href="https://kubernetes.io/docs/user-guide/node-selection/" rel="nofollow noreferrer">inter-pod anti-affinity</a> to spread the pods across the nodes. </li>
<li>make sure the number of pods > number of node in the set, so that every node has one pod scheduled.</li>
</ol>

<p>However, ensuring (3) is a chore as the set of nodes can change over time. With DaemonSet, you don't have to worry about that, nor would you need to create extra, unschedulable pods. On top of that, DaemonSet does not rely on the scheduler to assign its pods, which makes it useful for cluster bootstrap (see <a href="https://kubernetes.io/docs/admin/daemons/" rel="nofollow noreferrer">How Daemon Pods are scheduled</a>).</p>

<p>See the "Alternative to DaemonSet" section in the <a href="https://kubernetes.io/docs/admin/daemons/" rel="nofollow noreferrer">DaemonSet doc</a> for more comparisons. DaemonSet is still the easiest way to run a per-node daemon without external tools.</p>
