作者|刘启伟,广东公司网管中心网管系统室平台组核心专家。近年来,一方面,网管系统室大力推进OSS应用建设,为“三零三自”的自主智能网络赋能;另一方面,积极推动微服务、容器化、PaaS、DevOps等云原生技术落地。在团队中,负责DevOps平台和容器云的建设和运营。在Kubernetes、Istio和DevOps工具链的实施方面具有丰富的实践经验。致力于攻克技术落地难关,用云原生技术赋能应用。实验室简介Kubernetes是一个可移植、可扩展的开源平台,用于管理容器化工作负载和服务,促进声明式配置和自动化。Kubernetes拥有庞大且快速发展的生态系统,提供范围广泛的服务、支持和工具。1前言前段时间,kubernetes推出了1.24版本,曾经轰动一时的dockerdeprecation也正式上线,这意味着1.24版本之后,docker将无法作为k8s容器运行时使用。Docker是云原生的基础技术基础。如果kubernetes不再支持docker,将会引起互联网IT行业的恐慌。我们应该做什么?docker是不是完全不能用了?2技术真相其实kubernetes只是抛弃了dockershim,并不是docker的全部。docker系统中的containerd符合CRI标准,可以继续作为kubernetes的容器运行时。OCI标准的实现者runC也属于docker系统。另一方面,docker构建的镜像符合OCI标准,可以运行在kubernetes集群中,所以你仍然可以在本地使用docker进行开发和测试。2.1什么是OCI和CRI标准?OCI(OpenContainerInitiative)是围绕容器技术制定的一套开放标准和规范,主要定义了容器的生命周期管理规范。OCI的实现者通常被称为“低级容器运行时”,例如runC。底层运行时的主要功能是根据给定的容器文件系统和JSON配置文件创建容器并管理容器的生命周期。CRI(ContainerRuntimeInterface)是一组插件接口,定义了kubernetes(kubelet)和容器运行时之间的接口规范,以实现两者的解耦。通过CRI与kubernetes交互的运行时通常被称为“高级容器运行时”。高级运行时的作用是为容器准备必要的运行环境,如拉取镜像、解压镜像并创建容器文件系统、创建容器网络等,然后调用低级容器运行时创建并运行容器。2.2kubernetes支持哪些容器运行时?Kubernetes支持任何符合CRI的容器运行时。在1.23版本之前,常用的容器运行时有3种:docker、containerd和cri-o。docker守护进程不符合CRI标准。为了支持docker作为容器运行,kubelet内置了一个dockershim模块。Kubelet通过CRI调用dockershim,然后由它转换请求并调用dockerdaemon进程。该模块将在1.24版本中删除。该模式下创建容器时的调用流程如下:kubelet通过CRI调用dockershim;dockershim转换请求并调用dockerdaemon进程;docker调用containerd;containerd创建containerd-shim进程,然后containerd-shim调用runC完成容器创建。最终容器由containerd-shim管理,容器内的所有进程都是containerd-shim的子进程。containerdcontainerd是一个独立于dockerdaemon进程的容器运行时,最终通过runC运行容器。CRI标准提出后,为了兼容CRI,减少调用开销,containerd开发了一个守护进程CRI-containerd。原来的调用链kubelet->dockershim->dockerd->containerd简化为kubelet->CRI-containerd->containerd。后来containerd干脆把CRI-containerd作为CRI插件内置到项目中,直接通过方法调用,进一步简化了调用链到kubelet->containerd。cri-oCRI标准提出后,RedHat根据CRI开发了轻量级容器运行时,是CRI标准的最低实现。这种模式下kubelet直接调用cri-o,然后cri-o调用runC完成容器的创建和管理,调用链比较简单。广东公司网管中心网管系统室负责O域容器云的建设和维护。最近刚刚开始kubernetes版本升级。借此机会,我们决定将容器运行时从docker迁移到测试环境的cri-o,并验证以下kubernetes1.23->1.24版本升级方案,以下是迁移的一些注意事项和详细步骤。3迁移注意事项及详细步骤:对于在docker中使用docker的pod,如果挂载了宿主机的docker.sock守护进程,则迁移后不会运行。仍然正常运行。/etc/docker/daemon.json中的配置需要同步到新的运行时,比如仓库的镜像站点。查看各种运维脚本,如果包含docker命令,需要修改。容器stdout/stderr日志格式已更改。如果使用Fluentd或Filebeat采集日志,需要修改配置。①日志目录:使用docker时,日志通过/var/log/containers链接到/var/log/pods/目录,最后链接到/var/lib/docker/containers/xxx/目录。如果使用其他运行时,一般是通过/var/log/containers链接到/var/log/pods/目录下,由kubelet管理。②日志格式:在使用docker的时候,很多人习惯设置json格式,但是切换到其他runtime时,默认格式是text,格式是“timestreamlog-info”。需要修改日志解析配置。③日志回滚:使用docker时,在daemon.json中配置,切换运行时后,通过kubelet的配置项containerLogMaxSize和containerLogMaxFiles进行设置。如何将kubernetes容器运行时从docker迁移到cri-o?操作系统:centOS7.9内核版本:5.4.178kubernetes版本:1.23.3cri-o:1.22.31。迁移由node执行,先驱逐pod,隔离nodekubectldrain--delete-emptydir-data--force--ignore-daemonsets
