Kubernetes是Google一直在推动的容器调度和管理系统,是Google内部使用的容器管理系统Borg的开源版本。它能够实现对Docker容器的部署,配置,伸缩和监控等。当下,Kubernetes绝对是最火热的开源工程之一,在短短的一年多时间里,其Github工程已有接近两万次的Commits提交,一千多个PR。目前已经正式发布1.0版本,具有服务生产环境的能力。node
Kubernetes做为容器管理和调度系统,能在多台Host上部署预约义的容器,实现跨Host容器的互通访问。下图是Kubernetes的High-level架构图:nginx
Kubernetes的基本概念包括:web
Cluster:Kubernetes维护一个集群,Docker的containers都运行其上。而且,这个集群能够运维在任何云及Bare Metal物理机上。
Master:Master节点包含apiserver,controller-manager,sheduler等核心组件(经常也将etcd部署于其中)。api
Node:Kubernetes采用Master-Slaves方式部署,单独一台Slave机器称为一个Node(之前叫 Minion)。安全
Pods:Kubernetes最小管理单位,用于控制建立、重启、伸缩一组功能相近,共享磁盘的Docker容器。虽然Pod能够单首创建使用,可是推荐经过Replication Controller管理。服务器
Replication controllers(RC):管理其下控制的Pods的生命周期,保证指定数量(replicas)的Pods正常运行。网络
Service:可用做服务发现,相似于Loadbalancer,经过Selectors为一组Pods提供对外的接口。架构
Labels:K/V键值对,用来标记Kubernetes组件的类别关系(例如标记一组Pods是frontServices,另外一组是backServices)。Labels对于Kubernetes的伸缩调度很是重要。app
若是想了解Low-Level的架构细节,能够查看其官网的架构图http://kubernetes.io/v1.0/docs/design/architecture.png。负载均衡
从官网的架构图中能够看到,Kubernetes是一个组件多且依赖复杂的系统(上图仅仅是单Master,三台Node的状况。目前,Kubernetes已经支持Multi-Masters的部署架构,即须要至少三台主机做为Master)。而且Kubernetes社区开发速度很是快,版本差别大,文档更新每每不及时。因此,若是须要完整部署测试仍然有很多的工做量。若是要在生产中使用它,其运维管理也有较高的门槛。这里,咱们将详细介绍如何使用FIT2CLOUD帮助用户高效完成Kubernetes的系统部署、平常运维等,下降用户使用它的难度。
首先,Kubernetes做为容器管理系统,其自身也须要部署在相应的计算资源之上。而咱们认为只有部署在IaaS平台上的Kubernetes才能充分发挥其弹性调度管理的特性。这里,咱们选择了QingCloud做为部署Kubernetes集群的IaaS平台,主要是考虑以下几个因素:
从安全角度看,相似Kubernetes这类的PaaS应该是部署在VPC内。青云VPC在国内是独树一帜,特别适合用来部署Kubernetes这种分布式应用。
从部署管理角度看,青云提供的“userdata”和“metadata”功能在自动初始化云主机上很是有用,能够简化整个部署过程。
从成本和灵活性角度看,青云的按秒计费,资源快速响应是很是有吸引力的。这点以咱们自身为例:一年多以来咱们已经在青云上面建立了超过1万五千台虚机,花费仅在1000多。
其次,Kubernetes自己做为一个复杂的分布式应用,也须要工具(好比FIT2CLOUD)来实现快速部署、统一管理、监控告警、升级和伸缩。Kubernetes负责容器的调度和管理,FIT2CLOUD则负责主机的调度和管理。
最后,从目标用户视角看,Kubernetes集群(容器云)的使用者是应用开发人员,或者准确的讲是基于Docker容器的微服务开发者,而FIT2CLOUD和QingCloud的使用者是Kubernetes集群(容器云)运维和系统管理员。下图清晰描述了Kubernetes、QingCloud、FIT2CLOUD三者及其使用者之间的关系:
QingCloud的VPC基于二层网络隔离,实现了100%的私有网络隔离,而且用户在其Web控制台就能彻底操做VPC私有网络,包括建立私有网络,绑定公网 IP,DHCP,端口映射转发等。
咱们推荐在QingCloud的VPC内网中部署Kubernetes,以后经过绑定公网IP和端口映射将KubernetesMaster节点的apiserver endpoint暴露出来。具体部署架构以下图所示:
在此以前,咱们须要在QingCloud的Web控制台上配置下VPC网络。具体以下:
建立一个VPC私有网络,同时建立一个路由器,以下图所示:
建立一个虚拟路由器,并把上一步建立的私有网络链接到该路由器上,以下图所示:
注意:建立虚拟路由器时,需打开该虚拟路由器所用防火墙下行8080端口。由于该端口将在后面用于向外暴露Kubernetes服务接口。
申请一个公网 IP,绑定在路由器上,以便VPC内的Kubernetes apiserver 能够经过路由器对外提供服务。
在VPC内创建一个负载均衡器(LoadBalancer),并为其在8080端口负载均衡器的监听器来监听Kubernetes Master节点上的apiserver服务(该服务默认运行在8080端口)。 这样作的好处是能够只须要配置一次VPC私有网络及端口转发规则,在私有网络内部启动关闭主机都会自动attach到LoadBalancer,对外提供服务。 具体操做以下图:
一旦VPC建立配置完成,就能够开始经过FIT2CLOUD快速部署Kubernetes集群。
如上所示,本次示例中,咱们会部署一个单Master(192.168.0.3),2个Nodes(Minions)节点的Kubernetes集群。首先,咱们会在FIT2CLOUD上建立两个不一样的虚机组。一个是k8s-master,做为Master节点;一个是k8s-node做为Nodes 节点。具体步骤以下所示:
注:经过FIT2CLOUD在QingCloud上启动机器,须要先登入FIT2CLOUD控制台并绑定QingCloud云帐号,具体步骤能够参考FIT2CLOUD官方文档。另外请参考 FIT2CLOUD新手指南(QingCloud版)了解如何快速开始在FIT2CLOUD中管理QingCloud资源。
第一步:经过FIT2CLOUD控制台建立Kubernetes集群和虚机组
以下图建立Master节点虚机组。注意这里必须按指定虚机组名称,由于后续的初始化Master节点脚本须要利用到这个参数自动发现master的相关信息。
相似建立Node节点的虚机组。两个虚机组建立完成后会在虚机组列表中显示,以下图:
第二步:新建虚机建立模版,分别用来Provision Master节点主机和Nodes节点主机
“虚机建立模板”是FIT2CLOUD内用来快速建立云主机的预约义模板。包括云帐号信息、云主机配置以及相关初始化操做。为快速Provision这里的Kubernetes集群,咱们须要首先新建这些模板。为新建这些模板并实现自动部署Kubernetes集群,咱们已经在FIT2CLOUD中内置了3个Kubernetes集群部署脚本(这些脚本在CentOS 7.0系统上测试经过,在本示例中不管是Master节点仍是Salve节点都请选择CentOS 7.0操做系统),分别以下:
k8s_master_installer.sh
:用来部署Kubernetes Master节点。
k8s_node_installer.sh
: 用来部署Kubernetes Node节点。
k8s_ui_installer.sh
:用来激活安装 kube-ui (Kubernetes webUI)。
这些脚本能够在FIT2CLOUD的脚本列表中查看到,以下图:
首先,设置Master节点的“建立虚机模版”,以下图:
在这其中有两个点须要注意,具体以下:
第一点:如上图可见,建立虚机模版时能够在初始化操做中执行脚本,这里选择Kubernetes Master节点的安装部署脚本k8s_master_installer.sh
。如但愿了解Master节点的部署流程,请仓库该脚本内具体内容。
第二点:须要在Master节点的“建立虚机模板”内指定Master主机自动attach到负载均衡器上,从而将Kubernetes Master节点上的apiserver暴露给VPC外部,方便用户从VPC外部经过公网IP控制Kubernetes集群。同时,集群上运行的真正负载Service也能够由此经过apiserver proxy供外部访问。该设置以下图所示:
其次,设置Node节点的“建立虚机模板”。和Master节点相似,设置Node节点的“建立虚机模板”时候须要指定初始化脚本为k8s_node_installer.sh
,并一样把启动的Node节点放到和Master节点相同的QingCloud私有网络。可是,Node节点不须要如同Master节点那样挂载到负载均衡器上(由于Node节点在本示例不须要对外暴露端口,而是经过Master节点的apiserver proxy转发的方式对外暴露服务)。k8s_node_installer.sh
脚本中详细描述了整个Node节点的部署流程,以下图:
在Slave节点的部署脚本中须要注意以下两点:
上图第一处红色标注中,脚本会调用f2cadm
命令获取集群Master节点的内网IP信息,以便配置Node节点的kubelet服务,使其加入集群。 其中,f2cadm
是FIT2CLOUD提供的命令行工具,可在任何被FIT2CLOUD管理的机器上运行。该命令行工具可从FIT2CLOUD服务端获取当前集群/虚机组/虚机的元数据信息。这里,f2cadm
工具经过虚机组名称"k8s-master"来获取集群中Master节点的内网IP信息,这也是为何前面建立Master节点虚机组名称必须为"k8s-master"的缘由。固然,理论上只须要保持脚本内和虚机组定名称一致便可,不必定必须是"k8s-master"。
kubelet配置文件中,设定 KUBELET_ARGS=\"--pod-infra-container-image=repository.fit2cloud.com:5000/pause:latest\"
。若是不设置,国内用户启动 kubelet 服务会到Google服务器下载 pause 的image,这会致使网络问题。
第三步:建立Kubernetes集群所需的虚机
完成上述配置以后,咱们就能够回到控制台虚机页面,按顺序启动一台KubernetesMaster 主机,等待其建立成功并执行初始化部署脚本完毕,再启动2台Nodes主机(之后若是须要扩展Node节点,只须要再启动所需数量的Nodes主机便可)。以下图,Kubernetes集群已经建立完毕:
至此,Kubernetes集群启动完毕,并已经能够部署完成并正常工做。这里尝试用kubectl
命令行工具检查下集群状态。在本地运行该命令后,其结果会展现2个Node节点已经上线(Ready),具体以下。
➜ ~ export KUBERNETES_MASTER=http://119.254.111.36:8080 ➜ ~ kubectl get nodes NAME LABELS STATUS 192.168.100.3 kubernetes.io/hostname=192.168.100.3 Ready 192.168.100.5 kubernetes.io/hostname=192.168.100.5 Ready
因为是本地使用 kubectl
命令,须要设定下 KUBERNETES_MASTER 环境变量(apiserver endpoint地址),即为VPC出口公网IP的8080端口。
这时候咱们就能够开始测试一些Kubernetes的基本功能,好比建立Replication Controllers,启动nginx pods 并注册一个名为nginxservice的Service作服务发现。
建立 replication controller
➜ k8s cat ./nginx-rc.yaml apiVersion: v1 kind: ReplicationController metadata: name: nginx spec: replicas: 3 selector: app: nginx template: metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: index.alauda.cn/library/nginx:latest ports: - containerPort: 80 ➜ k8s kubectl create -f nginx-rc.yaml replicationcontrollers/nginx
检查 pods 启动状态:
➜ k8s kubectl get pods NAME READY REASON RESTARTS AGE nginx-5wjo3 1/1 Running 0 14m nginx-a2nak 1/1 Running 0 14m nginx-lb5rv 1/1 Running 0 14m
注册名为nginxservice的Service:
➜ k8s cat nginx-svc.yaml apiVersion: v1 kind: Service metadata: labels: name: nginxservice name: nginxservice spec: ports: - port: 80 selector: app: nginx ➜ k8s kubectl create -f nginx-svc.yaml services/nginxservice
建立好nginx pods和相应service后,咱们能够经过apiserver proxy转发集群内部的service, 这样咱们就能够经过 Master节点8080端口访问集群Node节点上运行的nginx服务。
本示例为简单起见,选择了apiserver proxy来转发集群内Node节点的服务。用户还能够设置其余方式访问Node节点上的服务。更多具体的Kubernetes的操做细节,能够参考 Kubernetes 官方文档。
第四步:安装Kubnetes WebUI
此外,FIT2CLOUD还内置了Kubernetes webUI addon的安装脚本,只须要在Master节点上执行一下 kube_ui_installer.sh脚本就能够激活安装 kube-ui。
等待脚本执行完毕,访问VPC路由器上绑定的公网IP(端口为8080),即http://<公网_IP>:8080/ui,就能看到部署成功的Kubernetes WebUI。其上会展现该集群的基本信息、当前状态等。
与前文所述,Kubernetes负责的是容器的建立、部署、监控和伸缩,FIT2CLOUD负责的是VM(虚机/云主机)的建立,部署,监控和伸缩。FIT2CLOUD默认系统监控能够对Kubernetes集群的CPU、内存、硬盘和网络进行监控,也能够设定`自定义监控指标,对Docker或者Containers作应用级别的监控。例如,能够监控每台KubernetesNode上的containers数量,方便之后基于Nodes节点的Containers数量来伸缩Nodes虚机。以下图尝试设置该自定义监控。
将其应用于Kubernetes Node虚机组(包括两台机器)上:
Kubernetes集群的Node节点已经应用了一个自定义监控指标,如今能够尝试启动50个nginx的容器,在Master节点执行以下命令
kubectl run my-nginx --image=nginx --replicas=50 --port=80
等待几分钟后就能够在监控面板上实时查看Kubernetes集群中每一个Node上的container数量(以下图所示):
除此以外,也能够在经过这个自定义监控实现VM水平上的自动伸缩,下面立刻会介绍如何利用FIT2CLOUD自定义监控实现Kubernetes集群的自动伸缩。
咱们知道,kubectl scale
命令能够用来伸缩容器数量,实现容器(应用)水平的伸缩,可是对于虚机水平的伸缩,Kubernetes自身无能为力,这就须要相似FIT2CLOUD这样的管理平台来帮忙实现。FIT2CLOUD所作的虚机水平自动伸缩,能保证Kubernetes集群中容器(应用)水平的伸缩可以不受限于节点数量和每一个节点的配额限制,保证容器(应用)的成功伸缩。
这里假设Kubernetes Nodes中的Pods/Containers的资源配额是40个,经过FIT2CLOUD设定自定义监控指标监控Nodes中的Containers数量。当超过80%资源配额(40*80%=32个)后,自动建立一台新的Kubernetes Nodes云主机,并自动部署后加入到集群之中;同理也能够设定当每台Nodes中的Pods/Containers平均数量小于必定数值时,自动回收云主机,节约开支。经过如此设置就可以保证当Kubernetes集群的负载达到资源配额上限前提早经过FIT2CLOUD扩容云主机并加入集群,保证上层容器扩容得以顺利实施。当突发负载发生并触发Node节点的资源配额上限时,一样会触发FIT2CLOUD自动伸缩机制并扩容云主机加入集群,而后由Kubernetes调度机制保证新加入云主机最终承担相应的负载。下面示例将演示突发负载这一场景。
如今假定已经经过上述教程建立好了一个单Master节点,3个Node节点的Kubernetes集群。接下来演示如何利用FIT2CLOUD自动伸缩功能支持上层Kubernetes的弹性伸缩特性。
首先,在虚拟机组页面,对Kubernetes Node节点,设定自动伸缩。
采用情景伸缩,针对咱们上面所述自定义监控指标,当Node节点上的平均pod数量超过32个时扩容一台Node云主机;当其中Node节点上的平台pod数量最小值小于20台时,缩容一台Node云主机,由Kubernetes自行将这一台上已有的pod在其余Node上从新启动。具体设置以下:
其次,当自动伸缩设置完毕以后尝试经过kubectl工具,把nginx pod总数扩展到150台。
kubectl scale rc my-nginx --replicas=150
观察自动伸缩状况,如今总共有3台Node。当pod总数忽然扩展到150台时,因为Kubernetes的默认配额限制(每一个节点pod数量不得超过40),如今每台Node上最多运行40个pods,总共3*40=120个,没法知足Kubernetes层扩容到150台的要求,如图:
当前总共有3台Node
自定义监控每台Node上实际的pod数量
可是,这时平均每台Node上会运行40个pod,这会触发40>32个pods的自动伸缩条件,FIT2CLOUD自动伸缩机制会扩容一台Node主机,如图所示:
系统已经扩展了一台Node,新扩展的节点经过虚机模板建立启动,自动会加入Kubernetes集群
新启动的Node节点加入Kubernetes集群后,Kubernetes会自动把前面未成功scale的30个containers调度到该台Node节点运行。在FIT2CLOUD中查看以前建立的自定义监控指标“podsNum”便可观察到这一点。
Kubernetes表明着目前最早进的容器管理系统,可是它做为PaaS(容器云)与IaaS(或者Bare-Metal物理机)之间还须要FIT2CLOUD对其进行运维管理。FIT2CLOUD能够帮助相似Kubernetes这样的PaaS(容器云)更好在云环境中使用。Kubernetes+FITCLOUD+QingCloud可让用户很是快速稳定地从底至顶搭建一套容器管理系统。