即使删除pod,我也遇到了无法立即停止的问题。
为了正常终止,应该解决什么问题?
myParser [a,b]
myParser (a:b:cs)
apiVersion: apps/v1
kind: Deployment
metadata:
name: cmd-example
spec:
replicas: 1
selector:
matchLabels:
app: cmd-example
template:
metadata:
labels:
app: cmd-example
spec:
terminationGracePeriodSeconds: 30
containers:
- name: cmd-container
image: alpine:3.8
resources:
requests:
cpu: 100m
memory: 100Mi
command: ["/bin/sh"]
args: ["-c", "while true; do exec sleep 100;done"]
$ kubectl apply -f deployments.yaml
输出是
kubectl delete-f 020-deployments.yaml
这应该更快完成。
完成大约30秒。可能是由于SIGKILL在终止GracePeriodSeconds 30s时发生的。
为什么不立即使用SIGTERM清理吊舱?
应该解决什么?
我在以下环境中确认了它。
答案 0 :(得分:1)
Hiroki Matsumoto,pod端接的行为就像它的设计行为一样。 您可以在Pod的documentation部分中找到
:由于Pod表示集群中节点上正在运行的进程,因此 重要的是要允许这些进程在以下情况下正常终止 不再需要它们(与被杀害凶杀 信号,没有机会清理。)
长话短说(根据官方文档)
1)运行re.sub(r'(?!^)', '?', "Man")
# Yields "M?a?n?"
时,您发送的命令的宽限期(默认为30秒)
2)运行kubectl delete -f deployments.yaml
时,您可以看到它具有kubectl get pods
状态
3)Kubelet看到此状态,并且Pod开始关闭。
4)宽限期结束后,如果仍有任何进程在运行,它将被SIGKILL杀死
因此要立即删除广告连播,您必须将宽限期降低为0并执行强制/立即删除:
terminating
,这将导致立即删除。
答案 1 :(得分:1)
此外壳程序是即使接受SIGTERM信号也不会停止。
使用trap命令。
已更改地点
command: ["/bin/sh"]
args: ["-c", "trap 'exit 0' 15;while true; do exec sleep 100 & wait $!; done"]
删除后,pod马上被清理干净!
img-example-d68954677-mwsqp 1/1 Running 0 2s
img-example-d68954677-mwsqp 1/1 Terminating 0 8s
img-example-d68954677-mwsqp 0/1 Terminating 0 10s
img-example-d68954677-mwsqp 0/1 Terminating 0 11s
img-example-d68954677-mwsqp 0/1 Terminating 0 11s
答案 2 :(得分:0)
您的广告连播实际上没有任何作用。如果您只想在偶尔在集群内部进行交互式调试的地方,请考虑使用kubectl run获得一次性的交互式容器
kubectl run --rm -it --name debug --image alpine:3.8
根据您的Pod规范尝试运行的命令,以shell脚本形式重写它:
#!/bin/sh
# Forever:
while true
do
# Replace this shell with a process that sleeps for
# 100 ms, then exits
exec sleep 100
# The shell no longer exists and you'll never get here
done
我不清楚Pod正在尝试做什么,但是如果您移除exec
,至少它不会退出。 (它仍将永远处于空闲循环中。)