如何在阿里云一键部署高可用的Kubernetes集群
摘要:在云栖TechDay34期:DockerCon2017最新的技术解读中,阿里云的容器服务团队技术专家谢瑶瑶做了题为《Kubernetes on Alibaba Cloud》的分享,主要介绍了Kubernetes的基本概念,如何在阿里云快速一键部署高可用安全的Kubernetes集群以及阿里云的Cloud Provider所提供的能力。以下内容根据演讲嘉宾现场视频以及速记整理而成。
今天主要会分享三个方面的问题:
- Kubernetes的基本概念介绍
- 如何在阿里云快速一键部署高可用安全的Kubernetes集群
- Kubernetes在阿里巴巴的Cloud Provider,也就是云厂商的集成提供的一些能力
首先简单介绍一下Kubernetes。Kubernetes简称K8S,这是社区的一种叫法。Kubernetes是整个CaaS工作流中的一环,CaaS是什么呢?就是Container As A Service——容器即服务,下图中的右图是一个简化版的CaaS的架构图,从最底层是一个基础服务,其上层主要提供的是物理机、网络、存储等一些比较硬件化的基础设施。再往上一层会构建PaaS平台,PaaS平台里头主要交付的对象是一些虚拟机,或者逻辑的结构,比如逻辑的VPC网络、存储等,让你可以方便地一键去创建这些资源,而不需要再去机房里头自己去运维管理这些东西。然后在PaaS平台上面会构建一层容器平台,这一层中主要的交互单元就是容器。

接下来分享一下Kubernetes的一些基本的概念,一个比较核心的概念就是Pod,Pod是一组容器的统称,就是它把一组容器作为一个最基础的调度单元,这组容器会被协同调度到一起,比如说有两个属于同一个Pod的容器,那么它们会被调度到同一个节点,一起调度,一起Fail Over。Service是一组Pod的抽象,比如在创建应用的时候可能需要创建很多个Pod来同时对外界提供服务,那么这一组Pod是同一个层次的东西,具有同等的地位,在前面提供一个Services对这一组Pod做负载均衡,当访问这个Services的时候,就会从后端随意挑出一个Pod来为前端提供服务,相当于负载均衡的概念,不过Services是集群内部的,它的网络只会局限于集群内部。
另外一个是Deployment概念,这是一个描述性的概念,就是当描述一个应用的时候就需要声明这个应用需要达到的状态,比如需要它有三个副本一直运行,需要它在故障的时候能够自动拉起来。用Deployment来描述它,然后系统就会自动保证这些东西,一旦出现了不符合预期的情况,系统会自动把这个状态转化到正常,无论是通过重新创建一组Pod或者是拉起原来的Pod。在K8S里面还有一个另外比较重要的概念就是持久化卷,通常来讲容器在创建的时候是没有数据卷的,对于存储在容器中的数据,如果把容器删掉了,那么这个数据也就会丢失。K8S提供一个持久化卷的概念,就是在创建服务的时候,可以先创建出这个卷,然后把这个卷挂载到容器里头去。通过这样的方式,在删除容器时,持久化卷是不会被删除的,数据也就可以保留下来。
下图是K8S的架构示意图,这是一个典型的无状态、多Master的分布式架构图。K8S主要功能组件:Kubelet,相当于Agent,在每一个节点上提供一个守护进程的服务,上报节点状态、运行Controller等。aplserver是一个Master,它是无状态的,所有的数据都存在后端的一致性存储中。Scheduler负责调度所有的Pod,也就是应用,为应用找一个合适的位置并运行起来。

在使用K8S当中遇到的一个比较大的问题就是部署问题。众所周知K8S一直在业界被诟病的就是太难用了,组件太多,概念太多,导致无法理解。对于开发者来讲,不希望去操心如何把集群快速地部署起来,如何去理解底层的东西,只需在用到的时候能够部署一个集群出来,这是需要达到最终的目标,就是部署简单。

那么阿里云的选择是什么呢?ROS + Kubeadm,原因只有一个:简单。首先简单介绍一下ROS,ROS是阿里云的资源编排服务,它可以非常方便的在阿里云一键创建出来所需要的各种资源比如ECS、VPC网络、SLB以及其他资源等等,相关的文档大家可以去阿里云官网查看。
一键部署主要分为三个步骤:
- 进入到ROS的控制台,这里有一个Kubernetes for chinese版本的,然后去点击创建。
- 选一个创建的区域。
- 填写创建的集群名称,填写节点的密码,点击创建。
主要的部署过程分为三个步骤:第一个是创建集群需要提供阿里云的KeyID跟KeySecret,首先需要设置这两个环境变量,然后需要从阿里云官方网站上下载一个脚本,执行一个node-type=Master命令,这个命令要在Master上执行,这样执行完了之后就在这台机器上初始化了一个Master了,然后它会返回一个Token和节点的IP。第二步再到node节点上面去把node-type改为node,然后带上KeyID跟KeySecre以及刚才返回的End Point和Token,就可以把这个结点加入到刚才创建的Master集群当中,如此反复,就可以把更多的节点加入到集群中去。当不想要某个节点的时候,还可以通过node-type = down的命令销毁掉这个节点。




实践过程中比较多的问题都来自于客户想了解VPC网络的性能究竟如何。在这里通过几种不同的方案来测试了一下VPC性能,主要有netprof、iprof以及qprof,下图是得出来的结果。从这些结果来看,容器的VPC网络跟主机VPC网络差距是非常小的,性能损耗是几乎是没有的,当然不同的人在不同的环境下测出来的结果会有略微的差异,大家可以自己测试一下。



阿里云的Cloud Provider还支持各种存储,比如NAS存储、OSS存储等。NAS存储是由原生的K8S的NFS驱动支持的。在这里简单介绍一下KBS的Volume的使用机制,K8S的PV就是一个持久化的卷,这需要由集群管理员首先在集群中创建出来作为一个集群内的资源,如果应用方想要在应用中使用,要先创建一个PVC,并要宣称要使用集群的存储资源,然后K8S会从所有的集群Volume里面去挑选出最合适、最匹配的,把它们绑定起来,绑定就意味着你可以使用这个PVC了。对于应用来讲,需要在Pod里面去声明需要使用PVC,然后应用就和PVC绑定起来了,这样在创建应用的时候,K8S就会把这个挂载到应用Pod里去,这样就可以像写本地磁盘一样去写Persistent-Volume。



最后更新:2017-05-29 13:02:07