一、介绍DaemonSet
1.1 为什么需要DaemonSet
在 Kubernetes 集群中,通常需要在每个节点上运行守护进程来监视节点健康状态、收集日志等,这些守护进程通常称为系统级守护进程,如 Kubernetes Cluster Autoscaler 和 Kubernetes DNS。使用 Deployment 或 StatefulSet 可以创建 Pod,这些 Pod 可以被调度到任何节点上运行,但是在某些情况下,需要确保每个节点上都运行着一个 Pod 副本 版本,即需要使用 DaemonSet。
1.2 DaemonSet 简介
DaemonSet 是 Kubernetes 中一种类型的控制器对象,用于在每个节点上运行一个 Pod 副本版本,确保每个节点上都有一个或多个 Pod 副本。DaemonSet 控制器可以保证在新增节点时自动在新增的节点上创建 Pod 副本,同时在节点删除时,自动删除该节点上的 Pod 副本。
1.3 DaemonSet 与其他 Kubernetes 对象的区别
DaemonSet 在运行时,会在集群中的每个节点上创建一个 Pod 副本,而其他的控制器如 Deployment 和 StatefulSet 创建的 Pod,会尽可能地让它们在集群的不同节点上运行。另外,DaemonSet 在节点加入和退出时,会自动处理 Pod 的创建和删除,因此可以保证在整个集群中的每个节点上都运行着一个 Pod 副本,适合用于运行集群服务的 daemon 容器或一些常驻内存的服务。而 Deployment 和 StatefulSet 更适用于部署需要动态扩缩容的应用程序。
对象类型 | 说明 | 控制器 | Pods数量 |
Deployment | 管理多个 ReplicaSets,用于应用程序的版本控制和滚动升级 | 控制器 | 可以控制多个Pods数量 |
StatefulSet | 用于有状态应用程序,例如数据库,确保每个实例具有唯一的网络标识符和稳定的存储 | 控制器 | 可以控制多个Pods数量 |
DaemonSet | 用于运行守护进程(如日志收集器),它会在每个工作节点上运行一个副本 | 控制器 | 等于节点数量 |
Job | 用于批处理任务,例如数据转换或任务调度 | 无 | 一次性 |
CronJob | 用于定期执行具有固定时间间隔的任务 | 无 | 可以控制多个Pods数量 |
二、创建DaemonSet
1.1 使用 kubectl 命令创建 DaemonSet
使用 kubectl 命令创建 DaemonSet 的步骤如下:
- 使用以下命令创建 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 的节点。
- 使用以下命令创建 DaemonSet:
kubectl create -f example-daemonset.yaml
这将使用先前创建的 YAML 文件创建 DaemonSet。您可以通过使用以下命令来验证是否已创建 DaemonSet:
kubectl get daemonsets
如果您看到 "example-daemonset",则表示 DaemonSet 已成功创建。
1.2 使用 YAML 文件创建DaemonSet
要使用 YAML 文件创建 DaemonSet,请执行以下步骤:
- 创建一个 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 的节点。
- 使用以下命令创建 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,您需要做以下几步:
- 安装 Terraform 工具:请根据您的操作系统在 Terraform 官方网站(www.terraform.io/downloads.h…
- 创建一个 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 映像。
- 初始化 Terraform 项目:使用以下命令初始化 Terraform 项目。
$ terraform init
- 配置 Terraform 项目:使用以下命令配置 Terraform 项目。
$ terraform apply
此命令将使用 Terraform 创建 DaemonSet。