如何使用 Kubectl 重启 Kubernetes Pod

如何使用 Kubectl 重启 Kubernetes Pod_第1张图片
Kubernetes Pod 应该在没有干预的情况下运行,但有时您可能会遇到容器无法正常工作的问题。重启 Pod 可以帮助恢复正常运行。

Kubectl 没有直接重启单个 Pod 的方法。Pod 应该一直运行,直到它们被替换为部署例程的一部分。这通常是在您发布容器映像的新版本时。

当您想在不构建新映像或运行 CI 管道的情况下重新启动 Pod 时,可以使用以下几种技术。当您认为一组新的容器将使您的工作负载再次运行时,它们可以提供帮助。

扩展副本计数

虽然没有kubectl restart,但您可以通过扩展正在运行的容器副本的数量来实现类似的目标。当您的 Pod 是 Deployment、StatefulSet、ReplicaSet 或 Replication Controller 的一部分时,这会起作用。

kubectl scale deployment my-deployment --replicas=0
kubectl scale deployment my-deployment --replicas=3

将您的部署缩小到0将删除所有现有的 Pod。等到 Pod 被终止,使用kubectl get pods来检查它们的状态,然后将 Deployment 重新扩展到您想要的副本数。Kubernetes 将使用新的容器实例创建新的 Pod。

通过推出实现无停机重启

手动调整副本数量有一个限制:缩小到0会造成一段停机时间,此时没有 Pod 可以为您的用户提供服务。另一种选择是启动滚动重启,让您无需停机即可更换一组 Pod。它适用于 Kubernetes v1.15 及更高版本。

kubectl rollout restart deployment my-deployment

当您运行此命令时,Kubernetes 将逐渐终止并替换您的 Pod,同时确保某些容器始终保持运行状态。推出的分阶段性质使您可以继续为客户提供服务,同时在幕后有效地“重新启动”您的 Pod。
在这里插入图片描述
部署完成后,您将拥有与之前相同数量的副本,但每个容器都将是一个新实例。您可以使用kubectl get pods列出 Pod 并观察它们是否被替换来检查推出的状态。还有这也kubectl rollout status deployment/my-deployment显示了当前的进展。

kubectl rollout适用于部署、守护程序集和状态集。大多数情况下,当您想要终止容器并立即启动新容器时,这应该是您的首选。

(Ab)使用ReplicaSet监控

当您的 Pod 是 ReplicaSet 或 Deployment 的一部分时,您可以通过简单地删除它来启动替换。ReplicaSet 会注意到 Pod 已经消失,因为容器实例的数量将下降到目标副本计数以下。

kubectl delete pod my-pod

ReplicaSet 将进行干预以恢复最低可用性级别。它会自动创建一个新的 Pod,启动一个新的容器来替换旧的容器。

这在技术上是一个副作用——最好使用更明确且专为此用例设计的scaleorrollout命令。尽管如此,如果您知道 ReplicaSet 或 Deployment 中单个行为异常的 Pod 的身份,手动删除可能是一种有用的技术。推出将替换所有托管 Pod,而不仅仅是出现故障的 Pod。

您可以扩展该技术以使用单个命令替换所有失败的 Pod:

kubectl delete pods --field-selector=status.phase=Failed

任何处于该Failed状态的Pod都将被终止并移除。复制控制器会注意到差异并添加新的 Pod 以将状态移回配置的副本计数。如果您确信旧 Pod 因暂时性错误而失败,则新 Pod 应保持健康运行状态。

更改 Pod 注释

强制替换 Pod 的另一种方法是添加或修改annotation。Kubernetes 将替换 Pod 以应用更改。

您可以使用该kubectl annotate命令来应用注释:

kubectl annotate pods my-pod app-version="2" --overwrite

此命令更新 上的app-version注释my-pod。–overwrite即使注解已经存在,该标志也会指示 Kubectl 应用更改。没有它,您只能添加新注释作为一种安全措施,以防止意外更改。

更新部署的环境变量与更改注释具有类似的效果。当您已经在环境中公开应用程序版本号、构建 ID 或部署日期时,这是理想的选择。

kubectl set env deployment my-deployment APP_VERSION="2"

结论

Kubernetes Pod 通常应该一直运行,直到它们被新部署取代。因此,没有直接的方法来“重启”单个 Pod。如果您的一个容器遇到问题,请尝试更换它而不是重新启动。术语的细微变化更符合 Kubernetes Pod 的无状态操作模型。

扩展您的副本数量、启动部署或从 ReplicaSet 中手动删除 Pod 以终止旧容器并启动新实例。Rollouts 是现代 Kubernetes 版本的首选解决方案,但其他方法也适用,并且更适合特定场景。

您最关心的应该是这两个问题:您是否希望您的 Deployment 或 ReplicaSet 中的所有 Pod 都被替换,并且任何停机时间都可以接受吗?如果您想在不停机的情况下“重新启动”单个 Pod,手动删除 Pod 可能是理想的选择,前提是您正在运行多个副本,而scale当rollout无法使用该命令并且您不关心简短的内容时,这是一种选择不可用的时期。

你可能感兴趣的:(kubernetes,docker,容器)