文章目录
一、DaemonSet控制器理论知识
1、DaemonSet控制器是什么?
Kubernetes中的DaemonSet(简写ds)控制器是一种用来运行守护进程应用程序的控制器,它确保每个Node节点都运行具有指定配置的 Pod副本,当Node节点的加入或删除DaemonSet控制器会自动创建或删除相应的 Pod副本。
特点:
-
每个节点只运行一个实例:DaemonSet确保每个节点上只运行一个 Pod 实例。这确保了在每个节点上部署的守护进程能够与主机紧密结合,以提供更高的可用性和可靠性。
-
滚动升级:在更新 DaemonSet 时,可以通过几种不同的方式控制滚动升级。可以选择一次更新所有 Pod 实例,也可以在运行新版本之前逐步删除旧的 Pod 实例。
-
在启动前执行任务:可以通过 DaemonSet 的
2、DaemonSet控制器工作原理
DaemonSet控制器会监听K8s的daemonset对象、pod对象、node对象,如果这些被监听的对象变动,就会触发syncLoop循环,让K8s集群朝着daemonset对象描述的状态进行演进。
3、DaemonSet典型应用场景
-
日志和指标收集:在每个节点上运行日志和指标收集器,比如flunentd 、 logstash、filebeat等。
-
数据存储:在每个节点上运行数据存储,比如glusterd 、ceph等。
-
监控组件:在每个节点上运行监控组件,比如prometheus、node_exporter、collectd等。
4、DaemonSet与Deployment的区别
- deployment创建出来的Pod,会分布在各个Node节点,每个节点都可能运行好几个副本。
- daemonset创建出来的Pod,每个Node节点上最多只能运行一个Pod副本,通常用来运行后台服务和守护进程应用程序。
因此,一般情况下,如果要部署后台服务和守护进程等单节点应用程序,可以使用DaemonSet;如果需要部署复杂的应用程序,如Web服务等,那就需要使用deployment了。
二、案例:DaemonSet控制器实战演示
1、使用DaemonSet部署日志收集组件
部署 fluentd 日志收集组件(只简单演示DaemonSet使用,并非做ELK整体实验)YAML资源清单如下:
cat fluentd-daemonset.yaml
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: elasticsearch-fluentd
namespace: default
spec:
selector:
matchLabels:
app: elasticsearch-fluentd
template:
metadata:
labels:
app: elasticsearch-fluentd
spec:
tolerations: # 定义容忍度,运行在master节点运行(根据自己master的污点定义)
- effect: NoSchedule
key: node-role.kubernetes.io/control-plane
volumes: # 定义卷名称为 system-log
- name: system-log
hostPath:
path: /var/log
containers:
- name: elasticsearch-fluentd
image: qinziteng/fluentd:2.5.1
imagePullPolicy: IfNotPresent
resources: # 定义资源限制
requests:
cpu: 100m
memory: 300Mi
limits:
memory: 300Mi
volumeMounts:
- name: system-log # 使用system-log卷,挂载到容器/var/log目录
mountPath: /var/log
执行YAML文件:
kubectl apply -f fluentd-daemonset.yaml
查看Pod状态,如下图可以看到分包在K8s集群每个节点上创建Pod
kubectl get pods -o wide
2、DaemonSet管理Pod滚动更新
DaemonSet更新策略在 spec.updateStrategy
字段定义,目前支持两种更新策略:
- rollingUpdate:由于daemonset不支持一个节点运行多个Pod,所以rollingUpdate更新策略是先删除在更新。
- OnDelete:默认不做更新,需要手动删除后更新。
第一步:创建daemonset资源并使用 nginx:1.18.0 镜像,YAML 如下:
cat web-daemonset.yaml
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: web-daemonset
namespace: default
spec:
updateStrategy:
rollingUpdate:
maxUnavailable: 1
selector:
matchLabels:
app: web-daemonset
template:
metadata:
labels:
app: web-daemonset
spec:
tolerations:
- effect: NoSchedule # 容忍度根据master 污点定义
key: node-role.kubernetes.io/control-plane
containers:
- name: web-daemonset
image: nginx:1.18.0
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 100m
memory: 300Mi
limits:
memory: 300Mi
执行YAML 文件:
kubectl apply -f web-daemonset.yaml
查看Pod状态:
kubectl get pods -o wide -l app=web-daemonset
第二步:更新镜像使用nginx:latest
只更改image地方,其余地方不做操作,然后重新apply 使其生效。
kubectl apply -f web-daemonset.yaml
第三步:验证镜像是否更新
kubectl describe pod web-daemonset-2vtd9|grep Image
可以看到镜像版本更新成功了,这种更新其实就是先删除旧版本,再使用新的镜像版本进行创建。
三、总结
- DaemonSet控制器用于控制每个Node节点有运行指定Pod副本集,当添加或删除Node节点时,DaemonSet会自动创建指定的Pod副本集,来保证每一个Node节点都运行此Pod。用于收集日志、监控等场景。
- DaemonSet rollingUpdate更新策略是先删除旧版本Pod,在创建新版本Pod,因为每个Node节点只能创建一个Pod副本集。