k8s中的重启策略&不同运行时
命令首先会发送SIGTERM信号给容器中的主进程,给它一定的时间进行清理工作并优雅地退出。(SIGKILL)强制终止,Kubernetes则不会重启它,因为这通常意味着容器是由于系统级别的原因被终止的,如系统内存不足等。,当容器状态由运行变为终止时,只有非零退出状态的容器会被Kubernetes重启。也就是说,如果容器由于。命令杀死容器进程相当于直接发送SIGKILL信号,容器进程没有机会进行任何
一、k8s的pod,kill进程和上节点停止容器,容器是否被重启(重启策略为OnFailure):
解释:docker ps -a看到容器退出码为:
- kill进程,其容器退出码为:
exit(137)
stop 容器,容器退出码为:exit(1)
exit(1)
和exit(137)
的区别在于其退出的原因。exit(1)
通常表示程序由于某种错误而非正常退出,而exit(137)
则意味着程序被SIGKILL信号强制终止,这可能是由于系统内存不足或者人为干预导致的。
在Docker容器的上下文中,docker stop
命令首先会发送SIGTERM信号给容器中的主进程,给它一定的时间进行清理工作并优雅地退出。如果在一定时间后(默认为10秒)容器仍未退出,那么docker stop
会发送SIGKILL信号强制结束容器进程。
而直接使用kill
命令杀死容器进程相当于直接发送SIGKILL信号,容器进程没有机会进行任何清理工作就被强制终止。
至于Kubernetes的重启策略,如果设置为onFailure
,当容器状态由运行变为终止时,只有非零退出状态的容器会被Kubernetes重启。也就是说,如果容器由于exit(1)
非正常退出,Kubernetes会尝试重启它。但如果容器被exit(137)
(SIGKILL)强制终止,Kubernetes则不会重启它,因为这通常意味着容器是由于系统级别的原因被终止的,如系统内存不足等。
总的来说,如果任务设置重启策略为onFailure
,那么在exit(1)
情况下任务会被重启并恢复为running状态,但在exit(137)
情况下则不会。
二、containerd运行时和docker运行时集群,如何在集群节点上查看pod容器
https://www.cnblogs.com/liugp/p/16633732.html
在Kubernetes(K8s)集群中,不论底层使用的是containerd还是Docker作为容器运行时,查看Pod中的容器信息都可以通过kubectl
命令行工具来实现。以下是一些常用的方法来查看Pod中的容器:
1. 使用kubectl describe pod
命令
kubectl describe pod
是一个非常有用的命令,它可以提供Pod及其容器的详细信息,包括容器名称、镜像、状态等。
kubectl describe pod <pod_name> -n <namespace>
其中<pod_name>
是Pod的名称,<namespace>
是Pod所在的命名空间,如果不指定<namespace>
,则默认为default
。
2. 使用kubectl get pod
命令结合输出格式
虽然kubectl get pod
命令本身主要是用来列出Pod的,但你可以通过-o json
或-o yaml
选项来获取Pod的JSON或YAML格式的详细信息。然后你可以在这些信息中找到容器的详情。
# 以json格式输出Pod信息
kubectl get pod <pod_name> -n <namespace> -o json
# 以yaml格式输出Pod信息
kubectl get pod <pod_name> -n <namespace> -o yaml
然后,在输出的JSON或YAML文件中,你可以找到spec -> containers
部分,这里列出了Pod中所有容器的信息。
3. 直接在节点上查看(对Docker和containerd都适用)
尽管Kubernetes提供了丰富的工具来查看和管理Pod,但如果你需要在底层节点上直接查看Pod对应的容器,你可以这样做:
-
对于Docker运行时:
在节点上,你可以使用docker ps
命令来列出所有正在运行的容器,并通过容器的ID或名称来找到与Pod对应的容器。但是,需要注意的是,Kubernetes中的Pod通常包含多个容器,且容器的命名可能与Pod的名称不完全相同。此外,Kubernetes还可能使用特定的前缀或后缀来命名容器,或者将容器放在特定的cgroup结构中,这取决于Kubernetes的配置和版本。一种更直接的方法是通过Pod的容器ID来查找容器。Pod的容器ID可以通过
kubectl describe pod
命令获取。然后,你可以在节点上使用docker inspect <container_id>
命令来查看该容器的详细信息。 -
对于containerd运行时:
containerd是Docker的一个更轻量级、更可插拔的容器运行时。如果你使用的是containerd作为容器运行时,你可以使用crictl
工具(CRI Compatible CLI)来查看和管理容器。crictl
是Kubernetes CRI(Container Runtime Interface)的一个命令行实现,它允许你与containerd进行交互。例如,你可以使用
crictl ps
命令来列出所有正在运行的容器,或者使用crictl inspect <container_id>
来查看特定容器的详细信息。
结论
在Kubernetes集群中查看Pod中的容器,你可以通过kubectl
命令行工具来实现,也可以在底层节点上直接查看(尽管这通常不是推荐的做法,因为它绕过了Kubernetes的抽象和管理层)。对于Docker和containerd运行时,方法略有不同,但基本原理是相似的。
更多推荐
所有评论(0)