写点什么

想用 K8s,还得先会 Docker 吗?其实完全没必要

作者:程序员啊叶
  • 2022 年 7 月 30 日
  • 本文字数:1720 字

    阅读完需:约 6 分钟

想用K8s,还得先会Docker吗?其实完全没必要

想学 K8s,必须得先学会 Docker 吗?这是很多网友在开始有想法想要学 K8s 什么时候都会冒出来的想法?那么今天我们就跟大家说说这个话题,要回答这个问题,我们需要先搞清楚 Docker 和 K8s 他们的角色是什么,相互之间是什么关系。

K8s 和 Docker 的关系

Docker 和 K8s 这两个经常一起出现,两者的 Logo 看着也有一定联系一个是背上驮着集装箱的鲸鱼一个是船的舵轮。


不过两者不能放在一个维度上讨论,Docker 是当前流行的 Linux 容器解决方案,利用 Namespaces 、Cgroups 以及联合文件系统 UnionFS 实现了同一主机上容器进程间的相互隔离。

NameSpaces:隔离进程,让进程只能访问到本命名空间里的挂载目录、PID、NetWork 等资源

Cgroups: 限制进程能使用的计算机系统各项资源的上限,包括 CPU、内存、磁盘、网络带宽等等

联合文件系统 UnionFS : 保存一个操作系统的所有文件和目录,在它基础之上添加应用运行依赖的文件。创建容器进程的时候给进程指定 Mount Namespace 把镜像文件挂载到容器里,用 chroot 把进程的 Root 目录切换到挂载的目录里,从而让容器进程各自拥有独立的操作系统目录。

而 K8s 是拥有容器编排能力的集群管理解决方案,可以按照应用的定义调度各个运行者应用组件 Docker 容器,但是 Docker 并不是 K8s 对容器的唯一选择,K8s 的 容器运行时支持对接多种容器 ,比如 CoreOS 公司的 Rkt 容器(之前称为 Rocket,现更名为 Rkt),Apache 开源的 Mesos 容器等。只要容器实现了 K8s 容器运行时的接口约定,都能让 K8s 进行调度。

Docker 公司也推出过自己的容器集群管理方案 Docker Swarm ,跟 K8s 算是竞品,但是在生产上几乎没人使用。

Docker Swarm 没有流行起来的深层次的原因就不深究了,从一些 IT 媒体的报道看,可能的原因是

跟 Docker 深度绑定,人天生对集权主义非常反感。

Docker 公司在大规模集群管理上的经验不足,不像谷歌那样能高屋建瓴地给出好的解决方法。

容器用 Docker,需要学到什么程度

看完 K8s 和 Docker 的关系后,我们已经有答案了,想学 K8s 不一定非得会 Docker。但是毕竟 Docker 还是目前最流行的 Linux 容器方案,绝大部分情况下我们还是会选择使用 Docker,那么我们 Docker 掌握到什么程度更易于我们学习 K8s 呢?

这个主要看我们想学什么 K8s 干什么,即使运行在 K8s 之上的容器选择 Docker,如果我们是搭建一些基建类的软件,比如 MySQL、Redis 之类的,因为这些组织已经提供了软件容器的镜像,我的使用体验是,完全用不到那些 Docker 的各种命令。

比如要在 K8s 集群上运行一个 MySQL 应用,写好应用的清单文件(就是各种配置和期望的状态),然后直接运行

kubectl apply -f mysql.yaml 就好,K8s 的容器运行时会根据清单文件里的镜像名,帮我们调 Docker 的接口去下载镜像、运行容器。

apiVersion: apps/v1 kind: Deployment metadata: name: mysql spec: selector: matchLabels: app: mysql strategy: type: Recreate template: metadata: labels: app: mysql spec: containers: - image: mysql:5.7 name: mysql env: - name: MYSQL_ROOT_PASSWORD value: superpass ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql - name: mysql-config mountPath: /etc/mysql/conf.d/my.cnf subPath: my.cnf 复制代码

上面配置文件,有删减。完整可运行的案例,请参考:

利用 Kubernetes 搭建便携式开发环境之 MySQL 和 Redis

不过,我们使用 K8s 除了搭建这种基础软件外,学 K8s 更多的是让自己开发的服务能依托 K8s 集群管理、调度的能力变得更具鲁棒性、更 portable。这个时候 Docker 各方面的技能掌握基本的 Dockerfile 编写、打包上传镜像的命令。这部分的几个简单的知识,感觉花个两小时就能掌握,这里推荐一下我以前的文章

Go 应用怎么打包成 Docker 镜像

Java 应用怎么打包成 Docker 镜像

学会这几个简单的 Docker 知识就完全够用,能支撑我们开始 K8s 的学习和练习啦,其他 Docker 相关的知识完全可以在做 K8s 练习时遇到问题、解决问题的过程中再学。

总结

这篇文章把 Docker 和 K8s 的关系给大家做了一个解答,希望还在迟疑自己现有的知识储备能不能直接学 K8s 的,赶紧行动起来,K8s 是典型的入门有点难,后面越用越香。

用户头像

还未添加个人签名 2022.07.13 加入

还未添加个人简介

评论

发布
暂无评论
想用K8s,还得先会Docker吗?其实完全没必要_Java_程序员啊叶_InfoQ写作社区