有了Docker为何需要k8s


之前的文章,我们聊了Docker,提到一个“容器”,实际上是一个由 Linux Namespace、Linux Cgroups 和 rootfs 三种技术构建出来的进程的隔离环境。似乎有了Docker,部署应用已经足够简单,那为什么还需要k8s等编排工具?这篇文章我们就来聊聊k8s要解决什么问题,以及它的一些核心概念。

Docker技术成熟后,容器发展就开始关注编排层面。比如Docker公司自己推出的docker-compose ,docker-swarm、以及Google和RedHat主导的k8s 。

k8s的直接理论基础来自于Google 公司在 2015 年 4 月发布的 Borg 论文了。

而Google在大规模集群的的调度编排方面有非常深后的技术积累。所以k8s项目一开始就站上了一个他人难以企及的高度。而一些核心特性也是直接来自于Borg系统,以至于一些概念让人摸不着头脑,比如Pod, Service等核心概念。

为什么需要k8s
容器编排的重要性

如果把Docker看做操作系统上的应用程序(当然这里的操作系统是分布式的),那k8s就是一个分布式操作系统,而且是一个很智能的操作系统。如果没有编排工具,你要启动一些“软件”,你只能一个个去启动(docker run ..)。

有了编排工具,你只需要在一个文件中定义好你需要的“软件”,k8s就会帮你启动好。这里docker-compose可以认为是一个单机版“操作系统”,而swarm和k8s则可以完成分布式下环境下的容器编排,并且k8s功能更加丰富强大,所以它成为容器编排事实上的标准。

前面说k8s智能,是因为k8s知道你定义的那张“软件”清单(yaml文件),它会随时监测(控制循环)当前的状态是否和你定义的一致,并进行动态修复(滚动更新Pod,重启,或删除Pod,Pod可以理解是对一个或多个容器的抽象),直到符合你yaml中的期望状态。

而且这张清单,可不止能定义你需要启动哪些容器,并且能够定义它们的依赖关系,启动顺序等非常多的属性。而这正是k8s编排中所谓的声明式API。

调度和编排的区别

调度的目的是找到一个合适的节点将容器运行起来,而编排则涵盖了调度,并且深入到了容器的生命周期、依赖关系等更深的层次。

比如HDFS,HBase,往往有一个master节点,用来协调各个机器的worker节点,保证数据保存在合理的节点上;还有Yarn在分配MR任务执行的资源时,也是类似的原理。其特点就是如何找到一个合理的节点,让数据或任务去保存或运行,而这个过程就是调度。

但是如果仅仅是帮我们把容器运行起来,其实根本不需要k8s。而Borg论文中则指出了一个非常重要的观点:

运行在大规模集群中的各种任务之间,实际上存在着各种各样的关系。这些关系的处理,才是作业编排和管理系统最困难的地方。

首先我们看一个简单的场景,来理解为什么编排能力才是我们更看重的东西。我们以部署一个wordpress博客网站为例:

  • 方式1:最传统的方式。

你需要安装配置mysql, 安装nginx服务器,以及wordpress程序等等…

仅仅部署几个应用,你就能觉得它的复杂,配置的繁琐。可以想象,如果是几十上百个应用,自动化的过程不可避免。

  • 方式2:独立的Docker容器
#1.拉去镜像
docker pull mysql
docker pull wordpress
#2.启动mysql
docker run --name w-mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
#3.启动wordpress,并连接mysql
docker run --name w-wordpress --link w-mysql:db -p 80:80 -d wordpress:latest

可以看到,安装过程只需要拉取镜像,启动即可,而不用关心软件的配置,版本等信息。简化了不少,但是还是手动去启动,拉取镜像等,如果容器很多,工作量依然很大,这只是个博客系统比较简单,真实的业务场景下,容器应用间的依赖关系,网络通信,数据持久化,状态等等我们关心的问题非常复杂,用这种方式处理起来非常棘手。

  • 方式3:docker-compose 轻量编排工具

定义一个docker-compose-wordpress.yml

version: '3.3'
services:
   db:
     image: mysql:5.7
     container_name: mysql
     security_opt:
       - seccomp:unconfined
     ports:
       - 3306:3306     
     volumes:
       - /opt/module/mysql/conf:/etc/mysql/conf.d
       - /opt/module/mysql/data:/var/lib/mysql
       - /opt/module/mysql/logs:/var/log/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: 123456
       MYSQL_DATABASE: wordpress
   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "80:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: root
       WORDPRESS_DB_PASSWORD: 123456
       WORDPRESS_DB_NAME: wordpress

这里的配置文件虽然看着很多,其实它的层次很清楚。services我们可以认为是一组应用,是一种抽象,具体到这里可以认为是博客服务。

博客服务需要mysql和wordpress两个容器配合,所以紧接着db(名称可以自定义)指的就是mysql,在后边则描述了对应的镜像,端口等信息。

而wordpress,有一个关键字depends_on,则描述了它和db的依赖关系。通过这样一个描述文件。

这样一个

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值