这个锅,containerd 应该背吗?

今天在生产环境遇到一个奇怪的问题,我们都知道,我们可以通过edit 单个pod 可以直接更新一个Pod的image,然后kubelet 会帮我们停止当前运行的容器运行,然后拉起一个新的容器。

这个锅,containerd 应该背吗?

但有个用户反馈说,容器的镜像没有替换,pod spec 中已经更新成功,但status 里面还是老的镜像。通过get pod -oyaml 显示镜像的image 字段还是之前的。

"containerStatuses": [
        {
            "name": "main",
            "state": {
                "running": {
                    "startedAt": "2021-08-26T12:45:53Z"
                }
            },
            "ready": true,
            "restartCount": 3,
            "image": "xxxx:20210826173649",
            "imageID": "xxxx@sha256:33a5b9e2d80850e526d52c4c2a9a90c879538a0577f1be06468b52ac7353c71e",
            "containerID": "containerd://xxxx",
            "started": true
        }
    ],

登录到机器查看后发现,用户前后更新的两个镜像其实是一个镜像,镜像的ID 是完全一样,可见,用户只是重新tag 了一下后,重新上传镜像,然后更新pod spec。这波骚操作,相同的镜像,你更新有啥意义!但客户是上帝,还是得看一下为啥status没有变化。

这个status 是通过CRI 接口查询出来的,在翻看了containerd中的 CRI server代码中getcontainerstatus接口发现。容器status中image 的字段,是通过id 查询出来的,如果一个有多个tag 对应同一个id ,那么只会返回第一个。

这个锅,containerd 应该背吗?

所以这就解释了,为啥status里面imageID 显示的是正确的,而image 却还是老的。这个问题为啥很少遇到呢,因为很少有用户会更新相同的镜像(镜像ID相同就是同一个镜像)。关于容器镜像格式参见之前发的关于介绍 OCI 格式的文章。

总结一下,containerd 是安装容器的ID 确定唯一容器,所以tag 返回哪一个其实无所谓。但却给k8s 的用户带来困扰,感觉镜像没有替换。

展开阅读全文

页面更新:2024-03-25

标签:字段   拉起   容器   困扰   无所谓   接口   上帝   奇怪   反馈   正确   意义   机器   格式   发现   用户   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top