pod 的重启策略
Kubernetes Pod重启策略详解 Kubernetes提供三种Pod重启策略:Always(默认策略,总是重启)、OnFailure(仅在异常退出时重启)和Never(从不重启)。实验验证了这三种策略:1)Always策略下,即使正常终止也会重启;2)OnFailure策略下,只有非零退出码才会触发重启,可能出现CrashLoopBackOff状态;3)Never策略下,Pod终止后不会重
一、Pod重启策略类型
1、Always #总是重启
2、OnFaliure #当pod错误退出时候重启
3、Never #从不重启
二、具体策略
1、Always
但凡Pod对象终止就将其重启,即使正常终止也重启,此为默认设定
2、OnFailure
只有在Pod对象出现错误终止的时候才会将其重启;比如pod终止的时候的返回值
在当初我们学习shell的时候有$?这个命令,是用来查看上一条命令的输出结果的
3、Never
从来不重启
三、实验环境
实验环境:
Master01 CentOS 7.9 172.16.2.11 kubenetes v1.28
Worker01 CentOS 7.9 172.16.2.12 kubenetes v1.28
Worker02 CentOS 7.9 172.16.2.13 kubenetes v1.28
三、Always(默认策略)测试
vim always.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod2
spec:
containers:
- name: pod2
image: httpd
imagePullPolicy: IfNotPresent
#文件创建好之后使用"kubectl apply -f 文件名"来执行
实验结果验证:
首先查看Pod在哪一个工作节点上
[root@master01 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod2 1/1 Running 0 (7m27s ago) 21h 10.244.5.29 worker01 <none> <none>
#NAME pod名称
#READY “/”前面是就绪的pod “/”后面是所有pod
#STATUS 当前状态(生命周期)
#RESTARTS 重启次数
#AGE 启动时间
#IP Pod的IP地址
#NODE 所在的节点
#NOMINATED NODE 当所在的节点故障的时候将pod重新调度到其他的节点上
发现pod在worker01上然后去相应的主机上手动关闭pod下面的容器测试重启策略
[root@worker01 ~]# docker ps -a | grep pod2
5c098b1123a5 httpd "httpd-foreground" 2 minutes ago Up 2 minutes k8s_pod2_pod2_default_1a0d5171-8b1c-4faf-99ce-bea4ecdd68ce_0
5c098b1123a5 #这是我pod中容器的id
httpd #这是我所使用的镜像的名称
"httpd-foreground" #容器启动时候执行的命令
2 minutes ago #创建时间
Up 2 minutes #启动时间
k8s_pod2_pod2_default_1a0d5171-8b1c-4faf-99ce-bea4ecdd68ce_0 #这是容器的名称
关闭之后发现pod被重启了
[root@master01 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod2 1/1 Running 1(27s ago) 21h 10.244.5.29 worker01 <none>
但是现在有一个问题,之前我们学习Docker的时候容器被重启了id就会变化,但是这个pod连ip都没有变化,这是因为什么呢?
简单来说,Kubernetes 通过 Pod 抽象层将容器的生命周期与网络标识解耦,确保了服务的稳定性和可访问性,这也是容器编排平台与单纯容器引擎的核心区别之一
所以,这个pod看似没有变化,其实里面的容器已经发生变化了
四、OnFailure测试
apiVersion: v1 # 指定 Kubernetes API 版本,v1 为核心资源稳定版本
kind: Pod # 定义资源类型为 Pod(K8s 最小部署单元)
metadata:
name: pod3 # Pod 的名称,在命名空间内唯一
spec:
restartPolicy: OnFailure # 重启策略:容器运行失败(退出码非0)时重启
containers:
- name: pod3 # 容器名称,在 Pod 内唯一
image: busybox # 容器使用的镜像(轻量级的 busybox 工具集)
imagePullPolicy: IfNotPresent # 镜像拉取策略:本地不存在时才从仓库拉取
args: # 容器启动命令参数
- /bin/sh # 使用 sh shell 执行命令
- -c # 将后续字符串作为完整命令执行
- sleep 10; exit 1 # 先休眠10秒,再以非0状态码退出(模拟运行失败)
OnFailure字段主要是在pod 的详细信息(spec)部分添加了 "restartPolicy: OnFailure ”字段
接下来执行这个文件并切新开一个窗口来查看实验成果
[root@master01 5rebootpolicy]# kubectl apply -f onfailure2.yaml
pod/pod3 created
[root@master01 ~]# kubectl get pod -w #-w持续监控
NAME READY STATUS RESTARTS AGE
pod3 0/1 Pending 0 0s
pod3 0/1 Pending 0 0s
pod3 0/1 ContainerCreating 0 0s
pod3 0/1 ContainerCreating 0 0s
pod3 1/1 Running 0 0s
pod3 0/1 Error 0 11s
pod3 1/1 Running 1 (2s ago) 12s
pod3 0/1 Error 1 (12s ago) 22s
pod3 0/1 CrashLoopBackOff 1 (13s ago) 34s
pod3 1/1 Running 2 (14s ago) 35s
pod3 0/1 Error 2 (23s ago) 44s
pod3 0/1 CrashLoopBackOff 2 (15s ago) 59s
pod3 1/1 Running 3 (30s ago) 74s
^[ORpod3 0/1 Error 3 (40s ago) 84s
pod3 0/1 CrashLoopBackOff 3 (14s ago) 98s
从这个实验结果中我们可以看到,因为我们args字段的原因,pod在创建之后持续重启,但是这里我们要注意一个现象:
在多次重启pod的状态出现了CrashLoopBackOff这是k8s集群内的一种机制
CrashLoopBackOff崩溃循环后退
是一种在Kubernetes中常见的状态,它表示Pod中的容器在启动后不断崩溃并重新启动,形成一个循环。Kubernetes会在每次重新启动之间等待一个越来越长的Backoff时间,以便有足够的时间来修复错误。
五、Never测试
vim Never.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod2
spec:
restartPolicy: Never
containers:
- name: pod2
image: httpd
imagePullPolicy: IfNotPresent
停止之后发现pod没有启动
更多推荐
所有评论(0)