浅谈如何打造⼀个安全稳定⾼效的容器云平台
本⽂介绍了容器的现状和发展趋势,容器集编排引擎选型,跨主机⽹络通信,定制化⽅案,公有云,私有云及混合云的场景及实现等内容,说明如何打造简单⽽强⼤的容器云平台。
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    \
  --le==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进⾏了深度优化,对升级和⾃动扩缩进⾏了优化,实现了真正的不间断升级和热更新。
  开发者中⼼既有公有云的展现,⼜提供了定制化的专属云版本,并可通过接⼊vpn和建⽴vpc专线的⽅式提供混合云的打通。相信总有⼀款适合你。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。