Kubernetes 入门之 DaemonSet

719 阅读2分钟

一篇文章讲解并演示了 Deployment 的使用,这篇文章来讲解下 DaemonSet 。

什么是 DeamonSet 呢?

DaemonSet 确保全部(或者一些)Node上运行一个 Pod 的副本。当有 Node 加入集群时,也会为它们新增一个 Pod,当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。

使用 DaemonSet 的一些典型用法:

  • 运行集群存储 deamon,例如在每个 Node 上运行 glusterdceph
  • 在每个 Node 上运行日志收集 deamon,例如 fluentdlogstash
  • 在每个 Node 上运行监控 daemon,例如 Prometheus Node Exporter

下面演示下:

daemonset.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-example
  labels:
    app: daemonset
spec:
  selector:
    matchLabels:
      name: daemonset-example
  template:
    metadata:
      labels:
        name: daemonset-example
    spec:
      containers:
      - name: daemonset-example
        image: heqingbao/k8s_myapp:v1

上面清单文件定义了一个 DaemonSet ,下面来创建试试:

[root@master01 ~]# kubectl create -f daemonset.yaml
daemonset.apps/daemonset-example created

[root@master01 ~]# kubectl get daemonset
NAME                DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset-example   2         2         2       2            2           <none>          5m3s

[root@master01 ~]# kubectl get pod -o wide
NAME                      READY   STATUS    RESTARTS   AGE     IP               NODE     NOMINATED NODE   READINESS GATES
daemonset-example-8hbfl   1/1     Running   0          5m36s   172.16.140.105   node02   <none>           <none>
daemonset-example-x8szq   1/1     Running   0          5m36s   172.16.196.171   node01   <none>           <none>

可以看到两个 DaemonSet 分别运行在两个节点上,你可能会问,为什么主节点没有被创建 DaemonSet 呢?不是说所有节点上都会创建吗?

这跟调度机制里面的污点概念有关,Scheduler 在调度 Pod 的时候会有一些策略去决定 Pod 应该运行在哪个节点上,感兴趣的同学可以研究下。

同时你会发现所有的 Pod 都不会在主节点上运行,一样的原理。

如果我把 node01 节点上的 Pod 删掉:

[root@master01 ~]# kubectl delete pod daemonset-example-x8szq
pod "daemonset-example-x8szq" deleted

[root@master01 ~]# kubectl get pod -o wide
NAME                      READY   STATUS    RESTARTS   AGE     IP               NODE     NOMINATED NODE   READINESS GATES
daemonset-example-7c75q   1/1     Running   0          16s     172.16.196.172   node01   <none>           <none>
daemonset-example-8hbfl   1/1     Running   0          6m36s   172.16.140.105   node02   <none>           <none>

可以看到 node01 上的 Pod 又被创建了,因为它要一直满足副本数为 1 的状态。


欢迎关注公众号:非著名开发者,订阅更多精彩内容。