Kubernetes中如何部署一个应用?
近日以来,Kubernetes弃用Docker、不再维护与Docker之间的桥接关系已在Apache开源基金会公布,在技术圈内也传的风生水起,其实Docker的结局不是偶然,而是必然。自Google大举推出Kubernetes以来,快速的完善其能力,Docker的被抛弃已是必然,只是时间早晚问题。作为互联网研发运维同学,我们是时候好好了解下Kubernetes了~什么是Kubernetes呢?一个自动化容器操作的开源平台,支持自动部署、调度节点、弹性伸缩。此外,它还是一个开放的开发平台,不局限于任何开发平台,不限定任何编程接口。无论是使用Java、python、golang、net编写的服务都可以映射为k8s的service,通过标准的tcp协议进行交互。并且由于k8s对开发框架、开发语言没有侵入性,所以即使应用原先部署在私有云、物理机平台都可以平滑地迁移到k8s平台。最后它还是一个分布式系统开发与支撑平台,提供灵活的服务注册和服务发现机制、强大的故障发现能力、自我修复能力、弹性扩容能力,涵盖了从开发到上线运维的全过程,让开发人员只聚焦于业务开发。Kubernetes中有MasterNode、WorkNode两大技术概念。主节点masternode控制整个集群,是指挥中心,从节点worknode处理业务,是业务骨干。MasterNode包括kubectl、Apiserver、Scheduler、Controller、Ectd,我们从数据流来看Kubernetes内部是如何运转。管理人员(一般为运维人员)通过kubetcl来执行资源的增、删、改、查等操作,而kubetcl是通过APIserver来去执行这一系列管理动作的,并在执行的过程中将所有资源对象的信息存在在etcd,Scheduler负责整个Pod资源的调度(比如业务访问量增大需要扩容等),Controller-manager通过Apiserver提供的接口实时监控整个集群资源对象的当前状态,当某个node发生意外时会执行自动修复流程,保障业务的正常运行。Workernode包括kubelet、Kube-proxy、Pod、Container,其中Kubelet负责Pod对应的容器的创建、启动、停止等任务,同时与Master节点一起管理集群,Kube-proxy负责内外的通信,即将来自外部的Internet访问和具体的业务Pod节点关联,Pod即业务节点,由一个或多个Docker容器组成,底层基于Docker引擎来创建容器。Service服务负责业务与机器之间的映射,一个Service对应多个处理同类业务。Kubernetes的基础概念介绍完了之后,我们来看看在Kubernetes中如何从0到1的部署一个应用呢?总的来说包含6个部分:制作镜像—》管理Pod—〉持久化Pod数据—》暴露应用—〉发布应用—》监控应用。第一步是制作镜像,我们知道应用除了业务服务之外,还包含数据库、MQ等中间件,Centos、Ubuntu等中间件。在Kubernetes中承载应用的便是容器,而容器中承载应用的便是镜像。镜像就像一个文件目录,从下往上包含基础镜像、中间件镜像、服务镜像,一层层的堆叠起来。运维人员把基础镜像、中间件镜像做好了之后,交给开发人员制作服务镜像,三个镜像都完事儿之后,应用镜像就做好了,里面包含了应用的代码和所运行的环境。第二步是管理Pod。在Kubernetes中,服务通过镜像部署在容器中,但容器毕竟只是一个封闭式的沙箱,每一个相互隔离,我们需要有更上层的概念把它们给组合起来,这便是Pod,一个Pod中有多个容器,共享相同的网络和IP地址。在Kubernetes中主要是通过控制器Controller管理控制。从业务的类型分为有状态应用(产生持久化数据,需要数据存储功能等,比如mysql、Kafka)、无状态应用(应用实例不涉及事务交互,不产生持久化数据,对同一个请求响应结果完全一致,比如tomcat)、守护型应用(长期运行、提供持续的监听服务)、批处理型应用(一次性的处理大量任务)来看,控制器也分为Deployment、StatefulSet、DaemonSet、Job、CronJob几类。根据应用的不同类型,可设置不同的控制器,通过Kind字段进行定义即可。第三步是持久化Pod数据,在容器部署过程中一般需要启动时的初始化数据、启动过程中的临时数据、启动中产生的持久化数据,在Pod内通过Volume卷进行数据持久化,即使容器销毁了,Volume卷中的数据仍然存在。Kubernetes支持多达28种数据类型,EmptyDir类型在创建Pod时产生、Pod移除时数据卷才被释放;HostPath支持将Pod中文件系统的某一个文件或目录挂载容器组;Persistent类型是Pod集群中的一块存储空间,作为一个资源对象被管理,通过编写yaml文件可进行持久化数据。第四步是暴露应用,在Kubernetes中的Service便可提供Pod服务的暴露,一个Service对应多个Pod,用户请求对应多个Service,通过Service的服务发现和负载均衡作用,将一个请求转发给多个Pod进行完成。第五步是发布应用,在Kuernetes中一般通过ingress去发布应用,让用户去访问,每个ingress会关联一组pod,而service会创建这组pod的负载均衡,通过service去区分这些节点上的Pod。结合DevOps流程,开发人员通过在Github等代码仓库上传下载代码,使用Jenkins进行编译构建,最后通过Kubernetes进行部署即可。第六步是监控应用,监控就像我们的眼睛一样,替我们看管着Kubernetes中的上百上千个Container节点。在Kubernetes常用的监控有两种方式,其一是在服务中插入探针,随着Docker一起部署运行,采集实时运行状态(如服务调用链路、接口调用情况)进行分析,其二是获取从容器到应用的运行日志。至此,关于Kubernetes是什么?技术架构和核心概念、如何的从0到1部署应用我们便介绍完了。在背靠Google的情况下,Kubernetes毫无疑问会成为云原生最热门的技术,赶快学习、实战起来吧~