7月19日,Docker&Kubernetes技术沙龙如期举行。来自腾讯、搜狗、Hyper、数人公司的相关技术负责人来到了沙龙现场,分享了他们的技术经验。下面,我们将对他们的分享内容和大家关心的问题进行简单的总结。
一、容器在社交网络技术运营的应用-孙亮(腾讯)
在分享开始,孙亮讲述了其十年运维的经验,从传统运维到海量数据运维积累下的实战经验。他用“技术运营”来代替“运维工作”,以表达他对运维未来的期待。接下来他分析了docker给运维体系带来的变化。 经过多年的积累,腾讯已经将多个服务无状态化了,大大简化了docker化的过程。(无状态指时间上先后的请求并没有明显的关联性,孙亮将无状态服务划分为三层:接入层、逻辑层和存储层,接入层越来越简单,而逻辑层趋向于复杂)。 在使用docker之前,腾讯数十万台服务器只有大约30%的利用率。大多数服务器被用在核心的QQ、QQ空间等业务上,其他服务器被用在数百个非核心的业务上,构成了长尾效应。非核心业务对机器的利用率比较低,一些业务需要临时租用一些机器,这样就不能充分利用其它业务闲置的计算/网络等资源。为此,机器资源按照cpu/memory/disk被划分为几个等级,开发根据需求选择合适配置创建特定数量的机器即可。即便如此,相对于docker实现,vm仍然太“重”,缺少灵活性,有一定的资源浪费。
引入docker之后,“资源共享”和“按需分配”的问题都得到了很好的解决。“资源共享”指允许一台机器为多个业务提供服务,“按需分配”指业务的扩容和缩容。在使用docker的过程中,孙亮也遇到了一些坑,在这里分别从 cpu、内存、disk限速、网络、linux内核增强几个方面分别进行讨论。在创建docker容器时,可以指定容器的cpu和内存,但这一资源限制并不总是有效的,如果开发人员写的程序存在内存泄露,禁用swap会导致OOM,不禁用swap的话会导致disk busy,腾讯对所有容器都禁用了swap。在磁盘io上,采用了lvm-overlayfs,磁盘的监控通过主机实现。网络上采用了veth+bridge方案,可以创建多个vlan以解决ip不足的问题。内核增强主要是对于/proc的操作,用于限制子进程的数量,磁盘等。资源伸缩是通过修改机器配置,重新生成镜像来实现的(下图为镜像更新的过程)
问答精选: 1.使用docker之前使用了什么vm技术?移植到docker时遇到了什么困难? 之前对外采用的是kvm,对内用的是container技术。Kvm io/net性能有已经提高很多了。移植的过程是:软件重新打包、重新部署
2.监控是从母机获取,还是子机上获取? 从母机上获取
二、虚拟机为pod提供隔离-王旭(hyper)
Hyper是一套基于vm和docker的解决方案,它充分利用了虚拟机和docker之长,使用户既能够充分使用docker的轻量级、部署发布便捷等优点,又能保持比较强的隔离性。比较给力的是hyper的代码是开源的,大家可以到github上下载。Hyper的实现基于Kubernetes和一些虚拟化解决方案。Pod是Kubernetes的最小管理单元,分享了他对docker、kubernetes和虚拟机的理解,并对hyper解决方案进行了深入的讲解。
王旭认为docker的核心概念是容器和镜像,以应用为中心;pod是kubernetes的管理单元,是容器的集合,在容器管理和编排上具有天生的优势。传统上,部署服务的过程是选择osà安装依赖à部署服务和监控,这是一个非收敛的过程;使用docker以后,app和运行环境可以封装成一个整体(镜像),为用户提供了一致性和收敛的体验。在存储上,由于云存储和本地存储的速度不在一个数量级上,容器倾向于支持无状态的服务,与云存储能更好地配合。但是需要注意的是需要将读写全部改成异步模式以弱化latency带来的问题。Hyper的工作方式。
问答精选: 1.hyper与docker是否保持一致的应用接口,hyper是否兼容docker的一些高级特性比如 日志功能和监控功能,hyper是否会与neutron、cinder提供一致的接口,与nova等组件的兼容性如何? 对于这些问题,王旭表示hyper保持与docker的高度兼容,未来的方向也会与docker一致,而不是向vm的方向发展。对neutron、cinder等框架的支持也会逐步加强。
2.容器的迁移如何实现的,如果pod寄宿的vm宕掉的话,container会丢失吗? 通过定制的hypervisor启动虚拟机,每个虚拟机运行一个pod,每个pod下运行多个container。一旦pod挂掉,k8s的调度机制保证了pod在另一台vm上满血复活。
3.Hyper 的high availability是如何实现的? 充分利用k8s的优势。
三、Kubernetes集群管理模型-杨乐(时速云)
杨乐对分布式容器管理向我们分享了一些经验,首先他抛出了几个问题 1.容器应用挂掉了,怎么办 2.跨机通信网络问题如何解决 3.多个机器,如何实现service discover
首先对k8s的基本概念一一进行讲解,k8s每个组件实现的功能进行了明确的划分。 Kubernetes 目前为 单master多slave架构,官方表示未来也会像mesos一样支持多master架构。 资源调度, kube-scheduler(作为一个进程运行在master上) 生命周期,replicationcontroller(副本管理器,可根据template创建pod) 健康检查,pod livenessProbe (探测pod status) 实例伸缩,Replication Controller –replicas(控制pod个数) 服务发现,Service/Skydns (服务出口,用于内部服务发现,环境变量用户服务链接) 负载均衡,kube-proxy/portal net(通过iptables实现,可以指定服务出口) 在存储上推荐使用 nfs,ceph等。在Pod层面上去定义mountPATH,pod内容器共享存储。可以在同一个pod启动多个容器,但只暴露出需要的端口。比如说,一个influxdb应用运行在pod内部,可以启动另外一个crontab容器,去定时清理日志,不必要暴露crontab容器。
问答精选: 1.master只有一个,如何实现ha? 通过守护进程;2.多master standby(etcd控制),类似于zookeeper对mesos 多master的支持。Kubernetes 未来也会支持多master模型。
2.docker daemon挂了这种单点故障,有应对机制吗? K8s的调度机制保证 挂掉机器上的pod在另外一台机器上重建,保证了服务的稳定性。
3.在存储上,时速云采用了什么方案? 推荐nfs和ceph,pod可以指定存储,在kubernetes v1.0中,可以通过volume去挂载。
4.kubernetes有哪些监控方案? kubernetes内置的cadvisor和hepster,从各个node获取数据,写入到数据库中。读取的时候直接从数据库读取。
5.kubernetes是如何对外提供服务的? kube-proxy将pod端口映射到外部。Kube-proxy支持横向扩展,不需要担心性能上的瓶颈。对于流量过高的服务,kube-proxy尚且不能解决问题 6.如果服务写死了ip,nginx转发报文时,服务挂掉了,这种情况如何应对? 改变这种设计。设置多个服务出口,使用nginx发现服务,如果挂掉,则从转发列表中清除。
四、将docker打造成vm-斐彤(搜狗)
开始讲了火车轨道宽度由马屁股决定的故事,形象地说明了“传统沿袭”的巨大作用。将docker打造成vm,既保持了对传统工具的兼容,也充分利用了docker这一新事物的优势。接着他对历时三个月的打造过程一一道来。 制作os镜像。坑:centos容器中 chkconfig、reboot、crontab等命令无效;解决方案:删除reboot等用处不大的命令,使用nsenter等工具渗透执行需要的命令 网络方案。删除docker0,启动docker时指定 –net=none,将指定ip、mask、gateway写入到env中,宿主机中创建一对 peer net。性能要求更高的话,可以采用SR-IOV 存储方案。使用宿主机的存储 监控。宿主机上实现,搜集cgroup下的文件,累加计算(20%的精力完成80%的功能) Extra:对于free,mpstat,top的命令,自己实现;对于redis,jvm,nginx等容器内不能控制的服务,需要人工干预(修改配置文件)
五、数人科技——微服务实践:构建分布式爬虫系统
数人科技COO谢乐冰主要是以一个项目经理的角度介绍了他们的分布式爬虫系统。首先,他介绍了分布式和微服务的有点,主要包括:
-
特定模块单独开发与测试;
-
容器对特定模块进行横向扩张;
-
服务(及代码)的可重用;
-
离线与在线可以混合部署。
在介绍完分布式爬虫系统的CheckList(包括服务单元功能单一、计算模块要做到“无状态”、任何服务不能单点必须做成集群、模块间接口尽量异步、分布式配置管理以及各个层面的监控与日志方案)后,谢乐冰给我们分享了一个经验。
“不要在一个Container中加载一个过重的进程,可以将这个进程解耦成多个轻量的进程,分别运行在不同的Container中,因为Container本身就是比较轻量的,所以尽量让Container中运行轻量的进程。”
最后,谢乐冰以“朝阳区群众”为例,提出日志与监控的重要性,并介绍了分布式爬虫系统中的日志与监控。
作者简介:
赵帅龙,时速云全栈工程师,首席翻译官,队医。