一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情。
一、 DaemonSet
简介
DaemonSet
资源对象可以保证 Kubernetes
集群中所有或部分 Node
都只能够运行一份 Pod
副本实例。当有新的 Node
加入集群时,kubernetes
将会在新 Node
上创建新的 Pod
副本;如果有 Node
被集群移除,节点上对应的 Pod
也会被清除。
-
DaemonSet
的作用:在每个Node
上都调度一个Pod
-
DaemonSet
解决了:如何同时在集群中的所有节点上提供基础服务和守护进程
DaemonSet
会管理所有 Node
上的 Pod
副本,保持集群中的 Pod
和 Node
为一一对应的关系,同时也负责对它们进行更新和删除。
DaemonSet
类似于计算机中的守护进程,运行集群中必备的基础服务,常见的用法如下:
- 集群存储:比如
GlusterFS
存储、Ceph
存储等 - 日志收集:比如
Fluentd
、Logstash
等 - 性能监控:用于采集
Node
的运行数据,比如Prometheus Node Exporter
、collectd
、New Relic agent
、Ganglia gmond
等 - 系统程序:比如
kube-proxy
、kube-dns
、glusterd
、ceph
等
(1)举个栗子
需求: 在每个
Node
节点都运行一个fluentd
容器,并且每个容器都需要挂载物理机的两个目录/var/log
和/var/lib/docker/containers
- 创建文件
fluentd-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-cloud-logging
namespace: kube-system
spec:
selector:
matchLabels:
k8s-app: fluentd-cloud-logging
template:
metadata:
namespace: kube-system
labels:
k8s-app: fluentd-cloud-logging
spec:
containers:
- name: fluentd-cloud-logging
image: registry-vpc.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/fluentd-elasticsearch:1.17
resources:
limits:
cpu: 100m
memory: 200Mi
env:
- name: FLUENTD_ARGS
value: -q
volumeMounts:
- name: varlog
mountPath: /var/log
readOnly: false
- name: containers
mountPath: /var/lib/docker/containers
readOnly: false
volumes:
- name: varlog
hostPath:
path: /var/log
- name: containers
hostPath:
path: /var/lib/docker/containers
- 执行创建
$ kubectl create -f fluentd-ds.yaml
daemonset.apps/fluentd-cloud-logging created
- 查看创建好的
DaemonSet
和Pod
$ kubectl get daemonset -n kube-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
fluentd-cloud-logging 2 2 2 2 2 <none> 63s
- 创建
fluentd-cloud
# 分别在 kube-node-1 和 kube-node-2 两个节点上创建了一个 fluentd-cloud Pod
$ kubectl get pods -n kube-system -o wide|grep fluentd-cloud-logging
- 执行删除
$ kubectl delete daemonsets.app fluentd-cloud-logging -n kube-system
daemonset.apps "fluentd-cloud-logging" deleted
# 也可以通过 YAML 文件删除
$ kubectl delete -f fluentd-ds.yaml
daemonset.apps/fluentd-cloud-logging deleted
二、滚动更新
DaemonSet
可以使用字段 spec.updateStrategy.type
设置更新策略,目前支持两种策略:
RolingUpdate
:更新DaemonSet
模板后,自动删除旧的Pod
并创建新的Pod
OnDelete
:默认策略,更新DaemonSet
模板后,只有手动删除了旧的Pod
才会创建新的Pod
在使用 RolingUpdate
策略时,还可以设置字段:
spec.updateStrategy.rollingUpdate.maxUnavailable
,默认值为 1spec.minReadySeconds
,默认值为 0
具体的设置信息可以如下所示:
---
spec:
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 2
minReadySeconds: 30