每天5分钟玩转Kubernetes | DaemonSet

Posted COCOgsta

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每天5分钟玩转Kubernetes | DaemonSet相关的知识,希望对你有一定的参考价值。

书籍来源:cloudman《每天5分钟玩转Kubernetes》

一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!


Deployment部署的副本Pod会分布在各个Node上,每个Node都可能运行好几个副本。DaemonSet的不同之处在于:每个Node上最多只能运行一个副本。

DaemonSet的典型应用场景有:

(1)在集群的每个节点上运行存储Daemon,比如glusterd或ceph。

(2)在每个节点上运行日志收集Daemon,比如flunentd或 logstash。

(3)在每个节点上运行监控Daemon,比如Prometheus Node Exporter或collectd。

其实Kubernetes自己就在用DaemonSet运行系统组件。执行如下命令,如图所示。

kubectl get daemonset --namespace=kube-system

DaemonSet kube-flannel-ds和kube-proxy分别负责在每个节点上运行flannel和kube-proxy组件,如图所示。

因为flannel和kube-proxy属于系统组件,需要在命令行中通过--namespace=kube-system指定namespace kube-system。若不指定,则只返回默认namespace default中的资源。

5.2.1 kube-flannel-ds

下面我们通过分析kube-flannel-ds来学习DaemonSet。

还记得之前是如何部署flannel网络的吗?我们执行了如下命令:(实际未用此方式部署,因为无法下载国外网站文件)

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

注意:配置文件的完整内容要更复杂一些,为了更好地学习DaemonSet,这里只保留了最重要的内容。

① DaemonSet配置文件的语法和结构与Deployment几乎完全一 样,只是将kind设为DaemonSet。

② hostName指定Pod直接使用的是Node网络,相当于docker run - -network=host。考虑到flannel需要为集群提供网络连接,这个要求是合理的。

③ containers定义了运行flannel服务的两个容器。

下面我们再来分析另一个DaemonSet:kube-proxy。

5.2.2 kube-proxy

由于无法拿到kube-proxy的YAML文件,只能运行如下命令查看配置:

kubectl edit daemonset kube-proxy --namespace=kube-system

结果如图所示。

同样为了便于理解,这里只保留了最重要的信息。

① kind: DaemonSet指定这是一个DaemonSet类型的资源。

② containers定义了kube-proxy的容器。

③ status是当前DaemonSet的运行时状态,这个部分是kubectl edit特有的。其实Kubernetes集群中每个当前运行的资源都可以通过 kubectl edit查看其配置和运行状态,比如kubectl edit deployment nginx-deployment。

5.2.3 运行自己的DaemonSet

本小节以Prometheus Node Exporter为例演示用户如何运行自己的DaemonSet。

Prometheus是流行的系统监控方案,Node Exporter是Prometheus的agent,以Daemon的形式运行在每个被监控节点上。

如果是直接在Docker中运行Node Exporter容器,命令为:

docker run -d \\ 
 -v "/proc:/host/proc" \\ 
 -v "/sys:/host/sys" \\ 
 -v "/:/rootfs" \\ 
 --net=host \\ 
 prom/node-exporter \\ 
 --path.procfs /host/proc \\ 
 --path.sysfs /host/sys \\ 
 --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)" 

将其转换为DaemonSet的YAML配置文件node_exporter.yml,如下所示。

[root@k8s-master ~]# cat node_exporter.yml 
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter-daemonset
spec:
  selector:
    matchLabels:
      app: prometheus
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      hostNetwork: true
      containers:
      - name: node-exporter
        image: prom/node-exporter
        imagePullPolicy: IfNotPresent
        command:
        - /bin/node_exporter
        - --path.procfs
        - /host/proc
        - --path.sysfs
        - /host/sys
        - --collector.filesystem.ignored-mount-points
        - ^/(sys|proc|dev|host|etc)($|/)
        volumeMounts:
        - name: proc
          mountPath: /host/proc
        - name: sys
          mountPath: /host/sys
        - name: root
          mountPath: /rootfs
      volumes:
      - name: proc
        hostPath:
          path: /proc
      - name: sys
        hostPath:
          path: /sys
      - name: root
        hostPath:
          path: /
[root@k8s-master ~]# 

① 直接使用Host的网络。

② 设置容器启动命令。

③ 通过Volume将Host路径/proc、/sys和/映射到容器中。我们将在后面详细讨论Volume。

执行kubectl apply -f node_exporter.yml,如图所示。

DaemonSet node-exporter-daemonset部署成功,k8s-node1和k8s-node2上分别运行了一个node exporter Pod。

以上是关于每天5分钟玩转Kubernetes | DaemonSet的主要内容,如果未能解决你的问题,请参考以下文章

每天5分钟玩转Kubernetes | Kubernetes Dashboard安装

每天5分钟玩转Kubernetes | Deployment

每天5分钟玩转Kubernetes | Heapster

每天5分钟玩转Kubernetes | Deployment

每天5分钟玩转Kubernetes | 先把Kubernetes跑起来

每天5分钟玩转Kubernetes | Network Policy