kubernetes-x/kubernetes-MD/kubernetes工作负载资源DaemonSet.md

5.8 KiB
Raw Blame History

kubernetes工作负载资源DaemonSet

著作:行癫 <盗版必究>


DaemonSet

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

1.DaemonSet用法

在每个节点上运行集群守护进程

在每个节点上运行日志收集守护进程

在每个节点上运行监控守护进程

一种简单的用法是为每种类型的守护进程在所有的节点上都启动一个 DaemonSet。 一个稍微复杂的用法是为同一种守护进程部署多个 DaemonSet每个具有不同的标志 并且对不同硬件类型具有不同的内存、CPU 要求。

2.创建 DaemonSet

[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

[root@master xingdian]# kubectl create -f Daemonset.yaml

4.验证运行情况

[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      <none>     13m
[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 需要 apiVersionkindmetadata 字段

DaemonSet 对象的名称必须是一个合法的DNS 子域名

DaemonSet 也需要一个 .spec 配置段

6.Pod 模板

·spec中唯一必需的字段是 .spec.template

.spec.template 是一个Pod 模板,它是嵌套的,因而不具有 apiVersionkind 字段之外,它与Pod 具有相同的 schema

除了 Pod 必需字段外,在 DaemonSet 中的 Pod 模板必须指定合理的标签

在 DaemonSet 中的 Pod 模板必须具有一个值为 AlwaysRestartPolicy。 当该值未指定时,默认是 Always

注意:

Pod 的 spec 中包含一个 restartPolicy 字段,其可能取值包括 Always、OnFailure 和 Never。默认值是 Always

Always当容器终止退出后总是重启容器

OnFailure当容器异常退出时退出状态码非0才重启容器

Never当容器终止退出从不重启容器

7.Pod 选择算符

.spec.selector 字段表示 Pod 选择算符,它与 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 选择算符的 无头服务 通过使用 endpoints 资源或从 DNS 中检索到多个 A 记录来发现 DaemonSet

Service:创建具有相同 Pod 选择算符的服务,并使用该服务随机访问到某个节点上的 守护进程(没有办法访问到特定节点)