Kubernetes(k8s)概述(背景 价值 目的 原理)

概念

Kubernetes(K8S)是一个可移植的,可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。它拥有一个庞大且快速增长的生态系统。Kubernetes的服务,支持和工具广泛可用

背景

k8s的前身是Google公司内部使用的borg,于2014年开源,由go语言写成。在这之前也有一些资源管理器,比如Twitter之前使用的Mesos,Docker自带的swarm等等

价值

传统部署时代: 早期,组织在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况,结果,另一个应用程序的性能将下降。一个解决方案是在不同的物理服务器上运行每个应用程序。但这并没有随着资源利用不足而扩展,并且组织维护许多物理服务器的成本很高。

虚拟化部署时代:作为解决方案,引入了虚拟化。它允许您在单个物理服务器的CPU上运行多个虚拟机(VM)。虚拟化允许在VM之间隔离应用程序,并提供安全级别,因为一个应用程序的信息不能被另一应用程序自由访问。
虚拟化可以更好地利用物理服务器中的资源,并可以实现更好的可伸缩性,因为可以轻松地添加或更新应用程序,降低硬件成本等。借助虚拟化,可以将一组物理资源呈现为一组一次性虚拟机。
每个VM都是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。

容器部署时代:容器类似于VM,但是它们具有轻松的隔离属性,可以在应用程序之间共享操作系统(OS)。因此,容器被认为是轻质的。与VM相似,容器具有自己的文件系统,CPU,内存,进程空间等。由于它们与基础架构分离,因此可以跨云和OS分发进行移植。
在这里插入图片描述
容器的出现让大家的应用部署更加方便,但是一些问题也随之而来
使用容器化封装应用程序的缺点
单机使用,无法集群
随着容器数量的上升,管理成本上升
没有有效的容灾、自愈机制
没有预设编排模板,无法实现快速大规模容器调度
没有统一的配置管理中心工具
没有容器生命周期的管理工具
没有图形化运维管理工具
等等

这些问题一直困扰着开发人员

而Google作为一家从事大规模生产工作负载互联网公司,它旗下的产品morg有着吩咐的经验和实践,随着需求的大量提高,开源k8s体现了它的真正价值

目的

容器是捆绑和运行应用程序的好方法。
在生产环境中,需要管理运行应用程序的容器,并确保没有停机时间。
例如,如果一个容器发生故障,则需要启动另一个容器。如果由系统处理此行为,会不会更容易?
这就是Kubernetes的救援方法!Kubernetes提供了一个可弹性运行分布式系统的框架。
它负责应用程序的扩展和故障转移,提供部署模式等。

Kubernetes特点:

1.服务发现和负载平衡
Kubernetes可以使用DNS名称或使用其自己的IP地址公开容器。如果到容器的流量很高,Kubernetes可以负载平衡并分配网络流量,从而使部署稳定。
2.存储编排
Kubernetes允许自动挂载您选择的存储系统,例如本地存储,公共云提供商等。
3.自动部署和回滚
您可以使用Kubernetes为部署的容器描述所需的状态,并且可以以受控的速率将实际状态更改为所需的状态。例如,可以自动化Kubernetes来为部署创建新容器,删除现有容器并将其所有资源用于新容器。
4.自动垃圾箱打包
Kubernetes提供了一个节点集群,可用于运行容器化任务。可以自由设定Kubernetes每个容器需要多少CPU和内存(RAM)。Kubernetes可以将容器安装到节点上,以充分利用资源
5.自我修复
Kubernetes会重启失败的容器,替换容器,杀死对用户定义的运行状况检查没有响应的容器,并且在准备好服务之前不会将其通告给客户端
6.秘密和配置管理
Kubernetes允许存储和管理敏感信息,例如密码,OAuth令牌和SSH密钥。可以部署和更新机密和应用程序配置,而无需重建容器映像,也无需在堆栈配置中公开机密

此外,Kubernetes不是一个传统的,包罗万象的PaaS(平台即服务)系统。由于Kubernetes在容器级别而非硬件级别运行,因此它提供了PaaS产品共有的一些普遍适用的功能,例如部署,扩展,负载平衡,并允许用户集成其日志记录,监视和警报解决方案。但是,Kubernetes并不是单片的,并且这些默认解决方案是可选的和可插入的。Kubernetes提供了构建开发人员平台的基础,但是在重要的地方保留了用户的选择和灵活性。

原理

组件

在这里插入图片描述

主节点Master

控制平面的组件对集群做出全局决策(比如调度),以及检测和响应集群事件

kube-apiserver

主节点上负责提供 Kubernetes API 服务的组件;它是 Kubernetes 控制面的前端,是所有服务访问的同一入口
kube-apiserver 在设计上考虑了水平扩缩的需要。 换言之,通过部署多个实例可以实现扩缩

etcd

etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库
在这里插入图片描述

kube-scheduler

主节点上的组件,该组件监视那些新创建的未指定运行节点的 Pod,并选择节点让 Pod 在上面运行

kube-controller-manager

节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应
副本控制器(Replication Controller): 负责为系统中的每个副本控制器对象维护正确数量的 Pod
端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)
服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌

cloud-controller-manager

节点控制器(Node Controller): 用于检查云提供商以确定节点是否在云中停止响应后被删除
路由控制器(Route Controller): 用于在底层云基础架构中设置路由
服务控制器(Service Controller): 用于创建、更新和删除云提供商负载均衡器
数据卷控制器(Volume Controller): 用于创建、附加和装载卷、并与云提供商进行交互以编排卷

计算节点Node

节点组件在每个节点上运行,维护运行的 Pod 并提供 Kubernetes 运行环境

kubelet

一个在集群中每个节点上运行的代理。它保证容器都运行在 Pod 中
kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。简单来说就是直接跟容器引擎交互实现容器的生命周期管理

kube-proxy

kube-proxy 是集群中每个节点上运行的网络代理,实现 Kubernetes Service 概念的一部分。
kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。
如果操作系统提供了数据包过滤层并可用的话,kube-proxy会通过它来实现网络规则。否则,kube-proxy 仅转发流量本身

Pod

Pod 是 Kubernetes 应用程序的基本执行单元,即它是 Kubernetes 对象模型中创建或部署的最小和最简单的单元。Pod 表示在 集群 上运行的进程

Pod 封装了应用程序容器(或者在某些情况下封装多个容器)、存储资源、唯一网络 IP 以及控制容器应该如何运行的选项。 Pod 表示部署单元:Kubernetes 中应用程序的单个实例,它可能由单个 容器 或少量紧密耦合并共享资源的容器组成。
Docker 是 Kubernetes Pod 中最常用的容器运行时,但 Pod 也能支持其他的容器运行时

Kubernetes 集群中的 Pod 可被用于以下两个主要用途:
运行单个容器的 Pod。"每个 Pod 一个容器"模型是最常见的 Kubernetes 用例;在这种情况下,可以将 Pod 看作单个容器的包装器,并且 Kubernetes 直接管理 Pod,而不是容器
运行多个协同工作的容器的 Pod。 Pod 可能封装由多个紧密耦合且需要共享资源的共处容器组成的应用程序。 这些位于同一位置的容器可能形成单个内聚的服务单元 —— 一个容器将文件从共享卷提供给公众,而另一个单独的“挂斗”(sidecar)容器则刷新或更新这些文件。 Pod 将这些容器和存储资源打包为一个可管理的实体。 Kubernetes 博客 上有一些其他的 Pod 用例信息
Pod 被设计成支持形成内聚服务单元的多个协作过程(作为容器)。 Pod 中的容器被自动的安排到集群中的同一物理或虚拟机上,并可以一起进行调度。 容器可以共享资源和依赖、彼此通信、协调何时以及何种方式终止它们。

在这里插入图片描述

工作原理

1.用户通过kubectl或者API server的REST API接口,提交需要运行的docker容器(创建pod请求)
2.api server将创建pod的相关请求数据存储到etcd(存储中心)中
3.scheduler监听API server,查询还未分配的Node的Pod,然后根据调度策略为这些Pod分配节点
4.kube-let则负责在所在的Node节点上接收主节点发来的指令,管理Pod以及Pod中的容器,并定时向master主节点汇报节点资源的使用情况以及容器的情况
5.controller-manager 则通过api-service监控整个集群的状态,并确保集群处于预期的工作状态

猜你喜欢

转载自blog.csdn.net/qq_46595591/article/details/107499348