【云原生 | 从零开始学Kubernetes】二十四、kubernetes控制器Daemonset

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: DaemonSet 控制器能够确保 k8s 集群所有的节点都运行一个相同的 pod 副本,当向 k8s 集群中增加 node 节点时,这个 node 节点也会自动创建一个 pod 副本,当 node 节点从集群移除,这些 pod 也会自动删除;删除 Daemonset 也会删除它们创建的 pod。

kubernetes控制器Daemonset


DaemonSet 控制器:概念、原理解读


DaemonSet 概述


DaemonSet 工作原理:如何管理 Pod?


Daemonset 典型的应用场景


DaemonSet 与 Deployment 的区别


DaemonSet 资源清单文件编写技巧


DaemonSet 使用案例:部署日志收集组件 fluentd


Daemonset 管理 pod:滚动更新


DaemonSet 控制器:概念、原理解读


DaemonSet 概述


DaemonSet 控制器能够确保 k8s 集群所有的节点都运行一个相同的 pod 副本,当向 k8s 集群中增加 node 节点时,这个 node 节点也会自动创建一个 pod 副本,当 node 节点从集群移除,这些 pod 也会自动删除;删除 Daemonset 也会删除它们创建的 pod。


DaemonSet 工作原理:如何管理 Pod?


daemonset 的控制器会监听 kuberntes 的 daemonset 对象、pod 对象、node 对象,这些被监听的对象变动就会触发 syncLoop 循环让 kubernetes 集群朝着 daemonset 对象描述的状态进行演进。


Daemonset 典型的应用场景


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


在每个节点上运行日志收集组件,比如:flunentd 、 logstash、filebeat 等。


在每个节点上运行监控组件,比如:Prometheus、 Node Exporter 、collectd 等。


都可以用daemonset去创建运行。


DaemonSet 与 Deployment 的区别


Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 都可能运行好几个副本。


DaemonSet 的不同之处在于:每个 Node 上最多只能运行一个副本。


DaemonSet 资源清单文件编写技巧


#查看定义 Daemonset 资源需要的字段有哪些
[root@k8smaster ~]# kubectl explain ds 
KIND:     DaemonSet
VERSION:  apps/v1
DESCRIPTION:
     DaemonSet represents the configuration of a daemon set.
FIELDS: 
 apiVersion <string>    #当前资源使用的 api 版本,跟 VERSION: apps/v1 保持一致 
 kind <string>      #资源类型,跟 KIND: DaemonSet 保持一致 
 metadata <Object>    #元数据,定义 DaemonSet 名字的 
 spec <Object>      #定义容器的 
 status <Object>    #状态信息,不能改 
#查看 DaemonSet 的 spec 字段如何定义
[root@k8smaster ~]# kubectl explain ds.spec 
KIND:     DaemonSet
VERSION:  apps/v1
RESOURCE: spec <Object>
DESCRIPTION:
     The desired behavior of this daemon set. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
     DaemonSetSpec is the specification of a daemon set.
FIELDS: 
 minReadySeconds <integer>      #当新的 pod 启动几秒种后,再 kill 掉旧的pod。 
 revisionHistoryLimit <integer>   #历史版本 
 selector <Object> -required-     #用于匹配 pod 的标签选择器 
 template <Object> -required-     #定义 Pod 的模板,基于这个模板定义的所有 pod 是一样的 
 updateStrategy <Object>      #daemonset 的升级策略 
#查看 DaemonSet 的 spec.template 字段如何定义
#对于 template 而言,其内部定义的就是 pod,pod 模板是一个独立的对象 
[root@k8smaster ~]# kubectl explain ds.spec.template 
kubectl explain ds.spec.template KIND:    DaemonSet
VERSION:  apps/v1
RESOURCE: template <Object>
FIELDS: 
 metadata <Object> 
 spec<Object>


DaemonSet 使用案例:部署日志收集组件 fluentd


#master node1 node2 都下载 fluentd
#编写一个 DaemonSet 资源清单 daemonset 也是通过标签选择器来选择模板创建pod
[root@k8smaster ~]# mkdir ds
[root@k8smaster ~]# cd ds
[root@k8smaster ~]# kubectl explain ds.spec.template.spec.tolerations
#找到容忍度 Taints 因为没有定义value 下面定义容忍度也不用写值,写一个排斥等级就行了
[root@k8smaster ds]# vim daemonset.yaml 
apiVersion: apps/v1
kind: DaemonSet
metadata: 
  labels:
    k8s-app: fluentd-logging
  name: fluentd-elasticsearch
  namespace: kube-system
spec:
  selector:
    matchLabels:
     name: fluentd-elasticsearch
  template:
    metadata:
     name: fluentd
     labels:
       name: fluentd-elasticsearch
    spec:
     tolerations:
     - key: node-role.kubernetes.io/master
       effect: NoSchedule
     containers:
     - name:  fluentd-elasticsearch
       image: fluentd
       resources:
         limits: 
           memory: 500Mi
         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
[root@k8smaster ds]# kubectl apply -f daemonset.yaml 
daemonset.apps/fluentd-elasticsearch created
[root@k8smaster ds]# kubectl get ds -n kube-system 
NAME                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
fluentd-elasticsearch   3         3         3       3            0           <none>                   9s
kube-flannel-ds         3         3         3       3            3           <none>                   18d
kube-proxy              3         3         3       3            3           kubernetes.io/os=linux   18d
[root@k8smaster ds]# kubectl get pods -n kube-system -o wide -l name=fluentd-elasticsearch
NAME                          READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE  
fluentd-elasticsearch-n5jj7   1/1     Running   0          59s   10.244.1.4   k8snode2    <none>           
fluentd-elasticsearch-qxgmc   1/1     Running   0          59s   10.244.0.2   k8smaster   <none>           
fluentd-elasticsearch-rhhv8   1/1     Running   0          59s   10.244.2.6   k8snode     <none>           
#通过上面可以看到在 k8s 的三个节点均创建了 fluentd 这个 pod 
#pod 的名字是由控制器的名字-随机数组成的 
#资源清单详细说明 
apiVersion: apps/v1    #DaemonSet 使用的 api 版本 
kind: DaemonSet     # 资源类型 
metadata: 
name: fluentd-elasticsearch  #资源的名字 
namespace: kube-system    #资源所在的名称空间 
labels: 
k8s-app: fluentd-logging    #资源具有的标签 
spec: 
selector:       #标签选择器 
matchLabels: 
name: fluentd-elasticsearch 
template: 
metadata: 
labels:       #基于这回模板定义的 pod 具有的标签 
name: fluentd-elasticsearch 
spec: 
tolerations:  #定义容忍度 
- key: node-role.kubernetes.io/master 
effect: NoSchedule      #只会影响新调度的pod
containers:  #定义容器 
- name: fluentd-elasticsearch 
image: xianchao/fluentd:v2.5.1 
resources:    #资源配额 
limits:   #最大资源
memory: 200Mi 
requests:   #最小资源
cpu: 100m 
memory: 200Mi 
volumeMounts: 
- name: varlog 
mountPath: /var/log    #把本地/var/log 目录挂载到容器 
- name: varlibdockercontainers 
mountPath: /var/lib/docker/containers   #把/var/lib/docker/containers/挂载到容器里 
readOnly: true      #挂载目录是只读权限 
terminationGracePeriodSeconds: 30 #优雅的关闭服务 
volumes: 
- name: varlog 
hostPath: 
path: /var/log      #基于本地目录创建一个卷 会去采集这个目录下的日志
- name: varlibdockercontainers 
hostPath: 
path: /var/lib/docker/containers #基于本地目录创建一个卷 同上


Daemonset 管理 pod:滚动更新


#DaemonSet 实现 pod 的滚动更新 
#查看 daemonset 的滚动更新策略 
[root@k8smaster ds]# kubectl explain ds.spec.updateStrategy 
KIND:     DaemonSet
VERSION:  apps/v1
RESOURCE: updateStrategy <Object>
DESCRIPTION:
     An update strategy to replace existing DaemonSet pods with new pods.
     DaemonSetUpdateStrategy is a struct used to control the update strategy for
     a DaemonSet.
FIELDS:
   rollingUpdate  <Object>
     Rolling update config params. Present only if type = "RollingUpdate".
   type <string>
     Type of daemon set update. Can be "RollingUpdate" or "OnDelete". Default is
     RollingUpdate.
#查看 rollingUpdate 支持的更新策略 
[root@k8smaster ds]# kubectl explain ds.spec.updateStrategy.rollingUpdate 
KIND:     DaemonSet
VERSION:  apps/v1
RESOURCE: rollingUpdate <Object>
DESCRIPTION:
     Rolling update config params. Present only if type = "RollingUpdate".
     Spec to control the desired behavior of daemon set rolling update.
FIELDS:
   maxUnavailable <string>
#上面表示 rollingUpdate 更新策略只支持 maxUnavailabe,先删除在更新;因为我们不支持一个节点运行两个 pod,因此需要先删除一个,在更新一个。 
#更新镜像版本,可以按照如下方法: 
[root@k8smaster ds]# kubectl set image daemonsets fluentd-elasticsearch fluentd-elasticsearch=nginx -n kube-system
daemonset.apps/fluentd-elasticsearch image updated
#这个镜像启动 pod 会有问题,主要是演示 daemonset 如何在命令行更新 pod 平时不用 都是改yaml
[root@k8smaster ds]# kubectl set image daemonsets fluentd-elasticsearch fluentd-elasticsearch=fluentd -n kube-system
daemonset.apps/fluentd-elasticsearch image updated
#改回来
[root@k8smaster ds]# kubectl get pods -n kube-system
NAME                                READY   STATUS    RESTARTS   AGE
fluentd-elasticsearch-874qw         1/1     Running   0          23s
fluentd-elasticsearch-lmvjq         1/1     Running   0          26s
fluentd-elasticsearch-qxgmc         1/1     Running   0          8m29s
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
5天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
23 2
|
7天前
|
Kubernetes 监控 调度
【赵渝强老师】K8s的DaemonSet控制器
DaemonSet控制器确保每个节点上运行一个Pod副本,适用于监控、日志收集等场景。通过示例创建DaemonSet并查看Pod信息,展示了其自动扩展和回收的能力。视频讲解和代码示例详细说明了DaemonSet的使用方法和调度机制。
|
7天前
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Job控制器单工作队列的串行方式
Kubernetes中的Job控制器用于管理一次性任务,确保任务完成后不再重启。本文介绍了Job的工作原理、运行方式及示例,包括创建Job、查看Job和Pod信息等步骤,并附有视频讲解。
|
5天前
|
Kubernetes 监控 负载均衡
深入云原生:Kubernetes 集群部署与管理实践
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其弹性、可扩展性成为企业IT架构的首选。本文将引导你了解如何部署和管理一个Kubernetes集群,包括环境准备、安装步骤和日常维护技巧。我们将通过实际代码示例,探索云原生世界的秘密,并分享如何高效运用这一技术以适应快速变化的业务需求。
23 1
|
7天前
|
存储 Kubernetes 调度
【赵渝强老师】K8s中Deployment控制器与StatefulSet控制器的区别
K8s中的Deployment控制器用于管理无状态应用程序,关注Pod数量、更新方式等;而StatefulSets控制器则管理有状态应用程序,提供持久存储和唯一标识符,适用于需要稳定网络标识符和持久化存储的场景。两者的主要区别在于是否维护状态和顺序。
|
7天前
|
存储 Kubernetes 调度
【赵渝强老师】K8s的有状态控制器StatefulSet
在Kubernetes中,StatefulSets用于部署有状态应用程序,提供持久存储和唯一标识符。与Deployment不同,StatefulSets确保Pod的标识符在重新调度后保持不变,适用于需要稳定网络标识符和持久存储的场景。本文介绍了StatefulSets的创建、扩容与缩容、更新与回滚等操作,并提供了具体示例和视频讲解。
|
7天前
|
Kubernetes Linux 调度
【赵渝强老师】K8s的周期性任务控制器CronJob
本文介绍了K8s中的CronJob控制器,它类似于Linux的crontab命令,用于管理和调度定时作业。CronJob可以设置在未来某一时间运行作业一次或在指定时间点重复运行作业。文章通过一个示例展示了如何创建和使用CronJob控制器,包括创建配置文件、应用配置、查看Pod信息和日志等步骤。同时,还解释了CronJob的时间表示方式及其限制。
|
7天前
|
Kubernetes 调度 容器
【赵渝强老师】K8s的Job控制器多工作队列的并行方式
Kubernetes Job 是一次性任务控制器,用于控制 Pod 中的容器执行特定任务。本文介绍了 Job 控制器的工作原理、运行方式及多工作队列并行执行的示例。示例中创建了 5 个作业,以 3 个队列并行执行,整个过程需 2 分钟。文中还提供了详细的 YAML 文件配置和执行命令。
|
3天前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
|
5天前
|
运维 Kubernetes Cloud Native
云原生技术:容器化与微服务架构的完美结合
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其灵活性和高效性成为企业的新宠。本文将深入探讨云原生的核心概念,包括容器化技术和微服务架构,以及它们如何共同推动现代应用的发展。我们将通过实际代码示例,展示如何在Kubernetes集群上部署一个简单的微服务,揭示云原生技术的强大能力和未来潜力。