• 自动秒收录
  • 软件:1973
  • 资讯:56511|
  • 收录网站:199641|

IT精英团

Kubernetes抛弃Docker 不要慌!这里有一套实用的方法告诉你~

Kubernetes抛弃Docker 不要慌!这里有一套实用的方法告诉你~

浏览次数:
评论次数:
编辑: 阳煦
信息来源: ITPUB
更新日期: 2022-06-07 21:07:01
摘要

导读Kubernetes是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes拥有一个庞大且快速增长的生态系统,其服务、支持和工具的使用范围

  • 正文开始
  • 相关阅读
  • 推荐作品

导读

Kubernetes是一个可移植和可扩展的开源平台,用于管理容器化的工作负载和服务,可以促进声明式配置和自动化。Kubernetes拥有一个庞大且快速增长的生态系统,其服务、支持和工具被广泛使用。

作者简介

刘启伟,公司网络管理中心网络管理系统机房平台团队核心专家。近年来,网管系统室一方面大力推进OSS应用建设,赋能“303自”自智能网络;另一方面,积极推进微服务、容器化、PaaS、DevOps等云原生技术的实践。在团队中,负责DevOps平台和容器云的建设和运营。他在Kubernetes、Istio和DevOps工具链的落地方面有着丰富的实践经验,致力于克服技术落地难题,用云原生技术实现应用。

1、前言

前段时间Kubernetes推出了1.24版本,曾经轰动一时的Docker被抛弃,正式安装。这意味着1.24版本之后,Docker将无法作为k8s的容器运行。

Docker是云的基础技术基础。如果Kubernetes不再支持Docker,将会在互联网IT行业引起适度的恐慌。我们做什么呢Docker是不是完全不能用了?

2、技术的真相

事实上,Kubernetes只是抛弃了dockershim,而不是Docker的全部。Docker系统中包含的是CRI兼容的,可以继续作为Kubernetes的容器运行时运行。OCI标准的实施者RunC也属于Docker系统。

另一方面,Docker构建的映像符合OCI标准,可以在Kubernetes集群中运行,因此Docker仍然可以在本地用于开发和测试。

2.1 OCI 和 CRI 标准分别是什么?

OCI(Open Container Initiative)是一套围绕容器技术的开放标准和规范,主要定义了容器的生命周期管理规范。

OCI的实现者通常被称为“低级容器运行时”,比如runC。底层运行时的主要功能是根据给定的容器文件系统和JSON配置文件,创建容器,管理容器的生命周期。

CRI(Container Runtime Interface)是一组插件接口,定义了Kubernetes(kubelet)与容器运行时之间的接口规范,实现了两者之间的解耦。

通过CRI与Kubernetes交互的运行时通常被称为“高级容器运行时”。高级运行时的作用是为容器准备必要的运行环境,如拉映像、解压映像和创建容器文件系统、创建容器网络等。然后调用低级容器运行时来创建和运行容器。

2.2 Kubernetes支持哪些容器运行时?

Kubernetes支持任何符合CRI标准的容器运行时。在1.23版本之前,有三种常用的容器运行时:docker、containerd和CRI-O。

  • Docker

Docker 守护进程是不符合 CRI 标准的。为了支持 Docker 作为容器运行时,kubelet 内置了一个 dockershim 模块,kubelet 通过 CRI 调用 dockershim,再由它转换请求,调用 Docker 守护进程,而 1.24 版本将要移除的就是这个模块。此模式下创建容器时的调用过程如下:

  1. Kubelet 通过 CRI 调用 dockershim

  2. dockershim 转换请求,调用 docker 守护进程

  3. docker 调用 containerd

  4. containerd 创建 containerd-shim 进程,再由 containerd-shim 调用 runC 完成容器创建。最终容器由 containerd-shim 管理,容器内所有进程都是 containerd-shim 的子进程。

  • containerd

containerd 是从 docker 守护进程中独立出来的容器运行时,最终也要通过 runC 运行容器。

在 CRI 标准被提出后,为了兼容 CRI,减少调用开销,containerd 开发了一个守护进程,叫 CRI-containerd。原先调用链 kubelet -> dockershim -> dockerd -> containerd 被简化成为 kubelet -> CRI-containerd -> containerd。后来,containerd 干脆将 CRI-containerd 以 CRI 插件形式内建在项目中,直接通过方法调用,进一步将调用链简化为 kubelet -> containerd。

  • cri-o

CRI 标准被提出后,红帽按照 CRI 开发的一个轻量级容器运行时,是 CRI 标准的最小实现。此模式下kubelet直接调用 cri-o,再由 cri-o 调用 runC 完成容器创建和管理,调用链比较简洁。

广东公司网络管理中心网管系统室负责建设和维护O域容器云,近期刚好启动Kubernetes 版本升级工作,借此机会,我们决定在测试环境上将容器运行时从 docker迁移至 cri-o,并验证下 Kubernetes 1.23 -> 1.24 版本升级方案,以下是迁移的部分注意事项及详细步骤。

3、迁移注意事项和详细步骤

❖注意事项:

1、对于使用 docker in docker 的 pod,如果是挂载宿主机的 docker.sock 守护进程,迁移后将不能运行,如果是在容器中安装独立的 docker 守护进程,迁移后仍然可以正常运行。

2、/etc/docker/daemon.json 中的配置需要同步到新的运行时,比如仓库的镜像站点。

3、检查各种运维脚本,如果包含 docker 命令需要修改。

4、容器 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 格式,而切换到其他运行时,默认格式是 text,格式为 “time stream log-info”。日志解析配置需要修改。
    ③日志回滚:使用 docker 时,在 daemon.json 配置,切换运行时后,通过 kubelet 的配置项 containerLogMaxSize、containerLogMaxFiles 设置。

5、其他注意点参考官网FAQ文档:

https://kubernetes.io/zh/blog/2022/02/17/dockershim-faq/

怎么将 Kubernetes 的容器运行时从 docker 迁移至 cri-o?

操作系统:centOS 7.9
内核版本:5.4.178
kubernetes版本:1.23.3
cri-o:1.22.3

1、迁移按节点进行,先驱逐 pod 并隔离节点

kubectl drain --delete-emptydir-data --force --ignore-daemonsets <NODE_NAME>

2、卸载 docker

systemctl stop kubeletsystemctl stop dockersystemctl disable docker
yum remove -y docker-ce
# docker数据目录先保留一段时间,运行没异常再删除
rm -rf /var/lib/docker

3、内核设置

这些设置一般在k8s安装前都会设置,这里再确认一次,已经设置好的忽略这一步。

cat <<EOF | sudo tee /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-iptables   = 1net.ipv4.ip_forward            = 1net.bridge.bridge-nf-call-ip6tables = 1EOF
sysctl --system
cat <<EOF | sudo tee /etc/modules-load.d/k8s.confoverlaybr_netfilterEOF
modprobe overlaymodprobe br_netfilter

4、安装 cri-o

# 设置yum源export OS=CentOS_7export VERSION=1.22curl -L -o/etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/devel:kubic:libcontainers:stable.repocurl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$VERSION/$OS/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo# 安装cri-oyum install -y cri-o

5、修改 cri-o 配置

# 查看conmon路径which conmon
# 修改cri-o配置文件vi /etc/crio/crio.conf# 修改crio.runtime表,加上conmon路径配置[crio.runtime]conmon = "/usr/bin/conmon"# 修改crio.image表,加上pause镜像设置。xxx需要换成你的私有镜像库[crio.image]insecure_registries = ["xxx"]pause_image = "xxx/k8s/pause:3.6"
# 修改registry配置vi /etc/containers/registries.conf# 添加私有镜像库,xxx需要替换成你的私有镜像库,这里设置了insecure,可按实现情况修改# 因为我用的是私有仓库,不需要设置镜像站点[[registry]]prefix = "xxx"insecure = trueblocked = falselocation = "xxx"

6、启动 cri-o 服务

systemctl enable criosystemctl start crio
systemctl status crio

7、修改 kubelet 配置

设置 kubelet 命令行启动参数,指定使用 cri-o 运行时。

vi /etc/sysconfig/kubelet
# 修改内容,加上以下两个参数
KUBELET_EXTRA_ARGS=--container-runtime=remote --container-runtime-endpoint='unix:///var/run/crio/crio.sock'

修改 /var/lib/kubelet/kubeadm-flags.env 文件,文件中如果有以下3个参数,请删除。

  • -- cgroup-driver k8s 建议在配置文件设置,不要在命令行。

  • -- cni-plugin 1.24 版本后会和 docker-shim 一起被移除。

  • -- pod-infra-container-image 当使用 cri-o 运行时,kubelet 忽略这个参数,需要在 cri-o 配置中指定。

修改 kubelet 的配置文件 /var/lib/kubelet/config.yaml,修改以下4个参数,如果参数不存在则添加上去。

设置 kubelet 的 cgroup 驱动为 systemd,因为 cri-o 默认驱动是 systemd,必须保持一致。旧版本 kubelet 默认驱动是 cgroupfs,1.22以上才是默认systemd。

cgroupDriver: systemd

设置运行时请求超时:

runtimeRequestTimeout: 5m

容器 stdout/stderr 日志文件的回滚设置,按实际需求修改。

containerLogMaxSize: 100MicontainerLogMaxFiles: 3

修改了 /var/lib/kubelet/config.yaml 文件后,建议同步修改内容到 kubelet-config-1.xx configmap,1.xx 是 kubernetes 的版本。因为集群扩容时,新节点使用这个 configmap 生成配置文件,这样可以保证新旧节点配置文件一致。

kubectl edit cm -n kube-system kubelet-config-1.23

8、启动 kubelet,查看 kubelet 状态、节点状态、pod 状态是否正常

systemctl start kubeletsystemctl status kubelet

9、更新 kubeadm 使用的 cri 运行时

# 查看当前节点的kubeadm使用的cri运行时kubectl get node <NODE_NAME> -o jsonpath='{.metadata.annotations.kubeadm\.alpha\.kubernetes\.io/cri-socket}'# 将dokcershim修改为cri-okubectl annotate node <NODE_NAME> --overwrite kubeadm.alpha.kubernetes.io/cri-socket=/var/run/crio/crio.sock

10、安装 podman

podman 是一个开源的容器管理工具,命令几乎与 Docker 一致,可以用于替换 docker。相较于 Docker,它不存在守护进程,因此 podman 避免了 docker daemon 引入的问题。另一方面,cri-o 专注于 CRI 实现,没有提供 build、tag 镜像等功能,而 podman 和 cri-o 的镜像是共享的,可以为 cri-o 补充镜像管理功能。

yum install -y podmanpodman info

11、重启服务器

Docker 卸载后可能还有一些配置遗留,例如 iptables 规则,建议重启服务器,防止被影响。

12、将节点重新加入集群调度

kubectl uncordon <NODE_NAME>

到这里,第一个节点的容器运行时迁移就完成了,可以按照相同的方法再迁移其他节点。

迁移完成后就能愉快地把 K8s 版本升到 1.24.0 了。

4 后记

虽然 k8s 已经正式移除了 dockershim,但是 docker+kubernetes 的方案经过多年发展已经成熟,被广泛地应用,短期内地位仍然不可撼动。开发、测试环境可以按照需求折腾,迁移容器运行时,积累实践经验。生产环境的话建议保持稳定,等时机成熟再迁移。

标签:容器 镜像 节点
老生常谈:如何在MySQL中查找数据
« 上一篇 2022-06-07
  • 老生常谈:如何在MySQL中查找数据
    0阅读 0条评论 个赞
    页的组成部分数据库中表的数据被划分为若各个页(page),每个页中又存储了很多行记录,而我们往MySQL中插入的每行记录就放到页当中的行记录中,InnoDB的页分为以下几个部分InnoDB页InnoD……
  • 他山之石|查询理解在美团搜索中的应用
    0阅读 0条评论 个赞
    作者|刘亮美团资深算法工程在过去的20年中,搜索过程中处理查询的方式以及向用户显示结果的方式已完全改变。该过程已经从仅基于文本匹配的检索发展到现阶段——尝试基于对查询的真实语义理解以及上下文,位置,时……
  • 写Python脚本 一定要加这个!
    1阅读 0条评论 个赞
    以下文章来源于公众号-Python技术,作者派森酱大家好,使用Python的人,平时经常会写一些脚本,不管是为了提升工作效率,还是为了满足一些特定的需求,Python脚本都是一个常见又有用的东西……
  • 本文讨论了密码算法在Linux内核中的设计和应用
    1阅读 0条评论 个赞
    文|baron出品|Linux阅码场(ID:gh_28254f84d698)作者简介:baron(csdn:代码改变世界ctw),九年手机安全/SOC底层安全开发经验。擅长trustzone/……
  • 架构进化 本文终于说清楚了~
    1阅读 0条评论 个赞
    相信大家都听说过单体和我服务,那么,单体到微服务架构的数据是如何演进的呢?这是个有意思的话题。今天,我们一起来看看,希望大家都有收获和启发。京东白条的快速发展满足了当前人们日益增长的消费需求。在京东商……
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
  • MYSQL如果索引优化仅仅是添加索引 太年轻而不简单
    1阅读 0条评论 个赞
    MYSQL的索引优化,如果此时此刻看到索引的优化,仅仅想到添加适合的索引,是不完全的,索引的优化本身就具有很多的不确定性。1索引会随着时间的推移,有性能的衰减2索引会随着数据量的增加,有性能的衰……
  • 重温SQL Server的行到列和列到列的变化 并采访常见问题
    1阅读 0条评论 个赞
    行转列,列转行是我们在开发过程中经常碰到的问题。行转列一般通过CASEWHEN语句来实现,也可以通过SQLSERVER的运算符PIVOT来实现。用传统的方法,比较好理解。层次清晰,而且比较习……
  • 码头工人常见问题处理技巧
    1阅读 0条评论 个赞
    本文列举Docker常见问题24个及解决方法:▍1.Docker迁移存储目录默认情况系统会将Docker容器存放在/var/lib/docker目录下[问题起因]今天通过监控系统,发现公……
  • 高可用性架构设计的无状态服务
    2阅读 0条评论 个赞
    笑谈架构设计事故的发生是量的积累的结果,任何事情都没有表面看起来那么简单,在软件运行的过程中,随着用户量的增加,不考虑高可用,迟早有一天会发生故障,不得事先考虑高可用设计,而高可用是一门庞大的学问。在……
  • 为什么数据治理是端到端的?
    1阅读 0条评论 个赞
    编辑:彭文华来源:大数据架构师彭友们好,我是老彭啊。今天有个彭友问我:数据中台里也有数据治理的很多功能,是不是就可以直接替代数据治理这件事情了?唉...市场上有些数据治理的概念很小,小到什么程度呢?……
  • 如何保证MySQL和Redis的数据一致性?
    1阅读 0条评论 个赞
    以下文章来源于公众号-楼仔,作者楼仔我直接先抛一下结论:在满足实时性的条件下,不存在两者完全保存一致的方案,只有最终一致性方案。根据网上的众多解决方案,总结出6种,直接看目录:不好的方案1.先……
  • MySQL查询语句的准备阶段是什么?
    1阅读 0条评论 个赞
    以下文章来源于公众号--一树一溪,作者一树一溪这一篇主要讲的内容是一条简单查询语句,在查询准备阶段会干哪些事情?分3个部分:打开表select*替换为表字段填充where条件示例表及SQ……
  • 嵌入式系统登录的简单方法
    3阅读 0条评论 个赞
    来源|我姓梁很多场景都需要记录日志,在嵌入式系统中,特别是单片机这种存储资源有限的环境下,就需要一种轻量级的存储方法。系统日志在嵌入式设备应用场景中,系统日志时常可以监控设备软件的运行状态,及时记录……
  • 内存数据库如何利用内存?
    1阅读 0条评论 个赞
    与以磁盘存储为主的普通数据库相比,内存数据库的数据访问速度可以高出几个数量级,能大幅提高运算性能,更适合高并发、低延时的业务场景。不过,当前大部分内存数据库仍然采用SQL模型,而SQL缺乏一些……
  • 如何正确创建和销毁Java对象?
    16阅读 0条评论 个赞
    一、介绍Java由SunMicrosystems发明并在1995年发布,是世界上使用最广泛的编程语言之一。Java是一个通用编程语言。由于它拥有功能强大的库、运行时、简单的语法、平台无关(Write……
  • 记得网上一个K8s Ingress访问故障排除 最后却不是帖子的锅
    1阅读 0条评论 个赞
    具体现象应用迁移至我们的PaaS平台后会出现偶发性的502问题,错误见图片:相比于程序的请求量,错误肯定是比较少的,但是错误一直在发生,会影响调用方的代码,需要检查下问题原因。为啥我们只看到了POST……
  • 有效的数据治理 如何管理元数据?
    5阅读 0条评论 个赞
    本期作者沈汪洋哔哩哔哩资深开发工程师负责B站数据平台工具侧元数据、数据运营、数据管理等业务方向,专注于元数据采集、血缘应用、数据地图、建模工具、治理工具等工具或产品功能的落地和推广。背景介绍元数据是数……
  • 前端面试必须解决网络中的跨域问题
    10阅读 0条评论 个赞
    什么是跨域浏览器有一个重要的安全策略,称之为「同源策略」其中,源=协议+主机+端口源=协议+主机+端口源=协议+主机+端口,两个源相同,称之为同源,两个源不同,称之为跨源或跨域比如:源1源2是否同……
  • 记得保命!捕捉Linux下的所有高危命令!
    1阅读 0条评论 个赞
    1、rm-rf命令该命令可能导致不可恢复的系统崩坏。>rm-rf/#强制删除根目录下所有东西。>rm-rf*#强制删除当前目录的所有文件。>rm-rf.#强制删除当前……
  • SQL Server实现行列转换
    0阅读 0条评论 个赞
    工作中经常需要查询一些数据,需要写sql语句来写报表。最近就在业务中使用到了转置,现在已经不再使用case方式了,而是使用sqlserver内置的pivot函数来实现转置。业务很逻辑,需要从多个表中……
  • 为什么C的singleton模式不直接使用static 而必须实例化一个对象?
    1阅读 0条评论 个赞
    以下文章来源于公众号-编程往事,作者果冻虾仁开场前段时间在知乎回答了这样一个问题:为什么C++单例模式不能直接全部使用static变量和static函数呢?如果全部使用static的话,是不是也……
  • Linux程序编译过程的来龙去脉
    1阅读 0条评论 个赞
    大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高级语言三类。高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解释型,因此我们基本上将高级语言分为两大类……
  • 运维入坑必看:Kubernetes平台架构解读
    1阅读 0条评论 个赞
    Kubernetes是一个开源容器编排平台,管理大规模分布式容器化软件应用,是云计算发展演进的一次彻底革命性的突破。Kubernetes是谷歌的第三代容器管理系统,是Borg独特的控制器和Omega灵……
  • 对八种架构“设计模式”的详细讨论以及它们的优缺点的概述
    1阅读 0条评论 个赞
    什么是架构我想这个问题,十个人回答得有十一个答案,因为另外的那一个是大家妥协的结果。哈哈,我理解,架构就是骨架,如下图所示:人类的身体的支撑是主要由骨架来承担的,然后是其上的肌肉、神经、皮肤。架构对于……
  • 架构进化 本文终于说清楚了~
    1阅读 0条评论 个赞
    相信大家都听说过单体和我服务,那么,单体到微服务架构的数据是如何演进的呢?这是个有意思的话题。今天,我们一起来看看,希望大家都有收获和启发。京东白条的快速发展满足了当前人们日益增长的消费需求。在京东商……
最近发布资讯
更多