实践 | Kubernetes守护进程集之DaemonSet
时间:2022-07-24
本文章向大家介绍实践 | Kubernetes守护进程集之DaemonSet,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
DaemonSet的滚动更新目前只在kubernetesv1.6+
版本集群支持
DaemonSet滚动更新策略
-
onDelete
: 使用该策略更新配置模板之后,只有在手动删除旧的DaemonSet Pod之后,才会创建新的DaemonSet Pod -
RollingUpdate
:默认策略,使用该策略更新配置模板之后,旧的Pod会被杀掉并且自动创建新的Pod,且整个更新过程中,每个节点上最多只有DaemonSet Pod.
启动滚动更新,必须设置DaemonSet的.spec.updateStrategy.type
属性为RollingUpdate
,也可以在.spec
中设置.spec.strategy.rollingUpdate.maxUnavailable
和.spec.minReadySeconds
。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx
namespace: kube-system
labels:
k8s-app: nginx-traffic
spec:
selector:
matchLabels:
name: nginx
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
template:
metadata:
labels:
name: nginx
spec:
tolerations:
# this toleration is to have the daemonset runnable on master nodes
# remove it if your masters can't run pods
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: nginx
image: nginx:1.18
ports:
- containerPort: 80
hostPort: 9090
terminationGracePeriodSeconds: 30
创建nginx服务的DaemonSet:
kubectl apply -f dnginx.yaml
检查运行状态:
☸️ vmware? default ~ ? ? k get daemonsets.apps -n kube-system -o wide |grep nginx
nginx 3 3 3 3 3 <none> 15s nginx nginx:1.18 name=nginx
☸️ vmware? default ~ ? ? curl -I http://192.168.99.134:9090
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Sat, 29 Aug 2020 11:45:18 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 21 Apr 2020 12:43:12 GMT
Connection: keep-alive
ETag: "5e9eea60-264"
Accept-Ranges: bytes
☸️ vmware? default ~ ? ? curl -I http://192.168.99.133:9090
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Sat, 29 Aug 2020 11:45:21 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 21 Apr 2020 12:43:12 GMT
Connection: keep-alive
ETag: "5e9eea60-264"
Accept-Ranges: bytes
☸️ vmware? default ~ ? ? curl -I http://192.168.99.128:9090
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Sat, 29 Aug 2020 11:45:24 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 21 Apr 2020 12:43:12 GMT
Connection: keep-alive
ETag: "5e9eea60-264"
Accept-Ranges: bytes
检查DaemonSet的更新策略:
☸️ vmware? default ~ ? ? kubectl get ds/nginx -o go-template='{{.spec.updateStrategy.type}}{{"n"}}' -n kube-system
RollingUpdate
如果没有在系统内部署daemonSet,可以使用以下--dry-run=client
检查
k apply -f dnginx.yaml --dry-run=client -o go-template='{{.spec.updateStrategy.type}}{{"n"}}'
RollingUpdate # 如果报错不支持client值,请更新你的kubectl到最新版本。
此时通过更新daemonSet中的nginx的镜像版本,观察滚动更新的效果
# 此时可以分别开多个终端,查看每个节点的守护进程集运行状态
watch -n1 "curl -I http://192.168.99.128:9090"
watch -n1 "curl -I http://192.168.99.133:9090"
watch -n1 "curl -I http://192.168.99.134:9090"
☸️ vmware? default ~ ? ? kubectl set image ds/nginx nginx=nginx:1.18 -n kube-system
daemonset.apps/nginx image updated
☸️ vmware? default ~ ? ? kubectl rollout status ds/nginx -n kube-system
Waiting for daemon set "nginx" rollout to finish: 1 out of 3 new pods have been updated...
Waiting for daemon set "nginx" rollout to finish: 2 out of 3 new pods have been updated...
Waiting for daemon set "nginx" rollout to finish: 2 out of 3 new pods have been updated...
Waiting for daemon set "nginx" rollout to finish: 2 out of 3 new pods have been updated...
Waiting for daemon set "nginx" rollout to finish: 2 out of 3 new pods have been updated...
Waiting for daemon set "nginx" rollout to finish: 2 of 3 updated pods are available...
daemon set "nginx" successfully rolled out
# 此时查看到滚动更新日志与watch查看到的一致,先杀掉一个节点的nginx,然后启动一个新的,运行起来之后,继续更新下一个节点。
如果需要查看所有的更新变化,可以执行以下命令,但是CHANGE-CAUSE
有时看不到信息,需要在kubectl变更的时候通过--record=true
选项带上,这样变更的命令将会记录在Annotations
的kubernetes.io/change-cause
中,并且与对应的revision版本号对应。
kubectl rollout history daemonset nginx -n kube-system
回滚到指定的revision
# 如果不指定--to-revision将会回滚最近的revision
kubectl rollout undo daemonset nginx --to-revision=4 -n kube-system
daemonset.apps/nginx rolled back
- Spring Boot实现热部署
- Java中的宏变量,宏替换详解。
- 类、变量、块、构造器、继承初始化顺序,终极解答。
- Spring Boot Debug调试
- Maven精选系列--classifier元素妙用
- PostgreSQL里面的一些命令小结
- Java中创建String的两道面试题及详解
- PostgreSQL主备环境搭建
- Tomcat集群session复制与Oracle的坑。。
- 用Keras+TensorFlow,实现ImageNet数据集日常对象的识别
- JavaWeb项目架构之Elasticsearch日志处理系统
- 分布式服务防雪崩熔断器,Hystrix理论+实战。
- JavaWeb项目架构之Kafka分布式日志队列
- 如何让Git记住用户名和密码
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android Studio设置颜色拾色器工具Color Picker教程
- Kotlin中常见的符号详解
- Kotlin中实体类的创建方式
- Android自定义流式布局/自动换行布局实例
- Android 中 MD5 的几种生成方式(小结)
- Flutter 日期时间DatePicker控件及国际化
- 解决Kotlin 类在实现多个接口,覆写多个接口中相同方法冲突的问题
- Kotlin 匿名类实现接口和抽象类的区别详解
- android实现微信朋友圈发布动态功能
- 基于Android studio3.6的JNI教程之helloworld思路详解
- 基于Android studio3.6的JNI教程之opencv实例详解
- AndroidStudio代码达到指定字符长度时自动换行实例
- android studio 新建项目报错的解决之路
- Android Studio 3.6中使用视图绑定替代 findViewById的方法
- Android 使用View Binding的方法详解