一起养成写作习惯!这是我参与「掘金日新计划 · 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并创建新的PodOnDelete:默认策略,更新DaemonSet模板后,只有手动删除了旧的Pod才会创建新的Pod
在使用 RolingUpdate 策略时,还可以设置字段:
spec.updateStrategy.rollingUpdate.maxUnavailable,默认值为 1spec.minReadySeconds,默认值为 0
具体的设置信息可以如下所示:
---
spec:
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 2
minReadySeconds: 30