0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Containerd的Bug导致容器被重建!如何避免?

openEuler 来源:openEuler 2023-02-10 13:55 次阅读

最近我们关注到一个关于containerd 运行时的issue

https://github.com/containerd/containerd/issues/7843),该问题在 containerd v1.6.9/v1.5.15 被引入。出现的问题是,当 containerd 重启后,在其中运行的 Pod 元数据中关于网络相关的数据(如 pod ip)丢失,核心原因在于部分数据没有落盘。

受影响的版本:

  • v1.6.9 ~ v1.6.14,问题在 v1.6.15 版本中被修复。

  • v1.5.15 ~ v1.5.16,问题在 v1.5.17 版本中被修复。

通过以下步骤,可以快速重现该问题,并验证该问题的修复情况。

本文使用 rke2 为例进行演示,版本为 rke2 v1.24.9+rke2r1,该版本使用了 k3s-containerd v1.6.12-k3s1,受该 containerd 问题影响。

在 containerd 的默认行为中,重启 containerd 服务不会影响正在运行的业务容器,并在启动容器时,通过将容器父进程绑定 Pid 1 的方式进行体现。即使使用 systemctl 对服务进行重启,也不会影响到已经在运行的容器状态。

——问题重现——
#配置rke2使用国内镜像仓库下载镜像
mkdir-p/etc/rancher/rke2
echo"system-default-registry:registry.cn-hangzhou.aliyuncs.com">/etc/rancher/rke2/config.yaml
#使用命令安装rke2,以下命令使用了我们在国内维护的rke2安装镜像脚本,会从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

#启动rke2服务,并等待服务启动成功
systemctlstartrke2-server

#配置rke2相关的PATH路径以及kube-config路径
exportKUBECONFIG=/etc/rancher/rke2/rke2.yaml
exportPATH=/var/lib/rancher/rke2/bin:$PATH

#使用kubectl查询当前集群状态
kubectlgetpo-A|greprke2-metrics-server-5b987d776b-gqxv9

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

至此,rke2 单节点服务启动完成,但我们的目标是 containerd,接下来继续操作:

#配置containerd相关环境变量
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 详情中的网络部分内容,并对 containerd 进行重启,对问题进行重现:

#查询metrics-serverpod的详情
crictlinspectpbfad445917423|jq.status.network

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

#停止rke2-server服务并单独启动containerd,避免kubelet影响重现结果
systemctlstoprke2-server
#单独启动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 运行状态

crictlpods|greprke2-metrics-server

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

#再次查询metrics-serverpod详情
crictlinspectpbfad445917423|jq.status.network

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

从最后的返回结果可以看出,containerd 重启后容器的 IP 丢失。

——问题影响——

通过在上述例子中重启 rke2-server 可以看到,由于 ip 信息丢失,导致了业务容器被重建,带来了业务中断的风险。

#在中断containerd进程后,重启rke2-server进程(以下数据为重新验证后的数据)
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 发生了重启,在 crictl pods 返回中可以看到重新创建的 pods。

——问题修复验证——

下载新版本 containerd,这次验证使用 k3s-containerd v1.6.14+k3s1。该版本为 Rancher 在 containerd v1.6.15 发布前紧急发布的修复补丁版本。

#拉取新镜像
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

#关闭当前运行的容器
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

#启动rke2
systemctlstartrke2-server
#此时使用crictl查询新的metrics-serverpod
crictlpods|grep"Ready"|grepmetrics-server
#ad8b101f819df3minutesagoReadyrke2-metrics-server-5b987d776b-gqxv9kube-system1(default)

#停止rke2并使用命令行启动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 运行状态

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 团队在 2023 年 1 月 6 日紧急合并了 containerd 中修复该 issue 的 commit,发布了 k3s-containerd v1.6.14+k3s1 版本,并发布了新的 rke2 rc 版本进行测试验证。

最终在 1 月 11 日,RKE2 团队发布以下已经修复 containerd 问题的版本:

  • v1.23.16+rke2r1

  • v1.24.9+rke2r2

  • v1.25.5+rke2r2

  • v1.26.0+rke2r2

RFO 是 Rancher For openEuler 的缩写,顾名思义,目的在于面向 openEuler 打造 Rancher 基础平台。

由于 RFO 版本发布周期在 RKE2 之后,RFO 并没有受到该 issue 影响,并在近期发布了以下版本:

  • 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

—— 写在最后 ——

由于操作系统的软件包发布存在一定的时间延后性,在大部分情况下都无法及时修复软件出现的问题。像 CVE、功能缺陷等问题都比较紧急,等待操作系统供应商提供修复版本将是一个漫长的过程,甚至有时候由于一些限制,操作系统提供商无法提供新版本的软件包,这会给系统运行带来不确定因素。

在这种情况下,将软件自身依赖的组件打包到自己的 rootfs 中进行分发,能更好地对其进行管理和升级,避免给系统运行带来风险以及潜在的损失。


审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 操作系统
    +关注

    关注

    37

    文章

    6712

    浏览量

    123163
  • 容器
    +关注

    关注

    0

    文章

    492

    浏览量

    22033
  • BUG
    BUG
    +关注

    关注

    0

    文章

    155

    浏览量

    15641

原文标题:Containerd 的 Bug 导致容器被重建!如何避免?

文章出处:【微信号:openEulercommunity,微信公众号:openEuler】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何避免容器充电会时导致的涌入电流

    在大多数系统中,为了确保电源轨电压不会出现压降,电容器遍布于整个设计中。当电源刚刚被施加到系统中时,为这些电容器充电会导致一个涌入电流,如果不加以处理的话,这个电流会造成数个系统问题。 图1显示
    的头像 发表于 05-31 09:39 1.2w次阅读
    如何<b class='flag-5'>避免</b>电<b class='flag-5'>容器</b>充电会时<b class='flag-5'>导致</b>的涌入电流

    Containerd常见命令操作

    作为接替 Docker 运行时的 Containerd 在早在 Kubernetes1.7 时就能直接与 Kubelet 集成使用,只是大部分时候我们因熟悉 Docker,在部署集群时采用了默认
    的头像 发表于 08-30 10:08 4877次阅读

    容器击穿的multism模型如何设计

    本帖最后由 yangk1990 于 2013-3-8 17:11 编辑 本人初学,需要设计一个示波器观测电容器击穿的波形(或者可变电容逐渐减小到变成导体也行),但电容器的击穿着实不会...希望大神们能够指点一下!
    发表于 03-07 20:38

    由于InnoDB MVCC导致的并发BUG介绍

    [原]记录一个由于InnoDB MVCC导致的并发BUG
    发表于 07-17 09:46

    8 分钟入门 K8s | 详解容器基本概念

    提供一个灵活的插件化管理。而 shim 就是针对于不同的容器运行时所开发的,这样就能够从 containerd 中脱离出来,通过插件的形式进行管理。其次,因为 shim 插件化的实现,使其能够
    发表于 09-17 15:29

    苹果IOS10.3.1正式版紧急发布,修复BUG

    在3月28日发布的10.3正式版中被发现存在一个BUG。这一BUG的存在可能导致此前已经关闭的iCloud服务自动开启。苹果方面并没有解
    发表于 04-05 15:03 1856次阅读

    IOS 10.3.1正式版紧急发布,修复BUG

    在3月28日发布的10.3正式版中被发现存在一个BUG。这一BUG的存在可能导致此前已经关闭的iCloud服务自动开启。苹果方面并没有解
    发表于 04-05 16:13 774次阅读
    IOS 10.3.1正式版紧急发布,修复<b class='flag-5'>BUG</b>

    重磅!阿里巴巴工程师获得 containerd 社区席位,与社区共建云时代容器标准

    重磅!阿里巴巴工程师获得 containerd 社区席位,与社区共建云时代容器标准11 月 29 日,CNCF containerd 社区正式宣布:两位阿里巴巴工程师正式获得 containe
    发表于 12-11 17:25 311次阅读

    MDK-ARM V5.28的Bug修复了吗 ?

    MDK-ARM V5.28的Bug修复了吗?
    的头像 发表于 03-01 12:01 2159次阅读

    微软又证实一新Bug Windows 10或导致无法访问互联网

    据外媒报道称,微软证实了一个新的Bug,那就是Windows 10存在一个可能导致无法访问互联网的问题。
    的头像 发表于 03-28 11:20 2242次阅读

    微软Win10两个新Bug曝光:可以滥用于各种攻击

    ,一位 Windows 安全研究人员在 Twitter 上披露了两个 Bug,可以滥用于各种攻击。 第一个 Bug 允许无权限的用户或程序输入一条命令,导致 NTFS 硬盘
    的头像 发表于 01-19 17:00 1362次阅读

    Containerd控制runC的守护进程

    ./oschina_soft/containerd.zip
    发表于 05-11 10:05 0次下载
    <b class='flag-5'>Containerd</b>控制runC的守护进程

    Containerd基础用法

    从 Docker 1.11 版本开始,Docker 容器运行就不是简单通过 Docker Daemon 来启动了,而是通过集成containerd、runc等多个组件来完成的。 虽然Docker
    的头像 发表于 04-11 10:50 747次阅读

    一个冗余电路导致BUG

      昨天解了一个BUG,一个低级错误导致BUG,一个冗余电路导致BUG,写写做个记录。
    的头像 发表于 05-14 15:28 862次阅读
    一个冗余电路<b class='flag-5'>导致</b>的<b class='flag-5'>BUG</b>

    服务器数据恢复-重建MDisk导致VDisk丢失的数据恢复案例

    重建MDisk导致对应的存储池中的VDisk丢失,导致Solaris操作系统中的Oracle数据库无法使用。
    的头像 发表于 07-26 15:26 289次阅读