kubernetes之DaemonSet以及滚动更新
1.什么是DaemonSet?
1.1DaemonSet是Pod控制器的又一种实现方式,用于在集群中的全部节点上同时运行一份指定的Pod资源副本,后续加入集群的节点也会自动创建一个相关的Pod对象,当从集群移除节点时,此类Pod对象也将被自动回收无需创建。管理员也可以使用"节点选择器"以及标签指定仅在部分具有特定特征的节点上运行指定的Pod对象。
1.2官方文档: https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/daemonset/
2.DaemonSet的用法
- 在每个节点上运行集群存储守护进程,如glusterd或Ceph;
- 在每个节点上运行日志收集守护进程,如fluentd、logstash;
- 在每个节点上运行监控系统代理程序,如Prometheus Node Exporter;
- 在每个节点上运行网络插件为Pod提供网络服务,如flannel、Calico;
- 在每个节点上运行kube-Proxy通过API-Server持续监控各个Service及其关联的Pod对象,并将其创建或变动实时反应至当前节点相应的iptables、ipvs规则上;
3.DaemonSet资源规范
DaemonSet是标准的K8s资源类型,它在Spec字段中嵌套了Selector、Template和minReadySeconds,并且功能和用法基本相同,但它不支持使用Replicas,DaemonSet并不是基于期望的副本数来控制Pod资源数量,而是基于节点数量来控制Pod数量;
apiVersion: apps/v1 # API群组及版本;
kind: DaemonSet # 资源类型;
metadata: # Pod元数据;
name: # 资源名称,在作用域中要唯一;
namespace: <string> # 名称空间,DaemonSet隶属名称空间级别;
spec:
minReadySeconds: <integer> # Pod就绪后多少秒内任一容器无Crash方可为就绪,来控制滚动更新的速度,默认值为0,表示新建的Pod对象一旦"就绪"将立即被视作可用,随后开始下一轮更新。如果设定了spec.minReadySeconds: 3表示新建的Pod对象至少要成功运行多久才会被视作可用,即就绪之后还要等待指定的3s才能开始下一批次的更新,在一个批次内新建的所有Pod就绪探测失败,都会导致滚动更新被终止,因此为minReadySeconds设定一个合理的值,不仅能够减缓更新的速度,还能够让Deployment提前发现一部分程序因为Bug导致的升级故障,生产环境中为Pod设置指针探测。
selector: <Object> # 标签选择器,必须匹配template字段中Pod模板中的标签;
template: <Object> # Pod模板对象;
metadata: <Object> # Pod名称
spec: <Object> # Pod详情
revisionHistoryLimit: <integer> # 滚动更新历史记录数量,默认为10;
updateStrategy: <Object> # 滚动更新策略;
type: <string> # 滚动更新类型,可用值有OnDelete和Rollingupdate;
rollingUpdate: <Object> # 滚动更新参数,专用于RollingUpdate类型;
maxSurge: <string> # 更新期间可比期望的Pod数量多出的数量和比例;
maxUnavailable: <string> # 更新期间可比期望的Pod数量缺少的数量或比例;
4.DaemonSet部署Node_exporter示例
- Github地址:https://github.com/prometheus/node_exporter
- DockerHub地址:https://hub.docker.com/r/prom/node-exporter
- Kubernetes1.8版本起,DaemonSet也必须使用selector来匹配Pod模板中指定的标签,而且它也支持matchLabels和matchExpressions两种标签选择器;
# 示例配置文件
root@kubernetes-master01:~# cat daemonSet-node_exporter.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
namespace: default
spec:
selector:
matchLabels:
app: node-exporter
template:
metadata:
labels:
app: node-exporter
spec:
hostNetwork: true # 共享主机网络
hostPID: true # 获取主机的PID
containers:
- name: prometheus-node-exporter
image: prom/node-exporter:v0.18.0
ports:
- name: node-ex-http
containerPort: 9100
hostPort: 9100 # 监听在节点的9100端口上面,节点的9100,实际就在访问这个Pod
livenessProbe:
tcpSocket:
port: node-ex-http
initialDelaySeconds: 5
readinessProbe:
httpGet:
path: '/metrics'
port: node-ex-http
initialDelaySeconds: 5
4.1 查看Pod实例;
root@kubernetes-master01:~# kubectl get pods -o wide -l app=node-exporter
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
node-exporter-l7lfh 1/1 Running 0 55s xx.0.0.xx kubernetes-xxx <none> <none>
node-exporter-qljd6 1/1 Running 0 55s xx.0.0.xx kubernetes-xxx <none> <none>
4.2 describe命令查看详细信息;
# DaemonSet也可以简写为ds;
root@kubernetes-master01:~# kubectl get daemonset
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
node-exporter 2 2 2 2 2 <none> 3m9s
#
root@kubernetes-master01:~# kubectl describe ds node-exporter
Name: node-exporter
Selector: app=node-exporter
Node-Selector: <none>
Labels: <none>
Annotations: deprecated.daemonset.template.generation: 1
Desired Number of Nodes Scheduled: 2 # 期望的Pod副本数
Current Number of Nodes Scheduled: 2 #
Number of Nodes Scheduled with Up-to-date Pods: 2
Number of Nodes Scheduled with Available Pods: 2
Number of Nodes Misscheduled: 0
Pods Status: 2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template: # 两个Pod都是Running
Labels: app=node-exporter
Containers:
prometheus-node-exporter:
Image: prom/node-exporter:v0.18.0 # Pod使用的镜像
Port: 9100/TCP # Pod的端口
Host Port: 9100/TCP # 开启了共享宿主机端口
Liveness: tcp-socket :node-ex-http delay=5s timeout=1s period=10s #success=1 #failure=3 # 探针检测
Readiness: http-get http://:node-ex-http/metrics delay=5s timeout=1s period=10s #success=1 #failure=3 # 探针检测
Environment: <none>
Mounts: <none>
Volumes: <none>
Events: # 调度给两个节点
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 4m26s daemonset-controller Created pod: node-exporter-qljd6
Normal SuccessfulCreate 4m26s daemonset-controller Created pod: node-exporter-l7lfh
4.3 node_exporter默认监听在TCP的9100端口,可以向任意一节点发起请求也是没有问题;
root@kubernetes-master01:~# curl -s xx.0.0.xx:9100/metrics | grep memory
# HELP node_memory_Active_anon_bytes Memory information field Active_anon_bytes.
# TYPE node_memory_Active_anon_bytes gauge
node_memory_Active_anon_bytes 3.01551616e+08
# HELP node_memory_Active_bytes Memory information field Active_bytes.
# TYPE node_memory_Active_bytes gauge
node_memory_Active_bytes 8.14239744e+08
# HELP node_memory_Active_file_bytes Memory information field Active_file_bytes.
# TYPE node_memory_Active_file_bytes gauge
node_memory_Active_file_bytes 5.12688128e+08
# HELP node_memory_AnonHugePages_bytes Memory information field AnonHugePages_bytes.
# TYPE node_memory_AnonHugePages_bytes gauge
node_memory_AnonHugePages_bytes 0
5.DaemonSet更新方式
1.DaemonSet自1.16版本开始也支持滚动更新机制,相关配置定义在spec.update-Strategy嵌套字段中。目前它支持RollingUpdate(滚动更新)和OnDelete(删除式更新)两种更新策略。滚动更新为默认的更新策略。工作逻辑类似于Deployment控制,不过仅支持使用maxUnavailable属性定义最大不可用Pod资源的副本数(默认为1)而删除式更新的方式则是在删除相应节点的Pod资源后重建并更新为新版本;
5.1 RollingUpdate更新示例:
# image: prom/node-exporter:v0.18.0修改为0.18.1
root@kubernetes-master01:~# cat daemonset-node_exporter.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
namespace: default
spec:
minReadySeconds: 3
revisionHistoryLimit: 20
updateStrategy:
type: RollingUpdate # 更新策略
rollingUpdate:
maxUnavailable: 1
selector:
matchLabels:
app: node-exporter
template:
metadata:
labels:
app: node-exporter
spec:
hostNetwork: true # 共享主机网络
hostPID: true # 获取主机的PID
containers:
- name: prometheus-node-exporter
image: prom/node-exporter:v0.18.1
ports:
- name: node-ex-http
containerPort: 9100
hostPort: 9100 # 监听在节点的9100端口上面,节点的9100,实际就在访问这个Pod
livenessProbe:
tcpSocket:
port: node-ex-http
initialDelaySeconds: 5
readinessProbe:
httpGet:
path: '/metrics'
port: node-ex-http
initialDelaySeconds: 5
5.1.1执行滚动更新及状态;
root@kubernetes-master01:~# kubectl apply -f daemonset-node_exporter.yaml && kubectl rollout status daemonset node-exporter
daemonset.apps/node-exporter configured
Waiting for daemon set "node-exporter" rollout to finish: 0 out of 2 new pods have been updated...
Waiting for daemon set "node-exporter" rollout to finish: 0 out of 2 new pods have been updated...
Waiting for daemon set "node-exporter" rollout to finish: 0 out of 2 new pods have been updated...
Waiting for daemon set "node-exporter" rollout to finish: 1 out of 2 new pods have been updated...
Waiting for daemon set "node-exporter" rollout to finish: 1 out of 2 new pods have been updated...
Waiting for daemon set "node-exporter" rollout to finish: 1 out of 2 new pods have been updated...
Waiting for daemon set "node-exporter" rollout to finish: 1 out of 2 new pods have been updated...
Waiting for daemon set "node-exporter" rollout to finish: 1 of 2 updated pods are available...
Waiting for daemon set "node-exporter" rollout to finish: 1 of 2 updated pods are available...
daemon set "node-exporter" successfully rolled out
5.1.2默认的RollingUpdate策略将采用一次更新一个Pod对象,待新建的Pod对象就绪后,再更新下一个Pod对象,直到全部完成。可以看到镜像版本为v0.18.1
root@kubernetes-master01:~# kubectl describe daemonsets.apps node-exporter
Pod Template:
Labels: app=node-exporter
Containers:
prometheus-node-exporter:
Image: prom/node-exporter:v0.18.1 # 镜像版本已经为0.18.1
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 46m daemonset-controller Created pod: node-exporter-qljd6
Normal SuccessfulCreate 46m daemonset-controller Created pod: node-exporter-l7lfh
Normal SuccessfulDelete 2m34s daemonset-controller Deleted pod: node-exporter-qljd6
Normal SuccessfulCreate 2m32s daemonset-controller Created pod: node-exporter-q479h
Normal SuccessfulDelete 2m21s daemonset-controller Deleted pod: node-exporter-l7lfh
Normal SuccessfulCreate 2m11s daemonset-controller Created pod: node-exporter-8c2mr
5.2 OnDelete更新示例:
# 修改镜像版本为latest
root@kubernetes-master01:~# cat daemonset-node_exporter.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
namespace: default
spec:
minReadySeconds: 3
revisionHistoryLimit: 10
updateStrategy: # 滚动更新策略
type: OnDelete # 使用OnDelete
rollingUpdate:
maxUnavailable: 1
selector:
matchLabels:
app: node-exporter
template:
metadata:
labels:
app: node-exporter
spec:
hostNetwork: true # 共享主机网络
hostPID: true # 获取主机的PID
containers:
- name: prometheus-node-exporter
image: prom/node-exporter:latest # 修改镜像版本为latest。
ports:
- name: node-ex-http
containerPort: 9100
hostPort: 9100 # 监听在节点的9100端口上面,节点的9100,实际就在访问这个Pod
livenessProbe:
tcpSocket:
port: node-ex-http
initialDelaySeconds: 5
readinessProbe:
httpGet:
path: '/metrics'
port: node-ex-http
initialDelaySeconds: 5
5.2.1 由于OnDelete并非自动完成升级,它需要管理员手动去删除Pod,然后重新拉起新的Pod,才能完成更新。(对于升级有着先后顺序的软件,这种方法非常有用;)
5.2.2删除Pod;
root@kubernetes-master01:~# kubectl delete pods node-exporter-8c2mr
pod "node-exporter-8c2mr" deleted
root@kubernetes-master01:~# kubectl delete pods node-exporter-q479h
pod "node-exporter-q479h" deleted
5.2.3查看Pod已经被拉起;
root@kubernetes-master01:~# kubectl get pods -l app=node-exporter
NAME READY STATUS RESTARTS AGE
node-exporter-fbmkv 1/1 Running 0 99s
node-exporter-hv69b 1/1 Running 0 85s
5.2.4查看Events和版本;
root@kubernetes-master01:~# kubectl describe ds node-exporter
Name: node-exporter
Selector: app=node-exporter
Node-Selector: <none>
Labels: <none>
Annotations: deprecated.daemonset.template.generation: 3
Desired Number of Nodes Scheduled: 2
Current Number of Nodes Scheduled: 2
Number of Nodes Scheduled with Up-to-date Pods: 2
Number of Nodes Scheduled with Available Pods: 2
Number of Nodes Misscheduled: 0
Pods Status: 2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=node-exporter
Containers:
prometheus-node-exporter:
Image: prom/node-exporter:latest
Port: 9100/TCP
Host Port: 9100/TCP
Liveness: tcp-socket :node-ex-http delay=5s timeout=1s period=10s #success=1 #failure=3
Readiness: http-get http://:node-ex-http/metrics delay=5s timeout=1s period=10s #success=1 #failure=3
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 3m31s daemonset-controller Created pod: node-exporter-fbmkv
Normal SuccessfulCreate 3m17s daemonset-controller Created pod: node-exporter-hv69b
root@kubernetes-master01:~# kubectl get pods node-exporter-fbmkv -o yaml
- containerID: docker://03e895265b19f82b3086c3bd7c013f7fa5edea96551a669aac164b92ea2e26b5
image: prom/node-exporter:latest
kubernetes之DaemonSet以及滚动更新的更多相关文章
- Kubernetes Pod应用的滚动更新(八)
一.环境准备 我们紧接上一节的环境,进行下面的操作,如果不清楚的,可以先查看上一篇博文. 滚动更新是一次只更新一小部分副本,成功后,再更新更多的副本,最终完成所有副本的更新.滚动更新的最大的好处是零停 ...
- Kubernetes 零宕机滚动更新
转载自:https://www.qikqiak.com/post/zero-downtime-rolling-update-k8s/ 软件世界的发展比以往任何时候都快,为了保持竞争力需要尽快推出新的软 ...
- Kubernetes的DaemonSet(下篇)
用Daemon Pod来进行通信 使用Pod来再DaemonSet中通信的手段有: 推的方式:在DaemonSet中的Pod会被配置成发送更新到如状态数据库这样的服务.这些都没有客户端. IP+端口方 ...
- Kubernetes集群中Service的滚动更新
Kubernetes集群中Service的滚动更新 二月 9, 2017 0 条评论 在移动互联网时代,消费者的消费行为已经“全天候化”,为此,商家的业务系统也要保持7×24小时不间断地提供服务以满足 ...
- Kubernetes Deloyment实现滚动更新
目录 滚动更新简介 使用kubectl rolling-update更新RC Deployment的rolling-update 滚动更新简介 当kubernetes集群中的某个服务需要升级时,传统的 ...
- kubernetes滚动更新
系列目录 简介 当kubernetes集群中的某个服务需要升级时,传统的做法是,先将要更新的服务下线,业务停止后再更新版本和配置,然后重新启动并提供服务.如果业务集群规模较大时,这个工作就变成了一个挑 ...
- Kubernetes——滚动更新和数据管理
k8s——滚动更新滚动更新就是一次只更新一小部分副本,更新成功之后再更新更多的副本,最终完成所有副本的更新.滚动更新最大的好处是零停机,整个更新的过程中始终有副本运行,从而保证了业务的连续性.kube ...
- 详谈kubernetes滚动更新-1
系列目录 这个系列分为两个小节,第一个小节介绍deployment滚动更新时,deployment.replicaset.pod的细节以及创建过程以及deployment版本管理的方式 第二个小节将介 ...
- Kubernetes之DaemonSet控制器
DaemonSet 简介 DaemonSet 确保全部(或者一些)Node 上运行一个 Pod 的副本.当有 Node 加入集群时,也会为他们新增一个 Pod .当有 Node 从集群移除时,这些 P ...
随机推荐
- HTML表格以及表单
学习内容: 1.HTML表格 代码实例: <%@ page language="java" import="java.util.*" pageEncodi ...
- ML第2周学习小结
本周收获 总结一下本周学习内容: 1.复习了Numpy的一些基础操作,主要是利用numpy来对ndarray数组进行操作 我的博客链接: Numpy的一些操作 2.正在学习<深入浅出Pandas ...
- git实战-多分支开发-2022新项目
现在开发中大多数公司中都在使用Git这个代码版本管理工具,几乎可以说是已经成为标配,刚入职不久的这家新公司也不例外. 去公司没多久,开始搭建项目,然后创建开发分支,有多少个后端人员就创建多少个开发分支 ...
- NB-IoT/LoRa/eMTC和蓝牙/WiFi的关系是互补还是替代?
近年来,相继出现了许多物联网技术.WiFi.蓝牙.NB-IoT.LoRa.eMTC和其他技术为IoT实践提供了一流的技术支持通讯端口.拥有这么多技术,能够互相替代吗?还是能起到互补的作用?为低功耗广域 ...
- KALI2020忘记用户名和密码
时隔半年,打开kali发现忘记了自己精心研制的用户名密码......... 第一步 在开机的时候就按e键进入如下界面 第二步 用键盘上的上下箭头↑↓进行屏幕滚动,滑到最后一行发现修改目标 倒数第四行: ...
- 入坑KeePass(二)重置keepass设置
保留好.kdbx和密钥文件,软件的文件可以删除掉,重新下载并解压设置就恢复默认了
- 使用PowerShell下载文件
更新记录 本文迁移自Panda666原博客,原发布时间:2021年7月12日. 使用Invoke-WebRequest指令下载文件 [Net.ServicePointManager]::Securit ...
- spring源码解析:元注解功能的实现
前言 众所周知,spring 从 2.5 版本以后开始支持使用注解代替繁琐的 xml 配置,到了 springboot 更是全面拥抱了注解式配置.平时在使用的时候,点开一些常见的等注解,会发现往往在一 ...
- 倾斜摄影3D模型|手工建模|BIM模型 轻量化处理
一.什么是大场景? 顾名思义,大场景就是能够从一个鸟瞰的角度看到一个大型场景的全貌,比如一个园区.一座城市.一个国家甚至是整个地球.但过去都以图片记录下大场景,如今我们可以通过建造3D模型来还原大场景 ...
- 手把手教学~基于element封装tree树状下拉框
在日常项目开发中,树状下拉框的需求还是比较常见的,但是element并没有这种组件以供使用.在这里,小编就基于element如何封装一个树状下拉框做个详细的介绍. 通过这篇文章,你可以了解学习到一个树 ...