kubernetes是什么

首先,它是全新的基于容器技术(docker,rocket)的分布式架构领先方案 。是谷歌保密了十几年的秘密武器-borg的一个开源版本。borg是谷歌内部使用的大规模集群管理系统。

其次,kubernetes的设计思想是全自动管理,不必再费心于负载均衡器的选型和部署实施问题,不必再考虑引入或自己开发一个复杂的服务管理框架,也不必头疼于服务监控和故障处理模块的开发,将精力更加集中于业务本身,由于k8s提供了强大的自动化机制,所以系统后期的运维难度和成本大大降低。

然后,k8s是一个开放的开发平台,并不局限任何一种语言,也没有限制任何编程接口,无论java,go,c++还有python编写的服务,都可以毫无困难地映射为k8s的service。通过标准的TCP通信协议进行交互。

最后,k8s是一个完备的分布式系统支撑平台,具有完善的集群管理能力,强大的故障发现和自我修复,服务滚动升级和在线扩容能力。

接下来介绍一些k8s的基本知识。

在k8s中,service服务是分布式集群架构的核心,一个service对象拥有如下特征:

1.拥有一个唯一指定的名字(比如mysql-server)

2.拥有一个虚拟IP(ClusterIP、serviceIP或VIP)和端口号。

3.能够提供远程服务能力。

4.被映射到了提供这种服务能力的一组容器应用上。

service服务进程都是基于socket通信方式对外提供服务。比如mysql,web server或者是一个TCP server进程。

虽然service通常由多个相关的服务进程来提供服务。每个服务进程都有一个独立的endpoint(IP+port)访问点,但k8s能够让我们通过service(虚拟cluster IP+Port)连接指定的service进程上。并且service本身一旦创建不再变化,这意味着,不用为了服务的IP地址变来变去的问题而头疼了。

由于容器提供了强大了隔离功能,所有有必要把为service提供服务的这组进程放入容器中。为此,k8s设计了pod对象(容器组),将每个服务进程包装到相应的pod中,使其成为pod中运行的一个容器。为了建立service和pod的关联关系,为pod贴上一个标签(label),比如给运行mysql的pod贴上name=mysql标签,给运行PHP的贴上name=php标签。给相应的service定义标签选择器(label selector),比如mysql的service的标签选择器的选择条件为name=mysql,意味着该service要作用于所有包含name=mysql label的pod上。解决了service和pod关联问题。

至于pod,首先其运行在一个我们称之为节点Node的环境中,Node既可以是物理机,也可以是云的一个虚拟机。通常在一个节点上运行几百个pod。其次每个pod中运行着许多容器,但只有一个特殊的pause容器,其他容器为业务容器,这些业务容器共享pause容器的网络栈和volume挂载卷。因为它们之间的数据交换更为高效。在设计时可以充分利用这一特性,将一组密切相关的服务进程放入到同一个pod中。最后需要注意的是,并不是每个pod和其中运行的容器都能映射到一个service上,只有那些提供服务(无论对内还是对外)的一组pod才会被映射为一个服务。

在集群管理方面,k8s将集群的机器划分为一个master节点和一群工作节点(Node),在master节点上运行集群管理相关的一组进程kube-apiserver,kube-controller-manager和kube-scheduler,这些进程实现了整个集群的资源管理、pod调度、弹性伸缩、系统监控等管理功能,且都是全自动完成的。Node作为集群中的工作节点,运行真正的应用程序,在node上k8s管理的最小运行单元是pod。node上运行kubelet、kube-proxy服务进程,这些负责pod的创建、启动,重启,销毁等。

最后对于传统IT系统中服务扩容和服务升级这两个难题,k8s中,只需要为需要扩容的service关联的pod创建一个replication control(RC),则service的扩容以至于后来的service升级等问题迎刃而解。在一个RC定义文件中包含如下3个关键信息:

1.目标pod的定义

2.目标pod所需运行的副本数量

3.要监控的目标pod的标签(label)

在创建好RC后,k8s会通过RC中定义的label筛选出对应的pod实例并实时监控其状态和数量,如果实例数量少于定义的副本数量,则根据RC中的pod模板来创建一个新的pod,然后将此pod调度到合适的Node上启动运行。直到pod实例的数量达到预定目标,这个过程是完全自动化的,无需人工干预。也就是说服务的扩容变得非常简单,只需要修改RC副本数量即可。后续的service升级也将通过修改RC来自动完成。

猜你喜欢

转载自blog.csdn.net/hahachenchen789/article/details/80616582