当前位置: 首页 > article >正文

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.kler.cn/a/600908.html

相关文章:

  • 【愚公系列】《高效使用DeepSeek》032-育儿知识获取
  • 记录一次部署k3s后,服务404 page not found,nginx显示正常
  • [数据结构]1.时间复杂度和空间复杂度
  • Win10批处理脚本操作注册表教程
  • Android Wrapper Gradle 下载问题:Could not install Gradle distribution from...
  • Lua语言的嵌入式安全
  • mysql慢查询日志
  • 【操作系统】Docker如何使用-续
  • 关于瑞芯微开发工具(RKDevTool)刷机下载Boot失败原因的研究
  • VUE3项目VITE打包优化
  • leetcode3.无重复字符的最长字串
  • G 2024hubei province 学习到的内容
  • 各类神经网络学习:(四)RNN 循环神经网络(下集),pytorch 版的 RNN 代码编写
  • AI+数字孪生:能碳管理中心的智能预测与动态优化
  • Python Django系列—多数据库
  • 干货分享|DeepSeek技术革命、算力范式重构与场景落地洞察
  • JavaEE企业级开发 延迟双删+版本号机制(乐观锁) 事务保证redis和mysql的数据一致性 示例
  • 常用的几种思维方式
  • 2024年MathorCup数学建模C题物流网络分拣中心货量预测及人员排班解题全过程文档加程序
  • Android 12.0 WiFi连接默认设置静态IP地址功能实现