kubernetes工作负载资源DaemonSet
著作:行癫 <盗版必究>
------
## 一:DaemonSet
DaemonSet确保全部(或者某些)节点上运行一个 Pod 的副本。 当有节点加入集群时, 也会为他们新增一个 Pod 。 当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
#### 1.DaemonSet用法
在每个节点上运行集群守护进程
在每个节点上运行日志收集守护进程
在每个节点上运行监控守护进程
一种简单的用法是为每种类型的守护进程在所有的节点上都启动一个 DaemonSet。 一个稍微复杂的用法是为同一种守护进程部署多个 DaemonSet;每个具有不同的标志, 并且对不同硬件类型具有不同的内存、CPU 要求。
#### 2.创建 DaemonSet
```shell
[root@master xingdian]# cat Daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
tolerations:
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
```
#### 3.运行Daemonset
```shell
[root@master xingdian]# kubectl create -f Daemonset.yaml
```
#### 4.验证运行情况
```shell
[root@master xingdian]# kubectl get Daemonset -A
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-system fluentd-elasticsearch 4 4 4 4 4 13m
```
```shell
[root@master xingdian]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system fluentd-elasticsearch-6bnkw 1/1 Running 0 14m
kube-system fluentd-elasticsearch-hsqq2 1/1 Running 0 14m
kube-system fluentd-elasticsearch-ncmnl 1/1 Running 0 14m
kube-system fluentd-elasticsearch-x2mqr 1/1 Running 0 14m
```
#### 5.必需字段
和所有其他 Kubernetes 配置一样,DaemonSet 需要 `apiVersion`、`kind` 和 `metadata` 字段
DaemonSet 对象的名称必须是一个合法的DNS 子域名
DaemonSet 也需要一个 [`.spec`](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status) 配置段
#### 6.Pod 模板
`·spec`中唯一必需的字段是 `.spec.template`
`.spec.template` 是一个Pod 模板,它是嵌套的,因而不具有 `apiVersion` 或 `kind` 字段之外,它与Pod 具有相同的 schema
除了 Pod 必需字段外,在 DaemonSet 中的 Pod 模板必须指定合理的标签
在 DaemonSet 中的 Pod 模板必须具有一个值为 `Always` 的 `RestartPolicy`。 当该值未指定时,默认是 `Always`
注意:
Pod 的 `spec` 中包含一个 `restartPolicy` 字段,其可能取值包括 Always、OnFailure 和 Never。默认值是 Always
Always:当容器终止退出后,总是重启容器
OnFailure:当容器异常退出时(退出状态码非0),才重启容器
Never:当容器终止退出,从不重启容器
#### 7.Pod 选择算符
`.spec.selector` 字段表示 Pod 选择算符,它与 [Job](https://kubernetes.io/zh/docs/concepts/workloads/controllers/job/) 的 `.spec.selector` 的作用是相同的
必须指定与 `.spec.template` 的标签匹配的 Pod 选择算符
一旦创建了 DaemonSet,它的 `.spec.selector` 就不能修改
`spec.selector` 是一个对象,如下两个字段组成:
`matchLabels` - 与ReplicationController的 `.spec.selector` 的作用相同
`matchExpressions` - 允许构建更复杂的选择器,通过指定 key、value 列表以及将 key 和 value 列表关联起来的 operator
注意:
Kubernetes 的 Operator 模式概念允许你在不修改 Kubernetes 自身代码的情况下,通过为一个或多个自定义资源关联控制器来扩展集群的能力。 Operator 是 Kubernetes API 的客户端,充当自定义资源的控制器。
#### 8.Daemon Pods 通信
与 DaemonSet 中的 Pod 进行通信的几种可能模式如下:
**推送(Push)**:配置 DaemonSet 中的 Pod,将更新发送到另一个服务,例如统计数据库。 这些服务没有客户端
**NodeIP 和已知端口**:DaemonSet 中的 Pod 可以使用 `hostPort`,从而可以通过节点 IP 访问到 Pod。客户端能通过某种方法获取节点 IP 列表,并且基于此也可以获取到相应的端口
**DNS**:创建具有相同 Pod 选择算符的 [无头服务](https://kubernetes.io/zh/docs/concepts/services-networking/service/#headless-services), 通过使用 `endpoints` 资源或从 DNS 中检索到多个 A 记录来发现 DaemonSet
**Service**:创建具有相同 Pod 选择算符的服务,并使用该服务随机访问到某个节点上的 守护进程(没有办法访问到特定节点)