介绍
DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。 当有节点加入集群时, 也会为他们新增一个 Pod 。 当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
DaemonSet 的一些应用场景:
- 在每个节点上运行集群守护进程
- 在每个节点上运行日志收集守护进程
- 在每个节点上运行监控守护进程
比如部署:
- 集群存储,ceph或者glusterd
- K8S网络插件,calico
- 节点日志的收集:fluentd或者是filebeat
- 节点的监控:node exporter
- 服务暴露:部署一个ingress nginx
特点和用途
-
确保每个节点都有副本运行: 与 ReplicaSet 或 Deployment 不同,DaemonSet 保证集群中的每个节点都有一个(或多个)Pod 的副本在运行。这使得 DaemonSet 适用于在每个节点上运行系统级别的服务,以确保它们在整个集群中的覆盖范围。
-
节点感知性: DaemonSet 能够感知节点的变化,例如节点的添加、删除或更新。当节点加入集群或者节点标签变化时,DaemonSet 会自动在新节点上调度 Pod,并确保每个节点上的 Pod 数量保持一致。
-
用途广泛: DaemonSet 可用于运行各种类型的系统服务或守护进程,包括日志收集器、监控代理、网络插件、存储插件、安全代理等。这些服务通常需要在整个集群中运行,并且需要与节点的特定状态或资源进行交互。
-
资源限制和节点亲和性: 可以通过 Kubernetes 的资源限制和节点亲和性来配置 DaemonSet。这样可以确保 DaemonSet 中的 Pod 不会消耗集群中的过多资源,并且可以将它们调度到适当的节点上,以满足特定的需求或策略。
总之,DaemonSet 是一种非常有用的 Kubernetes 控制器,可用于在整个集群中运行系统级别的服务或守护进程,并确保它们在每个节点上都有一个副本在运行。
部署DaemonSet
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
基于 YAML 文件创建 DaemonSet:
kubectl apply -f daemonset.yaml
更新 DaemonSet
DaemonSet 有两种更新策略:
- OnDelete:使用 OnDelete 更新策略时,在更新 DaemonSet 模板后,只有当你手动删除老的 DaemonSet Pod 之后,新的 DaemonSet Pod 才会被自动创建。跟 Kubernetes 1.6 以前的版本类似。
- RollingUpdate:这是默认的更新策略。使用 RollingUpdate 更新策略时,在更新 DaemonSet 模板后, 老的 DaemonSet Pod 将被终止,并且将以受控方式自动创建新的 DaemonSet Pod。 更新期间,最多只能有 DaemonSet 的一个 Pod 运行于每个节点上。
滚动更新参数
要启用 DaemonSet 的滚动更新功能,必须设置 .spec.updateStrategy.type 为 RollingUpdate。
默认参数:
- .spec.updateStrategy.rollingUpdate.maxUnavailable(默认为 1),执行更新期间的最大不可用pod的数量,默认为1 的话就是允许最大不可用数量为1个pod。
- .spec.minReadySeconds(默认为 0),用于指定在容器启动后应等待的最小秒数,以便将该容器标记为“准备就绪” ,设置为0秒时指不等待pod就会直接将流量发送到该pod。
- .spec.updateStrategy.rollingUpdate.maxSurge (默认为 0),用于指定在进行 Deployment 的滚动更新时,可以同时创建的额外 Pod 的数量或百分比。例如,如果将 maxSurge 设置为 25%,则 Kubernetes 将允许在更新期间创建的 Pod 数量超出所需数量的 25%。这意味着在更新期间,可能会出现比原始副本数更多的 Pod,但是会在更新完成后将这些额外的 Pod 逐步删除。
更新方式:
修改yaml文件后更新
kubectl apply -f daemonset-update.yaml
Edit命令更新
edit方式更新适合所有K8S资源类型
# ds 是 daemonset 缩写
kubectl edit ds fluentd-elasticsearch
更新容器镜像
# --re cored 参数好像是要废弃了 可以设置文更新以后用annotate 添加注释。
kubectl set image ds/fluentd-elasticsearch fluentd-elasticsearch=quay.io/fluentd_elasticsearch/fluentd:v2.6.0 --record
# 添加注释 双引号里面的随便填写
kubectl annotate ds fluentd-elasticsearch kubernetes.io/change-cause="kubectl set image ds/fluentd-elasticsearch fluentd-elasticsearch=quay.io/fluentd_elasticsearch/fluentd:v2.6.0"
查看更新进度
kubectl rollout status ds fluentd-elasticsearch
回滚 DaemonSet
列出 DaemonSet 的所有版本:
kubectl rollout history daemonset fluentd-elasticsearch
此命令返回 DaemonSet 版本列表:
daemonset.apps/calico-node
REVISION CHANGE-CAUSE
1 <none>
2 kubectl set image ds/fluentd-elasticsearch fluentd-elasticsearch=quay.io/fluentd_elasticsearch/fluentd:v2.6.0 --record
3 kubectl set image ds/fluentd-elasticsearch fluentd-elasticsearch=quay.io/fluentd_elasticsearch/fluentd:v2.7.0 --record
回滚到指定版本
# 在 --to-revision 中指定你从步骤 1 中获取的修订版本
kubectl rollout undo daemonset fluentd-elasticsearch --to-revision=2
查看回滚进度
kubectl rollout status ds fluentd-elasticsearch