在 pod 中重启容器
Restart container within pod
我有一个带 2 个容器的 pod test-1495806908-xn5jn
。我想重新启动其中一个名为 container-test
的程序。是否可以重启 pod 中的单个容器?如何重启?如果没有,我该如何重启 pod?
pod 是使用 deployment.yaml
创建的:
kubectl create -f deployment.yaml
Is it possible to restart a single container
不是通过 kubectl
,尽管根据集群的设置,您可以 "cheat" 和 docker kill the-sha-goes-here
,这将导致 kubelet 重新启动 "failed" 容器(假设,当然,Pod 的重启策略说这是它应该做的)
how do I restart the pod
这取决于 Pod 的创建方式,但根据您提供的 Pod 名称,它似乎在 ReplicaSet 的监督下,因此您可以 kubectl delete pod test-1495806908-xn5jn
并且 kubernetes 将创建一个新的取而代之(新的 Pod 将有一个不同的名称,所以不要指望 kubectl get pods
到 return test-1495806908-xn5jn
再一次)
拥有 kubernetes 的全部原因是它可以为您管理容器,因此您不必太关心 pod 中容器的生命周期。
因为您有一个使用 replica set
的 deployment
设置。您可以使用 kubectl delete pod test-1495806908-xn5jn
删除 pod,kubernetes 将管理使用 2 个容器创建新 pod,而无需停机。尝试在 pods 中手动重启单个容器会抵消 kubernetes 的全部好处。
有些情况下您想要重启特定容器而不是删除 pod 并让 Kubernetes 重新创建它。
做 kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5
对我有用。
(我根据以下建议将命令从 reboot
更改为 /sbin/killall5
。)
我们使用非常方便的命令行强制在集成 pod 上重新部署新映像。
我们注意到我们的 alpine 容器都在 PID 5 上 运行 它们的 "sustaining" 命令。因此,向它发送 SIGTERM
信号会使容器关闭。 imagePullPolicy
设置为 Always
让 kubelet 在将容器带回时重新拉取最新的镜像。
kubectl exec -i [pod name] -c [container-name] -- kill -15 5
终止 Dockerfile 的 CMD
/ ENTRYPOINT
中指定的进程对我有用。 (容器自动重启)
我的容器不允许重新启动,所以我不得不使用这个解决方法。
pod和容器都是临时的,尝试使用以下命令停止特定容器,k8s集群将重新启动一个新容器。
kubectl exec -it [POD_NAME] -c [CONTAINER_NAME] -- /bin/sh -c "kill 1"
这将发送一个SIGTERM
信号给进程1,它是容器中的主进程运行。所有其他进程都是进程 1 的子进程,并在进程 1 退出后终止。有关您可以发送的其他信号,请参阅 kill manpage。
coredns
pod 出现问题,我删除了这样的 pod
kubectl delete pod -n=kube-system coredns-fb8b8dccf-8ggcf
它的pod会自动重启。
以上所有答案都提到了删除 pod...但是如果您有许多 pods 相同的服务,那么删除它们中的每一个都会很乏味...
因此,我提出以下解决方案,重启:
1) 将刻度设置为零:
kubectl scale deployment <<name>> --replicas=0 -n service
上面的命令将终止所有你的 pods 名称为 <<name>>
2)要再次启动pod,将replicas设置为大于0
kubectl scale deployment <<name>> --replicas=2 -n service
以上命令将使用 2 个副本再次启动您的 pods。
kubectl exec -it POD_NAME -c CONTAINER_NAME bash - then kill 1
假设容器 运行 作为根目录,不推荐。
在我的例子中,当我更改应用程序配置时,我不得不重新启动在边车模式中使用的容器,我会终止 spring 引导应用程序的 PID,该应用程序属于 docker 用户。
我正在尝试重新启动容器的方法。我为我找到的是这个解决方案:
Dockerfile:
...
ENTRYPOINT [ "/app/bootstrap.sh" ]
/app/bootstrap.sh:
#!/bin/bash
/app/startWhatEverYouActuallyWantToStart.sh &
tail -f /dev/null
每当我想重新启动容器时,我都会用 tail -f /dev/null
终止进程,我用
找到它
kill -TERM `ps --ppid 1 | grep tail | grep -v -e grep | awk '{print }'`
执行该命令后,除带有 PID==1
的进程外的所有进程都将被终止,并且入口点,在我的例子中 bootstrap.sh
将被(再次)执行。
这是“重新启动”部分的内容 - 这并不是真正的重新启动,但它最终会按照您的意愿进行。对于限制重新启动名为 container-test
的容器的部分,您可以将容器名称传递给有问题的容器(因为容器名称否则在容器内不可用),然后您可以决定是否执行上述操作kill
。
在你的 deployment.yaml
:
中会是这样的
env:
- name: YOUR_CONTAINER_NAME
value: container-test
/app/startWhatEverYouActuallyWantToStart.sh:
#!/bin/bash
...
CONDITION_TO_RESTART=0
...
if [ "$YOUR_CONTAINER_NAME" == "container-test" -a $CONDITION_TO_RESTART -eq 1 ]; then
kill -TERM `ps --ppid 1 | grep tail | grep -v -e grep | awk '{print }'`
fi
我正在使用
kubectl rollout restart deployment [deployment_name]
或
kubectl delete pod [pod_name]
我意识到这个问题很老了并且已经回答了,但我想我会用我的方法来凑钱。
每当我想这样做时,我只需对 pod 的容器的图像字段进行微小的更改,这会导致 kubernetes 仅重启容器。
如果您不能在 2 个不同但等效的标签之间切换(例如 :latest
/ :1.2.3
,其中最新的是 实际上 版本 1.2.3)然后你总是可以快速将它切换到一个无效的标签(我在末尾放了一个 X,比如 :latestX
之类的)然后重新编辑它并在之后立即删除 X,这确实会导致容器失败虽然开始时出现图像拉取错误几秒钟。
例如:
kubectl edit po my-pod-name
找到你想杀死的spec.containers[].name
,然后找到它的image
apiVersion: v1
kind: Pod
metadata:
#...
spec:
containers:
- name: main-container
#...
- name: container-to-restart
image: container/image:tag
#...
您将搜索要重启的容器,然后将其映像更新为不同的内容,这将强制 kubernetes 为您进行受控重启。
正确但可能不太受欢迎的答案是,如果您需要重新启动 pod 中的一个容器,那么它不应该在同一个 pod 中。您无法按设计重启 Pod 中的单个容器。只需将容器移出到它自己的吊舱中即可。来自文档
Pods that run a single container. The "one-container-per-Pod" model is
the most common Kubernetes use case; in this case, you can think of a
Pod as a wrapper around a single container; Kubernetes manages Pods
rather than managing the containers directly.
Note: Grouping multiple co-located and co-managed containers in a
single Pod is a relatively advanced use case. You should use this
pattern only in specific instances in which your containers are
tightly coupled.
我有一个带 2 个容器的 pod test-1495806908-xn5jn
。我想重新启动其中一个名为 container-test
的程序。是否可以重启 pod 中的单个容器?如何重启?如果没有,我该如何重启 pod?
pod 是使用 deployment.yaml
创建的:
kubectl create -f deployment.yaml
Is it possible to restart a single container
不是通过 kubectl
,尽管根据集群的设置,您可以 "cheat" 和 docker kill the-sha-goes-here
,这将导致 kubelet 重新启动 "failed" 容器(假设,当然,Pod 的重启策略说这是它应该做的)
how do I restart the pod
这取决于 Pod 的创建方式,但根据您提供的 Pod 名称,它似乎在 ReplicaSet 的监督下,因此您可以 kubectl delete pod test-1495806908-xn5jn
并且 kubernetes 将创建一个新的取而代之(新的 Pod 将有一个不同的名称,所以不要指望 kubectl get pods
到 return test-1495806908-xn5jn
再一次)
拥有 kubernetes 的全部原因是它可以为您管理容器,因此您不必太关心 pod 中容器的生命周期。
因为您有一个使用 replica set
的 deployment
设置。您可以使用 kubectl delete pod test-1495806908-xn5jn
删除 pod,kubernetes 将管理使用 2 个容器创建新 pod,而无需停机。尝试在 pods 中手动重启单个容器会抵消 kubernetes 的全部好处。
有些情况下您想要重启特定容器而不是删除 pod 并让 Kubernetes 重新创建它。
做 kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5
对我有用。
(我根据以下建议将命令从 reboot
更改为 /sbin/killall5
。)
我们使用非常方便的命令行强制在集成 pod 上重新部署新映像。
我们注意到我们的 alpine 容器都在 PID 5 上 运行 它们的 "sustaining" 命令。因此,向它发送 SIGTERM
信号会使容器关闭。 imagePullPolicy
设置为 Always
让 kubelet 在将容器带回时重新拉取最新的镜像。
kubectl exec -i [pod name] -c [container-name] -- kill -15 5
终止 Dockerfile 的 CMD
/ ENTRYPOINT
中指定的进程对我有用。 (容器自动重启)
我的容器不允许重新启动,所以我不得不使用这个解决方法。
pod和容器都是临时的,尝试使用以下命令停止特定容器,k8s集群将重新启动一个新容器。
kubectl exec -it [POD_NAME] -c [CONTAINER_NAME] -- /bin/sh -c "kill 1"
这将发送一个SIGTERM
信号给进程1,它是容器中的主进程运行。所有其他进程都是进程 1 的子进程,并在进程 1 退出后终止。有关您可以发送的其他信号,请参阅 kill manpage。
coredns
pod 出现问题,我删除了这样的 pod
kubectl delete pod -n=kube-system coredns-fb8b8dccf-8ggcf
它的pod会自动重启。
以上所有答案都提到了删除 pod...但是如果您有许多 pods 相同的服务,那么删除它们中的每一个都会很乏味...
因此,我提出以下解决方案,重启:
1) 将刻度设置为零:
kubectl scale deployment <<name>> --replicas=0 -n service
上面的命令将终止所有你的 pods 名称为
<<name>>
2)要再次启动pod,将replicas设置为大于0
kubectl scale deployment <<name>> --replicas=2 -n service
以上命令将使用 2 个副本再次启动您的 pods。
kubectl exec -it POD_NAME -c CONTAINER_NAME bash - then kill 1
假设容器 运行 作为根目录,不推荐。
在我的例子中,当我更改应用程序配置时,我不得不重新启动在边车模式中使用的容器,我会终止 spring 引导应用程序的 PID,该应用程序属于 docker 用户。
我正在尝试重新启动容器的方法。我为我找到的是这个解决方案:
Dockerfile:
...
ENTRYPOINT [ "/app/bootstrap.sh" ]
/app/bootstrap.sh:
#!/bin/bash
/app/startWhatEverYouActuallyWantToStart.sh &
tail -f /dev/null
每当我想重新启动容器时,我都会用 tail -f /dev/null
终止进程,我用
kill -TERM `ps --ppid 1 | grep tail | grep -v -e grep | awk '{print }'`
执行该命令后,除带有 PID==1
的进程外的所有进程都将被终止,并且入口点,在我的例子中 bootstrap.sh
将被(再次)执行。
这是“重新启动”部分的内容 - 这并不是真正的重新启动,但它最终会按照您的意愿进行。对于限制重新启动名为 container-test
的容器的部分,您可以将容器名称传递给有问题的容器(因为容器名称否则在容器内不可用),然后您可以决定是否执行上述操作kill
。
在你的 deployment.yaml
:
env:
- name: YOUR_CONTAINER_NAME
value: container-test
/app/startWhatEverYouActuallyWantToStart.sh:
#!/bin/bash
...
CONDITION_TO_RESTART=0
...
if [ "$YOUR_CONTAINER_NAME" == "container-test" -a $CONDITION_TO_RESTART -eq 1 ]; then
kill -TERM `ps --ppid 1 | grep tail | grep -v -e grep | awk '{print }'`
fi
我正在使用
kubectl rollout restart deployment [deployment_name]
或
kubectl delete pod [pod_name]
我意识到这个问题很老了并且已经回答了,但我想我会用我的方法来凑钱。
每当我想这样做时,我只需对 pod 的容器的图像字段进行微小的更改,这会导致 kubernetes 仅重启容器。
如果您不能在 2 个不同但等效的标签之间切换(例如 :latest
/ :1.2.3
,其中最新的是 实际上 版本 1.2.3)然后你总是可以快速将它切换到一个无效的标签(我在末尾放了一个 X,比如 :latestX
之类的)然后重新编辑它并在之后立即删除 X,这确实会导致容器失败虽然开始时出现图像拉取错误几秒钟。
例如:
kubectl edit po my-pod-name
找到你想杀死的spec.containers[].name
,然后找到它的image
apiVersion: v1
kind: Pod
metadata:
#...
spec:
containers:
- name: main-container
#...
- name: container-to-restart
image: container/image:tag
#...
您将搜索要重启的容器,然后将其映像更新为不同的内容,这将强制 kubernetes 为您进行受控重启。
正确但可能不太受欢迎的答案是,如果您需要重新启动 pod 中的一个容器,那么它不应该在同一个 pod 中。您无法按设计重启 Pod 中的单个容器。只需将容器移出到它自己的吊舱中即可。来自文档
Pods that run a single container. The "one-container-per-Pod" model is the most common Kubernetes use case; in this case, you can think of a Pod as a wrapper around a single container; Kubernetes manages Pods rather than managing the containers directly.
Note: Grouping multiple co-located and co-managed containers in a single Pod is a relatively advanced use case. You should use this pattern only in specific instances in which your containers are tightly coupled.