您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何進行K8S中的runtime異常復盤,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
收到線上k8s的events報警:
看到這個報警,趕緊看下服務,發現服務目前正常,但有一個正發布的服務,銷毀不了老的pod,我懷疑node節點可能是不可用了。果不其然,在控制節點上查看node狀態,為not ready。
報的內核報警,但是其實不應該導致node節點不可用,故趕緊深究一下,先將node節點打上污點,不可調度。
當集群節點進入NotReady狀態的時候,我們需要做的第一件事情,肯定是檢查運行在節點上的kubelet是否正常。在這個問題出現的時候,使用systemctl命令查看kubelet狀態,發現它作為systemd管理的一個daemon,是運行正常的。當我們用journalctl查看kubelet日志的時候,發現下邊的錯誤。
Dec 11 19:38:45 ali-worker-k8s-001 kubelet[20140]: E1211 19:38:45.239546 20140 kubelet.go:1551] error killing pod: failed to "KillPodSandbox" for "31321cfc -1bbe-11ea-893e-00163e14447d" with KillPodSandboxError: "rpc error: code = DeadlineExceeded desc = context deadline exceeded"
order-oms-64544b9c65-4lq5d_sec-mall 這個pod殺不掉,導致了docker死鎖,所以判斷是containerd的問題
問了下阿里的大佬
shim其實扮演父進程,回收容器里進程的角色,跟systemd去回收系統進程一樣。linux上如果systemd卡主了,就會有一堆defunct。shim老版本的同步機制,就用了一個32大小的channel,理論上超過32個進程一起退出,就會overflow
于是我exec進入容器,果然發現進程很多,都是多于32,于是選擇升級containerd解決問題
具體操作步驟如下
1、下載1.2.10 containerd wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.10-3.2.el7.x86_64.rpm 2、停止kubelet進程 systemctl stop kubelet 3、停止containerd systemctl stop containerd 4、更新rpm版本 rpm -Uvh containerd.io-1.2.10-3.2.el7.x86_64.rpm 5、啟動containerd,檢查版本 systemctl start containerd ctr version 6、啟動docker,檢查容器進程 systemctl start docker docker ps 7、啟動kubelet systemctl start kubelet 8、調度pod到該節點,驗證是否正常
這個報錯很清楚的告訴我們,容器runtime是不工作的,且PLEG是不健康的。這里容器runtime指的就是docker daemon。Kubelet通過直接操作docker daemon來控制容器的生命周期。而這里的PLEG,指的是pod lifecycle event generator。PLEG是kubelet用來檢查容器runtime的健康檢查機制。這件事情本來可以由kubelet使用polling的方式來做。但是polling有其成本上的缺陷,所以PLEG應用而生。PLEG嘗試以一種“中斷”的形式,來實現對容器runtime的健康檢查,雖然實際上,它同時用了polling和”中斷”兩種機制。
基本上看到上邊的報錯,我們可以確認,容器runtime出了問題。在有問題的節點上,通過docker命令嘗試運行新的容器,命令會沒有響應。這說明上邊的報錯是準確的.
容器runtime包括docker daemon,containerd,containerd-shim以及runC。組件containerd負責集群節點上容器的生命周期管理,并向上為docker daemon提供gRPC接口。
故也升級了下systemd。升級systemd,直接yum update systemd就可以。
其中如果遇到容器起不來網絡插件的情況,可以ip link del dev cni0,會自動重啟的。
關于如何進行K8S中的runtime異常復盤就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。