[从零开始学Kubernetes] 10.Kubernetes的DaemonSet

在使用Kubernetes的时候,有些场景,比如监控各个节点的状态,使用 Deployment 或者 StatefulSet 都无法满足我们的需求,因为这个时候我们可能会有以下这些需求。

  1. 希望每个节点上都可以运行一个副本,且只运行一个副本。虽然通过调整 spec.replicas 的数值,可以使之等于节点数目,再配合一些调度策略(我们后面讲调度原理的时候会深入解释)可以实现这一点。但是如果节点数目发生了变化呢?

  2. 希望在新节点上也快速拉起副本。比如集群扩容,这个时候会有一些新节点加入进来,如何立即感知到这些节点,并在上面部署新的副本。

  3. 希望节点下线的时候,对应的 Pod 也可以被删除。

Kubernetes 提供的 DaemonSet 就可以完美地解决上述问题,其主要目的就是可以在集群内的每个节点上(或者指定的一堆节点上)都只运行一个副本,即 Pod 和 Node 是一一对应的关系。

DaemonSet使用场景

  • 监控数据收集,比如可以将节点信息收集上报给 Prometheus;
  • 日志的收集、轮转和清理;
  • 监控节点状态,比如运行 node-problem-detector 来监测节点的状态,并上报给 APIServer;
  • 负责在每个节点上网络、存储等组件的运行,比如 glusterd、ceph、flannel 等;

部署一个DaemonSet

创建 fluentd-elasticsearch-ds.yaml文件

apiVersion: apps/v1 # 这个地方已经不是 extension/v1beta1 了,在1.16版本已经废弃了,请使用 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:
      containers:
      - name: fluentd-elasticsearch
        image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      restartPolicy: Always
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers

使用命令kubectl apply -f fluentd-elasticsearch-ds.yaml进行创建

创建完成后,使用命令kubectl get pod -n kube-system -l name=fluentd-elasticsearch查看DaemonSet与Pod关联情况

[root@kubernetes yaml]# kubectl get pod -n kube-system -l name=fluentd-elasticsearch
NAME                          READY   STATUS              RESTARTS   AGE
fluentd-elasticsearch-d9b46   0/1     ContainerCreating   0          9s
fluentd-elasticsearch-lmj9c   0/1     ContainerCreating   0          9s
fluentd-elasticsearch-xlmrt   0/1     ContainerCreating   0          9s

使用命令kubectl get ds -n kube-system fluentd-elasticsearch查看DaemonSet整体状态

[root@kubernetes yaml]# kubectl get ds -n kube-system fluentd-elasticsearch
NAME                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
fluentd-elasticsearch   3         3         0       3            0           <none>          32s

在此处,DaemonSet缩写成了ds

输出的信息某些含义如下:

名称 含义
DESIRED 期望要创建的Pod个数
CURRENT 当前已经存在的Pod个数
READY 当前已经就绪的Pod个数
UP-TO-DATE 最新创建的个数
AVAILABLE 目前可用的Pod个数
NODE SELECTOR 节点选择标签, 有时候我们只希望在部分节点上运行一些 Pod,比如我们只节点上带有 app=logging-node 的节点上运行一些服务,就可以通过这个标签选择器来实现
上一篇:elasticsearch:v5.5.1-1和 fluentd-elasticsearch:v2.0.1下载镜像失败 imagePullBackOff的解决方法,其他镜像类似


下一篇:Android Studio 插件开发详解四:填坑