在部署服务时,有一类服务是需要在每台node上都启动一个的(例如,日志收集,网络存储设置等基础服务,最典型的,搭建k8s集群master节点时,需要创建一个网络管理,例如,flannel,这个应用就是以DaemonSet形式部署的)。如果在master上用部署Deployment的方式也能实现,为了保证能调度到每台node,就需要使用affinity来进行关联,需要使用IN条件来选中多个机器的label。但是k8s提供了更便捷的方式,使用DaemonSet来实现:
以Nginx为例:
apiVersion: apps/v1 kind: DaemonSet metadata: name: nginx-test spec: selector: matchLabels: app: web_server_test template: metadata: labels: app: web_server_test spec: # nodeSelector: # slaveNum: "88" # affinity: # nodeAffinity: # requiredDuringSchedulingIgnoredDuringExecution: # nodeSelectorTerms: # - matchExpressions: # - key: slaveNum # operator: In # values: # - "83" # - "88" containers: - name: nginx image: nginx:latestyaml的声明方式和Deployment基本一致,只是去掉了replicas属性。上述yaml在master节点执行之后,会默认的运行到所有node机器上。
如果想指定一台机器,则打开nodeSelector注释内容即可;如果想指定到一台以上的node,但是并不是所有node,则打开affinity注释内容,修改匹配规则即可。
注:DaemonSet 的 pods 是被 DaemonSet controller 创建和调度管理的,并不依赖master的scheduler,因此它没有pending状态
