From 8be3b9da14a6c9d4538d3c072ae15bfe01641cb3 Mon Sep 17 00:00:00 2001 From: Qiming Teng Date: Mon, 17 Aug 2020 11:23:29 +0800 Subject: [PATCH] [zh] Resync update-daemon-set task --- .../tasks/manage-daemon/update-daemon-set.md | 297 +++++++++--------- 1 file changed, 143 insertions(+), 154 deletions(-) diff --git a/content/zh/docs/tasks/manage-daemon/update-daemon-set.md b/content/zh/docs/tasks/manage-daemon/update-daemon-set.md index 7ad4b7259d..a501558cda 100644 --- a/content/zh/docs/tasks/manage-daemon/update-daemon-set.md +++ b/content/zh/docs/tasks/manage-daemon/update-daemon-set.md @@ -1,50 +1,38 @@ --- -reviewers: -- janetkuo title: 对 DaemonSet 执行滚动更新 content_type: task +weight: 10 --- +--> - +--> 本文介绍了如何对 DaemonSet 执行滚动更新。 - - - ## {{% heading "prerequisites" %}} - +--> * Kubernetes 1.6 或者更高版本中才支持 DaemonSet 滚动更新功能。 - - - + +DaemonSet has two update strategy types: +--> ## DaemonSet 更新策略 - DaemonSet 有两种更新策略: + At most one pod of the DaemonSet will be running on each node during the whole update process. +--> -* OnDelete: 使用 `OnDelete` 更新策略时,在更新 DaemonSet 模板后,只有当您手动删除老的 DaemonSet pods 之后,新的 DaemonSet pods *才会*被自动创建。跟 Kubernetes 1.6 以前的版本类似。 -* RollingUpdate: 这是默认的更新策略。使用 `RollingUpdate` 更新策略时,在更新 DaemonSet 模板后,老的 DaemonSet pods 将被终止,并且将以受控方式自动创建新的 DaemonSet pods。 +* OnDelete: 使用 `OnDelete` 更新策略时,在更新 DaemonSet 模板后,只有当你手动删除老的 + DaemonSet pods 之后,新的 DaemonSet Pod *才会*被自动创建。跟 Kubernetes 1.6 以前的版本类似。 +* RollingUpdate: 这是默认的更新策略。使用 `RollingUpdate` 更新策略时,在更新 DaemonSet 模板后, + 老的 DaemonSet pods 将被终止,并且将以受控方式自动创建新的 DaemonSet pods。 + 更新期间,最多只能有 DaemonSet 的一个 Pod 运行于每个节点上。 -## 执行滚动更新 - +--> +## 执行滚动更新 + 要启用 DaemonSet 的滚动更新功能,必须设置 `.spec.updateStrategy.type` 为 `RollingUpdate`。 -您可能想设置[`.spec.updateStrategy.rollingUpdate.maxUnavailable`](/docs/concepts/workloads/controllers/deployment/#max-unavailable) (默认为 1) 和[`.spec.minReadySeconds`](/docs/concepts/workloads/controllers/deployment/#min-ready-seconds) (默认为 0)。 +--> +你可能想设置 +[`.spec.updateStrategy.rollingUpdate.maxUnavailable`](/zh/docs/concepts/workloads/controllers/deployment/#max-unavailable) (默认为 1) 和 +[`.spec.minReadySeconds`](/zh/docs/concepts/workloads/controllers/deployment/#min-ready-seconds) (默认为 0)。 -### 步骤 1: 检查 DaemonSet 的滚动更新策略 +### Creating a DaemonSet with `RollingUpdate` update strategy + +This YAML file specifies a DaemonSet with an update strategy as 'RollingUpdate' +--> +### 创建带有 `RollingUpdate` 更新策略的 DaemonSet + +下面的 YAML 包含一个 DaemonSet,其更新策略为 'RollingUpdate': + +{{< codenew file="controllers/fluentd-daemonset.yaml" >}} +检查了 DaemonSet 清单中更新策略的设置之后,创建 DaemonSet: + +```shell +kubectl create -f https://k8s.io/examples/controllers/fluentd-daemonset.yaml +``` + + +另一种方式是如果你希望使用 `kubectl apply` 来更新 DaemonSet 的话,也可以 +使用 `kubectl apply` 来创建 DaemonSet: + +```shell +kubectl apply -f https://k8s.io/examples/controllers/fluentd-daemonset.yaml +``` + + +--> +### 检查 DaemonSet 的滚动更新策略 + 首先,检查 DaemonSet 的更新策略,确保已经将其设置为 `RollingUpdate`: ```shell -kubectl get ds/ -o go-template='{{.spec.updateStrategy.type}}{{"\n"}}' +kubectl get ds/fluentd-elasticsearch -o go-template='{{.spec.updateStrategy.type}}{{"\n"}}' -n kube-system ``` +--> 如果还没在系统中创建 DaemonSet,请使用以下命令检查 DaemonSet 的清单: ```shell -kubectl create -f ds.yaml --dry-run -o go-template='{{.spec.updateStrategy.type}}{{"\n"}}' +kubectl apply -f https://k8s.io/examples/controllers/fluentd-daemonset.yaml --dry-run=client -o go-template='{{.spec.updateStrategy.type}}{{"\n"}}' ``` + +--> 两个命令的输出都应该为: -```shell +``` RollingUpdate ``` +--> 如果输出不是 `RollingUpdate`,请返回并相应地修改 DaemonSet 对象或者清单。 -### 步骤 2:使用 `RollingUpdate` 更新策略创建 DaemonSet +### Updating a DaemonSet template - -如果已经创建了 DaemonSet,则可以跳过该步骤并跳转到步骤 3。 - - -验证 DaemonSet 清单的更新策略后,创建 DaemonSet: - -```shell -kubectl create -f ds.yaml -``` - - -或者,您打算使用 `kubectl apply` 更新 DaemonSet,请使用 `kubectl apply` 创建相同的 DaemonSet。 - -```shell -kubectl apply -f ds.yaml -``` - - -### 步骤 3:更新 DaemonSet 模板 - - -对 `RollingUpdate` DaemonSet `.spec.template` 的任何更新都将触发滚动更新。这可以通过几个不同的 `kubectl` 命令来完成。 +update. Let's update the DaemonSet by applying a new YAML file. This can be done with several different `kubectl` commands. +--> +### 更新 DaemonSet 模板 + +对 `RollingUpdate` DaemonSet 的 `.spec.template` 的任何更新都将触发滚动更新。 +这可以通过几个不同的 `kubectl` 命令来完成。 + +{{< codenew file="controllers/fluentd-daemonset-update.yaml" >}} + +If you update DaemonSets using +[configuration files](/docs/tasks/manage-kubernetes-objects/declarative-config/), +use `kubectl apply`: +--> #### 声明式命令 - -如果您使用[配置文件](/docs/concepts/overview/object-management-kubectl/declarative-config/)来更新 DaemonSets,请使用 `kubectl apply`: +如果你使用 +[配置文件](/zh/docs/tasks/manage-kubernetes-objects/declarative-config/) +来更新 DaemonSet,请使用 `kubectl apply`: ```shell -kubectl apply -f ds-v2.yaml +kubectl apply -f https://k8s.io/examples/controllers/fluentd-daemonset-update.yaml ``` -#### 命令式命令 - -如果您使用[命令式命令](/docs/concepts/overview/object-management-kubectl/imperative-command/)来更新 DaemonSets,请使用`kubectl edit` 或者 `kubectl patch`: +use `kubectl edit`: +--> +#### 指令式命令 + +如果你使用 +[指令式命令](/zh/docs/tasks/manage-kubernetes-objects/imperative-command/) +来更新 DaemonSets,请使用`kubectl edit`: ```shell -kubectl edit ds/ -``` - -```shell -kubectl patch ds/ -p= +kubectl edit ds/fluentd-elasticsearch -n kube-system ``` -##### 只更新容器镜像 - -如果您只需要更新 DaemonSet 模板里的容器镜像,比如,`.spec.template.spec.containers[*].image`, 请使用 `kubectl set image`: +##### 只更新容器镜像 + +如果你只需要更新 DaemonSet 模板里的容器镜像,比如,`.spec.template.spec.containers[*].image`, +请使用 `kubectl set image`: ```shell -kubectl set image ds/ = +kubectl set image ds/fluentd-elasticsearch fluentd-elasticsearch=quay.io/fluentd_elasticsearch/fluentd:v2.6.0 -n kube-system ``` -### 步骤 4:查看滚动更新状态 - +--> +### 监视滚动更新状态 + 最后,观察 DaemonSet 最新滚动更新的进度: ```shell -kubectl rollout status ds/ +kubectl rollout status ds/fluentd-elasticsearch -n kube-system ``` +--> 当滚动更新完成时,输出结果如下: -```shell -daemonset "" successfully rolled out +``` +daemonset "fluentd-elasticsearch" successfully rolled out ``` + +### DaemonSet rolling update is stuck +--> ## 故障排查 - ### DaemonSet 滚动更新卡住 - -有时,DaemonSet 滚动更新可能会卡住。可能原因如下: - - -#### 一些节点资源用尽 - -由于新 DaemonSet pods 无法调度到至少一个节点时,滚动更新就会卡住。这可能是由于节点已经[资源用尽](/docs/tasks/administer-cluster/out-of-resource/)。 - -发生这种情况时,通过对 `kubectl get nodes` 和下面命令行的输出作比较,找出没有调度部署 DaemonSet pods 的节点: +--> +有时,DaemonSet 滚动更新可能会卡住,其 Pod 至少在某个节点上无法调度运行。 +当节点上[可用资源耗尽](/zh/docs/tasks/administer-cluster/out-of-resource/)时, +这是可能的。 + +发生这种情况时,通过对 `kubectl get nodes` 和下面命令行的输出作比较, +找出没有调度部署 DaemonSet Pods 的节点: ```shell -kubectl get pods -l = -o wide +kubectl get pods -l name=fluentd-elasticsearch -o wide -n kube-system ``` -一旦找到这些节点,从节点上删除一些非 DaemonSet pods,为新的 DaemonSet pods 腾出空间。 +--> +一旦找到这些节点,从节点上删除一些非 DaemonSet Pod,为新的 DaemonSet Pod 腾出空间。 +--> {{< note >}} -当所删除的 pods 不受任何控制器管理,也不是多副本的 pods,上述操作将导致服务中断。 -同时,上述操作也不会考虑 [PodDisruptionBudget](/docs/tasks/configure-pod-container/configure-pod-disruption-budget/) 所施加的约束。 +当所删除的 Pod 不受任何控制器管理,也不是多副本的 Pod时,上述操作将导致服务中断。 +同时,上述操作也不会考虑 +[PodDisruptionBudget](/zh/docs/tasks/configure-pod-container/configure-pod-disruption-budget/) +所施加的约束。 {{< /note >}} -#### 滚动更新中断 - - - -如果最近的 DaemonSet 模板更新被破坏了,比如,容器处于崩溃循环状态或者容器镜像不存在(通常由于拼写错误),就会发生 DaemonSet 滚动更新中断。 +--> +#### 不完整的滚动更新 + +如果最近的 DaemonSet 模板更新被破坏了,比如,容器处于崩溃循环状态或者容器镜像不存在 +(通常由于拼写错误),就会发生 DaemonSet 滚动更新中断。 +--> 要解决此问题,只需再次更新 DaemonSet 模板即可。以前不健康的滚动更新不会阻止新的滚动更新。 -#### 时钟偏差 - -如果在 DaemonSet 中指定了 `.spec.minReadySeconds`,主节点和工作节点之间的时钟偏差会使 DaemonSet 无法检测到正确的滚动更新进度。 +--> +#### 时钟偏差 +如果在 DaemonSet 中指定了 `.spec.minReadySeconds`,主控节点和工作节点之间的时钟偏差会使 +DaemonSet 无法检测到正确的滚动更新进度。 + +## 清理 + +从名字空间中删除 DaemonSet: + +```shell +kubectl delete ds fluentd-elasticsearch -n kube-system +``` ## {{% heading "whatsnext" %}} - -* 查看[任务: 在 DaemonSet 上执行回滚](/docs/tasks/manage-daemon/rollback-daemon-set/) -* 查看[概念: 创建 DaemonSet 以适应现有的 DaemonSet pods](/docs/concepts/workloads/controllers/daemonset/) - +--> +* 查看[任务:在 DaemonSet 上执行回滚](/zh/docs/tasks/manage-daemon/rollback-daemon-set/) +* 查看[概念:创建 DaemonSet 以收养现有 DaemonSet Pod](/zh/docs/concepts/workloads/controllers/daemonset/)