精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

記錄一次K8s pod被殺的排查過程

馬哥Linux運維 ? 來源:博客園 ? 2024-01-18 09:57 ? 次閱讀

問題描述

今天下午運維反饋說我們這一個pod一天重啟了8次,需要排查下原因。一看Kiban日志,jvm沒有拋出過任何錯誤,服務就直接重啟了。顯然是進程被直接殺了,初步判斷是pod達到內存上限被K8s oomkill了。

因為我們xmx和xsx設置的都是3G,而pod的內存上限設置的是6G,所以出現這種情況還挺詭異的。

排查過程

初步定位

先找運維拉了一下pod的描述,關鍵信息在這里

Containers:
  container-prod--:
    Container ID:   --
    Image:          --
    Image ID:       docker-pullable://--
    Port:           8080/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Fri, 05 Jan 2024 1101 +0800
    Last State:     Terminated
      Reason:       Error
      Exit Code:    137
      Started:      Fri, 05 Jan 2024 1138 +0800
      Finished:     Fri, 05 Jan 2024 1158 +0800
    Ready:          True
    Restart Count:  8
    Limits:
      cpu:     8
      memory:  6Gi
    Requests:
      cpu:        100m
      memory:     512Mi

可以看到Last State:Terminated,Exit Code: 137。這個錯誤碼表示的是pod進程被SIGKILL給殺掉了。一般情況下是因為pod達到內存上限被k8s殺了。

因此得出結論是生產環境暫時先擴大下pod的內存限制,讓服務穩住。然后再排查為啥pod里會有這么多的堆外內存占用。

進一步分析

但是運維反饋說無法再擴大pod的內存限制,因為宿主機的內存已經占到了99%了。

然后結合pod的內存監控,發現pod被殺前的內存占用只到4G左右,沒有達到上限的6G,pod就被kill掉了。

于是問題就來了,為啥pod沒有達到內存上限就被kill了呢。

帶著疑問,我開始在google里尋找答案,也發現了一些端倪:

如果是pod內存達到上限被kill,pod的描述里會寫Exit Code: 137,但是Reason不是Error,而是OOMKilled

宿主機內存已經吃滿,會觸發k8s的保護機制,開始evict一些pod來釋放資源

但是為什么整個集群里,只有這個pod被反復evict,其他服務沒有影響?

謎題解開

最終還是google給出了答案:

Why my pod gets OOMKill (exit code 137) without reaching threshold of requested memory

鏈接里的作者遇到了和我一樣的情況,pod還沒吃到內存上限就被殺了,而且也是:

  Last State:     Terminated
      Reason:       Error
      Exit Code:    137

作者最終定位的原因是因為k8s的QoS機制,在宿主機資源耗盡的時候,會按照QoS機制的優先級,去殺掉pod來釋放資源。

什么是k8s的QoS?

QoS,指的是Quality of Service,也就是k8s用來標記各個pod對于資源使用情況的質量,QoS會直接影響當節點資源耗盡的時候k8s對pod進行evict的決策。官方的描述在這里.

k8s會以pod的描述文件里的資源限制,對pod進行分級:

QoS 條件
Guaranteed 1. pod里所有的容器都必須設置cpu和內存的request和limit,2. pod里所有容器設置的cpu和內存的request和容器設置的limit必須相等(容器自身相等,不同容器可以不等)
Burstable 1. pod并不滿足Guaranteed的條件,2. 至少有一個容器設置了cpu或者內存的request或者limit
BestEffort pod里的所有容器,都沒有設置任何資源的request和limit

當節點資源耗盡的時候,k8s會按照BestEffort->Burstable->Guaranteed這樣的優先級去選擇殺死pod去釋放資源。

從上面運維給我們的pod描述可以看到,這個pod的資源限制是這樣的:

    Limits:
      cpu:     8
      memory:  6Gi
    Requests:
      cpu:        100m
      memory:     512Mi

顯然符合的是Burstable的標準,所以宿主機內存耗盡的情況下,如果其他服務都是Guaranteed,那自然會一直殺死這個pod來釋放資源,哪怕pod本身并沒有達到6G的內存上限。

QoS相同的情況下,按照什么優先級去Evict?

但是和運維溝通了一下,我們集群內所有pod的配置,limit和request都是不一樣的,也就是說,大家都是Burstable。所以為什么其他pod沒有被evict,只有這個pod被反復evict呢?

QoS相同的情況,肯定還是會有evict的優先級的,只是需要我們再去尋找下官方文檔。

關于Node資源耗盡時候的Evict機制,官方文檔有很詳細的描述。

其中最關鍵的一段是這個:

If the kubelet can't reclaim memory before a node experiences OOM, theoom_killercalculates anoom_scorebased on the percentage of memory it's using on the node, and then adds theoom_score_adjto get an effectiveoom_scorefor each container. It then kills the container with the highest score.

This means that containers in low QoS pods that consume a large amount of memory relative to their scheduling requests are killed first.

簡單來說就是pod evict的標準來自oom_score,每個pod都會被計算出來一個oom_score,而oom_score的計算方式是:pod使用的內存占總內存的比例加上pod的oom_score_adj值

oom_score_adj的值是k8s基于QoS計算出來的一個偏移值,計算方法:

QoS oom_score_adj
Guaranteed -997
BestEffort 1000
Burstable min(max(2, 1000 - (1000 × memoryRequestBytes) / machineMemoryCapacityBytes), 999)

從這個表格可以看出:
首先是BestEffort->Burstable->Guaranteed這樣的一個整體的優先級
然后都是Burstable的時候,pod實際占用內存/pod的request內存比例最高的,會被優先Evict

總結

至此已經可以基本上定位出Pod被反復重啟的原因了:

k8s節點宿主機內存占用滿了,觸發了Node-pressure Eviction
按照Node-pressure Eviction的優先級,k8s選擇了oom_score最高的pod去evict
由于所有pod都是Burstable,并且設置的request memery都是一樣的512M,因此內存占用最多的pod計算出來的oom_score就是最高的
所有pod中,這個服務的內存占用一直都是最高的,所以每次計算出來,最后都是殺死這個pod

那么如何解決呢?

宿主機內存擴容,不然殺死pod這樣的事情無法避免,無非就是殺哪個的問題

對于關鍵服務的pod,要把request和limit設置為完全一致,讓pod的QoS置為Guaranteed,盡可能降低pod被殺的幾率。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JVM
    JVM
    +關注

    關注

    0

    文章

    157

    瀏覽量

    12209
  • QoS機制
    +關注

    關注

    0

    文章

    2

    瀏覽量

    4961

原文標題:記錄一次K8s pod被殺的排查過程

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    全面提升,阿里云Docker/Kubernetes(K8S) 日志解決方案與選型對比

    。根據不同Pod需求設置對應的采集配置,所有涉及容器采集的配置均支持IncludeLabel、ExcluseLabel過濾同配置可應用到多個k8s集群。如果您有多個的k8s集群,若其
    發表于 02-28 12:49

    K8s 從懵圈到熟練 – 集群網絡詳解

    導讀:阿里云 K8S 集群網絡目前有兩種方案:種是 flannel 方案;另外種是基于 calico 和彈性網卡 eni 的 terway 方案。Terway 和 flannel 類似
    發表于 10-14 15:06

    從零開始入門 K8s | 應用存儲和持久化數據卷:核心知識

    pod 刪掉之后的情況。先刪 Pod,接著再刪下對應的 PVC(K8s 內部對 pvc 對象由保護機制,在刪除 pvc 對象時如果發現有 pod
    發表于 10-15 14:55

    從零開始入門 K8s | 應用存儲和持久化數據卷:存儲快照與拓撲調度

    上我才能使用那塊 PV,而對第二個問題場景就是說跨可用區的話,必須要在將使用該 PV 的 pod 調度到同個可用區的 node 上才能使用阿里云云盤服務,那 K8s 中怎樣去解決這個問題呢?簡單
    發表于 10-15 15:07

    從零開始入門 K8s | 應用存儲和持久化數據卷:核心知識

    首先看Pod Volumes 的常見類型:本地存儲,常用的有 emptydir/hostpath;網絡存儲:網絡存儲當前的實現方式有兩種,種是 in-tree,它的實現代碼是放在 K8
    發表于 10-16 10:10

    OpenStack與K8s結合的兩種方案的詳細介紹和比較

    OpenStack與K8S結合主要有兩種方案。K8S部署在OpenStack平臺之上,二是K8S和OpenStack組件集成。
    的頭像 發表于 10-14 09:38 ?2.7w次閱讀

    如何使用kubernetes client-go實踐個簡單的與K8s交互過程

    【導讀】Kubernetes項目使用Go語言編寫,對Go api原生支持非常便捷。 本篇文章介紹了如何使用kubernetes client-go實踐個簡單的與K8s交互過程
    的頭像 發表于 02-02 11:16 ?6779次閱讀
    如何使用kubernetes client-go實踐<b class='flag-5'>一</b>個簡單的與<b class='flag-5'>K8s</b>交互<b class='flag-5'>過程</b>

    關于K8s最詳細的解析

    個目標:容器操作;兩地三中心;四層服務發現;五種Pod共享資源;六個CNI常用插件;七層負載均衡;八種隔離維度;九個網絡模型原則;十類IP地址;百級產品線;千級物理機;萬級容器;相如無億,K8s有億:億級日服務人次。
    的頭像 發表于 04-08 13:55 ?7224次閱讀
    關于<b class='flag-5'>K8s</b>最詳細的解析

    Docker不香嗎為什么還要用K8s

    Docker 雖好用,但面對強大的集群,成千上萬的容器,突然感覺不香了。 這時候就需要我們的主角 Kubernetes 上場了,先來了解K8s 的基本概念,后面再介紹實踐,由淺入深步步為營
    的頭像 發表于 06-02 11:56 ?3411次閱讀

    簡單說明k8s和Docker之間的關系

    這篇文章主要介紹了k8s和Docker關系簡單說明,本文利用圖文講解的很透徹,有需要的同學可以研究下 最近項目用到kubernetes(以下簡稱k8sks之間有
    的頭像 發表于 06-24 15:48 ?3356次閱讀

    K8S(kubernetes)學習指南

    K8S(kubernetes)學習指南
    發表于 06-29 14:14 ?0次下載

    k8s是什么意思?kubeadm部署k8s集群(k8s部署)|PetaExpres

    k8s是什么意思? kubernetes簡稱K8s,是個開源的,用于管理云平臺中多個主機上的容器化的應用,Kubernetes的目標是讓部署容器化的應用簡單并且高效(powerful
    發表于 07-19 13:14 ?1095次閱讀

    glibc導致的堆外內存泄露的排查過程

    本文記錄一次glibc導致的堆外內存泄露的排查過程
    的頭像 發表于 09-01 09:43 ?680次閱讀
    glibc導致的堆外內存泄露的<b class='flag-5'>排查過程</b>

    K8s常見的10個問題排查

    K8S的集群狀態是排查故障的關鍵起點。使用kubectl get nodes命令來檢查節點狀態。如果有節點未能就緒或出現異常狀態,可能會對應用程序造成故障。確保基本組件,如etcd、kubelet和kube-proxy等,正常運行。
    發表于 11-01 12:26 ?1362次閱讀
    <b class='flag-5'>K8s</b>常見的10個問題<b class='flag-5'>排查</b>

    記錄一次使用easypoi時與源碼博弈的過程

    、背景介紹 最近剛剛接手了保險線之聲平臺的開發和維護工作,第個需要修復的問題是:平臺的事件導出成excel功能在經過一次上線之后突然不可用了,于是就開始了幾輪痛苦的
    的頭像 發表于 07-03 16:33 ?299次閱讀
    <b class='flag-5'>記錄</b><b class='flag-5'>一次</b>使用easypoi時與源碼博弈的<b class='flag-5'>過程</b>