DaemonSet的应用编排机制
DaemonSet:在集群中的每个节点上,都要部署一个且只能部署目标应用的一个实例;
也可以基于标签选择器管控一组Pod副本;
DaemonSet在什么场景中可以用到:
我们使用zabbix监控目标主机的时候,通常在每一个目标主机上面部署一个zabbix.agent,但没必要在一个节点上部署多个,像这种场景下就可以使用DaemonSet
或者kube-proxy、kube-flanner、ProjectCalico、csi-node
常用场景
◼ 特定类型的系统化应用,例如kube-proxy,以及Calico网络插件的节点代理calico-node等
◼ 集群存储守护进程、集群日志收集守护进程以及节点监控守护进程等
DaemonSet在API格式上与Deployment区别:
与Deployment相似,DaemonSet对象也使用标签选择器和Pod模板,区别之处在于,DaemonSet不需要定义replicas(Pod副本数量),其Pod数量随节点数量而定;
apiVersion: apps/v1 #API群组及版本;
kind: DaemonSet #资源类型特有标识;
metadata:
name <string> #资源名称,在作用域中要惟一;
namespace <string> #名称空间;DaemonSet资源隶属名称空间级别;
spec:
minReadySeconds <integer> #Pod就绪后多少秒内任一容器无crash方可视为“就绪”;
selector <object> #标签选择器,必须匹配template字段中Pod模板中的标签;
template <object> #Pod模板对象;
revisionHistoryLimit <integer> #滚动更新历史记录数量,默认为10;
updateStrategy <Object> #滚动更新策略
type <string> #滚动更新类型,可用值有OnDelete和RollingUpdate(默认);
rollingUpdate <Object> #滚动更新参数,专用于RollingUpdate类型;
maxUnavailable <string> #更新期间可比期望的Pod数量缺少的数量或比例;
示例:prometheus
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-demo
namespace: default
spec:
selector:
matchLabels:
app: prometheus
component: node-exporter
template:
metadata:
name: prometheus-node-exporter
labels:
app: prometheus
component: node-exporter
spec:
containers:
- image: prom/node-exporter:v1.4.0
name: prometheus-node-exporter
ports:
- name: prom-node-exp
containerPort: 9100
hostPort: 9100
hostNetwork: true
hostPID: true
实际案例
prometheus的pod资源定义
[root@K8s-master01 chapter8]#cat daemonset-demo.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-demo
namespace: default
labels:
app: prometheus
component: node-exporter
spec:
selector:
matchLabels:
app: prometheus
component: node-exporter
template:
metadata:
name: prometheus-node-exporter
labels:
app: prometheus
component: node-exporter
spec:
containers:
- image: prom/node-exporter:v1.4.0
name: prometheus-node-exporter
ports:
- name: prom-node-exp
containerPort: 9100
hostPort: 9100
livenessProbe:
tcpSocket:
port: prom-node-exp
initialDelaySeconds: 3
readinessProbe:
httpGet:
path: '/metrics'
port: prom-node-exp
scheme: HTTP
initialDelaySeconds: 5
hostNetwork: true
hostPID: true
创建并查看pod
[root@K8s-master01 chapter8]#kubectl apply -f daemonset-demo.yaml
daemonset.apps/daemonset-demo created
[root@K8s-master01 chapter8]#kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
daemonset-demo-bztnc 1/1 Running 0 2m11s 10.0.0.105 k8s-node03 <none> <none>
daemonset-demo-t56r2 1/1 Running 0 2m11s 10.0.0.104 k8s-node02 <none> <none>
daemonset-demo-zc5fm 1/1 Running 0 2m11s 10.0.0.103 k8s-node01 <none> <none>
发现每个工作节点运行一个副本,但控制平面节点上没有被部署相应的实例
去访问服务所在的节点,会得到该节点的各种指标 如:进程、cpu核心、磁盘设备等
[root@K8s-master01 ~]#curl 10.0.0.105:9100/metrics
查看daemonset的信息
[root@K8s-master01 ~]#kubectl get daemonset
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset-demo 3 3 3 3 3 <none> 10h
更新策略
更新策略
◼ rollingUpdate:滚动更新,自动触发
◼ onDelete:删除时更新,手动触发
滚动更新
◼ 配置策略:rollingUpdate更新策略支持使用maxUnavailable参数来定义单批次允许更新的最大副本数量
◼ 更新方式
◆~$ kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ...
◆直接更新原配置文件,而后使用“kubectl apply”命令触发更新
对上述prometheus版本进行更新
查看daemonset的详细信息
[root@K8s-master01 ~]#kubectl get daemonset -o wide
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR
daemonset-demo 3 3 3 3 3 <none> 10h prometheus-node-exporter prom/node-exporter:v1.4.0 app=prometheus,component=node-exporter
对daemonset下的daemonset-demo pod中的prometheus-node-exporter容器进行镜像更新
[root@K8s-master01 ~]#kubectl set image daemonset daemonset-demo prometheus-node-exporter=prom/node-exporter:latest -n default
daemonset.apps/daemonset-demo image updated
监视更新过程(先删掉一个,更新一个,等就绪了,再更新第二个,因为更新策略默认是maxUnavailable:
其默认更新数量为1个1个滚动更新)
[root@K8s-master01 ~]#kubectl get pods -w
标签:11,node,exporter,demo,prometheus,更新,编排,DaemonSet,daemonset
From: https://blog.51cto.com/lmm01/7005674