Kubernetes 容器資源管理Resources和探針Probe

資源配額 Resources

在 Kubernetes 中,resources 配置用于設置容器的資源請求和限制,以確保集群中的資源(如 CPU 和內存)得到合理分配和使用。

在之前的pod中,不寫 resources 字段。就意味著 Pod 對運行的資源要求“既沒有下限,也沒有上限”,Kubernetes 不用管 CPU 和內存是否足夠,可以把 Pod 調度到任意的節點上,而且后續 Pod 運行時也可以無限制地使用 CPU 和內存。

Pod 可能會因為資源不足而運行緩慢,或者是占用太多資源而影響其他應用,所以我們應當合理評估 Pod 的資源使用情況,盡量為 Pod 加上限制。

Pod 容器的描述部分添加一個新字段 resources 進行資源限額

ngx-pod-resources.yml

apiVersion: v1
kind: Pod
metadata:name: ngx-pod-resourcesspec:containers:- image: nginx:alpinename: ngxresources:requests:cpu: 10mmemory: 100Milimits:cpu: 20mmemory: 200Mi

containers.resources,它下面有兩個字段:

  • “requests”,意思是容器要申請的資源,也就是說要求 Kubernetes 在創建 Pod 的時候必須分配這里列出的資源,否則容器就無法運行。
  • “limits”,意思是容器使用資源的上限,不能超過設定值,否則就有可能被強制停止運行。

cpu 和 memory 資源表達方式

  • 內存的寫法和磁盤容量一樣,使用 Ki、Mi、Gi 來表示 KB、MB、GB,比如 512Ki、100Mi、0.5Gi 等。
  • kubernetes 里 CPU 的最小使用單位是 0.001,為了方便表示用了一個特別的單位 m,也就是“milli”“毫”的意思,比如說 500m 就相當于 0.5。

ngx-pod-resources.yml 向系統申請的是 1% 的 CPU 時間和 100MB 的內存,運行時的資源上限是 2%CPU 時間和 200MB 內存。有了這個申請,Kubernetes 就會在集群中查找最符合這個資源要求的節點去運行 Pod。

Kubernetes 會根據每個 Pod 聲明的需求,像搭積木或者玩俄羅斯方塊一樣,把節點盡量“塞滿”,充分利用每個節點的資源,讓集群的效益最大化。

運行命令

vim ngx-pod-resources.ymlkubectl apply -f ngx-pod-resources.ymlkubectl get pod

在這里插入圖片描述

如果pod資源配額不夠,會是什么情況
修改 ngx-pod-resources.yml cpu為10個cpu

apiVersion: v1
kind: Pod
metadata:name: ngx-pod-resourcesspec:containers:- image: nginx:alpinename: ngxresources:requests:cpu: 10memory: 100Milimits:cpu: 20memory: 200Mi

執行命令

kubectl delete -f ngx-pod-resources.yml
kubectl get pod
vim ngx-pod-resources.yml
kubectl apply -f ngx-pod-resources.yml 
kubectl get pod
# 獲取pod詳情
kubectl describe pod ngx-pod-resources 

在這里插入圖片描述
使用 kubectl apply 創建這個 Pod,你可能會驚奇地發現,雖然我們的 Kubernetes 集群里沒有足夠的 CPU,但 Pod 也能創建成功。不過我們再用 kubectl get pod 去查看的話,就會發現它處于“Pending”狀態,實際上并沒有真正被調度運行:
在這里插入圖片描述
kubectl describe 來查看具體原因,會發現有這么一句提示:

集群中沒有足夠的可用 CPU 資源來調度新的 Pod,同時有一個節點(master 節點)存在污點 (taint),導致 Pod 無法被調度到該節點上。

檢查探針 Probe

探針 Probe

Kubernetes 為了能更細致地監控 Pod 的狀態,除了保證崩潰重啟,還必須要能夠探查到 Pod 的內部運行狀態,定時給應用做“體檢”,讓應用時刻保持“健康”,能夠滿負荷穩定工作。

Kubernetes 在應用的“檢查口”里提取點數據,就可以從這些信息來判斷應用是否“健康”了,這項功能被稱為“探針”(Probe),也可以叫“探測器”。

探針類型:

  • Startup,啟動探針,用來檢查應用是否已經啟動成功,適合那些有大量初始化工作要做,啟動很慢的應用。
  • Liveness,存活探針,用來檢查應用是否正常運行,是否存在死鎖、死循環。
  • Readiness,就緒探針,用來檢查應用是否可以接收流量,是否能夠對外提供服務。

三種探針的遞進關系:

  • 應用程序先啟動,加載完配置文件等基本的初始化數據就進入了 Startup 狀態
  • 之后如果沒有什么異常就是 Liveness 存活狀態,但可能有一些準備工作沒有完成,還不一定能對外提供服務
  • 只有到最后的 Readiness 狀態才是一個容器最健康可用的狀態。

在這里插入圖片描述
如果一個 Pod 里的容器配置了探針,Kubernetes 在啟動容器后就會不斷地調用探針來檢查容器的狀態:

  • 如果 Startup 探針失敗,Kubernetes 會認為容器沒有正常啟動,就會嘗試反復重啟,當然其后面的 Liveness 探針和 Readiness 探針也不會啟動。
  • 如果 Liveness 探針失敗,Kubernetes 就會認為容器發生了異常,也會重啟容器。
  • 如果 Readiness 探針失敗,Kubernetes 會認為容器雖然在運行,但內部有錯誤,不能正常提供服務,就會把容器從 Service 對象的負載均衡集合中排除,不會給它分配流量。
    在這里插入圖片描述

容器中使用狀態探針

開發應用時預留出“檢查口

nginx-config-cm.yml

apiVersion: v1
kind: ConfigMap
metadata:name: ngx-confdata:default.conf: |server {listen 80;location = /ready {return 200 'I am ready';}}

執行命令

vim nginx-config-cm.yml 
kubectl apply -f nginx-config-cm.yml

Pod 定義探針:

ngx-pod-probe.yml

apiVersion: v1
kind: Pod
metadata:name: ngx-pod-probespec:volumes:- name: ngx-conf-volconfigMap:name: ngx-confcontainers:- image: nginx:alpinename: ngxports:- containerPort: 80volumeMounts:- mountPath: /etc/nginx/conf.dname: ngx-conf-volstartupProbe:periodSeconds: 1exec:command: ["cat", "/var/run/nginx.pid"]livenessProbe:periodSeconds: 10tcpSocket:port: 80readinessProbe:periodSeconds: 5httpGet:path: /readyport: 80

startupProbe、livenessProbe、readinessProbe 這三種探針的配置方式都是一樣的,關鍵字段:

  • periodSeconds,執行探測動作的時間間隔,默認是 10 秒探測一次。
  • timeoutSeconds,探測動作的超時時間,如果超時就認為探測失敗,默認是 1 秒。
  • successThreshold,連續幾次探測成功才認為是正常,對于 startupProbe 和 livenessProbe 來說它只能是 1。
  • failureThreshold,連續探測失敗幾次才認為是真正發生了異常,默認是 3 次。

Kubernetes 支持 3 種探測方式:Shell、TCP Socket、HTTP GET ,它們也需要在探針里配置:

  • exec,執行一個 Linux 命令,比如 ps、cat 等等,和 container 的 command 字段很類似。
  • tcpSocket,使用 TCP 協議嘗試連接容器的指定端口。
  • httpGet,連接端口并發送 HTTP GET 請求。

ngx-pod-probe.yml配置解析

  • StartupProbe 使用了 Shell 方式,使用 cat 命令檢查 Nginx 存在磁盤上的進程號文件(/var/run/nginx.pid),如果存在就認為是啟動成功,它的執行頻率是每秒探測一次。
  • LivenessProbe 使用了 TCP Socket 方式,嘗試連接 Nginx 的 80 端口,每 10 秒探測一次。
  • ReadinessProbe 使用的是 HTTP GET 方式,訪問容器的 /ready 路徑,每 5 秒發一次請求。

執行命令

vim ngx-pod-probe.yml
kubectl apply -f ngx-pod-probe.yml
kubectl get pod
kubectl logs ngx-pod-probe

在這里插入圖片描述
Kubernetes ReadinessProbe 探針以大約 5 秒一次的頻率,向 URI /ready 發送 HTTP 請求,不斷地檢查容器是否處于就緒狀態。

驗證StartupProbe 探針失敗情況

修改ngx-pod-probe.yml的startupProbe

    startupProbe:exec:command: ["cat", "nginx.pid"]  #錯誤的文件

執行命令

kubectl delete -f ngx-pod-probe.yml
kubectl get pod
vim ngx-pod-probe.yml
kubectl apply -f ngx-pod-probe.yml 
kubectl get pod
kubectl logs ngx-pod-probe 

在這里插入圖片描述
StartupProbe 探測失敗的時候,Kubernetes 就會不停地重啟容器,現象就是 RESTARTS 次數不停地增加,而 livenessProbe 和 readinessProbePod 沒有執行,Pod 永遠不會 READY。

修改ngx-pod-probe.yml的livenessProbe(startupProbe內容要還原)

 livenessProbe:tcpSocket:port: 8080                     #錯誤的端口號

執行命令

kubectl delete -f ngx-pod-probe.yml
kubectl get pod
vim ngx-pod-probe.yml
kubectl apply -f ngx-pod-probe.yml 
kubectl get pod
kubectl logs ngx-pod-probe 

在這里插入圖片描述
因為 failureThreshold 的次數默認是三次,所以 Kubernetes 會連續執行三次 livenessProbe TCP Socket 探測,每次間隔 10 秒,30 秒之后都失敗才重啟容器。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/17206.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/17206.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/17206.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java面試八股之AQS對資源的共享方式

AQS對資源的共享方式 AQS設計了一套靈活的機制,不僅支持獨占(Exclusive)鎖模式,也支持共享(Shared)鎖模式,使得資源可以被一個或者多個線程以不同的方式訪問。這兩種模式通過控制一個內部的vol…

技術速遞|宣布 Java on Azure 開發工具支持 Azure Functions Flex Consumption

作者:Jialuo Gan 排版:Alan Wang Azure Functions Flex Consumption 剛剛在微軟 Build 2024大會期間發布(詳情請參見本博客)。我們很高興地與大家分享,Azure Functions 的 IntelliJ Azure Toolkit 和 Maven 插件現在也…

pyqt QTableView表格控件

pyqt QTableView表格控件 QTableView效果代碼 QTableView QTableView 是 PyQt中的一個控件,用于顯示表格數據。它通常與 QAbstractItemModel 或其子類(如 QStandardItemModel)一起使用,以提供和管理表格中的數據。 效果 代碼 i…

wordpress主題 ACG美化插件v3.4.2支持zibll主題7b2主題美化

獨具一格的二次元風格,打造全新的子比美化方向 大部分代碼均為CSS、JS做成插件只是為了方便懶人小白站長 后臺全功能一覽,大部分美化均為網上通用流傳,

2.冒泡排序

樣例輸入 5 8 3 6 4 9 樣例輸出 3 4 6 8 9 以下是解題答案&#xff1a; class demo1{public static void main(String[] args) {Scanner scnnew Scanner(System.in);int[] array new int[scn.nextInt()];if(array.length>0&&array.length<200){for(int…

python列表訪問的深入解析

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、正向索引與負索引的奧秘 二、切片&#xff1a;高效訪問多個元素 切片示例 三、切片的…

MIT6.828 Lab2-3 Sysinfo

目錄 一、實驗內容二、實驗過程2.1 已有的代碼2.2 需補充內容/kernel/kalloc.c修改&#xff08;剩余內存計算的函數&#xff09;/kernel/proc.c修改&#xff08;統計進程數量的函數&#xff09;/kernel/defs.h修改添加/kernel/sysinfo.c文件/kernel/syscall.h修改/kernel/sysca…

Java 文件操作和輸入輸出流

在 Java 編程中&#xff0c;文件操作和輸入輸出流是非常常見和重要的任務&#xff0c;它們允許你讀取和寫入文件、處理數據流等。 文件操作概述 文件操作是指對文件進行創建、讀取、寫入、刪除等操作的過程。在 Java 中&#xff0c;文件操作通常涉及到使用文件對象、輸入輸出…

OpenBayes 一周速覽|TripoSR 開源:1 秒即 2D 變 3D、經典 GTZAN 音樂數據集上線

公共資源速遞 This Weekly Snapshots &#xff01;5 個數據集&#xff1a; FER2013 面部表情識別數據集 GTZAN 音樂流派分類數據集 MVTec-AD 工業異常檢測數據集 UCAS-AOD 遙感目標檢測數據集 Oxford 102 Flowers 花卉圖片數據集 3 個教程&#xff1a; Latte 全球首個開…

利用ArcGIS Python批量拼接遙感影像(arcpy batch processing)

本篇文章將說明如何利用ArcGIS 10.1自帶的Python IDLE進行遙感影像的批量拼接與裁剪。 1.運行環境&#xff1a;ArcGIS10.1 (安裝傳送門)、Python IDLE 2.數據來源&#xff1a;地理空間數據云 GDEMV2 30M分辨率數字高程數據 3.解決問題&#xff1a;制作山西省的DEM影像 如下…

【WEB前端2024】開源智體世界:喬布斯3D紀念館-第30課-門的移動動畫

【WEB前端2024】開源智體世界&#xff1a;喬布斯3D紀念館-第30課-門的移動動畫 使用dtns.network德塔世界&#xff08;開源的智體世界引擎&#xff09;&#xff0c;策劃和設計《喬布斯超大型的開源3D紀念館》的系列教程。dtns.network是一款主要由JavaScript編寫的智體世界引擎…

服務器端口轉發,服務器端口轉發的作用、好處與壞處

服務器端口轉發&#xff0c;服務器端口轉發的作用、好處與壞處。 服務器端口轉發是一種關鍵的網絡技術&#xff0c;它在網絡安全和通信中發揮著不可替代的作用。其主要功能是將來自一個端口的網絡流量轉發到另一個端口&#xff0c;從而實現內外網之間的流量交互。這種技術通常…

雷軍-2022.8小米創業思考-8-和用戶交朋友,非粉絲經濟;性價比是最大的誠意;新媒體,直播離用戶更近;用真誠打動朋友,臉皮厚點!

第八章 和用戶交朋友 2005年&#xff0c;為了進一步推動金山的互聯網轉型&#xff0c;讓金山的同事更好地理解互聯網的精髓&#xff0c;我推動了一場向谷歌學習的運動&#xff0c;其中一個小要求就是要能背誦“谷歌十誡”。 十誡的第一條就令人印象深刻&#xff1a;以用戶為中…

基于Cortex的MCU設計

基于Cortex的MCU設計 今日更新的存貨文檔&#xff0c;發現日更文章還是很花時間的。保證一周更新三篇文章就行啦&#xff0c;本篇文章的內容起始主要取自于《Cortex-M3 權威指南》和知網下載的論文。寫的不詳細&#xff0c;想進一步了解的就去看這篇文檔或網上找別的資料&#…

數據治理與提取:未來科技發展的雙引擎

在數字化浪潮席卷全球的今天&#xff0c;數據已成為推動科技進步的新石油。無論是人工智能、機器學習還是物聯網&#xff0c;都離不開數據的支撐。然而&#xff0c;數據的海量增長也帶來了新的挑戰&#xff1a;如何有效地管理和利用這些數據&#xff1f;答案在于數據治理和數據…

Lightdm設置自動登錄

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、設置自動登錄總結 前言 熟悉嵌入式系統的人都不陌生lightdm&#xff0c;這個輕桌面管理器曾經是Ubuntu等一眾發行版默認的桌面&#xff0c;自從Ubuntu-18.…

Divisibility Part2(整除理論2)

Divisibility Part2 本節內容是Part1的進階內容&#xff0c;主要講的是整除在競賽中的一些常用的技巧。 數的分解 一、帶余除法 對于任意兩個整數 a 、 b ( b ≠ 0 ) a、b(b\neq 0) a、b(b0)&#xff0c;都有唯一確定的整數 q , r q,r q,r&#xff0c; 滿足 a q b r (…

Oracle 序列-SEQUENCE

文章目錄 序列-SEQUENCE創建序列訪問序列序列的修改和刪除查詢序列信息 序列-SEQUENCE 創建序列 訪問序列 序列的修改和刪除 DROP SEQUENCE SEQ_EKPO;查詢序列信息 可以通過視圖 dba/all/user_sequences 查詢序列的相關信息 SELECT SEQUENCE_NAME FROM DBA_SEQUENCES WHERE …

LLM提示工程的技巧

1. 從簡單開始&#xff08;Start Simple&#xff09; 避免在一開始就增加太多的復雜性。 從簡單的提示開始&#xff0c;然后在后續提示中添加更多信息和上下文。 這樣&#xff0c;提示就是一個迭代過程&#xff0c;提示在此過程中進一步發展。 從簡單的開始&#xff0c;就有足…

第十二章:C# 循環

0. 簡介 循環語句用于重復執行代碼塊,直到滿足特定條件。C#提供了多種循環語句,包括for循環、while循環和do-while循環。掌握這些循環語句有助于編寫高效和簡潔的代碼。 1. for 循環 for循環用于在已知迭代次數的情況下重復執行代碼塊。for循環的語法包括初始化語句、條件…