前言

环境:centos7.9 docker-ce-20.10.9 kubernetes-version v1.22.6

pod镜像拉取策略(imagePullPolicy)

pod镜像拉取策略可以通过imagePullPolicy字段配置镜像拉取策略,如下演示:

spec:
  containers:
    - name: nginx
      image: nginx:1.14
      imagePullPolicy: Always	#可取 Always(默认值)、IfNotPresent、Never

imagePullPolicy可以使用以下3种策略值:

Always: 默认值,每次创建pod都会重新拉取一次镜像;
IfNotPresent: 镜像在宿主机上不存在时才拉取;
Never: 永远不会主动拉取镜像,使用本地镜像,需要你手动拉取镜像下来;

pod重启容器策略(restartPolicy)

pod重启容器策略是指针对pod内所有容器的重启策略,不是重启pod,其可以通过restartPolicy字段配置pod重启容器的策略,如下演示:

spec:
  containers:
    - name: nginx
      image: nginx:1.14
      imagePullPolict: Always
  restartPolicy:Always		# 可取 Always(默认值)、OnFailure、Never

restartPolicy字段用于配置容器退出后,依据配置的3种值来确定是否重启容器,如下所示:

Always: 默认策略,当容器终止退出后,总是重启容器;
OnFailure: 当容器异常退出,即退出状态码非0时,才重启容器;
Never: 当容器终止退出,不管退出状态码是什么,从不重启容器;

标题模拟这样一个场景

为了更好的理解重启的是pod,还是pod里面的容器,我们来实验一下:
假设一个pod有2个容器,nginx和Tomcat,其中tomcat容器的就绪探针失败,重启的是容器还是pod?

答:经过实际验证,重启的是tomcat容器,而nginx仍可以对外提供服务,也就是说pod本身没有重启,pod还是原来的pod。
当tomcat容器重新创建之后,我们使用kubectl logs -p 可以看得到tomcat容器的上一个日志,是的,就是tomcat的上一个被中断的tomcat容器日志。
假设nginx容器从来没有重启过,所以你这样看kubectl  logs -p  nginx-deployment-574bd4df46-5zzzf -c nginx,报错了:
Error from server (BadRequest): previous terminated container "nginx" in pod "nginx-deployment-574bd4df46-5zzzf" not 
foundprevious terminated container

这说明,在pod内部,保存了被中断重启的容器日志,我们使用kubectl logs -p 或 kubectl logs --previous=true 可以查看
注意:仅能查看上一个被中断重启的容器日志,上上一个是看不到的,应该是覆盖了。

即使pod中只有一个tomcat容器也是一样的,手动让tomcat容器因存活探针失败,tomcat被重新启动了,而pod还是原来的pod,pod的没有说被重新创建,重新调度。

[root@master ~]# kubectl  get pod  -w 
NAME                                 READY   STATUS    RESTARTS      AGE
nginx-deployment-7589944bbd-drskb    1/1     Running   0             5m15s
																			#手动使存活探针失败

nginx-deployment-7589944bbd-drskb     1/1     Running   1 (16s ago)   8m6s	#容器重启1次,这个RESTARTS是容器重启测次数
nginx-deployment-7589944bbd-drskb     1/1     Running   2 (17s ago)   9m57s	#容器重启1次,这个RESTARTS是容器重启测次数

说明:

RESTARTS列是pod里面所有容器的重启次数相加之和。
READY列表示:ready状态的容器个数/总容器个数