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.pswp.cn/news/898990.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898990.shtml
英文地址,請注明出處:http://en.pswp.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…