8.实践篇:让我们聊一聊运维利器(一):DaemonSet控制器

8.实践篇:让我们聊一聊运维利器(一):DaemonSet控制器

2020-02-06 19:56:04

本章节给你带来第二个控制器:DaemonSet的讲解。

你将了解到:什么是DaemonSet,以及他的配置实战,最后我还引出了污点和容忍度的专有名词,如果你已经有了一定的基础,可以选择性地直接去阅读该章节(24.污点和容忍度深入研究)。

1.What is DaemonSet?

DaemonSet是一个确保每个符合规则的node节点有且仅有一个对应Pod的控制器。

你要注意以下两点:

1.新节点加入集群,也会新增一个Pod
2.当节点下线后,相应Pod也会被回收

DaemonSet控制器的应用场景,就是解决日志收集、监控系统等客户端部署的刚需。

2.命令补充

#我们可以使用kubectl get ds查看DaemonSet
[root@centos-1 mainfasts]#        kubectl get ds -A
NAMESPACE     NAME                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGE
kube-system   kube-flannel-ds-amd64     3         3         3       3            3           <none>                        4d1h
kube-system   kube-flannel-ds-arm       0         0         0       0            0           <none>                        4d1h
kube-system   kube-flannel-ds-arm64     0         0         0       0            0           <none>                        4d1h
kube-system   kube-flannel-ds-ppc64le   0         0         0       0            0           <none>                        4d1h
kube-system   kube-flannel-ds-s390x     0         0         0       0            0           <none>                        4d1h
kube-system   kube-proxy                3         3         3       3            3           beta.kubernetes.io/os=linux   4d1h

上图展示的flannel控制器,正是我们初始化集群的时候作用的。

它先根据node机器特征,使用其对应架构的flannel控制器;

然后根据DaemonSet控制器的特性,在每个node节点部署一个,且只部署一个!

3.实战配置

正如我上文所述,日志收集的业务场景是C/S架构,我们需要在待收集的机器部署一个客户端应用。

那我们一起来看一下,如何通过DaemonSet控制器来做这个事情呢?

1) 首先,编辑filebeat-daemonset.yaml,这里我们创建了一个filebeat的daemonset控制器,他们会和日常需求一样,在每个客户端node节点部署一个filebeat的pod容器。

你要注意:我们这里使用了一个节点的选择器:logcollecting: "on",节点上默认是没有这个标签的!
还记得如何给节点打标签吗?

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filebeat-ds
  labels:
    app: filebeat
spec:
  selector:
    matchLabels:
      app: filebeat
  template:
    metadata:
      labels:
        app: filebeat
    spec:
      containers:
      - name: filebeat
        image:  prima/filebeat:6.4.2
        env:
        - name: REDIS_HOST
          value: test.com:6379
        - name: LOG_LEVEL
          value: info
      nodeSelector:                       #节点选择器
        logcollecting: "on"               #自定义标签

2) 使用apply -f载入yaml,并观察。

可以发现,由于自定义标签的定义,没有符合的node节点,所以pod一个都没有生成!

[root@centos-1 mainfasts]# kubectl apply -f filebeat-daemonset.yaml  
daemonset.apps/filebeat-ds created

[root@centos-1 mainfasts]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
ngx-new-cb79d555-gqwf8   1/1     Running   0          29h
ngx-new-cb79d555-hcdr9   1/1     Running   0          30h

[root@centos-1 mainfasts]# kubectl get ds
NAME          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR      AGE
filebeat-ds   0         0         0       0            0           logcollecting=on   8s

3) 接下来,我们尝试给node01节点打上对应标签,发现pod已经开始调度至对应节点了

[root@centos-1 mainfasts]# kubectl label node centos-2.shared logcollecting="on" --overwrite
node/centos-2.shared labeled

[root@centos-1 mainfasts]# kubectl get pod
NAME                     READY   STATUS             RESTARTS   AGE
filebeat-ds-dlxwn        0/1     CrashLoopBackOff   1          5s
ngx-new-cb79d555-gqwf8   1/1     Running            0          29h
ngx-new-cb79d555-hcdr9   1/1     Running            0          30h

[root@centos-1 mainfasts]# kubectl get node --show-labels
NAME              STATUS   ROLES    AGE   VERSION   LABELS
centos-1.shared   Ready    master   4d    v1.16.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=centos-1.shared,kubernetes.io/os=linux,node-role.kubernetes.io/master=
centos-2.shared   Ready    <none>   4d    v1.16.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=centos-2.shared,kubernetes.io/os=linux,logcollceting=true,logcollecting=on
centos-3.shared   Ready    <none>   4d    v1.16.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=centos-3.shared,kubernetes.io/os=linux

4) 去除标签,你可以使用以下命令

 kubectl label node centos-2.shared logcollceting-

4.知识点扩展

不知大家是否发现一个现象:

资源的部署创建始终没有在master节点上调度!为什么?

答案:Master节点有Taints污点(NoSchedule),所以未定义容忍度的资源是不会调度上来的!

Taints:node-role.kubernetes.io/master:NoSchedule

[root@centos-1 mainfasts]# kubectl describe node centos-1.shared
Name:               centos-1.shared
Roles:              master
Labels:             beta.kubernetes.io/arch=amd64
beta.kubernetes.io/os=linux
kubernetes.io/arch=amd64
kubernetes.io/hostname=centos-1.shared
kubernetes.io/os=linux
node-role.kubernetes.io/master=
Annotations:        flannel.alpha.coreos.com/backend-data: {"VtepMAC":"6a:82:c9:37:15:dd"}
flannel.alpha.coreos.com/backend-type: vxlan
flannel.alpha.coreos.com/kube-subnet-manager: true
flannel.alpha.coreos.com/public-ip: 192.168.0.104
kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
node.alpha.kubernetes.io/ttl: 0
volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Mon, 25 Nov 2019 17:00:45 +0800
Taints:             node-role.kubernetes.io/master:NoSchedule.          #污点,pod调度的高级功能,不允许调度至master节点

@版权声明:51CTO独家出品,未经允许不能转载,否则追究法律责任


版权声明:
作者:WaterBear
链接:https://l-t.top/2044.html
来源:雷霆运维
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录