在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

記錄一次K8s pod被殺的排查過(guò)程

馬哥Linux運(yùn)維 ? 來(lái)源:博客園 ? 2024-01-18 09:57 ? 次閱讀

問(wèn)題描述

今天下午運(yùn)維反饋說(shuō)我們這一個(gè)pod一天重啟了8次,需要排查下原因。一看Kiban日志,jvm沒(méi)有拋出過(guò)任何錯(cuò)誤,服務(wù)就直接重啟了。顯然是進(jìn)程被直接殺了,初步判斷是pod達(dá)到內(nèi)存上限被K8s oomkill了。

因?yàn)槲覀儀mx和xsx設(shè)置的都是3G,而pod的內(nèi)存上限設(shè)置的是6G,所以出現(xiàn)這種情況還挺詭異的。

排查過(guò)程

初步定位

先找運(yùn)維拉了一下pod的描述,關(guān)鍵信息在這里

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。這個(gè)錯(cuò)誤碼表示的是pod進(jìn)程被SIGKILL給殺掉了。一般情況下是因?yàn)閜od達(dá)到內(nèi)存上限被k8s殺了。

因此得出結(jié)論是生產(chǎn)環(huán)境暫時(shí)先擴(kuò)大下pod的內(nèi)存限制,讓服務(wù)穩(wěn)住。然后再排查為啥pod里會(huì)有這么多的堆外內(nèi)存占用。

進(jìn)一步分析

但是運(yùn)維反饋說(shuō)無(wú)法再擴(kuò)大pod的內(nèi)存限制,因?yàn)樗拗鳈C(jī)的內(nèi)存已經(jīng)占到了99%了。

然后結(jié)合pod的內(nèi)存監(jiān)控,發(fā)現(xiàn)pod被殺前的內(nèi)存占用只到4G左右,沒(méi)有達(dá)到上限的6G,pod就被kill掉了。

于是問(wèn)題就來(lái)了,為啥pod沒(méi)有達(dá)到內(nèi)存上限就被kill了呢。

帶著疑問(wèn),我開(kāi)始在google里尋找答案,也發(fā)現(xiàn)了一些端倪:

如果是pod內(nèi)存達(dá)到上限被kill,pod的描述里會(huì)寫(xiě)Exit Code: 137,但是Reason不是Error,而是OOMKilled

宿主機(jī)內(nèi)存已經(jīng)吃滿,會(huì)觸發(fā)k8s的保護(hù)機(jī)制,開(kāi)始evict一些pod來(lái)釋放資源

但是為什么整個(gè)集群里,只有這個(gè)pod被反復(fù)evict,其他服務(wù)沒(méi)有影響?

謎題解開(kāi)

最終還是google給出了答案:

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

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

  Last State:     Terminated
      Reason:       Error
      Exit Code:    137

作者最終定位的原因是因?yàn)閗8s的QoS機(jī)制,在宿主機(jī)資源耗盡的時(shí)候,會(huì)按照QoS機(jī)制的優(yōu)先級(jí),去殺掉pod來(lái)釋放資源。

什么是k8s的QoS?

QoS,指的是Quality of Service,也就是k8s用來(lái)標(biāo)記各個(gè)pod對(duì)于資源使用情況的質(zhì)量,QoS會(huì)直接影響當(dāng)節(jié)點(diǎn)資源耗盡的時(shí)候k8s對(duì)pod進(jìn)行evict的決策。官方的描述在這里.

k8s會(huì)以pod的描述文件里的資源限制,對(duì)pod進(jìn)行分級(jí):

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

當(dāng)節(jié)點(diǎn)資源耗盡的時(shí)候,k8s會(huì)按照BestEffort->Burstable->Guaranteed這樣的優(yōu)先級(jí)去選擇殺死pod去釋放資源。

從上面運(yùn)維給我們的pod描述可以看到,這個(gè)pod的資源限制是這樣的:

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

顯然符合的是Burstable的標(biāo)準(zhǔn),所以宿主機(jī)內(nèi)存耗盡的情況下,如果其他服務(wù)都是Guaranteed,那自然會(huì)一直殺死這個(gè)pod來(lái)釋放資源,哪怕pod本身并沒(méi)有達(dá)到6G的內(nèi)存上限。

QoS相同的情況下,按照什么優(yōu)先級(jí)去Evict?

但是和運(yùn)維溝通了一下,我們集群內(nèi)所有pod的配置,limit和request都是不一樣的,也就是說(shuō),大家都是Burstable。所以為什么其他pod沒(méi)有被evict,只有這個(gè)pod被反復(fù)evict呢?

QoS相同的情況,肯定還是會(huì)有evict的優(yōu)先級(jí)的,只是需要我們?cè)偃ふ蚁鹿俜轿臋n。

關(guān)于Node資源耗盡時(shí)候的Evict機(jī)制,官方文檔有很詳細(xì)的描述。

其中最關(guān)鍵的一段是這個(gè):

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.

簡(jiǎn)單來(lái)說(shuō)就是pod evict的標(biāo)準(zhǔn)來(lái)自oom_score,每個(gè)pod都會(huì)被計(jì)算出來(lái)一個(gè)oom_score,而oom_score的計(jì)算方式是:pod使用的內(nèi)存占總內(nèi)存的比例加上pod的oom_score_adj值

oom_score_adj的值是k8s基于QoS計(jì)算出來(lái)的一個(gè)偏移值,計(jì)算方法:

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

從這個(gè)表格可以看出:
首先是BestEffort->Burstable->Guaranteed這樣的一個(gè)整體的優(yōu)先級(jí)
然后都是Burstable的時(shí)候,pod實(shí)際占用內(nèi)存/pod的request內(nèi)存比例最高的,會(huì)被優(yōu)先Evict

總結(jié)

至此已經(jīng)可以基本上定位出Pod被反復(fù)重啟的原因了:

k8s節(jié)點(diǎn)宿主機(jī)內(nèi)存占用滿了,觸發(fā)了Node-pressure Eviction
按照Node-pressure Eviction的優(yōu)先級(jí),k8s選擇了oom_score最高的pod去evict
由于所有pod都是Burstable,并且設(shè)置的request memery都是一樣的512M,因此內(nèi)存占用最多的pod計(jì)算出來(lái)的oom_score就是最高的
所有pod中,這個(gè)服務(wù)的內(nèi)存占用一直都是最高的,所以每次計(jì)算出來(lái),最后都是殺死這個(gè)pod

那么如何解決呢?

宿主機(jī)內(nèi)存擴(kuò)容,不然殺死pod這樣的事情無(wú)法避免,無(wú)非就是殺哪個(gè)的問(wèn)題

對(duì)于關(guān)鍵服務(wù)的pod,要把request和limit設(shè)置為完全一致,讓pod的QoS置為Guaranteed,盡可能降低pod被殺的幾率。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JVM
    JVM
    +關(guān)注

    關(guān)注

    0

    文章

    159

    瀏覽量

    12490
  • QoS機(jī)制
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    5031

原文標(biāo)題:記錄一次K8s pod被殺的排查過(guò)程

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    K8s 從懵圈到熟練 – 集群網(wǎng)絡(luò)詳解

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

    從零開(kāi)始入門 K8s | 應(yīng)用存儲(chǔ)和持久化數(shù)據(jù)卷:核心知識(shí)

    pod 刪掉之后的情況。先刪 Pod,接著再刪下對(duì)應(yīng)的 PVC(K8s 內(nèi)部對(duì) pvc 對(duì)象由保護(hù)機(jī)制,在刪除 pvc 對(duì)象時(shí)如果發(fā)現(xiàn)有 pod
    發(fā)表于 10-15 14:55

    從零開(kāi)始入門 K8s | 應(yīng)用存儲(chǔ)和持久化數(shù)據(jù)卷:存儲(chǔ)快照與拓?fù)湔{(diào)度

    上我才能使用那塊 PV,而對(duì)第二個(gè)問(wèn)題場(chǎng)景就是說(shuō)跨可用區(qū)的話,必須要在將使用該 PV 的 pod 調(diào)度到同個(gè)可用區(qū)的 node 上才能使用阿里云云盤(pán)服務(wù),那 K8s 中怎樣去解決這個(gè)問(wèn)題呢?簡(jiǎn)單
    發(fā)表于 10-15 15:07

    從零開(kāi)始入門 K8s | 應(yīng)用存儲(chǔ)和持久化數(shù)據(jù)卷:核心知識(shí)

    首先看Pod Volumes 的常見(jiàn)類型:本地存儲(chǔ),常用的有 emptydir/hostpath;網(wǎng)絡(luò)存儲(chǔ):網(wǎng)絡(luò)存儲(chǔ)當(dāng)前的實(shí)現(xiàn)方式有兩種,種是 in-tree,它的實(shí)現(xiàn)代碼是放在 K8
    發(fā)表于 10-16 10:10

    OpenStack與K8s結(jié)合的兩種方案的詳細(xì)介紹和比較

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

    如何使用kubernetes client-go實(shí)踐個(gè)簡(jiǎn)單的與K8s交互過(guò)程

    【導(dǎo)讀】Kubernetes項(xiàng)目使用Go語(yǔ)言編寫(xiě),對(duì)Go api原生支持非常便捷。 本篇文章介紹了如何使用kubernetes client-go實(shí)踐個(gè)簡(jiǎn)單的與K8s交互過(guò)程
    的頭像 發(fā)表于 02-02 11:16 ?7149次閱讀
    如何使用kubernetes client-go實(shí)踐<b class='flag-5'>一</b>個(gè)簡(jiǎn)單的與<b class='flag-5'>K8s</b>交互<b class='flag-5'>過(guò)程</b>

    關(guān)于K8s最詳細(xì)的解析

    個(gè)目標(biāo):容器操作;兩地三中心;四層服務(wù)發(fā)現(xiàn);五種Pod共享資源;六個(gè)CNI常用插件;七層負(fù)載均衡;八種隔離維度;九個(gè)網(wǎng)絡(luò)模型原則;十類IP地址;百級(jí)產(chǎn)品線;千級(jí)物理機(jī);萬(wàn)級(jí)容器;相如無(wú)億,K8s有億:億級(jí)日服務(wù)人次。
    的頭像 發(fā)表于 04-08 13:55 ?7561次閱讀
    關(guān)于<b class='flag-5'>K8s</b>最詳細(xì)的解析

    Docker不香嗎為什么還要用K8s

    Docker 雖好用,但面對(duì)強(qiáng)大的集群,成千上萬(wàn)的容器,突然感覺(jué)不香了。 這時(shí)候就需要我們的主角 Kubernetes 上場(chǎng)了,先來(lái)了解K8s 的基本概念,后面再介紹實(shí)踐,由淺入深步步為營(yíng)
    的頭像 發(fā)表于 06-02 11:56 ?3603次閱讀

    簡(jiǎn)單說(shuō)明k8s和Docker之間的關(guān)系

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

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

    k8s是什么意思? kubernetes簡(jiǎn)稱K8s,是個(gè)開(kāi)源的,用于管理云平臺(tái)中多個(gè)主機(jī)上的容器化的應(yīng)用,Kubernetes的目標(biāo)是讓部署容器化的應(yīng)用簡(jiǎn)單并且高效(powerful
    發(fā)表于 07-19 13:14 ?1255次閱讀

    glibc導(dǎo)致的堆外內(nèi)存泄露的排查過(guò)程

    本文記錄一次glibc導(dǎo)致的堆外內(nèi)存泄露的排查過(guò)程
    的頭像 發(fā)表于 09-01 09:43 ?922次閱讀
    glibc導(dǎo)致的堆外內(nèi)存泄露的<b class='flag-5'>排查過(guò)程</b>

    K8s常見(jiàn)的10個(gè)問(wèn)題排查

    K8S的集群狀態(tài)是排查故障的關(guān)鍵起點(diǎn)。使用kubectl get nodes命令來(lái)檢查節(jié)點(diǎn)狀態(tài)。如果有節(jié)點(diǎn)未能就緒或出現(xiàn)異常狀態(tài),可能會(huì)對(duì)應(yīng)用程序造成故障。確保基本組件,如etcd、kubelet和kube-proxy等,正常運(yùn)行。
    發(fā)表于 11-01 12:26 ?1778次閱讀
    <b class='flag-5'>K8s</b>常見(jiàn)的10個(gè)問(wèn)題<b class='flag-5'>排查</b>

    記錄一次使用easypoi時(shí)與源碼博弈的過(guò)程

    、背景介紹 最近剛剛接手了保險(xiǎn)線之聲平臺(tái)的開(kāi)發(fā)和維護(hù)工作,第個(gè)需要修復(fù)的問(wèn)題是:平臺(tái)的事件導(dǎo)出成excel功能在經(jīng)過(guò)一次上線之后突然不可用了,于是就開(kāi)始了幾輪痛苦的
    的頭像 發(fā)表于 07-03 16:33 ?485次閱讀
    <b class='flag-5'>記錄</b><b class='flag-5'>一次</b>使用easypoi時(shí)與源碼博弈的<b class='flag-5'>過(guò)程</b>

    自建K8S集群認(rèn)證過(guò)期

    今天使用kubectl命令查看pod信息時(shí),直正常運(yùn)行的k8s集群突然不能訪問(wèn)了,輸入任何命令都提示以下報(bào)錯(cuò)。
    的頭像 發(fā)表于 02-07 12:32 ?282次閱讀

    Java應(yīng)用OOM問(wèn)題的排查過(guò)程

    導(dǎo)讀 本文記錄最近例Java應(yīng)用OOM問(wèn)題的排查過(guò)程,希望可以給遇到類似問(wèn)題的同學(xué)提供參考。 前言:此文記錄最近例Java應(yīng)用OOM問(wèn)題
    的頭像 發(fā)表于 02-12 11:15 ?483次閱讀
    Java應(yīng)用OOM問(wèn)題的<b class='flag-5'>排查過(guò)程</b>
    主站蜘蛛池模板: 日韩一级在线观看 | 色站在线 | 国产精品视频久久久久 | 国产精品夜夜春夜夜爽 | 傲视影院午夜毛片 | 38pao强力打造永久免费高清视频 | 怡红院色视频在线 | 国产精品9999久久久久仙踪林 | 福利视频免费看 | 国产伦精品一区二区三区四区 | 狠狠干综合 | 欧美在线视频看看 | 人人洗澡人人洗澡人人 | 亚洲另类电击调教在线观看 | 久久国产精品99精品国产987 | 你懂的在线视频观看 | 日本三级强在线观看 | 性喷潮久久久久久久久 | 天天舔天天干天天操 | 国产一级毛片国语版 | 亚洲国产午夜精品理论片的软件 | 黄色国产视频 | 欧美精品亚洲网站 | 91国内在线国内在线播放 | 人与牲动交bbbbxxxx | 久久精品国产99国产精品免费看 | h视频在线免费看 | 国色天香网在线 | 国产成人啪精品午夜在线观看 | 欧美高清a | 三级黄色在线观看 | 一级特黄a 大片免费 | 亚洲97在线 | 看片福利 | 精品久久久久久午夜 | 插吧插吧综合网 | 午夜影院一级片 | 又粗又大撑满了好爽 | 护士巨好爽好大乳 | 黄色免费在线网址 | 久久久久久久综合狠狠综合 |