想学会K8S,DaemonSet很重要!值得收藏( 四 )

2、DaemonSet 的生命周期

想学会K8S,DaemonSet很重要!值得收藏

文章插图
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 副本 。
3、DaemonSet 的选择器选择器是 DaemonSet 对象的一部分,用于确定在哪些节点上运行该 DaemonSet 的 Pod 副本 。我们可以使用 Pod 模板中的标签或注释,或者在 DaemonSet 对象的选择器中指定标签或注释,来确定选择器 。
以下是一个示例 DaemonSet YAML 文件,其中使用标签选择器来确定在哪些节点上运行该 DaemonSet 的 Pod 副本:
apiVersion: apps/v1kind: DaemonSetmetadata:name: my-daemonsetlabels:app: my-appspec:selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: my-imagecommand: [ "sh", "-c", "echo Hello from the DaemonSet pod && sleep 3600" ]nodeSelector:disktype: ssd在这个示例中,我们使用 nodeSelector 来指定只在磁盘类型为 ssd 的节点上运行该 DaemonSet 的 Pod 副本 。
4、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/v1kind: DaemonSetmetadata:name: nginx-daemonsetspec:selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestterminationGracePeriodSeconds: 30updateStrategy:type: RollingUpdaterollingUpdate: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 的运行 。通常,这是因为节点处于不可调度的状态,例如它被标记为“已维护”或“故障” 。
(2)解决方案


推荐阅读