zoukankan      html  css  js  c++  java
  • DaemonSet介绍

    一、什么是DaemonSet

      DaemonSet(守护进程集)和守护进程类似,它在符合匹配条件的节点上均部署一个Pod
    
      DaemonSet确保全部(或者某些)节点上运行一个Pod副本。当有新节点加入集群时,也会为它们新增一个Pod。当节点从集群中移除时,这些Pod也会被回收,删除DaemonSet将会删除它创建的所有Pod
      使用DaemonSet的一些典型用法:
    	 运行集群存储daemon(守护进程),例如在每个节点上运行Glusterd、Ceph等
    	 在每个节点运行日志收集daemon,例如Fluentd、Logstash
    	 在每个节点运行监控daemon,比如Prometheus Node Exporter、Collectd、Datadog代理、New Relic代理或 Ganglia gmond
    

    二、编写DaemonSet规范

    创建一个DaemonSet的内容大致如下,比如创建一个fluentd的DaemonSet

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: fluentd-es-v2.0.4
      namespace: logging
      labels:
        k8s-app: fluentd-es
        version: v2.0.4
        kubernetes.io/cluster-service: "true"
        addonmanager.kubernetes.io/mode: Reconcile
    spec:
      selector:
        matchLabels:
          k8s-app: fluentd-es
          version: v2.0.4
      template:
        metadata:
          labels:
            k8s-app: fluentd-es
            kubernetes.io/cluster-service: "true"
            version: v2.0.4
          # This annotation ensures that fluentd does not get evicted if the node
          # supports critical pod annotation based priority scheme.
          # Note that this does not guarantee admission on the nodes (#40573).
          annotations:
            scheduler.alpha.kubernetes.io/critical-pod: ''
            seccomp.security.alpha.kubernetes.io/pod: 'docker/default'
        spec:
          serviceAccountName: fluentd-es
          containers:
          - name: fluentd-es
            image: k8s.gcr.io/fluentd-elasticsearch:v2.0.4
            env:
            - name: FLUENTD_ARGS
              value: --no-supervisor -q
            resources:
              limits:
                memory: 500Mi
              requests:
                cpu: 100m
                memory: 200Mi
            volumeMounts:
            - name: varlog
              mountPath: /var/log
            - name: varlibdockercontainers
              mountPath: /var/lib/docker/containers
              readOnly: true
            - name: config-volume
              mountPath: /etc/fluent/config.d
          nodeSelector:
            beta.kubernetes.io/fluentd-ds-ready: "true"
          terminationGracePeriodSeconds: 30
          volumes:
          - name: varlog
            hostPath:
              path: /var/log
          - name: varlibdockercontainers
            hostPath:
              path: /var/lib/docker/containers
          - name: config-volume
            configMap:
              name: fluentd-es-config-v0.1.4
    

    2.1、创建一个DaemonSet

    [root@k8s-master01 ~]# cat > nginx-ds.yaml  << EFO
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      labels:
        app: nginx
      name: nginx
    spec:
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          creationTimestamp: null
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx:1.15.2
            imagePullPolicy: IfNotPresent
            name: nginx
            resources: {}
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
          dnsPolicy: ClusterFirst
          restartPolicy: Alwaysyaml
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
    EFO
    

    # 创建一个ds
    [root@k8s-master01 ~]# kubectl create -f nginx-ds.yaml 
    daemonset.apps/nginx created
    
    # 查看ds信息,个个节点都有一个
    [root@k8s-master01 ~]# kubectl get node -owide
    NAME           STATUS   ROLES    AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
    k8s-master01   Ready    matser   43h   v1.20.0   192.168.1.100   <none>        CentOS Linux 7 (Core)   4.19.12-1.el7.elrepo.x86_64   docker://19.3.14
    k8s-master02   Ready    <none>   43h   v1.20.0   192.168.1.101   <none>        CentOS Linux 7 (Core)   4.19.12-1.el7.elrepo.x86_64   docker://19.3.14
    k8s-master03   Ready    <none>   43h   v1.20.0   192.168.1.102   <none>        CentOS Linux 7 (Core)   4.19.12-1.el7.elrepo.x86_64   docker://19.3.14
    k8s-node01     Ready    <none>   43h   v1.20.0   192.168.1.103   <none>        CentOS Linux 7 (Core)   4.19.12-1.el7.elrepo.x86_64   docker://19.3.14
    k8s-node02     Ready    <none>   43h   v1.20.0   192.168.1.104   <none>        CentOS Linux 7 (Core)   4.19.12-1.el7.elrepo.x86_64   docker://19.3.14
    
    1. 必需字段
      和其他所有Kubernetes配置一样,DaemonSet需要apiVersion、kind和metadata字段,同时也需要一个.spec配置段。
      
    2. Pod模板
      .spec唯一需要的字段是.spec.template。.spec.template是一个Pod模板,它与Pod具有相同的配置方式,但它不具有apiVersion和kind字段。
      除了Pod必需的字段外,在DaemonSet中的Pod模板必须指定合理的标签。
      在DaemonSet中的Pod模板必须具有一个RestartPolicy,默认为Always。
    
    3. Pod Selector
      .spec.selector字段表示Pod Selector,它与其他资源的.spec.selector的作用相同。
      .spec.selector表示一个对象,它由如下两个字段组成:
        matchLabels,与ReplicationController的.spec.selector的作用相同,用于匹配符合条件的Pod。
        matchExpressions,允许构建更加复杂的Selector,可以通过指定key、value列表以及与key和value列表相关的操作符。
        如果上述两个字段都指定时,结果表示的是AND关系(逻辑与的关系)。
      .spec.selector必须与.spec.template.metadata.labels相匹配。如果没有指定,默认是等价的,如果它们的配置不匹配,则会被API拒绝。
    
    (4)指定节点部署Pod
    	如果指定了.spec.template.spec.nodeSelector,DaemonSet Controller将在与Node Selector(节点选择器)匹配的节点上创建Pod,比如部署在磁盘类型为ssd的节点上(需要提前给节点定义标签Label):
        containers:
          - name: nginx
            image: nginx
            imagePullPolicy: IfNotPresent
          nodeSelector:
            disktype: ssd
    
    1. 命令式更新
    kubectl edit ds/<daemonset-name>
    kubectl patch ds/<daemonset-name> -p=<strategic-merge-patch>
    
    2. 更新镜像
    kubectl set image ds/<daemonset-name><container-name>=<container-new-image>--record=true
    
    3. 查看更新状态
    kubectl rollout status ds/<daemonset-name>
    
    4. 列出所有修订版本
    kubectl rollout history daemonset <daemonset-name>
    
    5. 回滚到指定revision
    kubectl rollout undo daemonset <daemonset-name> --to-revision=<revision>
    DaemonSet的更新和回滚与Deployment类似,此处不再演示。
    
  • 相关阅读:
    for,foreach,$.each()跳出循环的比较
    十大经典排序算法
    沙箱模式以及其使用到的IIFE
    绝对路径和相对路径的区别
    必备的JS调试技巧汇总
    通过.frm表结构和.ibd文件恢复数据
    Jenkins使用QQ邮箱构建邮件提醒服务
    windows常用命令积累
    7.手机屏幕分辨率
    6.移动端App安装包的测试用例
  • 原文地址:https://www.cnblogs.com/hsyw/p/14173836.html
Copyright © 2011-2022 走看看