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

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

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

Containerd的Bug導(dǎo)致容器被重建!如何避免?

openEuler ? 來源:openEuler ? 2023-02-10 13:55 ? 次閱讀

最近我們關(guān)注到一個(gè)關(guān)于containerd 運(yùn)行時(shí)的issue

https://github.com/containerd/containerd/issues/7843),該問題在 containerd v1.6.9/v1.5.15 被引入。出現(xiàn)的問題是,當(dāng) containerd 重啟后,在其中運(yùn)行的 Pod 元數(shù)據(jù)中關(guān)于網(wǎng)絡(luò)相關(guān)的數(shù)據(jù)(如 pod ip)丟失,核心原因在于部分?jǐn)?shù)據(jù)沒有落盤。

受影響的版本:

  • v1.6.9 ~ v1.6.14,問題在 v1.6.15 版本中被修復(fù)。

  • v1.5.15 ~ v1.5.16,問題在 v1.5.17 版本中被修復(fù)。

通過以下步驟,可以快速重現(xiàn)該問題,并驗(yàn)證該問題的修復(fù)情況。

本文使用 rke2 為例進(jìn)行演示,版本為 rke2 v1.24.9+rke2r1,該版本使用了 k3s-containerd v1.6.12-k3s1,受該 containerd 問題影響。

在 containerd 的默認(rèn)行為中,重啟 containerd 服務(wù)不會(huì)影響正在運(yùn)行的業(yè)務(wù)容器,并在啟動(dòng)容器時(shí),通過將容器父進(jìn)程綁定 Pid 1 的方式進(jìn)行體現(xiàn)。即使使用 systemctl 對(duì)服務(wù)進(jìn)行重啟,也不會(huì)影響到已經(jīng)在運(yùn)行的容器狀態(tài)。

——問題重現(xiàn)——
#配置rke2使用國(guó)內(nèi)鏡像倉(cāng)庫(kù)下載鏡像
mkdir-p/etc/rancher/rke2
echo"system-default-registry:registry.cn-hangzhou.aliyuncs.com">/etc/rancher/rke2/config.yaml
#使用命令安裝rke2,以下命令使用了我們?cè)趪?guó)內(nèi)維護(hù)的rke2安裝鏡像腳本,會(huì)從aliyunOSS下載RKE2資源
curl-sfLhttps://rancher-mirror.oss-cn-beijing.aliyuncs.com/rke2/install.sh|INSTALL_RKE2_MIRROR=cnINSTALL_RKE2_VERSION=v1.24.9+rke2r1sh-
#[INFO]usingv1.24.9-rke2r1asrelease
#[INFO]downloadingchecksumsathttps://rancher-mirror.rancher.cn/rke2/releases/download/v1.24.9-rke2r1/sha256sum-amd64.txt
#[INFO]downloadingtarballathttps://rancher-mirror.rancher.cn/rke2/releases/download/v1.24.9-rke2r1/rke2.linux-amd64.tar.gz
#[INFO]verifyingtarball
#[INFO]unpackingtarballfileto/usr/local

#啟動(dòng)rke2服務(wù),并等待服務(wù)啟動(dòng)成功
systemctlstartrke2-server

#配置rke2相關(guān)的PATH路徑以及kube-config路徑
exportKUBECONFIG=/etc/rancher/rke2/rke2.yaml
exportPATH=/var/lib/rancher/rke2/bin:$PATH

#使用kubectl查詢當(dāng)前集群狀態(tài)
kubectlgetpo-A|greprke2-metrics-server-5b987d776b-gqxv9

#kube-systemrke2-metrics-server-5b987d776b-gqxv91/1Running015m

至此,rke2 單節(jié)點(diǎn)服務(wù)啟動(dòng)完成,但我們的目標(biāo)是 containerd,接下來繼續(xù)操作:

#配置containerd相關(guān)環(huán)境變量
exportCRI_CONFIG_FILE=/var/lib/rancher/rke2/agent/etc/containerd/config.tomlCONTAINER_RUNTIME_ENDPOINT=unix:///var/run/k3s/containerd/containerd.sock
#使用crictl查詢pods以及container信息
crictlpods|greprke2-metrics-server

#bfad44591742318minutesagoReadyrke2-metrics-server-5b987d776b-gqxv9kube-system0(default)

crictlps|greprke2-metrics-server

#db5d6392a310ef6dc23a68f5fb18minutesagoRunningmetrics-server0bfad445917423rke2-metrics-server-5b987d776b-gqxv9

我們以 metrics-server 的 pod 為例,查詢 pod 詳情中的網(wǎng)絡(luò)部分內(nèi)容,并對(duì) containerd 進(jìn)行重啟,對(duì)問題進(jìn)行重現(xiàn):

#查詢metrics-serverpod的詳情
crictlinspectpbfad445917423|jq.status.network

#{
#"additionalIps":[],
#"ip":"10.42.0.6"
#}

#停止rke2-server服務(wù)并單獨(dú)啟動(dòng)containerd,避免kubelet影響重現(xiàn)結(jié)果
systemctlstoprke2-server
#單獨(dú)啟動(dòng)containerd
containerd-c/var/lib/rancher/rke2/agent/etc/containerd/config.toml-a/run/k3s/containerd/containerd.sock--state/run/k3s/containerd--root/var/lib/rancher/rke2/agent/containerd

通過新的 terminal,使用 crictl 查詢 containerd 運(yùn)行狀態(tài)

crictlpods|greprke2-metrics-server

#bfad44591742324minutesagoReadyrke2-metrics-server-5b987d776b-gqxv9kube-system0(default)

#再次查詢metrics-serverpod詳情
crictlinspectpbfad445917423|jq.status.network

#{
#"additionalIps":[],
#"ip":""
#}

從最后的返回結(jié)果可以看出,containerd 重啟后容器的 IP 丟失。

——問題影響——

通過在上述例子中重啟 rke2-server 可以看到,由于 ip 信息丟失,導(dǎo)致了業(yè)務(wù)容器被重建,帶來了業(yè)務(wù)中斷的風(fēng)險(xiǎn)。

#在中斷containerd進(jìn)程后,重啟rke2-server進(jìn)程(以下數(shù)據(jù)為重新驗(yàn)證后的數(shù)據(jù))
systemctlrestartrke2-server
kubectlgetpo-A|greprke2-metrics-server-5b987d776b-8vg69

#kube-systemrke2-metrics-server-5b987d776b-8vg691/1Running2(115sago)23m

crictlpods|greprke2-metrics-server

#caba6d8d1582341secondsagoReadyrke2-metrics-server-5b987d776b-8vg69kube-system1(default)
#2dec6a11fd36f22minutesagoNotReadyrke2-metrics-server-5b987d776b-8vg69kube-system0(default)

可以看到,在 rke2-server 重啟后,使用了 cni 的 pod 發(fā)生了重啟,在 crictl pods 返回中可以看到重新創(chuàng)建的 pods。

——問題修復(fù)驗(yàn)證——

下載新版本 containerd,這次驗(yàn)證使用 k3s-containerd v1.6.14+k3s1。該版本為 Rancher 在 containerd v1.6.15 發(fā)布前緊急發(fā)布的修復(fù)補(bǔ)丁版本。

#拉取新鏡像
dockerpullrancher/hardened-containerd:v1.6.14-k3s1-build20230105
mkdircontainer-new
cdcontainer-new
#從鏡像中獲取新版本containerd
dockerrun--rm-it-v${PWD}:/outputrancher/hardened-containerd:v1.6.14-k3s1-build20230105cp-r/usr/local/bin/output
./output/bin/containerd--version
#containerdgithub.com/k3s-io/containerdv1.6.14-k3s16f9c63d571f5026e85a0768f0f2ef03d1c8dbc6e

#關(guān)閉當(dāng)前運(yùn)行的容器
pkill-f/var/lib/rancher/rke2/data/v1.24.9-rke2r1-d4d8faf800d0/bin/containerd-shim-runc-v2
#替換containerdbinary版本
cp./bin/*/var/lib/rancher/rke2/bin
/var/lib/rancher/rke2/bin/containerd--version
#containerdgithub.com/k3s-io/containerdv1.6.14-k3s16f9c63d571f5026e85a0768f0f2ef03d1c8dbc6e

#啟動(dòng)rke2
systemctlstartrke2-server
#此時(shí)使用crictl查詢新的metrics-serverpod
crictlpods|grep"Ready"|grepmetrics-server
#ad8b101f819df3minutesagoReadyrke2-metrics-server-5b987d776b-gqxv9kube-system1(default)

#停止rke2并使用命令行啟動(dòng)containerd
systemctlstoprke2-server
containerd-c/var/lib/rancher/rke2/agent/etc/containerd/config.toml-a/run/k3s/containerd/containerd.sock--state/run/k3s/containerd--root/var/lib/rancher/rke2/agent/containerd

通過新的 terminal,使用 crictl 查詢 containerd 運(yùn)行狀態(tài)

crictlinspectpad8b101f819df|jq.status.network
#{
#"additionalIps":[],
#"ip":"10.42.0.13"
#}

可以看到 containerd 重啟后,pod ip 沒有丟失。

—— RKE2 與 RFO——

RKE2 以下版本受該 issue 影響:

  • v1.23.15+rke2r1

  • v1.24.9+rke2r1

  • v1.25.5+rke2r1

  • v1.26.0+rke2r1

該 issue 在 2022 年 12 月 20 日被提交,RKE2 團(tuán)隊(duì)在 2023 年 1 月 6 日緊急合并了 containerd 中修復(fù)該 issue 的 commit,發(fā)布了 k3s-containerd v1.6.14+k3s1 版本,并發(fā)布了新的 rke2 rc 版本進(jìn)行測(cè)試驗(yàn)證。

最終在 1 月 11 日,RKE2 團(tuán)隊(duì)發(fā)布以下已經(jīng)修復(fù) containerd 問題的版本:

  • v1.23.16+rke2r1

  • v1.24.9+rke2r2

  • v1.25.5+rke2r2

  • v1.26.0+rke2r2

RFO 是 Rancher For openEuler 的縮寫,顧名思義,目的在于面向 openEuler 打造 Rancher 基礎(chǔ)平臺(tái)。

由于 RFO 版本發(fā)布周期在 RKE2 之后,RFO 并沒有受到該 issue 影響,并在近期發(fā)布了以下版本:

  • v1.23.16+rfor1

  • v1.24.9+rfor1

  • v1.24.10+rfor1

  • v1.25.5+rfor1

  • v1.25.6+rfor1

  • v1.26.0+rfor1

  • v1.26.1+rfor1

—— 寫在最后 ——

由于操作系統(tǒng)的軟件包發(fā)布存在一定的時(shí)間延后性,在大部分情況下都無法及時(shí)修復(fù)軟件出現(xiàn)的問題。像 CVE、功能缺陷等問題都比較緊急,等待操作系統(tǒng)供應(yīng)商提供修復(fù)版本將是一個(gè)漫長(zhǎng)的過程,甚至有時(shí)候由于一些限制,操作系統(tǒng)提供商無法提供新版本的軟件包,這會(huì)給系統(tǒng)運(yùn)行帶來不確定因素。

在這種情況下,將軟件自身依賴的組件打包到自己的 rootfs 中進(jìn)行分發(fā),能更好地對(duì)其進(jìn)行管理和升級(jí),避免給系統(tǒng)運(yùn)行帶來風(fēng)險(xiǎn)以及潛在的損失。


審核編輯 :李倩


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

    關(guān)注

    37

    文章

    6545

    瀏覽量

    122751
  • 容器
    +關(guān)注

    關(guān)注

    0

    文章

    490

    瀏覽量

    21986
  • BUG
    BUG
    +關(guān)注

    關(guān)注

    0

    文章

    155

    瀏覽量

    15628

原文標(biāo)題:Containerd 的 Bug 導(dǎo)致容器被重建!如何避免?

文章出處:【微信號(hào):openEulercommunity,微信公眾號(hào):openEuler】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何避免容器充電會(huì)時(shí)導(dǎo)致的涌入電流

    在大多數(shù)系統(tǒng)中,為了確保電源軌電壓不會(huì)出現(xiàn)壓降,電容器遍布于整個(gè)設(shè)計(jì)中。當(dāng)電源剛剛被施加到系統(tǒng)中時(shí),為這些電容器充電會(huì)導(dǎo)致一個(gè)涌入電流,如果不加以處理的話,這個(gè)電流會(huì)造成數(shù)個(gè)系統(tǒng)問題。 圖1顯示
    的頭像 發(fā)表于 05-31 09:39 ?1.2w次閱讀
    如何<b class='flag-5'>避免</b>電<b class='flag-5'>容器</b>充電會(huì)時(shí)<b class='flag-5'>導(dǎo)致</b>的涌入電流

    Containerd常見命令操作

    作為接替 Docker 運(yùn)行時(shí)的 Containerd 在早在 Kubernetes1.7 時(shí)就能直接與 Kubelet 集成使用,只是大部分時(shí)候我們因熟悉 Docker,在部署集群時(shí)采用了默認(rèn)
    的頭像 發(fā)表于 08-30 10:08 ?4690次閱讀

    避免重建生成的源

    。有沒有辦法避免這種情況?謝謝 以上來自于百度翻譯 以下為原文Hi, because i want to use two slave addresses, I had to edit a line
    發(fā)表于 11-20 15:18

    由于InnoDB MVCC導(dǎo)致的并發(fā)BUG介紹

    [原]記錄一個(gè)由于InnoDB MVCC導(dǎo)致的并發(fā)BUG
    發(fā)表于 07-17 09:46

    8 分鐘入門 K8s | 詳解容器基本概念

    提供一個(gè)靈活的插件化管理。而 shim 就是針對(duì)于不同的容器運(yùn)行時(shí)所開發(fā)的,這樣就能夠從 containerd 中脫離出來,通過插件的形式進(jìn)行管理。其次,因?yàn)?shim 插件化的實(shí)現(xiàn),使其能夠
    發(fā)表于 09-17 15:29

    蘋果IOS10.3.1正式版緊急發(fā)布,修復(fù)BUG

    在3月28日發(fā)布的10.3正式版中被發(fā)現(xiàn)存在一個(gè)BUG。這一BUG的存在可能導(dǎo)致此前已經(jīng)關(guān)閉的iCloud服務(wù)自動(dòng)開啟。蘋果方面并沒有解
    發(fā)表于 04-05 15:03 ?1847次閱讀

    IOS 10.3.1正式版緊急發(fā)布,修復(fù)BUG

    在3月28日發(fā)布的10.3正式版中被發(fā)現(xiàn)存在一個(gè)BUG。這一BUG的存在可能導(dǎo)致此前已經(jīng)關(guān)閉的iCloud服務(wù)自動(dòng)開啟。蘋果方面并沒有解
    發(fā)表于 04-05 16:13 ?756次閱讀
    IOS 10.3.1正式版緊急發(fā)布,修復(fù)<b class='flag-5'>BUG</b>

    重磅!阿里巴巴工程師獲得 containerd 社區(qū)席位,與社區(qū)共建云時(shí)代容器標(biāo)準(zhǔn)

    重磅!阿里巴巴工程師獲得 containerd 社區(qū)席位,與社區(qū)共建云時(shí)代容器標(biāo)準(zhǔn)11 月 29 日,CNCF containerd 社區(qū)正式宣布:兩位阿里巴巴工程師正式獲得 containe
    發(fā)表于 12-11 17:25 ?272次閱讀

    MDK-ARM V5.28的Bug修復(fù)了嗎 ?

    MDK-ARM V5.28的Bug修復(fù)了嗎?
    的頭像 發(fā)表于 03-01 12:01 ?2073次閱讀

    微軟又證實(shí)一新Bug Windows 10或導(dǎo)致無法訪問互聯(lián)網(wǎng)

    據(jù)外媒報(bào)道稱,微軟證實(shí)了一個(gè)新的Bug,那就是Windows 10存在一個(gè)可能導(dǎo)致無法訪問互聯(lián)網(wǎng)的問題。
    的頭像 發(fā)表于 03-28 11:20 ?2209次閱讀

    微軟Win10兩個(gè)新Bug曝光:可以濫用于各種攻擊

    ,一位 Windows 安全研究人員在 Twitter 上披露了兩個(gè) Bug,可以濫用于各種攻擊。 第一個(gè) Bug 允許無權(quán)限的用戶或程序輸入一條命令,導(dǎo)致 NTFS 硬盤
    的頭像 發(fā)表于 01-19 17:00 ?1312次閱讀

    Containerd控制runC的守護(hù)進(jìn)程

    ./oschina_soft/containerd.zip
    發(fā)表于 05-11 10:05 ?0次下載
    <b class='flag-5'>Containerd</b>控制runC的守護(hù)進(jìn)程

    Containerd基礎(chǔ)用法

    從 Docker 1.11 版本開始,Docker 容器運(yùn)行就不是簡(jiǎn)單通過 Docker Daemon 來啟動(dòng)了,而是通過集成containerd、runc等多個(gè)組件來完成的。 雖然Docker
    的頭像 發(fā)表于 04-11 10:50 ?667次閱讀

    一個(gè)冗余電路導(dǎo)致BUG

      昨天解了一個(gè)BUG,一個(gè)低級(jí)錯(cuò)誤導(dǎo)致BUG,一個(gè)冗余電路導(dǎo)致BUG,寫寫做個(gè)記錄。
    的頭像 發(fā)表于 05-14 15:28 ?790次閱讀
    一個(gè)冗余電路<b class='flag-5'>導(dǎo)致</b>的<b class='flag-5'>BUG</b>

    服務(wù)器數(shù)據(jù)恢復(fù)-重建MDisk導(dǎo)致VDisk丟失的數(shù)據(jù)恢復(fù)案例

    重建MDisk導(dǎo)致對(duì)應(yīng)的存儲(chǔ)池中的VDisk丟失,導(dǎo)致Solaris操作系統(tǒng)中的Oracle數(shù)據(jù)庫(kù)無法使用。
    的頭像 發(fā)表于 07-26 15:26 ?261次閱讀