首页 > 其他分享 >3-5、Pod控制器-Daemonset

3-5、Pod控制器-Daemonset

时间:2022-11-14 23:56:24浏览次数:38  
标签:控制器 name filebeat spec DaemonSet 节点 pod Pod Daemonset

DaemonSet

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



DaemonSet 的一些典型用法:

在每个节点上运行集群存储 DaemonSet,例如 glusterd、ceph。

在每个节点上运行日志收集 DaemonSet,例如 fluentd、logstash。

在每个节点上运行监控 DaemonSet,例如 Prometheus Node Exporter、Flowmill、Sysdig 代理、collectd、Dynatrace OneAgent、AppDynamics 代理、Datadog 代理、New Relic 代理、Ganglia gmond 或者 Instana 代理。

一个简单的用法是在所有的节点上都启动一个 DaemonSet,并作为每种类型的 daemon 使用。



一个稍微复杂的用法是单独对每种 daemon 类型使用一种DaemonSet。这样有多个 DaemonSet,但具有不同的标识,并且对不同硬件类型具有不同的内存、CPU 要求

DaemonSet

vi daemonset-demo.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
    name: filebeat-ds
    namespace: default
spec:
    replicas: 2
    selector:
        matchLabels:
            app: filebeat
            release: canary
    template:
        metadata:
           labels:
            app: filebeat
            release: canary
        spec:
            containers:
            - name: filebeat
              image: ikubernetes/filebeat:5.6.5-alpine
              env:
              - name: REDIS_HOST
                value: redis.default.svc.cluster.local
              - name: REDIS_LOG_LEVEL
                value: info

查看镜像的信息:
# docker image inspect ikubernetes/filebeat:5.6.5-alpine

# kubectl apply -f daemonset-demo.yml
# kubectl get pods
NAME                            READY   STATUS             RESTARTS   AGE
myapp-ds-c8h2w                  1/1     Running            0          11s

查看其日志信息:
# kubectl logs myapp-ds-c8h2w    
2019/04/14 10:52:52.162394 beat.go:297: INFO Home path: [/usr/local/bin] Config path: [/usr/local/bin] Data path: [/usr/local/bin/data] Logs path: [/usr/local/bin/logs]

一个yml文件中定义多个资源:
apiVersion: v1
kind: Deployment
metadata:
  name: redis
  namespace: default
spec:
  replicas: 1
  selector: 
      matchLabels:
          app: redis
          role: logstor
  template:
    metadata:
      labels: 
        app: redis
        role: logstor
    spec:
      containers:
      - name: redis
        image: redis:4.0-alpine
        ports:
        - name: redis
          containerPort: 6379
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
    name: filebeat-ds
    namespace: default
spec:
    replicas: 2
    selector:
        matchLabels:
            app: filebeat
            release: canary
    template:
        metadata:
           labels:
            app: filebeat
            release: canary
        spec:
            containers:
            - name: filebeat
              image: ikubernetes/filebeat:5.6.5-alpine
              env:
              - name: REDIS_HOST
                value: redis.default.svc.cluster.local
              - name: REDIS_LOG_LEVEL
                value: info

将redis端口暴露出来:
# kubectl expose deployment redis --port=6379


daemonset示例2:
运行fluentd-elasticsearch image:
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

        effect: NoSchedule

      containers:

      - name: fluentd-elasticsearch

        image: k8s.gcr.io/fluentd-elasticsearch:1.20

        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
#kubectl apply -f daemonset.yaml

DaemonSet同样会受到Taint的抵制,如果不在配置中加入匹配的Toleration,那么DaemonSet不会在拥有Taint属性的node上部署pod。上例中有如下内容:



tolerations:

      - key: node-role.kubernetes.io/master

        effect: NoSchedule

原因就是系统默认为master节点增加了 “node-role.kubernetes.io/master”的Taint,以抵制普通pod部署,使master成为专用节点。因为我们预期上例DaemonSet在集群内全局部署,因此需要加入相匹配的Toleration。



如果预期DaemonSet只在特定节点上运行,可以在上述配置文件中加入.spec.template.spec.nodeSelector字段。.

spec.template.spec.nodeSelector字段内加入节点选择器(node selector)或者亲和选择器(node affinity),则DaemonSet只会在满足条件的node上部署pod。总之,可以通过Taint、Toleration、Affinity、node label控制DaemonSet部署pod的节点范围。

系统如何调度DaemonSet pod?
默认情况下DaemonSet在创建pod时,为其增加spec.nodeName字段,也就是说所创建的pod运行在那个节上在创建阶段就已经确定,所以DaemonSet中的pod实际上没有接受kubernetes scheduler的调度,它不需要调度,因此产生以下两个特性:
DaemonSet中的pod不遵从节点的unreachable条件,也就是即使节点被系统判定为不可达,DaemonSet仍然试图在其上部署pod。
在集群引导阶段,即使kubernetes scheduler还没有部署生效,DaemonSet仍然可以将pod部署到集群中的任何节点,此特性主要是在集群引导阶段使用。
因为DaemonSet不同于常规pod的调度特性,它带来两个问题:
pod行为不一致。普通pod被创建以后等待调度的阶段称为pending,因为DaemonSet中的pod无需调度,因而无此状态,用户会因此产生迷惑。
pod优先级特性由kubernetes scheduler实现,DaemonSet无此特性。当系统打开pod优先级功能时,pod优先级特性会被DaemonSet中的pod忽略。

为了解决以上两个问题,kubernetes增加了通过设置允许DaemonSet使用kurbernetes scheduler的功能,并在1.11的 alpha版本中成为稳定特性。其实现机制是DaemonSet在创建pod时,不再自动添加.spec.nodeName,而是以nodeAffinity取而代之,示例如下:
nodeAffinity:

  requiredDuringSchedulingIgnoredDuringExecution:

    nodeSelectorTerms:

    - matchFields:

      - key: metadata.name

        operator: In

        values:

        - target-host-name
其中"target-host-name"就是原来.spec.nodeName的值,这样pod就会被kubernetes scheduler调度。通过以上操作解决了上述两个问题。但DaemonSet的调度有自己因有的特性,在上文中提到的“不受节点unreachable条件限制”,为了使DaemonSet在使用kubernetes scheduler时仍然保持此特性需要打开集群的"TaintNodesByCondition"特性,如果DaemonSet使用主机网络那么必需在DaemonSet中添加如下的Toleration:



node.kubernetes.io/network-unavailable:NoSchedule

 

标签:控制器,name,filebeat,spec,DaemonSet,节点,pod,Pod,Daemonset
From: https://www.cnblogs.com/skyzy/p/16890998.html

相关文章

  • 3-4、Pod控制器-ReplicaSet
    Pod控制器:ReplicationController(简称RC,已经淘汰)ReplicaSetDeploymentDaemonSetJobCronjobStatefulSet自主式POD:deletepod后不会被重新拉起的,不是由pod控制器控......
  • 3-5、Pod控制器-StatefulSet
    StatefulSet有状态的集合,管理所有有状态的服务,比如MySQL、MongoDB集群等。StatefulSet:是一种给Pod提供唯一标志的控制器,它可以保证部署和扩展的顺序。Pod一致性:包含......
  • 1-4 pod生命周期
    1pod生命周期pod的创建过程用户通过kubectl或其他api客户端提交podspec给apiserverapiserver尝试着将pod对象的相关信息存入etcd中,待写入操作执行完成,apiserver即......
  • 实验6:开源控制器实践——RYU
    搭建下图所示SDN拓扑,协议使用OpenFlow1.0,并连接Ryu控制器,通过Ryu的图形界面查看网络拓扑。阅读Ryu文档的TheFirstApplication一节,运行当中的L2Switch,h1pingh2或h3,......
  • 实验4:开源控制器实践——OpenDaylight + 实验2:Open vSwitch虚拟交换机实践
    实验4:开源控制器实践——OpenDaylight1.基础要求1)扑生成并连接控制器的结果2)启动ODL3)打开Postman接口调试工具4)DELETEURL:http://127.0.0.1:8181/restconf/conf......
  • Pod详解之Pod生命周期
    Pod生命周期我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期,它主要包含下面的过程:-pod创建过程-运行初始化容器(initcontainer)过程-运行主容器(mainc......
  • 实验6:开源控制器实践——RYU
     一、实验目的能够独立部署RYU控制器;能够理解RYU控制器实现软件定义的集线器原理;能够理解RYU控制器实现软件定义的交换机原理。二、实验环境Ubuntu20.04Desktop......
  • 实验5:开源控制器实践——POX
     一、实验目的能够理解POX控制器的工作原理;通过验证POX的forwarding.hub和forwarding.l2_learning模块,初步掌握POX控制器的使用方法;能够运用POX控制器编写自定义......
  • 第五章 k8s Pod水平自动缩放
    官网​​https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale/​​原理基本原理:HPA通过监控分析控制器控制的所有Pod的负载变化情况来确......
  • 【ASP.NET Core】MVC控制器的各种自定义:应用程序约定的接口与模型
    从本篇起,老周会连发N篇水文,总结一下在MVC项目中控制器的各种自定义配置。本文内容相对轻松,重点讨论一下MVC项目中的各种约定接口。毕竟你要对控制器做各种自定义时,多......