【Kubernetes】 DaemonSet 详解(一)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 【Kubernetes】 DaemonSet 详解

一、介绍DaemonSet

1.1 为什么需要DaemonSet

在 Kubernetes 集群中,通常需要在每个节点上运行守护进程来监视节点健康状态、收集日志等,这些守护进程通常称为系统级守护进程,如 Kubernetes Cluster Autoscaler 和 Kubernetes DNS。使用 Deployment 或 StatefulSet 可以创建 Pod,这些 Pod 可以被调度到任何节点上运行,但是在某些情况下,需要确保每个节点上都运行着一个 Pod 副本 版本,即需要使用 DaemonSet。

1.2 DaemonSet 简介

image.png

DaemonSet 是 Kubernetes 中一种类型的控制器对象,用于在每个节点上运行一个 Pod 副本版本,确保每个节点上都有一个或多个 Pod 副本。DaemonSet 控制器可以保证在新增节点时自动在新增的节点上创建 Pod 副本,同时在节点删除时,自动删除该节点上的 Pod 副本。

1.3 DaemonSet 与其他 Kubernetes 对象的区别

DaemonSet 在运行时,会在集群中的每个节点上创建一个 Pod 副本,而其他的控制器如 Deployment 和 StatefulSet 创建的 Pod,会尽可能地让它们在集群的不同节点上运行。另外,DaemonSet 在节点加入和退出时,会自动处理 Pod 的创建和删除,因此可以保证在整个集群中的每个节点上都运行着一个 Pod 副本,适合用于运行集群服务的 daemon 容器或一些常驻内存的服务。而 Deployment 和 StatefulSet 更适用于部署需要动态扩缩容的应用程序。


image.png

对象类型 说明 控制器 Pods数量
Deployment 管理多个 ReplicaSets,用于应用程序的版本控制和滚动升级 控制器 可以控制多个Pods数量
StatefulSet 用于有状态应用程序,例如数据库,确保每个实例具有唯一的网络标识符和稳定的存储 控制器 可以控制多个Pods数量
DaemonSet 用于运行守护进程(如日志收集器),它会在每个工作节点上运行一个副本 控制器 等于节点数量
Job 用于批处理任务,例如数据转换或任务调度 一次性
CronJob 用于定期执行具有固定时间间隔的任务 可以控制多个Pods数量

二、创建DaemonSet

1.1 使用 kubectl 命令创建 DaemonSet

使用 kubectl 命令创建 DaemonSet 的步骤如下:

  1. 使用以下命令创建 YAML 文件:
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: example-container
        image: nginx

在此示例中,我们创建了一个名为 "example-daemonset" 的 DaemonSet,并使用 Nginx 容器作为模板。请注意,标签 "app: example" 在这里起到关键作用,因为它将用于选择要运行此 DaemonSet 的节点。

  1. 使用以下命令创建 DaemonSet:
kubectl create -f example-daemonset.yaml

这将使用先前创建的 YAML 文件创建 DaemonSet。您可以通过使用以下命令来验证是否已创建 DaemonSet:

kubectl get daemonsets

如果您看到 "example-daemonset",则表示 DaemonSet 已成功创建。

1.2 使用 YAML 文件创建DaemonSet

要使用 YAML 文件创建 DaemonSet,请执行以下步骤:

  1. 创建一个 YAML 文件并使用以下内容:
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: example-container
        image: nginx

在此示例中,我们创建了一个名为 "example-daemonset" 的 DaemonSet,并使用 Nginx 容器作为模板。请注意,标签 "app: example" 在这里起到关键作用,因为它将用于选择要运行此 DaemonSet 的节点。

  1. 使用以下命令创建 DaemonSet:
kubectl apply -f example-daemonset.yaml

这将使用先前创建的 YAML 文件创建 DaemonSet。您可以通过使用以下命令来验证是否已创建 DaemonSet:

kubectl get daemonsets

如果您看到 "example-daemonset",则表示 DaemonSet 已成功创建。

1.3 使用 Terraform 创建 DaemonSet

使用 Terraform 创建 DaemonSet 是一种自动化部署和管理 Kubernetes 应用程序的方法。Terraform 是一种基础设施即代码工具,允许您编写代码来定义和管理基础设施。

要使用 Terraform 创建 DaemonSet,您需要做以下几步:

  1. 安装 Terraform 工具:请根据您的操作系统在 Terraform 官方网站(www.terraform.io/downloads.h…
  2. 创建一个 Terraform 项目:在一个新的目录中,创建一个 main.tf 文件,并添加以下内容。
provider "kubernetes" {
  config_context_cluster = "my-k8s-cluster"
}
resource "kubernetes_daemonset" "my-daemonset" {
  metadata {
    name = "my-daemonset"
  }
  spec {
    selector {
      match_labels = {
        app = "my-daemonset"
      }
    }
    template {
      metadata {
        labels = {
          app = "my-daemonset"
        }
      }
      spec {
        containers {
          name = "my-container"
          image = "nginx:1.19.0-alpine"
          ports {
            name = "http"
            container_port = 80
          }
          volume_mounts {
            name = "html"
            mount_path = "/usr/share/nginx/html"
          }
        }
        volumes {
          name = "html"
          config_map {
            name = "my-daemonset-configmap"
            items {
              key = "index.html"
              path = "index.html"
            }
          }
        }
      }
    }
  }
}

此代码将创建一个名为 my-daemonset 的 DaemonSet,该 DaemonSet 包含一个名为 my-container 的容器,并使用 Nginx 映像。

  1. 初始化 Terraform 项目:使用以下命令初始化 Terraform 项目。
$ terraform init
  1. 配置 Terraform 项目:使用以下命令配置 Terraform 项目。
$ terraform apply

此命令将使用 Terraform 创建 DaemonSet。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
11月前
|
存储 Kubernetes 调度
k8s教程(pod篇)-DaemonSet(每个node上只调度一个pod)
k8s教程(pod篇)-DaemonSet(每个node上只调度一个pod)
209 0
|
7天前
|
Kubernetes 监控 调度
【赵渝强老师】K8s的DaemonSet控制器
DaemonSet控制器确保每个节点上运行一个Pod副本,适用于监控、日志收集等场景。通过示例创建DaemonSet并查看Pod信息,展示了其自动扩展和回收的能力。视频讲解和代码示例详细说明了DaemonSet的使用方法和调度机制。
|
3月前
|
Kubernetes 监控 调度
在K8S中,DaemonSet类型资源特性?
在K8S中,DaemonSet类型资源特性?
|
3月前
|
Prometheus Kubernetes 监控
在K8S中,DaemonSet类型的资源特性有哪些?
在K8S中,DaemonSet类型的资源特性有哪些?
|
3月前
|
Prometheus Kubernetes 监控
在k8S中,DaemonSet类型的资源特性有哪些?
在k8S中,DaemonSet类型的资源特性有哪些?
|
3月前
|
存储 Kubernetes 关系型数据库
Kubernetes(K8S) Controller - StatefulSet、DaemonSet 介绍
Kubernetes(K8S) Controller - StatefulSet、DaemonSet 介绍
33 0
|
监控 Java Perl
17-Kubernetes-Pod控制器详解-DaemonSet(DS)
17-Kubernetes-Pod控制器详解-DaemonSet(DS)
|
Kubernetes 固态存储 API
【k8s 系列】k8s 学习十八,replicaSet,DaemonSet and Job
上一篇讲到的 ReplicationController 是用于复制和在异常的时候重新调度节点的 K8S 组件,后面 K8S 又引入了 ReplicaSet 资源来替代 ReplicationController
114 0
|
6月前
|
存储 Kubernetes 监控
k8s学习-DaemonSet(模板、创建、更新、回滚、删除等)
k8s学习-DaemonSet(模板、创建、更新、回滚、删除等)
140 0
|
Kubernetes 监控 安全
【K8S系列】深入解析DaemonSet
【K8S系列】深入解析DaemonSet
736 0