专栏名称: 分布式实验室
最专业的Docker文章,最权威的Docker新闻。关注容器生态圈的发展。
目录
相关文章推荐
Java知音  ·  SpringBoot 实现接口防刷的 5 ... ·  3 天前  
Java知音  ·  SpringBoot 实现接口防刷的 5 ... ·  3 天前  
51好读  ›  专栏  ›  分布式实验室

容器云在万达的落地经验

分布式实验室  · 公众号  · 后端  · 2017-09-26 07:45

正文

请到「今天看啥」查看全文



容器云的技术架构介绍


目前使用的容器云架构方案如图所示,我将其分为四个部分,每个部分包含对应的容器技术栈,下面对于主流的技术介绍如下:



1、存储方案


后端存储主要采用 Ceph 驱动,这里主要介绍它在有状态服务和 docker-registry 两方面的应用。


有状态是应用程序的高级需求,它们需要在 Pod 挂了特别是飘移到其他 Node 后,可以持续的访问后端存储。因此,Kubernetes 通过网络存储提供了丰富的 Persistent Volume 支持,比如:GCE 的 pd,AWS 的 ebs,还有 GlusterFS,Ceph 等先进的分布式文件系统。我们目前使用了 Ceph 的 rbd 来支持有状态服务。Kubernetes 集群环境中,由于所有的组件采用容器化部署,因此除了在主机上安装 ceph-common 之外,还需要在 kubelet、kube-controller-manager 容器中安装它,而且在启动时挂载如下三个 volume,其他的与二进制方式差不多:



具体 ceph rbd 配置,详见:Persistent Volume Provisioning 官网(http://t.cn/R0cbWrx)。


rbd 支持动态供应,支持单节点读写,多节点读,但不支持多节点写。如果有业务需要多节点写的话,rbd 就比较受限制。目前由于只有 GlusterFS 既允许动态供应,又支持单节点和多节点读写,所以我们也正在调研其相关使用。


docker-registry 做为容器的核心部分,起初我们采用 Swift 作为后端存储,为了提高 push/pull 的效率,采用 Redis 作为 Metadata 缓存,然后直接以容器的方式运行官方提供的镜像,比如:



具体的 config.yml 配置,详见:docker-registry 官方配置(http://t.cn/R0cbrfN)。但后来为了保证 docker-registry 的高可用,我们采用 Harbor 做 HA,并以 Pod 的形式运行在 Kubernetes 集群上,镜像数据以及 Harbor-db 全部通过 Ceph 的 PV 来挂载,这样就保证在 Harbor 主机挂了或者 Pod 故障后,Harbor 也可以 HA 了,同时我们也不需要额外维护 Swift 了。


另外注意一个问题,由于 PV,StorageClass 都局限于单个 Namespace 下,所以对于想通过 Namespace 来区分多租户使用动态存储的情况目前是不满足的。


2、网络方案


底层容器网络我们最初使用的是官方推荐的 Flannel,现在部分集群已经由 Flannel 切换成了 OVS 。 Flannel 可以很容易的实现 Pod 跨主机通信,但不能实现多租户隔离,也不能很好的限制 Pod 网络流量,所以我们网络同事开发了 K8S-OVS 组件来满足这些需求。它是一个使用 Open VSwitch 为 Kubernetes 提供 SDN 功能的组件。该组件基于 OpenShift SDN 的原理进行开发。由于 OpenShift 的 SDN 网络方案和 OpenShift 自身的代码耦合在一起,无法像 Flannel 和 Calico 等网络方案以插件的方式独立的为 Kubernetes 提供服务,所以开发了 K8S-OVS 插件,它拥有 OpenShift 优秀的 SDN 功能,又可以独立为 Kubernetes 提供服务。


K8S-OVS 支持单租户模式和多租户模式,主要实现了如下功能:


  • 单租户模式直接使用 Openvswitch+Vxlan 将 Kubernetes 的 Pod 网络组成一个大二层,所有 Pod 可以互通。

  • 多租户模式也使用 Open vSwitch+Vxlan 来组建 Kubernetes 的 Pod 网络,但是它可以基于 Kubernetes 中的 Namespace 来分配虚拟网络从而形成一个网络独立的租户,一个 Namespace 中的 Pod 无法访问其他 Namespace 中的 Pod 和 Service。

  • 多租户模式下可以对一些 Namespace 进行设置,使这些 Namespace 中的 Pod 可以和其他所有 Namespace 中的 Pods 和 Services 进行互访。

  • 多租户模式下可以合并某两个 Namespace 的虚拟网络,让他们的 Pods 和 Services 可以互访。

  • 多租户模式下也可以将上面合并的 Namespace 虚拟网络进行分离。

  • 单租户和多租户模式下都支持 Pod 的流量限制功能,这样可以保证同一台主机上的 Pod 相对公平的分享网卡带宽,而不会出现一个 Pod 因为流量过大占满了网卡导致其他 Pod 无法正常工作的情况。

  • 单租户和多租户模式下都支持外联负载均衡。


下面举例解释一下:


合并是指两个不同租户的网络变成一个虚拟网络从而使这两个租户中的所有 Pod 和 Service 能够互通;分离是指针对合并的两个租户,如果用户希望这两个租户不再互通了则可以将他们进行分离;全网化是指有一些特殊的服务需要能够和其他所有的租户互通,那么通过将这种特殊的租户进行全网化操作就可以实现。


不同租户的网络隔离是通过为每个 Kubernetes 命名空间分配一个 VNI(VXLAN 中的概念)来实现的,在 VXLAN 中不同的 VNI 可以隔离不同的网络空间。K8S-OVS 将具体的 Kubernetes 命名空间和 VNI 的对应关系存储在 Etcd 中,如下:








请到「今天看啥」查看全文