kubernetes真要放弃docker吗?

简介: kubernetes真要放弃docker吗?

这几天,kubernetes社区发生了一件大事,1.20版本宣布放弃docker,圈内一下子炸锅了。我们看一下官方描述:

Docker support in the kubelet is now deprecated and will be removed in 
a future release. The kubelet uses a module called "dockershim" which 
implements CRI support for Docker and it has seen maintenance issues in 
the Kubernetes community. We encourage you to evaluate moving to a container 
runtime that is a full-fledged implementation of CRI (v1alpha1 or v1 compliant)
 as they become available. (#94624, @dims) [SIG Node]

官方链接如下:


https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md#deprecation

不要小看这短短的一句话,蕴含了丰富的内容。dockershim?container runtime?CRI?你真的理解吗?今天我们就来聊一聊kubernetes是否真的要放弃docker。


kubernetes体系架构


我们先看一下kubernetes体系架构,如下图:

微信图片_20221212171900.png

master节点是空值节点,有3个重要的组件组成。controller manager负责容器编排,api server提供api服务,scheduler负责任务调度。整个集群的状态保存在etcd中。


node节点是计算节点。最重要的组件是kubelet,通过CRI(Container Runtime Interface)远程调用接口跟container runtime进行交互,这个接口定义了容器启动时的各种参数。而真正容器在运行时,是通过OCI(容器运行时规范)跟底层操作系统交互。如下图:

微信图片_20221212171924.png

所以,只要容器能够通过CRI接入kubernete,不管是不是docker容器,都是可以被kubernete集群管理的。


聊聊kubelet


kubelet是kubernetes中非常重要的一个组件,它是按照控制器模式来进行工作的。kubelet启动的时候,会注册各种自己关心的事件,比如pod的状态变化(add、update、remove等)、磁盘空间监控、oom监控等。


注册成功后,kubelet就会启动一个循环监控,来监听这些事件。kubelet同时还会控制一些子控制器,这些控制器也是一个循环监控,可以监控volume管理器、image管理器、网络状态以及node状态的管理器等。


这些循环监控的控制器,会收集监控到的内容,比如node状态,上报给api server。


我们看下面的这个yaml文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot-mybatis-deployment
spec:
  selector:
    matchLabels:
      app: springboot-mybatis
  replicas: 1
  template:
    metadata:
      labels:
        app: springboot-mybatis
    spec:
      containers:
      - name: spingboot-mybatis
        imagePullPolicy: IfNotPresent
        image: zjj2006forever/springboot-mybatis:1.2
        ports:
        - containerPort: 8300

我们执行下面的命令后,有一个pod就会被创建出来:


kubectl apply -f springboot-mybatis.yaml

那这个过程是怎样的呢?我们看下面的图:

从图中可以看到,当pod被调度到一个node节点后,这个节点的kubelet监听到这个事件后,首先会生成pod status,然后检查pod是否具备创建条件,比如volume是否准备好,最后调用底层的container runtime来创建这个pod里面定义的容器。


聊聊CRI


通过上一节的讲述,其实我们已经明白了kubelet创建容器的过程。有一个要注意的是,kubelet并不会直接调用容器的api来创建容器,而是通过container runtime,具体说就是CRI(Container Runtime Interface)提供gRPC接口给kubelet。


那kubernetes为什么要设计CRI这一层呢?这其实是使用了适配器模式。要知道docker是一种容器,但是容器不光是docker,还有其他类型容器,比如rkt、runV,它们提供的api并不是完全一样的,kubelet要创建这些容器,就需要调用不同的接口。


kubernetes主业务是编排,它的编排功能要支持不同容器的接入,就需要提供一套统一的接口来适配不同的容器。kubernetes的做法是开发了一个GenericRuntime通用组件,这个组件会把CRI请求发送给具体的CRI,最后由CRI把收到的请求封装成OCI请求来调用。


具体到docker而言,这个CRI叫做dockershim,它会把CRI组装成docker api来发送给docker。


上面的过程如下图:

微信图片_20221212172024.png


在kubernetes1.20之前,dockershim的代码是在kubelet中的,这给docker使用带来方便,如果要是使用其他类型的容器,比如在操作系统上安装一个CRI shim,来转换请求。


可以看到,kubernetes把dockershim从kubelet的代码中剥离出来,专注于做容器编排,也是合情合理的,并不违背设计原则。


注意:上面提到了OCI,也是一个container runtime,它的规范是用来同底层的linux操作系统来交互的,也就是说container shim的职责就是把CRI请求转换成OCI规范。


目前的CRI主要有2种,containerd和CRI-O,我们来看一下:

  • containerd是在docker内部实现的,是docker的一部分,所以如果升级kubernetes到1.20,使用containerd的话,其实是可以很容易使用docker的。
  • CRI-O不同,它纯粹就是一个CRI,比较轻,它也是支持docker的。


docker shim何去何从


kubernetes弃用docker的消息确实引起了大家的关注,不过另外一个好消息是Mirantis已经同意在kubernetes之外维护docker shim的代码了。这样我们就可以继续使用docker shim了,不同的是之前是在kubernetes内置使用,现在需要在外部使用。当然我们也可以使用docker内置的CRI。


Mirantis的docker shim开源的地址如下:


https://github.com/Mirantis/cri-dockerd

具体内容我们可以参考这个官网连接:


https://www.mirantis.com/blog/mirantis-to-take-over-support-of-kubernetes-dockershim-2/


总结


kubernetes放弃docker shim,对使用docker构建容器镜像的用户来说,确实会有一些影响。但是有解决方案的,docker内置的CRI或者我们使用CRI-O都是可以的。


kubernetes作为一个容器编排引擎,创立之初docker已经是容器领域事实的老大了,kubernetes想要发展壮大,就必须对docker大力支持,所以当时就在kubelet上开发了docker shim。


有人说kubernetes现在翅膀硬了,就要甩开docker,这种说法也能说得过去。但是从我们技术人的角度看,业务边界划分和维护成本我想是kubernetes移除docker shim的重要原因。


相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
3天前
|
Kubernetes Java 调度
Java容器技术:Docker与Kubernetes
Java容器技术:Docker与Kubernetes
13 0
|
4天前
|
Kubernetes 负载均衡 调度
【Docker 专栏】Docker Swarm 与 Kubernetes 的选型指南
【5月更文挑战第8天】Docker Swarm 和 Kubernetes 是两大容器编排工具,各有优势。Docker Swarm 简单易用,适合小到中型规模,与 Docker 生态系统集成紧密;而 Kubernetes 功能强大,扩展性好,适用于大规模、复杂场景。选择时需考虑团队技术能力、应用需求及现有技术栈。Kubernetes 学习曲线较陡,Docker Swarm 则较平缓。
【Docker 专栏】Docker Swarm 与 Kubernetes 的选型指南
|
5天前
|
Kubernetes Cloud Native 持续交付
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
【5月更文挑战第7天】本文探讨了Docker和Kubernetes如何协同构建和管理云原生应用。Docker提供容器化技术,Kubernetes则负责容器的部署和管理。两者结合实现快速部署、自动扩展和高可用性。通过编写Dockerfile创建镜像,然后在Kubernetes中定义部署和服务进行应用暴露。实战部分展示了如何部署简单Web应用,包括编写Dockerfile、构建镜像、创建Kubernetes部署配置以及暴露服务。Kubernetes还具备自动扩展、滚动更新和健康检查等高级特性,为云原生应用管理提供全面支持。
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
|
6天前
|
Kubernetes Cloud Native Go
Golang深入浅出之-Go语言中的云原生开发:Kubernetes与Docker
【5月更文挑战第5天】本文探讨了Go语言在云原生开发中的应用,特别是在Kubernetes和Docker中的使用。Docker利用Go语言的性能和跨平台能力编写Dockerfile和构建镜像。Kubernetes,主要由Go语言编写,提供了方便的客户端库与集群交互。文章列举了Dockerfile编写、Kubernetes资源定义和服务发现的常见问题及解决方案,并给出了Go语言构建Docker镜像和与Kubernetes交互的代码示例。通过掌握这些技巧,开发者能更高效地进行云原生应用开发。
49 1
|
8天前
|
Kubernetes 监控 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【5月更文挑战第4天】在现代软件开发中,微服务架构已成为实现可扩展、灵活且独立部署服务的流行解决方案。本文将探讨如何利用Docker容器化技术和Kubernetes容器编排平台来构建一个高效的微服务系统。我们将分析Docker和Kubernetes的核心优势,并指导读者如何通过这些工具优化微服务部署、管理和扩展过程。文章还将涉及监控和日志管理策略,以确保系统的健壮性和可靠性。
|
Web App开发 存储 应用服务中间件
迈入Docker、Kubernetes容器世界的大门
本文通过简单的示例,带领初学者快速迈入Docker、Kubernetes(K8S)容器世界的大门。假设,你已拥有一个K8S集群,否则,可通过minikube或minishift快速搭建一实验环境。 Docker Docker与K8S ​ Docker本质上是一种虚拟化技术,类似于KVM、XEN、VMWARE,但其更轻量化,且将Docker部署在Linux环境时,其依赖于Linux容器技术(LXC)。
1819 0
|
Kubernetes Linux 网络安全
Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之自签TLS证书及Etcd集群部署(二)
0、前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一、服务器设置   1、把每一个服务器的selinux 设置为 disabled 设置方式: vi  /etc/selinux/config 将 SELINUX=disabled,然后保存,然后 执行命令: setenforce 0,使之生效。
1228 0
|
Kubernetes 测试技术 Docker
Kubernetes让Docker容器如虎添翼
本文讲的是Kubernetes让Docker容器如虎添翼【编者的话】本文主要讲述作者看好Kubernetes与Docker结合的未来。
1635 0