四、k8s入门系列----daemonset

  这节介绍跟deployment同级别的资源类型:daemonset 。

  Deployment部署在每个Node上的 POD 副本可以有多个,DaemonSet 则在每个Node节点上最多只能部署一个 POD 副本,默认DaemonSet 资源会在每个Node节点上部署 一个 POD 副本。

  DaemonSet常见的应用场景有:

  • 在各个节点上运行存储daemon,例如gluster或ceph
  • 在各个节点上运行日志收集daemon,例如filebeat或logstash
  • 在各个节点上运行监控daemon,例如prometheus node exporter

  创建daemonset 资源配置文件,daemonset 和 deployment 的配置文件差别不大,最主要的区别是少了一个 replicas 副本数参数:

[root@ylserver10686071 ~]# cat daemonset.yml 
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: app007
  namespace: prod
spec:
  selector:
    matchLabels:
      daemonset: web
  template:
    metadata:
      labels:
        daemonset: web
    spec:
      containers:
      - name: tomcat
        image: tomcat:8.0

  创建daemonset app007:

[root@ylserver10686071 ~]# kubectl apply -f daemonset.yml 
daemonset.apps/app007 created
[root@ylserver10686071 ~]# kubectl get daemonset -n prod -o wide
NAME     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE   CONTAINERS   IMAGES       SELECTOR
app007   3         3         3       3            3           <none>          50s   tomcat       tomcat:8.0   daemonset=web
[root@ylserver10686071 ~]# 

  查看replicaset 并没有相关信息,daemonset 创建的POD副本数最多为1,因此不需要 replicaset 控制器维护副本数:

[root@ylserver10686071 ~]# kubectl get replicaset -n prod -o wide|grep app007
[root@ylserver10686071 ~]# 

  查看daemonset控制器创建的POD资源,可以看到默认会在各个NODE上创建 一个 POD 副本:

[root@ylserver10686071 ~]# kubectl get pods -n prod -o wide|grep app007
app007-c9s49              1/1     Running   0          3m55s   10.233.75.63   ylserver10686071   <none>           <none>
app007-vll7r              1/1     Running   0          3m55s   10.233.67.30   ylserver10686072   <none>           <none>
app007-xhnqt              1/1     Running   0          3m56s   10.233.72.40   ylserver10686073   <none>           <none>
[root@ylserver10686071 ~]# 

  通过Node Label 也可以在指定的Node上创建POD,修改daemonset配置文件,添加nodeSelector标签:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: app007
  namespace: prod
spec:
  selector:
    matchLabels:
      daemonset: web
  template:
    metadata:
      labels:
        daemonset: web
    spec:
      nodeSelector:
        "type": ‘daemonset‘
      containers:
      - name: tomcat
        image: tomcat:8.0

  给Node打上标签,并更新daemonset app003 资源配置:

[root@ylserver10686071 ~]# kubectl label node ylserver10686072 type=daemonset
node/ylserver10686072 labeled
[root@ylserver10686071 ~]# kubectl apply -f daemonset.yml 
daemonset.apps/app007 configured

  查看daemonset app003 资源创建的daemonset 和 pod 信息,可以看到 daemonset 的 NODE SELECTOR已经配置了Node Label ,最终创建的POD 只在 指定的 NODE上部署一个副本:

[root@ylserver10686071 ~]#  kubectl get daemonset -n prod -o wide
NAME     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR    AGE   CONTAINERS   IMAGES       SELECTOR
app007   1         1         1       1            1           type=daemonset   14m   tomcat       tomcat:8.0   daemonset=web
[root@ylserver10686071 ~]# kubectl get pods -n prod -o wide|grep app007
app007-tkdv6              1/1     Running   0          18s   10.233.67.31   ylserver10686072   <none>           <none>

 总结一下:

  1. daemonset和deployment 属于同一级别的控制器,daemonset在各个NODE上创建的 POD 副本数最多为1,不需要 replicaset 控制器管理POD副本数;
  2. daemonset也可以使用 nodeSelector 标签选择器指定在哪些NODE上创建POD;
  3. daemonset 默认会在各个Node 上创建一个POD副本。

  

  

四、k8s入门系列----daemonset

上一篇:Golang 方法接收者为值与指针的区别


下一篇:流程控制