
Kubernetes DaemonSet讲解
需求来源
背景问题
我们可以让每个集群内的节点都运行一个相同的Pod吗?
如果这样做,以下的问题有什么方式来解决:
1. 我们如何保证每个节点都运行一个Pod?
2. 如果新节点加入集群,如何感知并部署对应的Pod?
3. 如果有节点退出,如何删除对应的Pod?
4. 如果Pod状态异常,如何监控并恢复Pod的状态?
DaemonSet 守护进程控制器
DaemonSet 能帮助我们做什么事情?
1. 保证集群内每一个(或一些节点)都运行一组相同的Pod
2. 跟踪集群节点状态,保证新加入的节点自动创建对应的Pod
3. 跟踪集群节点状态,保证移除的节点删除对应的Pod
4. 跟踪Pod状态,保证每个节点Pod处于运行状态
用例解读
DaemonSet 语法
适用场景:
1. 集群存储进程:glusterd,ceph
2. 日志收集进程:fluentd,logstash
3. 需要在每个节点运行的监控收集器
DaemonSet-Demo.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
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
查看DaemonSet状态
# kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
fluentd-elasticsearch 1 1 1 1 1 <none> 13s
# kubectl get pods
NAME READY STATUS RESTARTS AGE
fluentd-elasticsearch-b2t7l 1/1 Running 0 19s
状态描述:(本集群公有一个节点[所以大家可以多弄几个节点])
- DESIRED: 需要的Pod个数
- UP-TO-DATE: 最新创建的个数
- CURRENT: 当前已存在的pod个数
- AVAILABLE: 可用pod个数
- READY: 就绪的个数
- NODE SELECTOR: 节点选择标签
更新DaemonSet
更新策略:
1. RollingUpdate: DaemonSet默认更新策略,当更新DaemonSet模板后,老的Pod会被先删除,然后再去创建新的Pod,可以配合健康检查做滚动更新。
2. OnDelete: 当DaemonSet模板更新后,只有手动的删除某一个对应的Pod,此节点Pod才会被更新。
# 更新镜像
# kubectl set image ds/fluentd-elasticsearch fluentd-elasticsearch=fluent/fluentd:v1.4
daemonset.extensions/fluentd-elasticsearch image updated
# kubectl rollout status ds/fluentd-elasticsearch
Waiting for daemon set "fluentd-elasticsearch" rollout to finish: 0 out of 1 new pods have been updated...
Waiting for daemon set "fluentd-elasticsearch" rollout to finish: 0 of 1 updated pods are available...
daemon set "fluentd-elasticsearch" successfully rolled out
架构设计
1. DaemonSet Controller 负责根据配置创建Pod
2. DaemonSet Controller 跟踪Job状态,更加配置及时重试Pod或者继续创建
3. DaemonSet Controller 会自动添加affinity & label来跟踪对应的pod,并根据配置在每个节点或者适合的部分节点创建Pod
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

