k8s中经常会在node上安装部署应用,DaemonSet守护进程适用于在所有节点或部分节点运行一个daemon守护进程。这就和之前搭建过的zabbix监控很像,所有节点都必须安装agent以便采集监控数据,之前搭建k8s集群时,用到的calico网络插件就是这样,部署在每一个node上。
DaemonSet的特征如下:
- 这个 Pod 运行在 k8s 集群里的每一个节点(Node)上;
- 每个节点上只有一个这样的 Pod 实例;
- 当有新的节点加入 Kubernetes 集群后,该 Pod 会自动地在新节点上被创建出来;而当旧节点被删除后,它上面的 Pod 也相应地会被回收掉。
写个yml做个实验:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-nginx
namespace: kube-system
labels:
la-nginx: daemonset-nginx
spec:
selector:
matchLabels:
k2-nginx: daemonset-nginx2
template:
metadata:
labels:
k2-nginx: daemonset-nginx2
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: c-nginx
image: nginx:1.25.0
resources:
limits:
cpu: 200m
memory: 200Mi
requests:
cpu: 100m
memory: 100Mi
volumeMounts:
- name: nginx-volume1
mountPath: /usr/share/nginx/html
- name: nginx-volume2
mountPath: /usr/share/nginx/conf
readOnly: true
terminationGracePeriodSeconds: 30
volumes:
- name: nginx-volume1
hostPath:
path: /data/nginx-volume1
- name: nginx-volume2
hostPath:
path: /data/nginx-volume2
这个yml定义了DaemonSet,容器名称为c-nginx,由于主节点上存在污点,pod不会被创建在有污点的node上,tolerations是容忍污点,这样就可以把pod分到主节点上了,并挂载两个卷到/usr/share/nginx/html和/usr/share/nginx/conf,用来放发布项目以及配置文件,conf目录只读,防止不必要的修改发生。apply后,容器创建成功,详细去看看都在哪个node上。
三个容器分别位于三个节点上,符合DaemonSet的规范。