k8s 读书笔记 - kubernetes 是什么以及我们为什么要使用它?

kubernetes 是什么?

k8s 是一个全新的基于容器技术的分布式架构解决方案、并且是一个一站式的完备的分布式系统开发和支撑的平台。

从 k8s 的前生说起

是一个全新的基于容器技术的分布式架构领先的方案。

这个方案虽然很新,但它是谷歌十几年以来大规模应用于容器技术的经验积累和升华的重要成果。确切地说,kubernetes(简称 k8s)是谷歌严格保密十几年的秘密武器 —— Borg 的一个开源版本。Borg 是谷歌的一个久负盛名的内部使用的大规模集群管理系统,它基于容器技术,目的是实现资源管理的自动化,以及跨多个数据中心的资源利用率的最大化。十多年以来,谷歌一直通过 Borg 系统管理着数量庞大的应用程序集群。由于谷歌员工签署了保密协议,即便离职也不能泄漏 Borg 的内部设计,所以外界一直无法了解关于它的更多信息。直到 2015 年 4 月,传闻许久的 Borg 论文伴随 k8s 的高调宣传被谷歌首次公开,大家才得以了解他的更多内幕。正是由于站在 Borg 这个前辈的肩膀上,汲取了 Borg 过去十年间的经验与教训,所以 k8s 一经开源就一鸣惊人,并迅速称霸容器领域。

受 k8s 架构思想的影响,传统系统架构有哪些改变?

无需考虑和业务没有太多关系的底层代码或功能模块。

假如我们系统设计遵循了 k8s 的设计思想,那么与传统系统架构相比,改变的有以下部分:

  • 无需考虑和业务没有太多关系的底层代码或功能模块,比如:负载均衡器的选型和部署实施问题、不必再考虑引入或自己开发一个复杂的服务治理框架、不必再头疼于服务监控和故障处理模块的开发。

得益于 k8s 提供的解决方案,我们可以节省不少于 30% 的开发成本,让开发人员的精力更加集中于业务本身,而且由于 k8s 提供了强大的自动化机制,所以系统后期的运维难度和运维成本大幅度降低。

k8s 是一个开放的开发平台(语言无关)

与 J2EE 不同,它不局限于任何一种编程语言,没有限定任何编程接口,所以无论是用 .NET、Java、Go、C++、Rust 还是 Python 等语言编写的服务,都可以被映射为 k8s 的 Services(服务),并通过标准的 TCP 通信协议进行交互。

k8s 平台对现有的编程语言,编程框架,中间没有任何入侵性,因此现有的系统也很容易改造升级并迁移到 k8s 平台上。

k8s 是一个完备的分布式系统支撑平台

k8s 具有完备的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建的智能负载均衡器、强大的鼓掌发现和自我修复的能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制,以及多粒度的资源配额管理能力。

k8s 提供了完善的管理工具

k8s 这些工具涵盖了包括开发、部署测试、运维监控在内的各个环节。

k8s 基本知识点的简单了解

为了更好的理解 k8s,我们先简单的了解一下 k8s 的基本知识点,方便对 k8s 有更深入的理解做前期铺垫。

Service 在 k8s 中是分布式集群架构的核心

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

  • 拥有唯一指定的名称,Service 本身一旦被创建就不再变化。
  • 拥有一个虚拟 IP(Cluster IP、Service IP 或 VIP)和端口号。
  • 能够提供某种远程服务能力。
  • 被映射到提供这种服务能力的一组容器应用上。

Service 的服务进程目前都基于 Socket 通信方式对外提供服务,比如 Redis、Memcache、PostgreSQL、Pulsar、Web Server 等,或者是实现了某个具体业务的特定 TCP Server 进程。虽然一个 Service 通常由多个相关的服务进程提供服务,每个服务进程都有一个独立的 Endpoint(IP+Port)访问点,但 k8s 能够让我们通过 Service (Cluster IP + Service Port)连接到指定的 Service。

容器提供了强大的隔离功能

容器提供了强大的隔离功能,所以有必要把为 Service 提供服务的这组进程放入容器中进行隔离。为此,k8s 设计了 Pod 对象,将每个服务进程都包装到相应的 Pod 中,使其成为在 Pod 中运行的一个容器(Container)。

为了建立 Service 和 Pod 之间的关联关系,k8s 首先给每个 Pod 都贴上一个标签(Label),然后给相应的 Service 定义标签选择器(Label Selector),这样就巧妙的解决了他们之间的关联问题。

k8s 里面最小的运行单元 Pod

Pod 概念的简单了解。Pod 运行在一个被称为节点(Node)的环境中,这个节点既可以是物理机,也可以是虚拟机(私有云或公有云环境)。每一个 Pod 中都运行着一个特殊的容器 —— Pause 容器,其他容器则为业务容器,这些业务容器共享 Pause 容器的网络栈和 Volume 挂载卷,因此他们之间的通信和数据交换更为高效。

Pod 里面通常运行着 1 个 Pause 容器和 (1~n) 个 业务容器,共同组成一个服务进程,统一对外提供服务。

【注意】并不是每个 Pod 和它里面运行的容器都能被映射到一个 Service 上,只有提供服务(无论是对内还是对外)的那组 Pod 才会被映射为一个服务。

k8s 集群管理

集群管理方面,k8s 将集群中的机器划分为两类角色,分别是 Master 和 Node。

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

k8s 提供服务扩容和服务升级

k8s 提供服务扩容和服务升级。服务的扩容涉及资源分配(如何选择哪个节点进行扩容)、实例部署和启动等环节,在一个复杂的业务系统中,这两个难题基本上靠人工的方式,一步一步的操作才得以解决,费事费力有难以保证实施的质量。

在 k8s 集群中,只需为需要扩容的 Service 关联的 Pod 创建一个 RC(Replication Controller),在创建好 RC(系统自动创建好 Pod)后,k8s 会通过 RC 中定义的 Lable 筛选出对应的 Pod 实例并实时监控其状态和数量,如果实例数量少于定义的副本数量,则会根据在 RC 中定义的 Pod 模板创建一个新的 Pod,然后将此 Pod 调度到合适的 Node 上启动运行,直到 Pod 实例数量达到预定的目标。这个过程完全是自动化的,无须人工的干预。有了 RC 服务的扩容只需修改 RC 中副本的数量即可,后续的服务升级也将通过修改 RC 的镜像版本来自动完成。

在一个 RC 定义文件中包括以下 3 个关键信息:

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

为什么要使用 k8s ?

通过上面对 k8s 的基本介绍,相信你已经大概有理由了,我们为啥使用 k8s,在 IT 行业中,回顾历史从来都是由新技术驱动发展的。

接下来我们就聊聊使用 k8s 的原因,或者说使用 k8s 获得了哪些好处?

CNCF 开源组织推广 k8s 和强大的云原生生态

2015 年,谷歌联合 20 多家公司一起建立了 CNCF(Cloud Native Computing Foundation,云原生计算基金会)开源组织来推广 k8s,它是基于容器的大规模容器化分布式系统解决方案,得到以谷歌为首的 IT 巨头们的大力宣传和持续推进。如今,数百家厂商和技术社区共同构建了非常强大的云原生生态。

为开发人员“减负”,可以“轻装上阵”地开发复杂系统

在传统的分布式系统解决方案中,需要很多人(其中不缺乏技术达人)一起分工协作才能设计、实施和运维分布式系统,采用 k8s 解决方案后,只需一个精悍的小团队就能轻松应付。这个精悍的小团只需一名架构师负责系统服务组件的架构设计,几名开发工程师负责业务代码的开发,一名系统兼运维工程师负责 k8s 的部署和运维即可。

全面拥抱微服务架构(Microservices)

微服务架构的核心是科学的将一个巨大的单体应用分解为很多的可相互独立部署、相互连接的微服务,各个模块遵循单一职责原则。一个微服务可能由很多实例副本支撑,副本的数量可以随着系统的负载变化进行相应的调整。微服务架构的设计,让每个服务都可以独立开发、升级、部署和扩展,因此系统具备了很高的稳定性和快速的迭代能力,而开发者也可以自由选择开发技术,比如 Dapr(任何语言,任何框架技术,任何平台)+ k8s 非常轻松的应付微服务开发的相关技术难点。

采用 k8s 架构技术方案的应用,可以随时随地的将整体 “迁移” 到公有云平台

例如谷歌自家的 GCE、AWS 的 EKS、微软的 AKS,还有国内的华为云(CCE)、阿里云(ACK)、腾讯云(TKE)、京东云(Kubernetes 集群)先后宣布支持 k8s 集群,目前为止主流的云厂商无论是国外云厂商还是国内的云厂商基本都是拥抱支持 k8s 集群了,这里就不在一一例举,感兴趣的自行查阅。

k8s 提供的服务弹性扩容机制可以让我们轻松应对突发流量

在服务高峰期,我们可以选择在公有云中快速扩容某些 Service 的实例副本提升系统的吞吐量,这样不仅节省了公司的硬件投入成本,还提升了系统的抗并发能力大大改善系统用户体验。

k8s 超强的横向扩容能力大大提升系统竞争力

对于互联网公司来说,用户规模等价于资产,因此横向扩容能力是衡量互联网业务系统竞争能力的关键指标。特别是在微服务架构设计中,只要架构设计合理,系统能够在多云环境中进行弹性伸缩,从而大大提升系统整体的并发能力,轻松应对更多的用户群体。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChaITSimpleLove

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值