🐇明明跟你说过:个人主页

🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅

🔖行路有良友,便是天堂🔖

目录

一、前言

1、k8s概述

2、DaemonSet概述

二、DaemonSet基本概念

1、DaemonSet的定义

2、DaemonSet的特性

3、DaemonSet与Pod、ReplicationController、ReplicaSet的对比 

三、DaemonSet的工作原理 

1、DaemonSet的调度机制

2、DaemonSet的更新与回滚 

四、DaemonSet的使用

1、创建DaemonSet

2、管理DaemonSet


一、前言

1、k8s概述

Kubernetes单词起源于希腊语, 是“舵手”或者“领航员、飞行员”的意思。

Kubernetes(简称K8s)的前世今生可以追溯到谷歌(Google)内部的一个项目,它起源于2003年,当时谷歌正面临着不断增长的应用程序和服务的管理挑战。这个项目最初被称为"Borg",是一个早期的容器编排系统。Borg 的成功经验成为 Kubernetes 开发的契机。

 有关k8s起源的介绍,请参考《初识K8s之前世今生、架构、组件、前景》这篇文章

Kubernetes的优点包括可移植性、可伸缩性和扩展性。它使用轻型的YAML清单文件实现声明性部署方法,对于应用程序更新,无需重新构建基础结构。管理员可以计划和部署容器,根据需要扩展容器并管理其生命周期。借助Kubernetes的开放源代码API,用户可以通过首选编程语言、操作系统、库和消息传递总线来构建应用程序,还可以将现有持续集成和持续交付(CI/CD)工具集成。

2、DaemonSet概述

DaemonSet是Kubernetes中的一种控制器对象,它的主要作用是在Kubernetes集群的每个节点上运行一个Pod的副本。这意味着,当DaemonSet被创建时,系统会自动调度Pod到所有符合条件的节点上,确保每个节点上都有且仅有一个该Pod的实例。

 DaemonSet在Kubernetes中有着广泛的应用场景,例如部署网络插件的Agent组件、存储插件的Agent组件、监控组件和日志组件等。这些组件都需要在每个节点上运行,以处理节点上的容器网络、挂载远程存储目录、操作容器的Volume目录、收集监控信息和日志等任务。 

  

二、DaemonSet基本概念

1、DaemonSet的定义

DaemonSet的定义包含在一个YAML或JSON文件中,该文件描述了DaemonSet的期望状态。在定义DaemonSet时,需要指定Pod模板,该模板描述了DaemonSet应该创建的Pod的规格。Kubernetes将使用这个模板来生成并管理每个节点上的Pod实例。


一旦DaemonSet定义被提交给Kubernetes API服务器,Kubernetes的调度器就会负责确保每个节点上都运行一个DaemonSet的Pod实例。如果某个节点上没有相应的Pod,调度器会自动创建它;如果Pod由于某种原因被删除或终止,调度器也会自动重新创建它。

2、DaemonSet的特性

  1. 每个节点运行一个实例:DaemonSet会在集群的每个节点上自动创建一个Pod的副本,并确保每个节点上都有一个Pod在运行。这种特性使得DaemonSet特别适合用于部署需要在每个节点上运行的守护进程应用程序。
  2. 节点生命周期绑定:当新的节点加入到Kubernetes集群时,DaemonSet会自动在该节点上运行所需的Pod副本。相反,当节点从集群中移除或被标记为不可调度时,DaemonSet会移除或清理与之关联的Pod。
  3. 节点选择性部署:DaemonSet支持使用NodeSelector、NodeAffinity等机制来精细控制Pod在哪些节点上运行。这使得用户可以根据需要,将Pod部署在具有特定标签的节点上。

   

3、DaemonSet与Pod、ReplicationController、ReplicaSet的对比 

DaemonSet与Pod、ReplicationController和ReplicaSet在Kubernetes中各自扮演着不同的角色,并有着显著的区别。

Pod是Kubernetes中最小的可部署的计算单元,它封装了一个或多个容器以及这些容器共享的网络、存储等资源。Pod是Kubernetes资源管理的基础,它使得容器间的通信和资源共享变得简单。

ReplicationController(RC)ReplicaSet是用于确保在Kubernetes集群中始终运行指定数量的Pod副本的控制器。它们的主要目标是保证应用的高可用性。ReplicationController是早期的控制器实现,而ReplicaSet则是其下一代版本,提供了更强大的功能,特别是支持新的基于集合的选择器需求。

DaemonSet则与上述三者有着明显的不同。DaemonSet的主要职责是在集群的每个节点上运行一个Pod的副本,这使得DaemonSet非常适合用于部署需要在每个节点上运行的守护进程应用程序。DaemonSet不关心Pod副本的总数,而是关心每个节点上是否都有Pod在运行。

  

三、DaemonSet的工作原理 

1、DaemonSet的调度机制

DaemonSet的调度机制与Kubernetes中其他类型的资源调度有所不同。其核心目的是确保每个满足条件的节点上都运行一个Pod副本。


以下是DaemonSet调度机制的主要特点:

  1. 节点选择:DaemonSet的调度器会首先遍历集群中的所有节点,根据DaemonSet的定义和节点的标签、污点等信息来判断哪些节点满足运行Pod的条件。这通常是通过节点选择器(Node Selector)、污点与容忍度(Taints and Tolerations)以及亲和性和反亲和性(Affinity 和 Anti-affinity)等机制来实现的。
  2. Pod创建:一旦调度器找到满足条件的节点,它会根据DaemonSet中定义的Pod模板来创建Pod。这些Pod会被调度到相应的节点上,并由kubelet负责启动和管理。
  3. 自动扩展:当新的节点加入集群时,DaemonSet的调度器会自动检测到这一变化,并在新节点上创建Pod副本。同样地,如果某个节点从集群中移除或变得不可调度,DaemonSet会确保该节点上的Pod被删除或迁移到其他节点。
  4. 更新与滚动升级:当DaemonSet的定义发生变化时(例如更新了Pod模板),调度器会负责协调Pod的更新过程。这通常涉及到滚动升级机制,即逐步替换旧的Pod副本,以确保在升级过程中服务的可用性。

2、DaemonSet的更新与回滚 

DaemonSet的更新与回滚机制是Kubernetes中重要的一部分,它允许管理员在不影响集群运行的情况下,对DaemonSet中的Pod进行版本更新或回滚到之前的版本。

更新机制:

DaemonSet提供了两种主要的更新策略:OnDelete和RollingUpdate。

  • OnDelete策略:在这种策略下,当DaemonSet的模板被更新后,只有当你手动删除老的DaemonSet Pods后,新的DaemonSet Pod才会被自动创建。这种策略给了管理员更多的控制权,但也需要更多的手动操作。
  • RollingUpdate策略:这是默认的更新策略。当DaemonSet模板更新后,老的DaemonSet Pod将被终止,并且将以受控方式自动创建新的DaemonSet Pod。在更新期间,最多只能有一个Pod运行于每个节点上,以确保更新的平滑进行。

回滚机制:

如果新的DaemonSet版本存在问题,管理员可以选择回滚到之前的版本。回滚操作通常涉及以下几个步骤:

  1. 记录历史版本:在更新DaemonSet之前,通常需要记录当前的版本信息,以便在需要时可以回滚到该版本。
  2. 触发回滚:当发现问题需要回滚时,管理员可以使用kubectl命令行工具或其他Kubernetes API来触发回滚操作。
  3. 选择回滚目标:管理员可以选择回滚到上一个版本,或者指定一个特定的历史版本来进行回滚。
  4. 执行回滚:一旦选择了回滚目标,Kubernetes将开始执行回滚操作,将DaemonSet及其Pod恢复到指定的历史版本。

四、DaemonSet的使用

1、创建DaemonSet

1. 定义YAML文件:首先,需要创建一个YAML文件来描述DaemonSet的规格。这个文件中会包含Pod模板,以及DaemonSet的其他配置信息,如节点选择器(用于指定DaemonSet在哪个节点上运行)。

 示例:

apiVersion: apps/v1  
kind: DaemonSet  
metadata:  
  name: example-daemonset  
  labels:  
    app: example  
spec:  
  selector:  
    matchLabels:  
      app: example  
  template:  
    metadata:  
      labels:  
        app: example  
    spec:  
      containers:  
      - name: my-container  
        image: my-image

在这个例子中,我们创建了一个名为example-daemonset的DaemonSet,它运行一个名为my-container的容器,该容器使用my-image镜像。

2. 使用kubectl创建DaemonSet:一旦定义了YAML文件,就可以使用kubectl命令行工具来创建DaemonSet。

kubectl apply -f daemonset.yaml

 这里daemonset.yaml是YAML文件的名称。执行这个命令后,Kubernetes将根据YAML文件中的定义创建DaemonSet。

2、管理DaemonSet

1. 查看DaemonSet状态:可以使用kubectl来查看DaemonSet的状态和相关信息。

kubectl get daemonsets

这个命令将列出所有的DaemonSet及其状态。

2. 查看DaemonSet详情:要查看特定DaemonSet的详细信息,可以使用以下命令:

kubectl describe daemonset <daemonset-name>

将<daemonset-name>替换为要查看的DaemonSet的名称。

3. 更新DaemonSet:当需要更新DaemonSet时,可以编辑原始的YAML文件,然后重新应用它。Kubernetes会处理Pod的滚动更新,确保在更新过程中服务的连续性。

kubectl apply -f updated-daemonset.yaml

这里updated-daemonset.yaml是包含更新后配置的YAML文件。

4. 删除DaemonSet:当不再需要DaemonSet时,可以使用以下命令删除它:

kubectl delete daemonset <daemonset-name>

同样,将<daemonset-name>替换为要删除的DaemonSet的名称。删除DaemonSet会同时删除它创建的所有Pod。

💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Kubernetes的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!    

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐