【Kubernetes】 DaemonSet 详解(三)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【Kubernetes】 DaemonSet 详解

1.2 DaemonSet 的生命周期


image.png


DaemonSet 的生命周期包括以下几个阶段:

  1. 创建 DaemonSet:使用 kubectl apply 或 kubectl create 命令创建一个 DaemonSet 对象。
  2. DaemonSet 控制器创建 Pod:当 DaemonSet 被创建时,DaemonSet 控制器会根据 Pod 模板创建 Pod 副本,并在每个节点上运行一个 Pod 副本。
  3. 新节点加入集群:当新的节点加入集群时,DaemonSet 控制器会自动在新节点上创建一个 Pod 副本,确保每个节点上都有一个 Pod 副本。
  4. 节点被删除:当一个节点被删除时,DaemonSet 控制器会自动删除该节点上的 Pod 副本,以确保每个节点上都有一个 Pod 副本。
  5. 更新 DaemonSet:当需要更新 DaemonSet 时,可以使用 kubectl apply 或 kubectl edit 命令修改 DaemonSet 对象的配置。这会导致 DaemonSet 控制器创建新的 Pod 副本,并逐步替换旧的 Pod 副本,以确保每个节点上都有一个新的 Pod 副本。
  6. 删除 DaemonSet:当不再需要 DaemonSet 时,可以使用 kubectl delete 命令删除 DaemonSet 对象。此时,DaemonSet 控制器会删除所有的 Pod 副本。

1.2 DaemonSet 的选择器

选择器是 DaemonSet 对象的一部分,用于确定在哪些节点上运行该 DaemonSet 的 Pod 副本。我们可以使用 Pod 模板中的标签或注释,或者在 DaemonSet 对象的选择器中指定标签或注释,来确定选择器。

以下是一个示例 DaemonSet YAML 文件,其中使用标签选择器来确定在哪些节点上运行该 DaemonSet 的 Pod 副本:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: my-daemonset
  labels:
    app: my-app
spec:
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: my-image
          command: [ "sh", "-c", "echo Hello from the DaemonSet pod && sleep 3600" ]
      nodeSelector:
        disktype: ssd

在这个示例中,我们使用 nodeSelector 来指定只在磁盘类型为 ssd 的节点上运行该 DaemonSet 的 Pod 副本。

1.3 DaemonSet 的更新策略

更新策略用于确定如何更新 DaemonSet 对象的 Pod 副本。在 Kubernetes 中,有以下三种更新策略可供选择:

  1. RollingUpdate:滚动更新。这是默认的更新策略。它允许您将 DaemonSet 的 Pod 副本版本逐个更新。即首先更新一个节点上的 Pod,然后等待它的更新成功后再更新下一个节点上的 Pod,以此类推。这种策略确保了在更新期间至少有一个 Pod 副本可用,从而最小化了服务的中断时间。
  2. OnDelete:当 DaemonSet 对象的 Pod 副本有更新时,不会自动对旧的 Pod 副本进行更新。相反,旧的 Pod 副本将在删除后自动被新的 Pod 副本替换。这种策略适用于不需要连续更新的应用程序。
  3. Pause:暂停更新。这种策略将停止 DaemonSet 的自动更新,直到您手动恢复更新。这种策略适用于需要手动控制更新过程的应用程序。

更新策略可以在 DaemonSet 对象的 spec 字段中进行配置。以下是一个使用 RollingUpdate 策略的 DaemonSet 示例:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-daemonset
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
      terminationGracePeriodSeconds: 30
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1

在这个 YAML 文件中,我们定义了一个名为 nginx-daemonset 的 DaemonSet。该 DaemonSet 会在每个节点上运行一个名为 nginx 的容器。

该容器使用了最新版本的 Nginx 镜像。容器在终止时有 30 秒的 grace period,以确保正在进行的请求可以完成。

该 DaemonSet 对象使用 RollingUpdate 策略,并指定了 maxUnavailable 选项,该选项指定了在更新期间最多允许一个 Pod 副本不可用。这确保了在更新期间始终有至少一个 Pod 副本可用。

五、DaemonSet 的常见问题及解决方案

1.1 容器无法在节点上创建

问题描述

当您创建 DaemonSet 时,您可能会遇到以下错误:

Error creating: pods "XXX" is forbidden: node "YYY" cannot be used because it is unschedulable

这个错误消息表示,调度程序无法在某个节点上安排 DaemonSet Pod 的运行。通常,这是因为节点处于不可调度的状态,例如它被标记为“已维护”或“故障”。

解决方案

image.png

要解决这个问题,您需要检查节点的状态。您可以使用以下命令来检查节点的状态:

kubectl get nodes

如果节点的状态是“维护”或“故障”,您需要将其恢复为可用状态。您可以使用以下命令来将节点重新调度:

kubectl uncordon <node-name>

1.2 更新失败

问题描述

当您更新 DaemonSet 时,您可能会遇到以下错误:

Update failed. First seen error: error updating status for daemonset

这个错误消息表示,DaemonSet 更新失败。通常,这是因为某个节点上的 Pod 处于不可用状态,例如节点故障或容器崩溃。

解决方案

image.png

要解决这个问题,您需要检查节点和 Pod 的状态。您可以使用以下命令来检查节点和 Pod 的状态:

kubectl get nodes
kubectl get pods -n <namespace>

如果您发现节点或 Pod 处于不可用状态,您需要将其恢复为可用状态。您可以使用以下命令来重新启动节点或 Pod:

kubectl delete pod <pod-name> -n <namespace>

1.3 网络配置问题

问题描述

当您创建 DaemonSet 时,您可能会遇到以下错误:

Failed to create pod: <pod-name>
Error syncing pod

这个错误消息表示,Pod 同步失败。通常,这是因为网络配置不正确。

解决方案

要解决这个问题,您需要检查网络配置。您可以使用以下命令来检查网络配置:

kubectl describe pod <pod-name> -n <namespace>

如果您发现网络配置不正确,您需要更新它。您可以使用以下命令来更新网络配置:

kubectl edit pod <pod-name> -n <namespace>

1.4 如何监视 DaemonSet 运行状态

在 Kubernetes 中,监视 DaemonSet 的运行状态可以通过以下几种方式实现:

1.4.1 使用 kubectl 命令行工具

kubectl 命令行工具提供了多种监视 DaemonSet 运行状态的命令,如下所示:

  • kubectl get daemonset:列出当前集群中所有的 DaemonSet。
  • kubectl describe daemonset <daemonset-name>:查看指定 DaemonSet 的详细信息,包括 Pod 的状态、事件和控制器的状态等。
  • kubectl rollout status daemonset <daemonset-name>:查看 DaemonSet 的升级进度和状态。
  • kubectl logs <pod-name>:查看 Pod 的日志输出。

1.4.2 使用 Kubernetes Dashboard

Kubernetes Dashboard 提供了一个用户友好的 Web 界面,可用于监视 DaemonSet 的运行状态。在 Kubernetes Dashboard 中,可以查看所有 DaemonSet 和它们的 Pod,还可以查看各个 Pod 的详细信息,包括 Pod 的日志输出。

1.4.3 使用 Prometheus 和 Grafana

Prometheus 和 Grafana 是流行的监视和指标收集工具,可以用于监视 DaemonSet 的运行状态。通过 Prometheus 收集集群中的指标,使用 Grafana 可视化这些指标。可视化的指标包括 DaemonSet 的 Pod 数量、节点上的 CPU 使用情况和内存使用情况等。

1.5 如何排除问题和调试

在使用 DaemonSet 过程中,可能会遇到各种问题。以下是一些常见的问题及其解决方案。

1.5.1 Pod 处于 Pending 状态

当 DaemonSet 中的 Pod 处于 Pending 状态时,有以下几种可能的原因:

  • 节点资源不足:Pod 需要的资源(例如 CPU、内存等)超出了节点可用资源。解决方法是添加更多的节点或调整 Pod 的资源请求。
  • 节点标签不匹配:如果 DaemonSet 指定了节点选择器,但节点没有匹配的标签,则 Pod 将处于 Pending 状态。解决方法是为节点添加匹配的标签。
  • Pod 调度失败:如果没有足够的节点满足 Pod 的调度要求,则 Pod 将处于 Pending 状态。解决方法是添加更多的节点或调整 Pod 的调度要求。

1.5.2 Pod 启动失败

当 DaemonSet 中的 Pod 启动失败时,有以下几种可能的原因:

  • 容器镜像拉取失败:Pod 配置中指定的容器镜像不存在或拉取失败。解决方法是确认容器镜像的可用性,并检查 Pod 配置中的容器镜像名称和版本是否正确。
  • 容器启动命令或参数不正确:如果容器的启动命令或参数不正确,则容器将无法启动。
  • 解决方法是检查 Pod 配置中的容器的启动命令和参数是否正确。
  • 容器配置错误:如果容器的配置文件存在错误,则容器可能无法启动或启动后立即崩溃。解决方法是检查容器的配置文件是否正确,并重新启动 Pod。

1.5.3 Pod 运行时错误

当 DaemonSet 中的 Pod 运行时出现错误时,有以下几种可能的原因:

  • 容器内部错误:容器内部可能会发生错误,例如进程崩溃或配置文件错误。
  • 解决方法是检查容器日志,确定错误原因,并修复容器内部问题。
  • 节点故障:如果节点出现故障,则节点上运行的所有 Pod 可能会受到影响。
  • 解决方法是检查节点的健康状况,并在必要时重启节点。
  • 网络问题:如果 Pod 无法与其他服务或资源通信,则可能存在网络问题。解决方法是检查网络配置,确保 Pod 能够访问所需的服务或资源。

1.5.4 如何排除问题和调试

在排除问题和调试时,可以使用以下方法:

  • 查看日志:使用 kubectl logs 命令查看容器的日志,以了解容器内部发生的错误和故障。
  • 使用 kubectl describe 命令:使用 kubectl describe 命令查看 Pod 和其他相关对象的详细信息,以确定问题所在。
  • 使用 kubectl exec 命令:使用 kubectl exec 命令在容器内部运行命令,以检查容器的状态和配置文件。
  • 使用 kubectl get 命令:使用 kubectl get 命令查看集群中的对象,以确定节点和 Pod 的状态。
  • 使用 kubectl events 命令:使用 kubectl events 命令查看 Kubernetes 事件,以了解 Pod 和其他对象的状态变化。


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
存储 Kubernetes 调度
k8s教程(pod篇)-DaemonSet(每个node上只调度一个pod)
k8s教程(pod篇)-DaemonSet(每个node上只调度一个pod)
402 0
|
11月前
|
Kubernetes 监控 调度
【赵渝强老师】K8s的DaemonSet控制器
DaemonSet控制器确保每个节点上运行一个Pod副本,适用于监控、日志收集等场景。通过示例创建DaemonSet并查看Pod信息,展示了其自动扩展和回收的能力。视频讲解和代码示例详细说明了DaemonSet的使用方法和调度机制。
148 1
|
Kubernetes 监控 调度
在K8S中,DaemonSet类型资源特性?
在K8S中,DaemonSet类型资源特性?
|
Prometheus Kubernetes 监控
在K8S中,DaemonSet类型的资源特性有哪些?
在K8S中,DaemonSet类型的资源特性有哪些?
|
Prometheus Kubernetes 监控
在k8S中,DaemonSet类型的资源特性有哪些?
在k8S中,DaemonSet类型的资源特性有哪些?
|
存储 Kubernetes 关系型数据库
Kubernetes(K8S) Controller - StatefulSet、DaemonSet 介绍
Kubernetes(K8S) Controller - StatefulSet、DaemonSet 介绍
111 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
198 0
|
存储 Kubernetes 监控
k8s学习-DaemonSet(模板、创建、更新、回滚、删除等)
k8s学习-DaemonSet(模板、创建、更新、回滚、删除等)
267 0
|
Kubernetes 监控 安全
【K8S系列】深入解析DaemonSet
【K8S系列】深入解析DaemonSet
981 0

热门文章

最新文章