一、kubernetes是什么?
简单理解,它就是一个基于容器的分布式架构,是一个完备的分布式系统支撑平台。
它是一个开放的开发平台。和JAVA不同,它不受任何语言的限制,所以对于任何一种语言编写的程序服务,都是可以被映射为kubernetes的service。
并且,kubernetes对现有的编程语言,框架,中间件都没有任何侵入性,因此现有的系统也很容易改造升级并迁移到kubernetes平台上。
在kubernetes中,service是分布式集群架构的核心,一个service对象拥有如下关键特征。
①拥有唯一指定的名称(比如mysql-server)
②拥有一个虚拟ip(cluster ip、service ip 或 VIP)和端口号
③能够提供某种远程服务能力
④被映射到提供这种服务能力的一组容器应用上
service的服务进程目前都是基于socket通信方式对外提供服务,比如redis、MySQL,或是实现了某个具体业务的特定TCPServer进程。
虽然一个service通常由多个相关的服务进程提供服务,每个服务进程都有一个独立的endpoint(ip+port)访问点,但kubernetes能够让我们通过service(虚拟cluster ip + service port)连接到指定的service。
kubernetes内部有负载均衡和故障恢复的机制,所以不管后端有多少服务进程,也不管某个服务进程是否由于发生故障而被重新部署到其它机器,都不会影响对服务的正常调用。
更重要的是,这个service本身一旦创建就不再变化,这意味着我们再也不用为kubernetes集群中服务的ip地址变来变去的问题而头疼了。
容器提供了强大的隔离功能,所以有必要把为service提供服务的这组进程放入容器中进行隔离。为此,kubernetes设计了pod对象,将每个服务进程都包装到相应的pod中,使其成为在pod中运行的一个容器。
为了建立service和pod之间的关联关系,kubernetes首先会给每个pod都贴上一个标签(label),给运行MySQL的pod贴上name=mysql。这样一来,就巧妙解决了service和pod的关联问题。
service:service定义了这样一种抽象:一个pod的逻辑分组,一种可以访问它们的策略。service通常被称为微服务,定义了一个服务的访问入口地址,前端的应用(pod)通过这个入口访问其背后的一组由pod副本组成的集群实例,service与其后端pod副本集群之间通过label selector来实现通信。
label:标签,一个label就是一个key=value的键值对,由用户自己指定。label可以附加到各种资源对象上,例如pod、service等,一个资源对象可以定义任意数量的label,同一个label也可以被添加到任意数量的资源对象上去。label通常在资源对象定义时确定,也可以在对象创建后动态添加或者删除。
pod是什么?
简单理解,pod是运行在一个被称为节点(node)的环境中,这个节点可以是物理机,也可以是私有云或者公有云中的一个虚拟机,通常在一个节点上运行几百个pod。
其次,在每个pod中都运行着一个特殊的被称为pause的容器,其它容器则为业务容器。
最后,咱们需要注意的是,并不是每个pod和它里面运行的容器都能被映射到一个service上,只有提供服务(无论是对内还是对外)的那组pod才会被映射为一个服务。
在集群管理方面,kubernetes将集群中的机器划分为一个master和一些node。
在master上运行着集群管理相关的一组进程kube-apiserver、kuber-controller-manager和kube-scheduler,这些进程实现了整个集群的资源管理、pod调度、弹性伸缩、安全控制、系统监控和纠错等管理功能,并且都是自动完成的。
node是什么?
顾名思义,node(节点),一般作为集群中的工作节点,运行真正的应用程序,在node上kubernetes管理的最小运行单元是pod。
在node上运行着kubernetes的kubelet、kube-proxy服务进程,这些服务进程负责pod的创建、启动、监控、重启、销毁,以及实现软件模式的负载均衡器。
kubelet:负责pod对应的容器的创建、启停等任务,同时与master节点密切协作,实现集群管理的基本功能。
kube-proxy:实现kubernetes service的通信与负载均衡机制的重要组件。
kube-apiserver:提供了HTTP Rest接口的关键服务进程,是集群里所有资源的增、删、改、查等操作的唯一入口,也是集群的控制入口。
kube-controller-manager:运行管理控制器,是集群中处理常规任务的后台进程,每个controller都负责一种具体的控制流程,而controller manager就是这些controller的核心管理者。
kube-scheduler:负责资源调度(pod调度)的进程,为新创建的pod选择一个node节点。
二、kubernetes之传统IT系统中服务扩容和服务升级解决方案
对于传统的这两大难题基本上都是靠人工一步步操作处理的,费时费力又难以保证实施质量。
在kubernetes集群中,只需为需要扩容的service关联的pod创建一个RC(replication controller),服务扩容以至服务升级等这些问题都能迎刃而解。
在一个RC定义文件中包含以下3个关键信息:
①目标pod的定义
②目标pod需要运行的副本数量(replicas)
③要监控的目标pod的标签
在创建好RC(系统将自动创建好pod)后,kubernetes会通过在RC中定义的label筛选出对应的pod实例并监控其状态和数量,如果实例数量少于定义的副本数量,则会根据在RC中定义的pod模板创建一个新的pod,然后将此pod调度到合适的node上启动运行,直到pod实例的数量达到预定目标。这个过程完全是自动化的,无需人工干预。
有了RC,服务扩容就变成了一个纯粹的简单数字游戏了,只需修改RC中的副本数量即可。后续的服务升级也将通过修改RC来自动完成。
写在最后:
本文内容是摘自相关书籍以及网上文献,并结合自己理解所编写,如果理解不周还望大家指出更正,初心不变,大家共同进步,一起交流学习~~~
接下来的更新,将为大家讲述为什么要用kubernetes?有什么优势?为啥在互联网公司那么火?