浅谈如何打造一个安全稳定高效的容器云平台

本文介绍了容器的现状和发展趋势,容器集群编排引擎选型,跨主机网络通信,定制化方案,公有云,私有云及混合云的场景及实现等内容,说明如何打造简单而强大的容器云平台。

1. 容器技术现状及发展趋势

  什么是容器?
  我们可以将容器理解为一种沙盒,每个容器具有独立的操作系统资源,不同的容器之间相互隔离,也可以建立通信,应用跑在各自的容器中,避免了环境中有冲突的资源使用,做到一次封装,到处运行。

  那容器与虚拟机的区别在哪?
  容器可以看做轻量的虚拟机,虚机启动可能需要数分钟或者更长,而容器只需几十毫秒。传统虚拟技术是在硬件层面实现虚拟化,有性能损耗,而容器技术是以共享内核的方式实现,几乎无损耗。虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而Docker通常用于隔离不同的应用,例如前端,后端以及数据库。
  以Docker为代表的容器技术的出现,给云计算提供了全新的视角,使创建和部署应用如堆积木一样简单,我们在创建应用或服务时,不用考虑资源和维护成本,使得应用的部署极为简单快捷,失败的成本大大降低,让我们的注意力更多的聚焦在应用和服务本身,而不是繁琐的系统和环境配置中。
  几年来,容器技术的发展也十分迅猛,从管理单一容器应用到管理多容器,多主机的分布式应用。企业也纷纷面临着由传统应用向云端分布式应用的转变,使用容器技术将应用转型为微服务。
  随着容器采用率越来越快,容器的生态环境也需要快速迭代。需要有一个平台可以对容器集群进行高效灵活的管理,方便的搞定容器编排和容器部署,容器云平台应运而生。容器云平台应具备哪些能力,如何打造一个安全,稳定,高效的容器云平台,我们从下面几方面来谈一谈。

2. 容器集群编排引擎选型

  容器编排是容器云平台的核心部分和基础能力,为实现大规模的容器化部署提供一个抽象层的处理。典型的容器编排引擎需要实现以下几个功能:集群(跨主机提供计算能力),调度(决定容器部署在哪个节点),可伸缩(支持应用实例的自动或手动扩容缩容),容错(应用或主机故障的情况下自动重启容器),隔离(保障容器安全)。
  Docker Native(swarm)
  Docker自带原生编排工具,添加已经在多节点运行的Docker到Swarm中,Swarm的设置是很简单的:你只需在其中一个节点上调用docker swarm init,然后在任何其他你想添加的节点上调用docker swarm join即可。使用与Docker Engine和Docker Compose相同的语法提供编排支持。
  swarm会自动地做一些如负载均衡,保持容器副本数量等工作,所以swarm对外提供的和k8s类似也是属于一个“服务”的概念。
  docker service create \
  -name helloworld \
  -replicas 5 \
  -network my-network \
  --constraint engine.labels.cloud==aliyun \
  --constraint node.role==manager \
  -p 80:80/tcp nginx:latest.
  Swarm也可以使用约束和标签来做一些非常基本的容器调度。使用约束可以向服务添加关联,并且它将尝试仅启动具有特殊标签的容器。
  Kubenetes

  kubelet将控制给定节点上的容器或pod与主控制节点的连接。kubeproxy用于为Kubernetes中定义的服务提供负载平衡和高可用性。
  Kubernetes使用Pods的概念作为基本单位,而不是单个容器。每个pod是一组容器(集合大小可以是一个)。
  kubernetes把集群带到了一个全新的高度,代价是学习曲线比较陡。它用一个不同的命令行接口,不同的编程接口及不同的YAML文件定义等。换言之,你不能使用docker命令行接口也不能用docker compose来定义容器。好在kubernetes提供了各种api供开发者调用,也使得容器云平台和kubernetes的结合成为可能。是否能发挥出kubernetes的强大功能也是容器云平台是否好用的判断标准之一。
  Mesos+Marathon

  Mesos是一个开源集群管理系统,支持各种工作负载。
  marathon为运行在mesos之上的框架(Framework),为运行Docker容器(以及本地Mesos容器)提供支持。它的双层调度机制可以使得集群规模大很多。其它框架的调度器是直接面对整个集群,Mesos的优势在于,第一层调度先将整个Node分配给一个Framework,然后Framework的调度器面对的集群规模小很多,然后在里面进行二次调度,而且如果有多个Framework,例如有多个Marathon,则可以并行调度不冲突。
  学习成本较高,复杂性较高,多层管理工具,很多marathon的高级功能作为Marathon之上运行的附加框架提供(如marathon-lb)。
  总结:
  Docker Native更新迭代快,封装较少,所以较为灵活,对于简单的web/stateless应用来说是个不错的选择。然而如果需要部署复杂的,大规模的生产环境应用,则可能不是那么适用。kubenetes相较于mesos,提供更加丰富和成熟的功能体验。label的定义使用使得k8s更加灵活
  如果你是一名开发人员,正需要一种科学的办法来加速你的应用程序开发过程或者微服务的构建,那么我们建议你选择Docker。
  如果你是一个dev/devops团队,想要搭建一个系统致力于Docker容器编排,并愿意亲力亲为底层基础设施的集成解决方案(或依赖于公共云基础设施,如谷歌引擎或Azure容器服务),Kubernetes是你值得考虑的好技术。
  如果您想构建一个可靠的平台,可以运行多个关键任务,包括Docker容器、遗留程序(例如:Java)和分布式数据服务(例如:Spark,Kafka,Cassandra,Elastic),并想要可移植的云服务或数据中心,那么Mesos(或者我们自己的Mesos分布, Mesosphere DC/OS)是适合你的。

3. SDN(跨主机网络通信)

  在这里主要讨论的是多主机容器网络解决方案(SDN网络)。
  多主机联网意味着将不同主机上的容器连接到同一个虚拟网络,下面介绍三种方式实现:
  docker的overlay网络 使用docker network create -d overlay my-overlay 创建命名为 my-overlay的网络。Overlay网络是docker原生实现跨主机通信的网络驱动类型,同时还需要一个键值型的服务发现和配置共享软件。Overlay实现跨主机容器互联的通信过程是这样的:
  1.宿主机A上的容器1通过容器的eth0发送出去,并通过路由表发往br0,br0相当于交换机,如果目标容器在同一宿主机,则直接通过br0通信,如果不在则通过vxlan;
  2.br0收到请求会交给vxlan1,并通过宿主机的eth1发送出去;
  3.请求到达宿主机B,发现是vxlan报文则交给宿主机B上的vxlan设备;
  4.Vxlan设备处理后交给br0,br0根据MAC表完成请求投递。
  overlay虽然可以方便的实现跨主机访问需求,但在传递过程中性能损耗较大,不太适合在生产过程中使用,经常用于开发测试或者小并发量的容器集群。
  flannel网络
  flanel需要先于docker启动,docker启动前需要配置flannel的信息,在docker启动时启用flannel网络。flannel支持flannel和Etcd之间的TLS加密通道,以及Flannel对等体之间数据路径的加密,在数据性上更加安全。但flannel在进行路由转发的基础上进行了封包解包的操作,这样浪费了CPU的计算资源。flanne没有提供网络隔离方案,需要使用者定制化解决隔离问题。
  calico网络
  Calico 整个过程中始终都是根据iptables规则进行路由转发,并没有进行封包,解包的过程,这和flannel比起来效率就会快多了。请求从源容器经过源宿主机,经过数据中心的路由,然后到达目的宿主机最后分配到目的容器。Calico支持网络隔离,可以方便的隔离租户数据,隔离方案有NetworkPolicy,微分段等。
  由于Calico是纯三层解决方案,并不支持所有的第3层或第4层协议。只有TCP,UDP,ICMP和ICMPv6得到Calico的支持,flannel等其他解决方案由于是udp封装或者是vxlan方式,可以支持通过L3封装L2数据包,所以支持所有协议。
  小结:
  Calico不支持任何种类的加密方法,以及支持部分协议的通信,但是Calico在这三个解决方案中达到了最佳的性能,而且支持隔离策略,因此更适合内部环境和多租户环境。适合打造企业私有云或者混合云。

4. 定制化方案

  根据客户需求提供定制化方案,比如:
  1)K8S重构
  API Server减负:分析API请求,大量使用缓存技术
  etcd:监控,演戏故障恢复;configmap
  Controller重构:Node Controller,Service Controller
  2)容器reuse策略
  容器优先自动拉起先前退出的容器,而不是总是启动新的容器。
  3)IP保留池
  设计IP保留池,已应用为单位进行IP保留,容器删除则IP回池,该应用的容器创建使用池中的IP。
  4)容器rebuild等
  容器修改镜像,配置文件,环境变量等,则在当前容器所在节点新启动一个容器而不用重新调度,并使用原来的数据卷。
  容器云平台不是简单的堆砌开源解决方案,而是有在理解的基础上进行对客户需求进行深入定制的能力。

5. 公有云,私有云及混合云的场景及实现

  公有云:
  公有云实现规模化才能生存
  公司对全盘云化没做好准备时,更愿意把公有云视为需求量不可预测的工作负载或者全新应用开发的试验地。公有云市场面临瓶颈。
  私有云:
  真正的私有云是做减法
  私有云并不是把公有云的所有功能都照搬进来,80%的企业私有云需要的是一个基本的云功能。降低企业私有云使用门槛,加快云计算进入数据中心
  混合云:
  企业的应用部署在安全性,可控性,定制化等方面有各种顾虑,有的想把关键数据留在内部网络,接入系统部署在公有云,或者直接在内部网络部署应用,通过公有云进行管理,所以就有混合云的需求存在,作为服务商我们开发者中心应该提供相应的方案实现混合云的架构需求。大部分的“混合云”产品只有打通了控制层面,更多是把焦点放在管控面,除了管控面的统一调度,实现数据层面的统一以及自由流动,构建无缝的用户体验,才是混合云的本质。实现控制面和数据面彻底打通才是真正的混合云。

6. 打造简单而强大的容器云平台

  我们从编排选型,网络通信,定制化能力和平台接入方面阐述了容器云平台的关键指标和适用场景,打造一个安全,稳定,高效的容器云平台,需要我们在simplicity(使用简单)和power(功能强大)之间找到一个平衡点。我们可以将功能模块化,在保证核心功能稳定高可用的基础上,根据不同的使用场景和用户人群,提供相应的技术选型和不同维度的服务,做到简单而强大。
  用友云开发者中心采用Mesos+Kubenetes 双编排架构,可以按照用户需求提供不同的服务,容器间通信(SDN网络)采用calico方案,并使用networkpolicy实现网络隔离策略,支持在控制台主页进行一键设置,更安全可靠。核心模块的存储采用OSS及Fastdfs分布式存储,确保了多集群访问,以及通过挂载卷的方式实现容器的文件共享,并提供了容灾策略,使用户的数据更安全。
  对marathon框架及k8s进行了深度优化,对升级和自动扩缩进行了优化,实现了真正的不间断升级和热更新。
  开发者中心既有公有云的展现,又提供了定制化的专属云版本,并可通过接入***和建立vpc专线的方式提供混合云的打通。相信总有一款适合你。

原文地址:http://blog.51cto.com/14084875/2327288

时间: 12-06

浅谈如何打造一个安全稳定高效的容器云平台的相关文章

从零开始打造一个Android 3D立体旋转容器

本文地址,转载请注明 http://blog.csdn.net/mr_immortalz/article/details/51918560 嗯,2个月没有写博客,是要好好反省下,趁着放暑假把这两个月看的东西好好沉淀下.嗯,就立下这个Flag,希望不要自己再打自己脸. 1.概述 回到正题,这次带来的效果,是一个Android 的3D立体旋转的效果. 当然灵感的来源,来自早些时间微博上看到的效果图. 非常酷有木有!作为程序猿我当然要把它加入我的下一个项目中啦! 原效果 我们实现的效果: (为了更加可

浅谈如何搭建一个项目,初学者对于架构程序的理解

经过坚持不懈的努力,终于学到了软件建模的部分,对于java的理解,也有了更深入的理解,首先,软件建模就是把软件的概念抽象出来,然后,建立成一个单独存取属性的类,比如说,你想做一个网站,大家都知道网站有很多题头,就像首页.内容.摘要.新闻,这些字段,就是网页抽象出的属性,而我们把他们抽象出来,封装成一个类,来对它进行控制,这个控制在java中叫做javabean,javabean就是建立一个都是属性(id,name,age,address)这样一个有getter和setter,实现序列化,有默认构

浅谈css中一个元素如何在其父元素居中显示

css如何垂直居中一个元素的问题已经是一个老生常谈的问题了.不管对于一个新手或者老手,在面试过程中是经常被问到的.前两天在看一个flex的视频教程,当中提到了有关元素的居中问题,所以今天小编就来扒一扒几种常见的方式.不足之处请大家批评指正(所有的代码都是自己亲手敲过可用的) 1.水平居中(margin:0 auto;) 关于这个,大家应该是最不陌生的,不管是在培训班还是自己自学的话 .这个应该是老师讲的第一个方法了(水平方向上),但是其有一个前提,就是被包裹的元素不能有浮动的属性.否则的话这个属

浅谈如何打造网站内容

http://t.qq.com/p/t/451306122596455 http://t.qq.com/beijingmei5661 http://t.qq.com/meinvshang4414 http://t.qq.com/p/t/442716011445712 http://t.qq.com/meinvshang1289 http://t.qq.com/p/t/472104133101689 http://t.qq.com/meinvshang2219 http://t.qq.com/p/

浅谈 产品经理、研发、测试,三个冤家如何高效沟通

浅谈 产品经理.研发.测试,三个冤家的那点事(1) 算上实习时间,参加工作已经五年了,一直在从事软件开发和测试的工作,期间也兼职干过一部分产品经理的事情,对这三者之间的微妙关系,颇有感悟. 1. 先来解读一下这三个岗位的"痛点" 聚会的时候,经常碰到以下几种情况,事后想起来,经常会有逗乐的感脚. 做开发的GG们是这样的: 一聊到自己的项目,两眼开始冒光,同时开启了狂喷模式,blabla一堆高大上的专业术语,一方面骂测试人员不懂技术,提的bug根本就不是关键问题,高级的bug他们根本就发

浅谈为什么只有指针能够完成多态及动态转型的一个误区

c++多态由一个函数地址数组Vtable和一个指向Vtable的指针vptr实现. 具体来说,类拥有自己的vtable,类的vtable在编译时刻完成. 每个对象有自己的vptr指针,该指针初始化时指向对象所实现的类的vtable. 关于向上转型的误区: 通常对于向上转型的理解是这样的,当子类对象向上转型(允许隐式)成父类对象时,实际上只是将子类对象暂时看做父类对象,内部的数据并未改变. 对于没有虚函数的对象,这句话是正确的,但是,当引入虚函数后,这样的理解是有问题的,实际上,向上转型的过程中,

浅谈程序员创业(要有一个自己的网站,最好的方式还是自己定位一个产品,用心把这个产品做好)

浅谈程序员创业 ——作者:邓学彬.Jiesoft 1.什么是创业? 关于“创业”二字有必要重新学习一下,找了两个相对权威定义: 创业就是创业者对自己拥有的资源或通过努力能够拥有的资源进行优化整合,从而创造出更大经济或社会价值的过程.——百度百科 创业是一种思考.推理和行为方式,它为机会所驱动,需要在方法上全盘考虑并拥有和谐的领导能力.创业必须要贡献出时间.付出努力,承担相应的财务的.精神的和社会的风险,并获得金钱的回报.个人的满足和独立自主.——互动百科 两者都给出了明确的创业定义,这里想着重想

浅谈DevExpress<二>:设计一个完整界面(2)

下面来把剩下的工作做完,换肤功能昨天已近讨论过,今天就不重复了.首先建立三个全局变量,一个存放文件路径,一个存放数据,一个存放过滤条件. string DBFileName; DataView dataView; string[] filter = new string[3]; 取得数据并绑定到表格中: DBFileName = DevExpress.Utils.FilesHelper.FindingFileName(Application.StartupPath, "Products.xml&

浅谈SQL注入风险 - 一个Login拿下Server

前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都能登录了.不能这么写!” “呦?小伙子这都知道了?那你说说看 啥是注入?注入只能拿来绕过登录么?” 好吧,竟然在老子面前装逼,看来不给你点儿颜色看看,你还真是不明白天有多高.. 于是乎..哈哈.大清早的,轻松在班里装了一手好逼.. 呵呵.不说了,下面我把那个项目重写一下发上来吧.演示一下注入有哪些危

【转】浅谈Nginx负载均衡与F5的区别

前言 笔者最近在负责某集团网站时,同时用到了Nginx与F5,如图所示,负载均衡器F5作为处理外界请求的第一道"墙",将请求分发到web服务器后,web服务器上的Nginx再进行处理,静态内容直接访问本地门户,动态数据则通过反向代理指向内网服务. 其实Nginx和F5这两者均可用作网站负载均衡,那二者有什么区别呢?笔者在此浅谈下Nginx与F5的一些区别. 目前很多网站或应用在设计之初都会为高并发的数据请求做负载均衡,不差钱的土豪用户一般会直接买F5硬件设备作为其负载均衡器,原因不用多