DaemonSet

说明

  • 是个 Pod 控制器
  • 能够确保 k8s 的所有节点都运行一个相同的 pod 副本,假设这个 pod 名称为 pa
    • 当增加 node 节点时,这个节点会自动创建一个 pa
    • 副本当删除 node 节点时,pa 副本会自动删除
  • 删除 daemonset 会删除它们创建的 pod

使用场景

  • 需要在每一个 node 节点运行一个存储服务,例如 gluster,ceph
  • 需要在每一个 node 节点运行一个日志收集服务,例如 fluentd,logstash
  • 需要在每一个 node 节点运行一个监控服务,例如 Prometheus Node Exporter,zabbix agent 等

DaemonSet 概述

在 k8s 中,DaemonSet 是一种用于在集群中的每个节点上运行一个副本的资源对象。它确保每个节点上都运行一个 Pod 的副本,以便在整个集群中提供特定的服务或功能。

DaemonSet 具有以下特点:

  • 每个节点一个副本:每个节点上都会自动创建一个 Pod 的副本,并且不会自动在新节点上创建副本。
  • 节点自动感知:当节点加入或离开集群时,DaemonSet 会自动调整 Pod 的数量,以保证每个节点上都有运行的副本。
  • 节点亲和性:可以使用节点选择器或亲和性规则来选择在特定节点上运行 DaemonSet 的 Pod。
  • 基于 Pod 模板:DaemonSet 使用 Pod 模板来定义要创建的 Pod 的配置,包括容器镜像、命令、环境变量等。

DaemonSet 在很多场景中都非常有用,例如:

  • 日志收集:在每个节点上运行日志收集代理,将节点日志发送到集中的存储或分析系统。
  • 监控和度量:在每个节点上运行监控代理,收集节点和容器的度量指标。
  • 网络代理:在每个节点上运行网络代理,实现网络隔离、负载均衡等功能。

通过使用 DaemonSet,您可以确保在整个集群中的每个节点上都运行指定的 Pod,以提供特定的服务或功能,并确保集群中的每个节点都具有相同的配置。

我们的 k8s 集群默认有两个 DaemonSet

获取所有 ns 下的 DaemonSet

kubectl get ds -A

[root@k8s-master k8s]# kubectl get ds -A
NAMESPACE     NAME          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
kube-system   calico-node   3         3         3       3            3           kubernetes.io/os=linux   2d8h
kube-system   kube-proxy    3         3         3       3            3           kubernetes.io/os=linux   2d9h

示例

  1. 编辑 yaml 文件my-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-nginx
  namespace: kube-system
  labels:
    la-nginx: daemonset-nginx
spec:
  selector:
    matchLabels:
      k2-nginx: daemonset-nginx
  template:
    metadata:
      labels:
        k2-nginx: daemonset-nginx
    spec:
      containers:
        - name: daemonset-nginx
          image: nginx
  1. 执行 yaml 文件,创建 daemonset
[root@k8s-master k8s]# vim my-ds.yaml
[root@k8s-master k8s]# kubectl apply -f my-ds.yaml 
daemonset.apps/daemonset-nginx created
  1. 查看 ns 命名空间为 kube-system 下的所有 pod
kubectl get pod -n kube-system

在这里插入图片描述

  1. 可以看到,我们只启动了2个 pod,集群明明有3个节点,我们看看在哪2个节点启动了
kubectl get pod -n kube-system -o wide
......
daemonset-nginx-5x8gr                      1/1     Running   0              4m42s   192.169.169.169   k8s-node2    <none>           <none>
daemonset-nginx-8s6dg                      1/1     Running   0              4m42s   192.169.36.114    k8s-node1    <none>           <none>
......

可以看到,只在 node1 和 node2 两个节点启动了,master 节点没有启动,这是为什么呢?

因为 master 天生就打了一个污点信息 NoSchedule,污点后面再讲

我们可以通过以下命令查看节点设置了哪些污点

# k8s-master 是节点的名字
kubectl describe node k8s-master
......
Taints:             node-role.kubernetes.io/control-plane:NoSchedule
......

里面有这样一条信息,这就是 master 节点打上的污点,就是不让 pod 调度到该节点

查看其它节点的信息,发现为none

# 如果为空,Pod 可以自由地调度到这个节点上
Taints:             <none>

说明:

有指定节点,那就在指定节点创建 pod,如指定了 nodeName,affinity,污点容忍度等…

未指定节点,将在所有节点上创建 Pod

Deployments 和 Daemonset 区别联系

相似性

  • 都能创建Pod
  • 创建的 Pod 对应的进程都不希望被终止掉

使用 Deployments 的场景:无状态的 Sevice 使用 Deployments,微服务,需要实现对副本的数量进行扩缩容、平滑升级,就用 Deployments

使用 Daemonset 的场景:需要 Pod 副本总是运行在全部或特定主机上,并需要先于其他 Pod 启动,就用 daemonSet。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐