云架构师进阶攻略(2)

此文已由作者刘超授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

 

八、基于OpenStack了解云平台

 

当有了虚拟机,并且虚拟机能够上网了之后,接下来就是搭建云平台的时候了。

云是基于计算,网络,存储虚拟化技术的,云和虚拟化的主要区别在于,管理员的管理模式不同,用户的使用模式也不同。

 

虚拟化平台没有多层次的丰富的租户管理,没有灵活quota配额的限制,没有灵活的QoS的限制,多采用虚拟网络和物理网络打平的桥接模式,虚拟机直接使用机房网络,没有虚拟子网VPC的概念,虚拟网络的管理和隔离不能和租户隔离完全映射起来。对于存储也是,公司采购了统一的存储,也不能和租户的隔离完全映射起来。

 

使用虚拟化平台的特点是,对于这个平台的操作完全由运维部门统一管理,而不能将权限下放给业务部门自己进行操作。因为一旦允许不同的部门自己操作,大家都用机房网络,在没有统一管控的情况下,很容易网段冲突了。如果业务部门向申请虚拟机,需要通过工单向运维部门统一的申请。当然这个运维部门很适应这种方式,因为原来物理机就是这样管理的。

 

但是公有云,例如aws就没办法这样,租户千千万万,只能他们自己操作。在私有云里面,随着服务化甚至微服务化的进行,服务数目越来越多,迭代速度越来越快,业务部门需要更加频繁的创建和消耗虚拟机,如果还是由运维部统一审批,统一操作,会使得运维部门压力非常大,而且极大限制了迭代速度,因而要引入 租户管理,运维部灵活配置每个租户的配额quota和QoS,在这个配额里面,业务部门随时可以按照自己的需要,创建和删除虚拟机,无需知会运维部门。每个部门都可以创建自己的虚拟网络VPC,不同租户的VPC之前完全隔离,所以网段可以冲突,每个业务部门自己规划自己的网络架构,只有少数的机器需要被外网或者机房访问的时候,需要少数的机房IP,这个也是和租户映射起来的,可以分配给业务部门机房网IP的个数范围内,自由的使用。这样每个部门自主操作,迭代速度就能够加快了。

 

云平台中的开源软件的代表是OpenStack,建议大家研究OpenStack的设计机制,是在云里面通用的,了解了OpenStack,对于公有云,容器云,都能发现相似的概念和机制。

 

沿着OpenStack创建虚拟机的过程,我总结了100个知识点,写下了下面的文章。

OpenStack虚拟机创建的50个步骤和100个知识点

用OpenStack界面轻松创建虚拟机的你,看得懂虚拟机启动的这24个参数么?

觉得OpenStack的网络复杂?其实你家里就有同样一个网络

当发现你的OpenStack虚拟机网络有问题,不妨先试一下这16个步骤

手动用KVM模拟OpenStack Cinder挂载iSCSI卷

不仅Docker会使用Control Group,KVM也会使用Cgroup来控制资源分配

 

通过我们研究OpenStack,我们会发现很多非常好的云平台设计模式。

 

第一:基于PKI Token的认证模式

如果我们要实现一个Restful API,希望有个统一的认证中心的话,Keystone的三角形工作模式是常用的。

当我们要访问一个资源,通过用户名密码或者AK/SK登录之后,如果认证通过,接下来对于资源的访问,不应该总带着用户名密码,而是登录的时候形成一个Token,然后访问资源的时候带着Token,服务端通过Token去认证中心进行验证即可。

         

如果每次验证都去认证中心,效率比较差,后来就有了PKI Token,也即Token解密出来是一个有详细租户信息的字符串,这样本地就可以进行认证和鉴权。

 

第二:基于Role Based Access Control的鉴权模式

对于权限控制,我们学会比较通用的Role Based Access Control的权限控制模式, 形成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系,可以非常灵活的控制权限。

             

第三:基于Quota的配额管理

可以通过设置计算,网络,存储的quota,设置某个租户自己可以自主操作的资源量。

 

第四:基于预选和优选两阶段的Scheduler机制

当需要从一个资源池里面,选择一个节点,使用这个节点上的资源的时候,一个通用的Scheduler机制是:

·      首先进行预选,也即通过Filter,将不满足条件的过滤掉。

·      然后进行优选,也即对于过滤后,满足条件的候选人,通过计算权重,选择其中最优的。

             

第五:基于独立虚拟子网的网络模式

为了每个租户可以独立操作,因而虚拟网络应该是独立于物理网络的,这样不同的租户可以进行独立的网络规划而互不影响,也不影响物理网络,当需要跨租户访问,或者要访问物理网络的时候,需要通过路由器。

             

第六:基于Copy on Write的镜像机制

有时候我们在虚拟机里面做了一些操作以后,希望能够把这个时候的镜像保存下来,好随时恢复到这个时间点,一个最最简单的方法就是完全复制一份,但是由于镜像太大了,这样效率很差。因而采取Copy on write的机制,当打镜像的时刻,并没有新的存储消耗,而是当写入新的东西的时候,将原来的数据找一个地方复制保存下来,这就是Copy on Write。

 

对于Openstack,有一种镜像qcow2就是采取的这样的机制。

             

这样镜像就像分层一样,一层一层的罗上去。

 

第七:基于namespace和cgroup的隔离和Qos机制

在OpenStack里面,网络节点的路由器是由network namespace来隔离的。

             

KVM的占用的CPU和内存,使用Cgroup来隔离的。

             

网络的QoS使用TC来隔离的。

             

第八:基于iptables的安全机制

有时候,我们希望网络中的节点之间不能相互访问,作为最简单的防火墙,iptables起到了很重要的作用,以后实现ACL机制的,都可以考虑使用iptables。

             

九、基于Mesos和Kubernetes了解容器平台

搭建完毕虚拟化层和云平台层,接下来就是容器层了。

Docker有几个核心技术,一个是镜像,一个是运行时,运行时又分看起来隔离的namespace和用起来隔离的cgroup。

Docker的镜像也是一种Copy on Write的镜像格式,下面的层级是只读的,所有的写入都在最上层。

             

对于运行时,Docker使用的namespace除了network namespace外,还有很多,如下表格所示。

             

Docker对于cgroup的使用是在运行Docker的时候,在路径/sys/fs/cgroup/cpu/docker/下面控制容器运行使用的资源。

可见容器并没有使用更新的技术,而是一种新型的交付方式,也即应用的交付应该是一容器镜像的方式交付,容器一旦启动起来,就不应该进入容器做各种修改,这就是不可改变基础设施。

由于容器的镜像不包含操作系统内核,因而小的多,可以进行跨环境的迁移和弹性伸缩。

 

我写下了下面的文章,总结了几点容器的正确使用姿势。

容器化的本质?基于镜像的跨环境迁移

有关容器的六大误区和八大正确场景

 

有了容器之后,接下来就是容器平台的选型,其实swarm, mesos, kubernetes各有优势,也可以在不同的阶段,选择使用不同的容器平台。

Docker, Kubernetes, DCOS 不谈信仰谈技术

容器平台选型的十大模式:Docker、DC/OS、K8S谁与当先?

 

基于Mesos的DCOS更像是一个数据中心管理平台,而非仅仅容器管理平台,他可以兼容Kubernetes的编排,同时也能跑各种大数据应用。

DC/OS的基本思想——为什么说他是数据中心操作系统

号称了解mesos双层调度的你,先来回答下面这五个问题!

DC/OS的容器功能

DC/OS的网络功能

DC/OS的存储功能

DC/OS的服务发现与负载均衡功能

 

在容器领域,基于Kubernetes的容器编排已经成为事实标准。

 

             

基于万节点Kubernetes支撑大规模云应用实践

支撑大规模公有云的Kubernetes改进与优化 (1)

支撑大规模公有云的Kubernetes改进与优化 (2)

支撑大规模公有云的Kubernetes改进与优化 (3)

为支撑高并发应用的 Kubernetes 的性能优化

 

当我们深入分析Kubernetes管理容器模式的时候,我们也能看到熟悉的面孔。

在Kubernetes里面,租户之间靠namespace进行隔离,这个不是Docker的namespace,而是Kubernetes的概念。

API Server的鉴权,也是基于Role Based Access Control模式。

Kubernetes对于namespace,也有Quota配置,使用ResourceQuota。

    

             

当Kubernetes想选择一个节点运行pod的时候,选择的过程也是通过预选和优选两个阶段。

·      预选(Filtering)

§  PodFitsResources满足资源

§  PodSelectorMatches符合标签

§  PodFitsHost符合节点名称

·      优选(Weighting)

§  LeastRequestedPriority资源消耗最小

§  BalancedResourceAllocation资源使用最均衡

 

Kubernetes规定了以下的网络模型定义。

·      所有的容器都可以在不使用NAT的情况下同别的容器通信

·      所有的节点都可以在不使用NAT的情况下同所有的容器通信

·      容器的地址和别人看到的地址一样

 

也即容器平台应该有自己的私有子网,常用的有Flannel, Calico, Openvswitch都是可以的。

既可以使用Overlay的方式,如图flannel.

             

也可以使用BGP的方式,如图Calico

 

相关阅读:

云架构师进阶攻略(1)

云架构师进阶攻略(3)

 

网易云计算基础服务深度整合了 IaaSPaaS 及容器技术,提供弹性计算、DevOps 工具链及微服务基础设施等服务,帮助企业解决 IT、架构及运维等问题,使企业更聚焦于业务,是新一代的云计算平台,点击可免费试用

 

相关文章:
【推荐】 Android 标题栏(2)
【推荐】 网易严选的wkwebview测试之路