一、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没有启动

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐