Skip to content

DaemonSet

概念

  • 相比ReplicaSet将副本随机分配在各个节点上,DaemonSet可以在每个节点上只运行一个Pod副本。它没有期望副本(replicas)的概念,因为它的工作是确保一个Pod匹配它的选择器并在每个节点上运行。
  • 如果节点下线,那么DaemonSet不会在其他地方重新创建Pod,但是当一个新的节点加入集群时,它会立刻部署一个新的Pod的实例。若无意中删除一个节点上的Pod,那么DaemonSet会重新部署一个新的Pod。
  • DaemonSet一般用于管理系统服务,即使节点配置了不可调度,DaemonSet也会部署Pod到此节点。需要注意的是:DaemonSet不会将Pod部署在master节点上

创建DaemonSet

yaml
apiVersion: apps/v1
kind: DaemonSet # 设置DaemonSet类型
metadata:
	name: ssd-monitor
spec:
	selector: # 指定标签选择器
		matchLabels:
			app: ssd-monitor
	template:
		metadata:
			labels:
				app: ssd-monitor
		spec:
			nodeSelector: # 这些Pod只能部署到disk=ssd的node节点上
				disk: ssd
			containers:
			- name: main
			  image: luksa/ssd-monitor
详细信息

daemonSet会默认添加如下容忍度:

node.kubernetes.io/not-readyNoExecute1.13+当出现类似网络断开的情况导致节点问题时,DaemonSet Pod 不会被逐出。
node.kubernetes.io/unreachableNoExecute1.13+当出现类似于网络断开的情况导致节点问题时,DaemonSet Pod 不会被逐出。
node.kubernetes.io/disk-pressureNoSchedule1.8+DaemonSet Pod 被默认调度器调度时能够容忍磁盘压力属性。
node.kubernetes.io/memory-pressureNoSchedule1.8+DaemonSet Pod 被默认调度器调度时能够容忍内存压力属性。
node.kubernetes.io/unschedulableNoSchedule1.12+DaemonSet Pod 能够容忍默认调度器所设置的 unschedulable 属性.
node.kubernetes.io/network-unavailableNoSchedule1.12+DaemonSet 在使用宿主网络时,能够容忍默认调度器所设置的 network-unavailable 属性。

换个角度:也就是节点出现如上污点时,daemonSet能够被调度或不被驱逐。

模拟节点标签不匹配

shell
# 先将节点设置label: disk=ssd
kubectl label node k8s-node1 disk=ssd
# 创建daemonset
kubectl apply -f ssd-monitor-daemonset.yaml
# 我们修改node的标签为disk=hdd,ds管理的pod会被删除
kubectl label nodes k8s-node1 disk=hdd --overwrite