Kubernetes高级应用之-重启策略

一、介绍+扩展应用(涉及的高级资源在后续会写出来)

# Kubernetes Pod重启策略(RestartPolicy)全面解析

## 一、重启策略的核心价值与重要性

在Kubernetes集群中,Pod重启策略(RestartPolicy)是容器编排系统自愈能力的关键组成部分,它直接决定了容器异常终止后的恢复行为。其重要性体现在以下几个维度:

1. **应用高可用保障**:
   - 自动处理容器进程崩溃、OOM被杀等意外情况
   - 减少服务中断时间,满足SLA要求(如99.9%可用性)
   - 对无状态服务特别重要,如Web服务器、API服务等

2. **工作负载适应性**:
   - 区分长期运行服务与批处理任务的不同需求
   - 避免批处理任务成功后不必要的重启
   - 支持多种业务场景的差异化需求

3. **资源利用优化**:
   - 防止故障容器无限重启造成的资源浪费
   - 与资源配额(ResourceQuota)机制协同工作
   - 通过退避延迟(Back-off)机制避免密集重启

4. **系统运维维度**:
   - 降低运维人员手动干预频率
   - 与监控告警系统形成完整故障处理闭环
   - 为故障诊断提供时间窗口(特别是Never策略)

## 二、三种重启策略深度解析

### 1. Always策略(默认策略)

**行为特征**:
- 任何非预期终止都会触发重启(包括正常退出码0)
- 采用指数退避算法(从10秒到5分钟)
- 记录重启次数到Pod状态(restartCount)

**适用场景**:
- 7×24小时运行的关键服务(如Nginx、MySQL)
- 需要持续存在的后台进程
- 与Deployment/StatefulSet配合使用的场景

**典型配置**:
```yaml
spec:
  restartPolicy: Always
```

### 2. OnFailure策略

**行为特征**:
- 仅当容器返回非零退出码时重启
- 同样采用指数退避机制
- 成功完成任务(exit 0)后保持终止状态

**适用场景**:
- 批处理作业(如数据分析任务)
- 定时执行的维护脚本
- CI/CD流水线中的构建步骤

**特殊说明**:
- 对于OOM killed等信号终止,会被识别为失败
- 需确保业务代码正确返回退出状态码

### 3. Never策略

**行为特征**:
- 完全禁用自动重启功能
- 保留容器最后状态供检查
- Pod状态将显示Error/Completed

**适用场景**:
- 调试排障阶段保留现场
- 明确不需要重启的一次性任务
- 需要人工介入的特殊处理流程

## 三、生产环境最佳实践

1. **策略选择指南**:
   - 长期服务:Always + livenessProbe
   - 定时任务:OnFailure + activeDeadlineSeconds
   - 测试任务:Never + 日志持久化

2. **高级配置组合**:
   ```yaml
   spec:
     restartPolicy: OnFailure
     terminationGracePeriodSeconds: 30  # 优雅终止宽限期
     containers:
     - livenessProbe:
         httpGet:
           path: /healthz
           port: 8080
   ```

3. **监控建议**:
   - 通过`kubectl get pods`观察restartCount
   - 设置重启次数告警阈值(如1小时重启5次)
   - 结合Pod状态(CrashLoopBackOff)进行告警

4. **常见问题处理**:
   - **频繁重启**:检查应用日志、资源限制
   - **重启无效**:验证镜像可启动性
   - **状态停滞**:检查kubelet服务状态

## 四、底层实现原理

1. **控制循环机制**:
   - kubelet持续监控容器状态
   - 通过CRI(容器运行时接口)获取退出码
   - 根据策略触发重启操作

2. **状态保持机制**:
   - 重启后保持相同的Pod IP
   - 存储卷(Volume)保持挂载
   - 环境变量等配置不变

3. **退避算法细节**:
   - 首次重启延迟10秒
   - 每次失败加倍延迟时间
   - 上限为5分钟

## 五、与其他特性的关系

1. **与控制器配合**:
   - Deployment确保期望副本数
   - Job控制任务重试次数(backoffLimit)
   - 重启策略作用于单Pod层面

2. **与探针协同**:
   ```yaml
   livenessProbe:
     failureThreshold: 3  # 连续失败3次判定为不健康
   readinessProbe:
     periodSeconds: 5     # 每5秒检测一次
   ```

3. **与资源限制**:
   - 频繁重启可能触发Memory/CPU限制
   - 需合理设置requests/limits

正确理解和使用重启策略,是构建可靠Kubernetes应用的重要基础。建议通过`kubectl describe pod`命令详细观察重启记录,结合业务特点选择最适合的策略配置。

二、应用部署

[root@master ~]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod
spec:
  restartPolicy: Always
  containers:
  - name: pod-test
    image: docker.io/library/tomcat:8.5-jre8-alpine
    imagePullPolicy: Never

[root@master ~]# kubectl apply -f pod.yaml
pod/pod created

[root@master ~]# kubectl exec -it pod -- bash
bash-4.4# /usr/local/tomcat/bin/shutdown.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/lib/jvm/java-1.8-openjdk/jre
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
bash-4.4# command terminated with exit code 137


[root@master ~]# kubectl get pod -w
NAME   READY   STATUS    RESTARTS   AGE
pod    1/1     Running   0          2s
pod    0/1     Completed   0          20s
pod    1/1     Running     1 (10s ago)   21s

root@master ~]# kubectl exec -it pod -- bash
bash-4.4# ps -ef | grep tomcat
    1 root      0:02 /usr/lib/jvm/java-1.8-openjdk/jre/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
   76 root      0:00 grep tomcat
bash-4.4# kill 1
bash-4.4# command terminated with exit code 137

[root@master ~]# kubectl get pod -w
NAME   READY   STATUS    RESTARTS      AGE
pod    1/1     Running   1 (52s ago)   63s
pod    0/1     Error     1 (2m11s ago)   2m22s
pod    0/1     CrashLoopBackOff   1 (24s ago)     2m37s
pod    1/1     Running            2 (24s ago)     2m37s

[root@master ~]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod
spec:
  restartPolicy: Never
  containers:
  - name: pod-test
    image: docker.io/library/tomcat:8.5-jre8-alpine
    imagePullPolicy: Never
[root@master ~]# kubectl apply -f pod.yaml && kubectl get pod
pod/pod created
NAME   READY   STATUS              RESTARTS   AGE
pod    0/1     ContainerCreating   0          0s

[root@master ~]# kubectl exec -it pod -- bash
bash-4.4# kill 1
bash-4.4# command terminated with exit code 137

[root@master ~]# kubectl get pods
NAME   READY   STATUS   RESTARTS   AGE
pod    0/1     Error    0          40s

[root@master ~]# kubectl exec -it pod -- bash
bash-4.4# /usr/local/tomcat/bin/shutdown.sh u
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/lib/jvm/java-1.8-openjdk/jre
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ]  { -help | start | stop }
bash-4.4# command terminated with exit code 137

[root@master ~]# kubectl apply -f pod.yaml
pod/pod created
[root@master ~]# kubectl get pod -w
NAME   READY   STATUS    RESTARTS   AGE
pod    1/1     Running   0          10s
pod    0/1     Completed   0          19s
pod    0/1     Completed   0          20s
pod    0/1     Completed   0          20s
^C[root@master ~]# cat pod
cat: pod: No such file or directory
[root@master ~]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod
spec:
  restartPolicy: OnFailure
  containers:
  - name: pod-test
    image: docker.io/library/tomcat:8.5-jre8-alpine
    imagePullPolicy: Never

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/898990.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简记_单片机硬件最小系统设计

以STM32为例: 一、电源 1.1、数字电源 IO电源:VDD、VSS:1.8~3.6V,常用3.3V,去耦电容1 x 10u N x 100n ; 内核电源:内嵌的稳压器输出:1.2V,给内核、存储器、数字外设…

matlab使用fmincon开加速

在使用 fmincon 进行优化时,可以通过以下方法加速优化过程。这些方法主要涉及算法选择、并行计算、减少函数调用次数等。以下是具体建议和实现方式: 1. 选择合适的优化算法 fmincon 支持多种优化算法,不同的算法适用于不同类型的优化问题。选…

MySQL颠覆版系列————MySQL新特性(开启数据库的新纪元)下篇

文章目录 前言五、持久化全局变量5.1 持久化全局变量特点5.2 持久化全局变量实例5.3 持久化全局变量注意事项 六、降序索引(Descending Indexes)6.1 降序索引(Descending Indexes)特点6.2 降序索引(Descending Indexes…

解析1688.item_search_shop接口:获取店铺所有商品返回数据详细说明

一、引言 在电商领域,获取特定店铺的所有商品信息是运营分析、市场调研和自动化处理的重要基础。1688作为国内领先的B2B电商平台,提供了丰富的API接口供开发者使用。其中,item_search_shop接口允许开发者通过店铺ID获取该店铺的所有商品信息…

新书速览|OpenCV计算机视觉开发实践:基于Python

《OpenCV计算机视觉开发实践:基于Python》 本书内容 OpenCV是一个跨平台计算机视觉和机器学习软件库,也是计算机视觉领域的开发人员必须掌握的技术。《OpenCV计算机视觉开发实践:基于Python》基于Python 3.8全面系统地介绍OpenCV 4.10的使用,并配套示例…

微服务架构中的服务发现与 Consul 实践

在微服务架构中,服务之间的通信是核心问题之一。随着服务数量的增长,如何高效地管理和定位服务实例变得尤为重要。本文将介绍服务发现的基本概念,并详细讲解如何使用 Consul 进行服务注册、发现和健康检查。 1. 什么是服务发现? …

PyTorch 深度学习实战(24):分层强化学习(HRL)

一、分层强化学习原理 1. 分层学习核心思想 分层强化学习(Hierarchical Reinforcement Learning, HRL)通过时间抽象和任务分解解决复杂长程任务。核心思想是: 对比维度传统强化学习分层强化学习策略结构单一策略直接输出动作高层策略选择选…

车载网络测试实操源码_使用CAPL脚本进行UDS刷写及其自动化测试

系列文章目录 使用CAPL脚本解析hex、S19、vbf文件 使用CAPL脚本对CAN报文的Counter、CRC、周期、错误帧进行实时监控 使用CAPL脚本模拟发送符合协议要求(Counter和CRC)的CAN报文 使用CAPL脚本控制继电器实现CAN线、电源线的通断 使用CAPL脚本实现安全访问解锁 使用CAPL脚本实现…

Spring Boot整合Spring Data JPA

Spring Data作为Spring全家桶中重要的一员,在Spring项目全球使用市场份额排名中多次居前位,而在Spring Data子项目的使用份额排名中,Spring Data JPA也一直名列前茅。Spring Boot为Spring Data JPA提供了启动器,使Spring Data JPA…

JS 应用WebPack 打包器第三方库 JQuery安装使用安全检测

# 打包器 -WebPack- 使用 & 安全 参考: https://mp.weixin.qq.com/s/J3bpy-SsCnQ1lBov1L98WA Webpack 是一个模块打包器。在 Webpack 中会将前端的所有资源文件都作为模块处理。 它将根据模块的依赖关系进行分析,生成对应的资源。 五个核心概…

Oracle归档配置及检查

配置归档位置到 USE_DB_RECOVERY_FILE_DEST,并设置存储大小 startup mount; !mkdir /db/archivelog ALTER SYSTEM SET db_recovery_file_dest_size100G SCOPEBOTH; ALTER SYSTEM SET db_recovery_file_dest/db/archivelog SCOPEBOTH; ALTER SYSTEM SET log_archive…

Four.meme是什么,一篇文章读懂

一、什么是Four.meme? Four.meme 是一个运行在 BNB 链的去中心化平台旨在为 meme 代币供公平启动服务。它允许用户以极低的成本创建和推出 meme 代币,无需预售或团队分配,它消除了传统的预售、种子轮和团队分配,确保所有参与者有…

Simula语言的正则表达式

Simula语言中的正则表达式 引言 Simula是一种开创性的编程语言,最初在1960年代由Ole-Johan Dahl和Kristen Nygaard在挪威的计算机中心开发。它不仅是面向对象编程的先驱,还在模拟和各种计算领域有显著的应用。然而,Simula语言本身并不直接支…

Java 集合 List、Set、Map 区别与应用

一、核心特性对比 二、底层实现与典型差异 ‌List‌ ‌ArrayList‌:动态数组结构,随机访问快(O(1)),中间插入/删除效率低(O(n))‌‌LinkedList‌:双向链表结构,头尾操作…

【第二月_day7】Pandas 简介与数据结构_Pandas_ day1

以下是专为小白设计的 Pandas 简介与数据结构 学习内容,用最通俗的语言和案例讲解核心概念: 一、安装 Pandas 1. 安装方法 打开电脑的命令提示符(Windows)或终端(Mac/Linux)输入以下命令并回车&#xff1…

欢迎来到未来:探索 Dify 开源大语言模型应用开发平台

欢迎来到未来:探索 Dify 开源大语言模型应用开发平台 如果你对 AI 世界有所耳闻,那么你一定听说过大语言模型(LLM)。这些智能巨兽能够生成文本、回答问题、甚至编写代码!但是,如何将它们变成真正的实用工具…

python多线程和多进程的区别有哪些

python多线程和多进程的区别有七种: 1、多线程可以共享全局变量,多进程不能。 2、多线程中,所有子线程的进程号相同;多进程中,不同的子进程进程号不同。 3、线程共享内存空间;进程的内存是独立的。 4、同一…

【MySQL报错】:Column count doesn’t match value count at row 1

MySQL报错:Column count doesn’t match value count at row 1 意思是存储的数据与数据库表的字段类型定义不相匹配. 由于类似 insert 语句中,前后列数不等造成的 主要有3个易错点: 要传入表中的字段数和values后面的值的个数不相等。 由于类…

TCP/IP 协议栈深度解析

1. 分层结构设计 TCP/IP协议栈采用四层模型,其分层结构与协议实现细节如下: 1.1 网络层(Network Layer) 核心功能:提供端到端的数据包路由与寻址 核心协议: IP协议(IPv4/IPv6) I…

Apache Tomcat CVE-2025-24813 安全漏洞

Apache Tomcat CVE-2025-24813被广泛利用,但是他必须要满足两个点: 1.被广泛的使用,并且部署在服务器中。 2.漏洞必须依赖在服务器中的配置。 并且漏洞补丁已经发布。 漏洞攻击方式: CVE-2025-24813 是 Apache Tomcat 部分 PUT…