在部署服务时,有一类服务是需要在每台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:latest

yaml的声明方式和Deployment基本一致,只是去掉了replicas属性。上述yaml在master节点执行之后,会默认的运行到所有node机器上。

如果想指定一台机器,则打开nodeSelector注释内容即可;如果想指定到一台以上的node,但是并不是所有node,则打开affinity注释内容,修改匹配规则即可。

注:DaemonSet 的 pods 是被 DaemonSet controller 创建和调度管理的,并不依赖master的scheduler,因此它没有pending状态

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐