zoukankan      html  css  js  c++  java
  • Kubernetes 资源对象之DaemonSet

    DaemonSet是在Kubernetes1.2 版本新增的一种资源对象

    DaemonSet能够让所有(或者一些特定)的Node节点仅运行一份Pod。当节点加入到kubernetes集群中,Pod会被(DaemonSet)调度到该节点上运行,当节点从kubernetes集群中被移除,被(DaemonSet)调度的Pod会被移除,如果删除DaemonSet,所有跟这个DaemonSet相关的pods都会被删除。

    在使用kubernetes来运行应用时,很多时候我们需要在一个区域(zone)或者所有Node上运行同一个守护进程(pod),例如如下场景:

    • 每个Node上运行一个分布式存储的守护进程,例如glusterd,ceph
    • 运行日志采集器在每个Node上,例如fluentd,logstash
    • 运行监控的采集端在每个Node,例如prometheus node exporter,collectd等

    DaemonSet的Pod调度策略与RC很类似,除了使用系统内置的调度算法在每个Node上进行调度,也可以在Pod定义中使用NodeSelector或NodeAffinity来指定满足条件的Node范围进行调度

    DaemonSet 资源文件格式

    apiVersion: extensions/v1beta1
    kind: DaemonSet
      metadata:
    

    1.下面例子定义为在每个Node上都启动一个filebeat容器,其中挂载了宿主机目录"/var/log/messages"

    $ vi k8s-log-filebeat.yaml
    apiVersion: v1
    kind: ConfigMap # 定义一个config文件内容
    metadata:
      name: k8s-logs-filebeat-config
      namespace: kube-system
    data:
      # 填写filebeat读取日志相关信息
      filebeat.yml: |-
        filebeat.prospectors:
          - type: log
            paths:
              - /messages
            fields:
              app: k8s
              type: module
            fields_under_root: true
        output.logstash:
          # specified logstash port (by default 5044)
          hosts: ['10.0.0.100:5044']
    ---
    apiVersion: apps/v1
    kind: DaemonSet  # DaemonSet 对象,保证在每个node节点运行一个副本
    metadata:
      name: k8s-logs
      namespace: kube-system
    spec:
      selector:
        matchLabels:
          project: k8s
          app: filebeat
      template:
        metadata:
          labels:
            project: k8s
            app: filebeat
        spec:
          containers:
          - name: filebeat
            image: docker.elastic.co/beats/filebeat:6.8.1
            args: [
              "-c", "/etc/filebeat.yml",
              "-e",
            ]
            resources:
              requests:
                cpu: 100m
                memory: 100Mi
              limits:
                cpu: 500m
                memory: 500Mi
            securityContext:
              runAsUser: 0
            # 进行实际挂载操作
            volumeMounts:
            # 将configmap里的配置挂载到 /etc/filebeat.yml 文件中
            - name: filebeat-config
              mountPath: /etc/filebeat.yml
              subPath: filebeat.yml
    
            # 将宿主机  /var/log/messages 路径挂载到 /messages中
            - name: k8s-logs
              mountPath: /messages
          # 定义卷
          volumes:
          - name: k8s-logs
            hostPath:
              path: /var/log/messages
              type: File
          - name: filebeat-config
            configMap:
              name: k8s-logs-filebeat-config
    

    2.使用kubectl create 命令创建该DeamonSet

    $ kubectl create -f  k8s-log-filebeat.yaml
    configmap/k8s-logs-filebeat-config created
    daemonset.apps/k8s-logs created
    

    3.查看创建好的DeamonSet和Pod,可以看到在每个Node上都创建了一个Pod

    $ kubectl get ds -n kube-system | grep "k8s-logs"
    NAME            DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGE
    k8s-logs                  2         2         0       2            0           <none>                        2m15s
    
    $ kubectl get pods -n kube-system -o wide | grep "k8s-logs"  
    k8s-logs-gw4bs                         0/1     Running   0          87s     <none>        k8s-node01     <none>           <none>
    k8s-logs-p6r6t                         0/1     Running   0          87s     <none>        k8s-node02     <none>           <none>
    

    在kubernetes 1.6以后的版本中,DaemonSet也能执行滚动升级了,即在更新一个DaemonSet模板的时候,旧的Pod副本会被自动删除,同时新的Pod副本会被自动创建,此时DaemonSet的更新策略(updateStrategy)为RollingUpdate,如下:

    apiVersion: apps/v1
    kind: DaemonSet 
    metadata:
      name: k8s-logs
      namespace: kube-system
    spec:
      updateStrategy:
        type: RollingUpdate
    

    updateStrategy 的另外一个值是OnDelete,即只有当手工删除了DaemonSet创建的Pod副本,新的Pod副本才会被创建出来,如果不设置updateStrategy的值,则在kubernetes 1.6之后的版本中会被默认设置为RollingUpdate(滚动升级)。

  • 相关阅读:
    服务端跳转和客户端跳转的区别
    jsp:include标签与include指令的区别
    jsp错误页不跳转显示500
    使用Cookie进行会话管理
    深入理解重定向和转发
    appium环境搭建(二)----搭建android开发环境
    appium环境搭建(一)----安装appium
    Fiddler实现移动端手机抓包
    黑盒测试人员必备技能
    SVN服务器搭建
  • 原文地址:https://www.cnblogs.com/jasonminghao/p/12273341.html
Copyright © 2011-2022 走看看