• k8s的DamonSet使用


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

    1.DaemonSet 的典型应用场景

    1. 在集群的每个节点上运行存储 Daemon,比如 分布式存储 glusteFS 或 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 中的资源。

    下面详细分析两个 k8s 自己的 DaemonSet:kube-flannel-ds 和 kube-proxy 。

    2.kube-flannel-ds

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

    还记得之前是如何部署 flannel 网络的吗?我们执行了如下两个命令:

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

    flannel 的 DaemonSet 就定义在 kube-flannel.yml 中:

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

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

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

    我们再来分析另一个 DaemonSet   kube-proxy

    3.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

    4.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:

    apiVersion: extensions/v1beta1
    kind: DaemonSet
    metadata:
      name: node-exporter-daemonset
    spec:
      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: /

    ① 直接使用 Host 的网络。
    ② 设置容器启动命令。
    ③ 通过 Volume 将 Host 路径 /proc/sys 和 / 映射到容器中。

    执行 kubectl apply -f node_exporter.yml

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

  • 相关阅读:
    交叉编译qt5.4.1遇到的错误
    qt5.4.1官网上找不到
    Runtime dependency gstreameraudio1.0 found: NO (tried pkgconfig and cmake)
    gstreamer库 ubuntu下安装
    gstreamer编译错误
    gstreamer在ubuntu上源码编译
    http学习
    SQL定义变量
    对w3wp.exe的一点认识!
    官方发布!DevExpress WPF 2022年产品升级路线图
  • 原文地址:https://www.cnblogs.com/benjamin77/p/9902369.html
Copyright © 2020-2023  润新知