It has been 780 days since the last update, the content of the article may be outdated.

作用

  1. 保证集群内每一个或者一些节点都运行一组相同的 Pod
  2. 跟踪集群节点状态,保证新加入的节点自动创建对应的 Pod
  3. 跟踪集群节点状态,保证移除的节点删除对应的 Pod
  4. 跟踪 Pod 状态,保证每个节点 Pod 处于运行状态

实践

YAML 文件

yaml
ds.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template: # Pod Template
metadata:
labels:
name: fluentd-elasticsearch
spec:
containers:
- name: fluentd-elasticsearch
image: 'fluent/fluentd:v1.4-1'

查看 Node

plaintext
1
2
3
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready master 10h v1.15.5

查看 DaemonSet

plaintext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ kubectl apply -f ds.yaml
daemonset.apps/fluentd-elasticsearch created

$ kubectl get ds -n kube-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
fluentd-elasticsearch 1 1 1 1 1 <none> 3m58s
kube-proxy 1 1 1 1 1 beta.kubernetes.io/os=linux 10h

$ kubectl get ds -n kube-system fluentd-elasticsearch -o yaml | head -n 15
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"apps/v1","kind":"DaemonSet","metadata":{"annotations":{},"labels":{"k8s-app":"fluentd-logging"},"name":"fluentd-elasticsearch","namespace":"kube-system"},"spec":{"selector":{"matchLabels":{"name":"fluentd-elasticsearch"}},"template":{"metadata":{"labels":{"name":"fluentd-elasticsearch"}},"spec":{"containers":[{"image":"fluent/fluentd:v1.4-1","name":"fluentd-elasticsearch"}]}}}}
creationTimestamp: "2021-07-12T02:51:12Z"
generation: 1
labels:
k8s-app: fluentd-logging
name: fluentd-elasticsearch
namespace: kube-system
resourceVersion: "8703"
selfLink: /apis/extensions/v1beta1/namespaces/kube-system/daemonsets/fluentd-elasticsearch
uid: 4b3c030f-8f45-4f74-87c6-1c21899ebc31
Key Value
DESIRED 需要的 Pod 个数
CURRENT 当前已存在的 Pod 数
READY 就绪的 Pod 数
UP-TO-DATE 到达预期版本的 Pod 数
AVAILABLE 可用的 Pod 数
NODE SELECTOR 节点选择标签(筛选部分节点)

查看 Pod

Pod 的 OwnerReference 为 DaemonSet

plaintext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-6967fb4995-n2pk4 1/1 Running 2 10h
etcd-minikube 1/1 Running 1 10h
fluentd-elasticsearch-z4b9x 1/1 Running 0 4m25s
kube-apiserver-minikube 1/1 Running 1 10h
kube-controller-manager-minikube 1/1 Running 1 10h
kube-proxy-tjgc7 1/1 Running 1 10h
kube-scheduler-minikube 1/1 Running 1 10h
storage-provisioner 1/1 Running 2 10h

$ kubectl get pods -n kube-system fluentd-elasticsearch-z4b9x -o yaml | head -n 21
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2021-07-12T02:51:12Z"
generateName: fluentd-elasticsearch-
labels:
controller-revision-hash: 5fd669cccc
name: fluentd-elasticsearch
pod-template-generation: "1"
name: fluentd-elasticsearch-z4b9x
namespace: kube-system
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: DaemonSet
name: fluentd-elasticsearch
uid: 4b3c030f-8f45-4f74-87c6-1c21899ebc31
resourceVersion: "8702"
selfLink: /api/v1/namespaces/kube-system/pods/fluentd-elasticsearch-z4b9x
uid: b2b3ed75-31f9-43f5-b247-92fcb7894741

更新 DaemonSet

  1. RollingUpdate(默认):当 DaemonSet 模板更新后,老 Pod 会先被删除,然后再去创建新的 Pod,配合健康检查做滚动更新
  2. OnDelete:当 DaemonSet 模板更新后,只有手动删除某个对应的 Pod,此节点 Pod 才会被更新
plaintext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
$ kubectl set image ds/fluentd-elasticsearch fluentd-elasticsearch=fluent/fluentd:v1.4 -n kube-system
daemonset.extensions/fluentd-elasticsearch image updated

$ kubectl describe ds -n kube-system fluentd-elasticsearch
Name: fluentd-elasticsearch
Selector: name=fluentd-elasticsearch
Node-Selector: <none>
Labels: k8s-app=fluentd-logging
Annotations: deprecated.daemonset.template.generation: 2
kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"apps/v1","kind":"DaemonSet","metadata":{"annotations":{},"labels":{"k8s-app":"fluentd-logging"},"name":"fluentd-elasticsear...
Desired Number of Nodes Scheduled: 1
Current Number of Nodes Scheduled: 1
Number of Nodes Scheduled with Up-to-date Pods: 1
Number of Nodes Scheduled with Available Pods: 1
Number of Nodes Misscheduled: 0
Pods Status: 1 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: name=fluentd-elasticsearch
Containers:
fluentd-elasticsearch:
Image: fluent/fluentd:v1.4
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 24m daemonset-controller Created pod: fluentd-elasticsearch-z4b9x
Normal SuccessfulDelete 2m24s daemonset-controller Deleted pod: fluentd-elasticsearch-z4b9x
Normal SuccessfulCreate 2m12s daemonset-controller Created pod: fluentd-elasticsearch-dwmdt

$ kubectl get pods -n kube-system fluentd-elasticsearch-dwmdt -o yaml | head -n 21
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2021-07-12T03:13:27Z"
generateName: fluentd-elasticsearch-
labels:
controller-revision-hash: f86bfc847
name: fluentd-elasticsearch
pod-template-generation: "2"
name: fluentd-elasticsearch-dwmdt
namespace: kube-system
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: DaemonSet
name: fluentd-elasticsearch
uid: 4b3c030f-8f45-4f74-87c6-1c21899ebc31
resourceVersion: "9692"
selfLink: /api/v1/namespaces/kube-system/pods/fluentd-elasticsearch-dwmdt
uid: 8ea753ea-2ed3-4d8a-b950-c31ec6847ecd

架构设计

管理模式

纠正:跟踪 Pod 状态,而非跟踪 Job 状态

image-20210712111948819

image-20210712111948819

DaemonSet Controller

  1. 纠正:不是 Job Controller,而是 DaemonSet Controller
  2. DaemonSet Controller 需要 Watch 节点状态(通过 API Server 传递到 Etcd)
  3. 当节点状态发生变化时,会通过一个内存 MQ 传递消息,DaemonSet Controller 会 Watch 到这一状态
  4. DaemonSet Controller 会查看各个节点上是否都有对应的 Pod,没有则创建,有则对比版本

image-20210712112415859

image-20210712112415859

参考资料

  1. CNCF × Alibaba 云原生技术公开课