Kubernetes教程之Kubernetes是什么?

简介

Kubernetes又名k8s,由来是Kubernetes首字母与尾字母之间有8个字符因此简称为k8s。

k8s是一个全新的基于容器技术的分布式架构领先方案,也可以称呼为容器编排系统,或者k8s集群。

说到k8s,熟悉的人,可能第一时间会联想到Docker,因为k8s+Docker的组合是最常见的,但是需要注意的一点是,k8s不只是支持Docker一种容器技术,还支持其他的容器技术,后面会给大家介绍到k8s的另外一个知识点,叫CRI(容器运行时接口),使用CRI我们就可以实现,在无需编译k8s的情况下,来支持更多的容器技术。

k8s是Borg系统的一个开源版本。

Borg系统是Google内部使用的大规模集群管理系统,它基于容器技术, 目的是实现资源管理的自动化, 以及跨多个数据中心的资源利用率的最大化。十几年以来,谷歌一直通过Borg系统管理着数量庞大的应用程序集群。

Google对于Borg系统有着非常严格的保密性,据说,每个可以接触到Borg系统的人,都需要签订保密协议,不允许泄漏Borg系统的内部设计,因此外界对于Borg系统的了解,知之甚少。

直到2015年4月,Google发布了一篇Borg系统的论文,才得以让外界了解到了更多的内容,同时发布的还是k8s系统。

正是由于站在Borg系统这个巨人的肩膀上, 汲取了Borg系统过去多年以来的经验与教训, 所以k8s一经开源就一鸣惊人, 并迅速称霸容器领域。受到了各大 IT 科技巨头的追捧, 红帽、华为、IBM、微软(排名不分先后)等企业迅速加入社区贡献者行列。

2017 年 9 月,Mesosphere公司宣布支持 k8s。

2017 年 10 月,Docker 公司 CTO 宣布,Docker 的下个版本将支持 k8s。

在Mesosphere和Docker都宣布支持k8s后,k8s便再无强力的竞争对手,成为了容器编排领域的领头羊。

k8s的存在,解决我们很多非业务相关的开发工作以及技术选型工作。例如,我们不必再费心于负载均衡器的选型以及部署实施问题, 不必再考虑引入或自己开发一个复杂的服务治理框架, 不必再头疼于服务监控以及故障处理模块的开发。对于这些,k8s都给我们提供了完善解决方案。不仅节省了我们的开发时间,更可以让我们的精力专注于业务本身。

同时,k8s有强大的自动化机制,使我们后期的运维难度及运维成本有了大幅度的降低。

k8s是一个开放平台,不管你是用Java、Go、 C++还是用Python编写的服务,都可以被映射为k8s的Service(服务) , 并通过标准的TCP通信协议进行交互。

k8s具有非常全面的集群管理能力:

  • 多层次的安全防护
  • 服务注册
  • 服务发现
  • 负载均衡
  • 故障发现
  • 故障自愈
  • 滚动升级
  • 在线扩容
  • 资源自动调度
  • 多粒度的资源配合管理能力

基础知识了解

在正式开始本章的Hello World之旅之前, 我们首先要学习k8s的一些基本知识, 这样才能方便大家理解k8s提供的解决方案。

Service

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

  • 拥有唯一指定的名称(比如mysql-server) 。
  • 拥有一个虚拟IP(Cluster IP、 Service IP或VIP) 和端口号。
  • 能够提供某种远程服务能力。
  • 被映射到提供这种服务能力的一组容器应用上。

Service的服务进程目前都基于Socket通信方式对外提供服务, 比如Redis、 Memcache、 MySQL、 Web Server,或者是实现了某个具体业务的特定TCP Server进程。

虽然一个Service通常由多个相关的服务进程提供服务, 每个服务进程都有一个独立的Endpoint(IP+Port),但k8s能够让我们通过Service Endpoint(虚拟Cluster IP +ServicePort) 连接到指定的Service。

Kubernetes教程之Kubernetes是什么?

有了k8s内建的透明负载均衡和故障恢复机制, 不管后端有多少服务进程, 也不管某个服务进程是否由于发生故障而被重新部署到其他机器, 都不会影响对服务的正常调用。 更重要的是, 这个Service本身一旦创建就不再变化, 这意味着我们再也不用为k8s集群中服务的IP地址变来变去的问题而头疼了。

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

Kubernetes教程之Kubernetes是什么?

Pod

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

Kubernetes教程之Kubernetes是什么?

简单了解一下架构

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

Kubernetes教程之Kubernetes是什么?

RC

在k8s集群中, 只需为需要扩容的Service关联的Pod创建一个RC(Replication Controller) , 服务扩容以至服务升级等令人头疼的问题都迎刃而解。 在一个RC定义文件中包括以下3个关键信息。

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

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

Kubernetes是什么,就介绍到这吧。

本文为原创文章,未经授权禁止转载本站文章。
原文出处:兰玉磊的个人博客
原文链接:https://www.fdevops.com/2020/09/05/k8s-4714
版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。

发表评论

邮箱地址不会被公开。 必填项已用*标注