本文是去年写的一篇文章,当时这个公众号还没开,首发微博上,后来运维帮转载,这里和Mesos的文章一并推送一次,方便查阅。
10余年的满洲网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。网络营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整满洲建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联公司从事“满洲网站设计”,“满洲网站推广”以来,每个客户项目都认真落实执行。
阅读对象:对Kubernetes尚未深入了解的同学
首先,为什么要用Kubernetes? 使用一个工具先要梳理下使用这个工具的目标,我们不是为了工具而用工具。
Kubernetes的目标用一张被很多人引用过的图来说明最好:
一句话,Kubernetes的目标是让你可以像管理牲畜一样管理你的服务,而不是像宠物一样,同时提高资源的利用率,让码农关注在应用开发本身,高可用的事情就交给Kubernetes吧。这个图本来是openstack提出的,但纯粹IaaS层的解决方案实现不了这个目标,于是有了Kubernetes。
Kubernetes和Borg系出同门,基本是Borg的开源改进版本,引用Google Borg论文里的说法:
我们如何验证是否达到这个目标了呢?
我们从一个简单的多层应用的架构改进来探讨下:
说明:
具体分析一下为了达到我们的目标,需要做到改进:
1.Loadbalancer要调用后端应用服务节点,后端应用服务节点挂了或者迁移增加节点,都要变更Loadbalancer的配置。这样明显达不到目标,于是计划将Loadbalancer改造成Smart Loadbalancer,通过服务发现机制,应用实例启动或者销毁时自动注册到一个配置中心(etcd/zookeeper),Loadbalancer监听应用配置的变化自动修改自己的配置。
2.Web应用对后端资源的依赖,比如Mysql和Memcached,对应资源的ip一般是写到配置文件的。资源节点变更或者增加都要变更应用配置。
3.应用节点迁移时依赖的系统和基础库不一样如何处理?部署方式不一样如何处理?磁盘路径,监听端口等冲突怎么办?这个可以通过Docker这样的容器技术,将应用部署运行的方式进行标准化,操作系统和基础库的依赖允许应用自定义,对磁盘路径以及端口的依赖通过Docker运行参数动态注入,而不需要变更应用配置。Docker的自定义变量以及参数,需要提供标准化的配置文件。
4.服务迁移问题 每种服务都需要一个master调度中心,来监控实例状态,确定要不要进行迁移,负责统一调度。并且每个服务器节点上要有个agent来执行具体的操作,监控该节点上的应用。另外还要提供接口以及工具去操作。
5.网络以及端口冲突的问题比较麻烦 需要引入类似SDN的解决方案。
6.内存,cpu,以及磁盘等硬件资源,原来的习惯是购买服务器的时候就根据服务器的上的应用类型进行规划,如果应用和硬件解耦,这种方式需要淘汰。但必须有一种调度机制让应用迁移的时候可进行筛选。总结一下,通过分析得出,要达到目标,关键是解耦,应用进程和资源(包括 cpu,内存,磁盘,网络)的解耦,服务依赖关系的解耦。
我们上面的改造机制基本是按照个案进行设计,Kubernetes的则是要提供一套全面通用的机制。
然后,我们看看Kubernetes对以上问题的解决方案。
Kubernates架构
先上一张Kubernetes官方的架构图
1.调度中心master,主要有四个组件构成:
etcd 作为配置中心和存储服务(架构图中的Distributed Watchable Storage),保存了所有组件的定义以及状态,Kubernetes的多个组件之间的互相交互也主要通过etcd。
- Kubernetes etcd registry的目录结构
- etcdctl ls /registry
- /registry/minions 保存node节点信息
- /registry/namespaces
- /registry/pods 保存所有的pods信息
- /registry/ranges
- /registry/serviceaccounts
- /registry/services
- /registry/controllers
- /registry/events Kubernetes组件的变更事件都会写到这个目录下
kube-apiserver 提供和外部交互的接口,提供安全机制,大多数接口都是直接读写etcd中的数据。
kube-scheduler 调度器,主要干一件事情:监听etcd中的pod目录变更,然后通过调度算法分配node,最后调用apiserver的bind接口将分配的node和pod进行关联(修改pod节点中的nodeName属性)。scheduler在Kubernetes中是一个plugin,可以用其他的实现替换(比如mesos)。有不同的算法提供,算法接口如下:
- type ScheduleAlgorithm interface {
- Schedule(api.Pod, NodeLister) (selectedMachine string, err error)
- }
kube-controller-manager 承担了master的主要功能,比如和CloudProvider(IaaS)交互,管理node,pod,replication,service,namespace等。基本机制是监听etcd /registry/events下对应的事件,进行处理。具体的逻辑需要专门文章分析,此处不进行详解。
2.节点上的agent,主要有两个组件:
kubelet 主要包含容器管理,镜像管理,Volume管理等。同时kubelet也是一个rest服务,和pod相关的命令操作都是通过调用接口实现的。比如:查看pod日志,在pod上执行命令等。pod的启动以及销毁操作依然是通过监听etcd的变更进行操作的。但kubelet不直接和etcd交互,而是通过apiserver提供的watch机制,应该是出于安全的考虑。kubelet提供插件机制,用于支持Volume和Network的扩展。
kube-proxy 主要用于实现Kubernetes的service机制。提供一部分SDN功能以及集群内部的智能LoadBalancer。前面我们也分析了,应用实例在多个服务器节点之间迁移的一个难题是网络和端口冲突问题。Kubernetes为每个service分配一个clusterIP(虚拟ip)。不同的service用不同的ip,所以端口也不会冲突。Kubernetes的虚拟ip是通过iptables机制实现的。每个service定义的端口,kube-proxy都会监听一个随机端口对应,然后通过iptables nat规则做转发。比如Kubernetes上有个dns服务,clusterIP:10.254.0.10,端口:53。应用对10.254.0.10:53的请求会被转发到该node的kube-proxy监听的随机端口上,然后再转发给对应的pod。如果该服务的pod不在当前node上,会先在kube-proxy之间进行转发。当前版本的kube-proxy是通过tcp代理实现的,性能损失比较大(具体参看后面的压测比较),1.2版本中已经计划将kube-proxy完全通过iptables实现(https://github.com/kubernetes/kubernetes/issues/3760)
3.Pods Kubernetes将应用的具体实例抽象为pod。每个pod首先会启动一个google_containers/pause docker容器,然后再启动应用真正的docker容器。这样做的目的是为了可以将多个docker容器封装到一个pod中,共享网络地址。
4.Replication Controller 控制pod的副本数量,高可用就靠它了。
5.Services service是对一组pods的抽象,通过kube-proxy的智能LoadBalancer机制,pods的销毁迁移不会影响services的功能以及上层的调用方。Kubernetes对service的抽象可以将底层服务和上层服务的依赖关系解耦,同时实现了和Docker links类似的环境变量注入机制(https://github.com/kubernetes/kubernetes/blob/release-1.0/docs/user-guide/services.md#environment-variables),但更灵活。如果配合dns的短域名解析机制,最终可实现完全解耦。
6.Label key-value格式的标签,主要用于筛选,比如service和后端的pod是通过label进行筛选的,是弱关联的。
7.Namespace Kubernetes中的namespace主要用来避免pod,service的名称冲突。同一个namespace内的pod,service的名称必须是唯一的。
8.Kubectl Kubernetes的命令行工具,主要是通过调用apiserver来实现管理。
9.Kube-dns dns是Kubernetes之上的应用,通过设置Pod的dns searchDomain(由kubelet启动pod时进行操作),可以实现同一个namespace中的service直接通过名称解析(这样带来的好处是开发测试正式环境可以共用同一套配置)。主要包含以下组件,这几个组件是打包到同一个pod中的。
10.Networking Kubernetes的理念里,pod之间是可以直接通讯的(http://kubernetes.io/v1.1/docs/admin/networking.html),但实际上并没有内置解决方案,需要用户自己选择解决方案: Flannel,OpenVSwitch,Weave 等。我们测试用的是Flannel,比较简单。
11.配置文件 Kubernetes 支持yaml和json格式的配置文件,主要用来定义pod,replication controller,service,namespace等。
Kubernates 可能带来的改变
遇到的一些问题
最后总结一下我遇到的一些问题
【本文为专栏作者“王渊命”的原创稿件,转载请通过作者微信公众号jolestar-blog获取授权】
戳这里,看该作者更多好文
网站题目:Kubernetes 架构浅析
本文网址:http://www.mswzjz.com/qtweb/news16/205616.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联