Kubernetes 入门篇 (一) Kubernetes 介绍,Kubernetes 基本概念

Kubernetes 入门篇 (一) Kubernetes 介绍,Kubernetes 基本概念


以下内容摘自《 Kubernetes 权威指南 从Dcoker 到 Kubernetes 纪念版》,此文章非原创,如侵权,还请联系删除

Kubernetes是什么?

首先,它是一个全新的基于容器技术的分布式架构领先方案。这个方案虽然是新起的,但它是谷歌十几年以来最大规模应用容器技术的经验积累和升华的一个重要成果。由于 kuberbetes 从第一个字母b到最后一个字母s中间间隔8个字母,所以也被简称为“k8s”

其次,如果我们的系统设计遵循了Kubernetes 的设计思想,那么传统系统架构中那些和业务没有太大关系的底层代码或功能模块儿,都可以立刻从我们的视线中消失,我们不必在费心于负载均衡器的选型和部署实施的问题,不必再考虑引入或者自己开发一个复杂的服务治理框架,不必再头疼于服务监控和故障处理模块的开发。总之,使用Kubernetes提供的解决方案,我们不仅节省了不少于30%的开发成本,同时可以将精力更加集中于业务本身,而且由于Kubetbetes 提供了强大的自动化机制,所以系统后期的运维难度和运维成本大幅度降低。
Kubernetes 入门篇 (一) Kubernetes 介绍,Kubernetes 基本概念

然后,Kubernetes 是一个开放的开发平台。与J2EE不同,它不限于任何一种语言,没有限定任何编程接口,所以不论是用 Java,Go,C++ 还是用 Python 编写的服务,都可以毫无困难的映射为 Kubernetes 的 Service,并通过标准的TCP通信协议进行交互。此外,由于Kubernetes 平台对现有的编程语言,编程框架,中间件没有任何入侵,因此现有的系统也很容易改造升级并迁移到 Kubernetes 平台中。

最后,Kubernetes 是一个完整的分布式系统支撑平台。Kubernetes 具有完备的集群管理能力,包括多层的安全防护准入机制,多租户应用支撑能力,透明的服务注册和服务发现机制,内建智能负载均衡器,强大的故障发现和自我修复能力,服务滚动升级和在线扩容能力,可扩展的资源自动调度机制,以及多粒度的资源配额管理能力。同时 Kubernetes 提供了完善的管理工具,这些工具涵盖了包括开发,部署测试,运维监控在内的各个环节。因此 Kubernetes 是一个全新的基于容器技术的分布式框架解决方案,并且是一个一站式的完备的分布式系统开发和支撑平台。

Kubernetes 基本概念

在 Kubernetes 中,Service(服务)是分布式集群架构的核心,一个 Service 对象对象拥有如下关键特征

  • 拥有一个唯一指定的名字。
  • 拥有一个虚机IP和端口号。
  • 能够提供某种远程服务能力。
  • 被映射到了提供这种服务能力的一组容器上。

Service 的服务进程目前都基于 Socket 通信方式对外提供服务,比如Redis、Memcache、MySQL、Web Server,或者是实现了某个具体业务的一个特定的TCP Server 进程。虽然一个Service 通常由多个相关的服务进程来提供服务,每个服务进程都有一个独立的Endpoint(IP+Port)访问点,但 Kubernetes 能够让我们通过 Service (虚拟 Cluster IP + Service Port) 链接到指定的 Service 上。有了 Kubernetes 内建的透明负均衡和故障恢复机制,不管后端有多少服务进程,也不管某个服务进程是否由于发生故障而重新部署到其他机器,都不会影响到我们对服务的正常调用。更重要的是这个Service 本身一旦创建就不再变化,这意味着在 Kubernetes 集群中,我们再也不用为了服务的 IP 地址变来变去的问题而头疼了。

容器提供了强大的隔离功能,所以有必要把 Service 体用服务的这组进程放入容器中进行隔离。为此,Kubernetes 设计了Pod对象,将每个服务进程包装到相应的 Pod 中,使其成为 Pod 中运行的一个容器(Container)。为了建立 Service 和 Pod 间的关联对应,Kubernetes 首先给每个 Pod 贴上一个标签(Label),给运行 MySQL 的 Pod 贴上 name=mysql 标签,给运行 PHP 的 Pod 贴上 name=php 标签,然后给相应的 Service 定义标签选择器 (Label Selector),比如 MySQL Service 的标签选择器的条件为 name=mysql ,意为该 Service 要作用于所有包含 name=mysql Label 的 Pod 上。这样一来,就巧妙的解决了 Service 与 Pod 的关联问题

说到 Pod,我们这里先简单介绍其概念。首先 Pod运行在我们一个称之为节点(Node)的环境中,这个节点既可以是物理机,也可以是虚拟机,通常在一个节点上运行几百个 Pod,其次,每个 Pod 里运行着一个特殊的被称之为 Pause 的容器,其他容器则为业务容器,这些业务容器 共享 Pause 日报过去的网络栈和 Volume 挂在卷,因此它们之间的通信和数据叫唤更为高效,在设计时我们可以充分利用这一特性将一组密切相关的服务进程放入统一个 Pod 中;最后,需要注意的是,并不是每个 Pod 和它里面运行的容器都能 “映射” 到一个Service 上,只有那些提供服务(无论是对内还是对外)的一组 Pod 才会被 “映射” 成一个服务。

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

最后,我们再来看看传统的 IT 系统中服务扩容和服务升级的两个难题,以及 Kubernetes 所提供的全新解决思路。服务的扩容涉及资源分配(选择哪个节点进行扩容)、实例部署和启动等环节,在一个复杂的业务系统中,这两个问题基本上靠人工一步一步操作才得以完成,费事费力又难以保证实施质量。

在 Kubernetes 集群中,你只需为需要扩容的 Service 关联的 Pod 创建 RC (Replication Controller),或者Deployment,则该 Service 的扩容以至于后来的 Service 升级等头疼的问题都迎刃而解。在一个 RC,或者 Deployment 定义文件中包括以下 3 个关键信息

  • 目标 Pod 的定义。
  • 目标 Pod 需要运行的副本数量(Replicas)。
  • 要监控的目标 Pod 的标签(Label)。

在创建好 RC 或者 Deployment 后(系统会自动创建 Pod), Kubernetes 会通过 RC ,或者Deployment 中定义的 Label 筛选出对应的 Pod 实例并实时监控其状态和数量,如果实例数量少于定义的副本数量(Replicas),则会根据 PC 中定义的 Pod 模板来创建一个新的 Pod,然后将此 Pod 调度到适合的 Node 上启动运行,直到 Pod 实例的数量达到预定的目标。这个过程完全是自动化的,无需人工干预。若要修改 Pod 的副本数量,只需要 修改 RC 或者 Deployment 中定义的 副本数量(Replicas)即可。

Kubernetes 入门篇 (一) Kubernetes 介绍,Kubernetes 基本概念

为什么要用Kubernetes?

使用 Kubernetes 的理由有很多,最根本的一个理由就是:IT 从来都是一个由新技术驱动的行业。

Docker 这个新兴的容器技术当前已经被很多公司所采用,其从单机走向集群已成必然,而云计算的蓬勃发展正在加速这一进程。 Kubernetes 作为当前唯一被业界广泛认可和高度看好的 Docker 分布式系统解决方案,可以预见,在未来几年内,会有大量的新系统选择它,不管这些系统是运行在企业本地服务器上还是托管在公有云中。

使用了 Kubernetes 又会收获哪些好处呢?

首先,最直接的感受就是我们可以 “轻装上阵” 的开发复杂的系统了。 以前动不动就需要十几个人而且团队里需要不少技术达人一起分工协作才能设计实现和运维的分布式系统,在采用 Kubernetes 解决方案后,只需要一个精悍的小团队就能轻松应对。在这个团队里,一名架构师专注于系统中 “服务组件” 的提炼,几名开发工程师专注于代码的开发,一名系统兼运维工程师负责 Kubernetes 的部署和运维,从此再也 不用 “996” 了,这并不是因为我嫩少做了什么,而是因为 Kubernetes 已经帮我们做了那么多。

其次,使用 Kubernetes 就是在全面的拥抱微服务架构。微服务架构的核心是将一个巨大的单体应用分解为很多小的互相链接的微服务,一个微服务背后可能有很多个实例副本在支撑,副本的数量坑你会随着系统的负荷变化而进行调整,内嵌的负载均衡器在这里发挥了重要的作用。微服务架构使得每个服务都可由专门的开发团队来开发,开发者可以*选择开发技术,这对于大规模团队来说很有价值,另外每个微服务独立开发、升级、扩展、因此系统具备很高的稳定性和快速迭代进化能力。

然后,我们的系统可以随时随地的整体 “搬迁” 到公有云或者私有云中。 Kubernetes 最初的目标就是运行在谷歌自家的公有云 GCE 中,未来会支持跟多的公有云及基于 OpenStack 的私有云。同时,在 Kubernetes 的架构方案中,底层网络的细节完全被屏蔽,基于服务的Cluster IP 甚至都无需我们改变运行期的配置文件,就能将系统从物理机环境汇总无缝迁移到公有云中,或者在服务高峰期将部分服务对应的 Pod 副本放入公有云中以提升系统的吞吐量,不仅节省了公司的硬件投入,还大大改善了客户体验。

最后, Kubernetes 系统架构具备了超强的横向扩容能力。对于互联网公司来说,用户规模就像等于资产,谁拥有更多的要交给用户,谁就能在竞争中胜出,因此超强的横向扩容能力是互联网业务系统的关键指标之一。不用修改代码,一个 Kubernetes 集群即可从只包含几个 Node 小集群平滑扩展到拥有上百个 Node 的大规模集群,我们利用 Kubernetes 提供的工具,甚至可以在线完成集群扩容。只要我们的微服务设计得好,结合硬件或者公有云资源的线性增加,系统就能够承受很大用户来并发访问所带来的的巨大压力。