K8s为啥不用docker部署

说点有意思的新闻

  1. CNCF8月4日有免费的备考CKA的公开课,主讲人为吴振老师。感兴趣的可以听一下。

  2. 9月26日至28日在上海举报kubcon+cloudnativecon+opensource summit围绕云原生、安全、服务网格、网络+边缘、开放AI+数据等主题展开讨论协作。

  3. LFX Mentorship第三期开放申请了,带薪为Linux和CNCF实习项目做贡献。

  4. 云原生社区成都站Meetup在8月19日举行,感兴趣可以关注下。

部署

相信学习之初现在都是用kubeadm部署的。一键部署,确实快速。但是否能用于生产环境还要打个问号。

为什么不用容器部署kubernetes呢,将每个K8s的组件进行容器化,做成一个个容器镜像,然后宿主机使用docker run不就部署完成了吗?据我所学,早期k8s部署脚本中,有一个脚本就是用docker部署k8s项目,这个脚本相比于ansible以及saltstack部署也简单不少。

但是咱知道,容器化kubelet是个大问题,因为kublet是要直接来操作docker等容器运行时的核心组件,还得配置容器网络、管理容器数据卷、都需要直接操作宿主机。如果kubelet运行在容器里的话,那操作宿主机就真的很麻烦。比如之前我们使用gitlabci部署应用的时候,就会发现,如果使用容器运行器,遇到传输文件等操作时,网络配置都是个问题。就算kubelet容器不开启网络命名空间,使用host 网络的方式,共享宿主机的网络,但是kubelet隔着容器的数据挂载命名空间和文件系统,来操作宿主机的文件系统,就比较困难。

比如想要用NFS做容器的持久化数据卷,那么kubelet在容器绑定挂载前,在宿主机指定目录上先挂在NFS的远程目录。但是现在kubelet是运行在容器中,需要执行mount -F nfs命令,但是隔离在一个单独的mount namespace中,就算操作了,也不能到宿主机上。

所以不是很推荐用容器部署k8s项目,所以kubeadm也是选择将kubelet直接运行在宿主机上,其他组件使用容器部署。所以kubeadm部署的第一步就是安装kubeadm、kubelet和kubectl三个二进制文件。只需要安装linux发行版准备的安装包即可:

比如:yum install kubeadm kubectl kubelet

再说说kubeadm的创造者,居然是一位高中生的作品,他叫 Lucas Käldström,他在17岁的时候利用业余时间完成的一个社区项目,帮助成千上万的人简化了部署步骤。他是个芬兰人,不经让我们想起了linus,不得不说芬兰应该是有创意的土壤。

当然目前大部分部署还是使用二进制部署,尽管kubeadm现在已经支持高可用集群部署,并且有很多可供大家定制化的选择,所以选择哪种方式并不是最重要的,重要的是具备快速搭建快速恢复集群得到能力。相信将来会越来越完善,k8s对于初学者更加友好。

好了,今天简单分享到这。