Skip to content

K8S官网:https://kubernetes.io/

K8S中文文档:https://kubernetes.io/zh-cn/docs/home/

1.kubernetes简介

1.1 Kubernetes是什么

Kubernetes是一个可移植、可扩展的“分布式开源平台",这个平台主要是用来管理我们运行的容器化应用,只不过这个平台它是一个分布式的,那Kubernetes这个分布式平台是如何实现的呢。Kubernetes是将多个0S节点组织在一起,构建出一个庞大的虚拟资源池,而后对用户提供操作该集群的接口,用户就可以通过Kubernetes提供的对应接口对容器进行增删查改等操作。所以对于用户而言,它无需关心Kubernetes底层是如何对容器进行的创建、又是如何调度到对应的节点的,它只需要专注于自己的业务逻辑代码开发即可;

image-20231219223630003

当我们需要使用Kubernetes交付应用时,仅需要通过yaml文件的方式来描述对应容器的状态,Kubernetes则会按照yaml文件中所描述的容器状态信息;进行容器的"自动化"创建。

image-20231219223944449

Kubernetes会时刻监控着容器的状态,如果有容器故障,则会尝试重启容器,使其能容器运行的状态能达到用户所期望的值

1.2 为什么需要Kubernetes

目前使用容器打包和运行应用程序,已经是业界主流的一种方式,在生产环境中,我们需要管理运行应用程序的容器,同时还要确保它不会停机,

例:一个容器发生故障,需要重新拉起该容器。如果系统能自动为其处理,那么容器的管理会不会更加的容易

这就是Kubernetes需要解决的问题!Kubernetes它可以轻松的实现应用的扩展、服务发现、负载均衡、容器的故障转移、以及容器编排等。

  • 垂直扩容:新的服务器节点能够很容易的进行增加和删除。
  • 水平扩容:容器实例能通过副本控制器进行轻松的扩容,
  • 缩容弹性伸缩:能根据容器的资源使用情况,进行自动的扩缩容
  • 服务发现和负载均衡:Kubernetes为容器提供负载均衡功能进行流量调度,从而使得应用运行更加稳定。
  • 存储编排:Kubernetes允许自动挂载各种存储类系统,例如本地存储、NFS、GFS、Ceph、公共云存储等。
  • 自动部署和回滚:如果应用部署过程中出现错误,可以实现自动回滚
  • 自动完成装箱计算:Kubernetes允许指定每个容器所需的CPU和内存资源,能够更好的管理容器的资源使用。
  • 自我修复:Kubernetes 会重新启动失败的容器、替换容器、对运行状况检查不响应的容器进行杀死
  • 密钥与配置管理:Kubernetes允许你存储和管理敏感信息,例如密码、令牌和SSh 密钥。可以在不重建容器镜像的情况下,部署和更新密钥

1.3 Kubernetes不是什么

Kubernetes不是传统的、包罗万象的PaaS(平台即服务)系统。它提供了PaaS产品共有的一些普遍适用的功能,例如部署、扩展、负载均衡、日志记录和监视。Kubernetes默认解决方案都是可选和可插拔的。但在重要的地方保留了用户的选择和灵活性。

Kubernetes:

  • 不限制支持的应用程序类型:如果只要应用程序可以在容器中运行,那么它应该可以在 Kubernetes上很好地运行。
  • 不部署源代码,也不构建你的应用程序:CI/CD工作流取决于组织的文化和偏好以及技术要求。
  • 不提供应用程序级别的服务作为内置服务:例如中间件(例如,消息中间件)、数据处理框架(例如,Spark)、数据库(例如,mysqL)、缓存、集群存储系统(例如,Ceph)。但这些组件都可以在 Kubernetes 上运行
  • 不要求日志记录、监视或警报解决方案它提供了一些集成作为概念证明,并提供了收集和导出指标的机制。
  • 不提供或不要求配置语言/系统:它提供了声明性API,该声明性API可以由任意形式的声明性规范所构成。RESTfuL;不提供也不采用任何的机器配置、维护、管理或自我修复系统

1.4 Kubernetes集群角色

Kubernetes集群需要建立在多个物理主机上,将多个物理主机的资源抽象出来,组织成一个平台,而后进行统一管理,当然它需要多个物理主机,不一定必须是物理机,也可以是虚拟机VM等等;所以从这个角度来说,Kubernetes是一个集群,但是在Kubernetes集群内部,这些节点又被划分成了两类角色;

  • 一类角色为主节点,叫Master,负责管理集群;
  • 一类角色为工作节点,叫Node,负责运行应用;

这也就意味着我们将来运行的所有容器,都应该运行在Node节点,而Master负责管理有多少个Node节点,同时还负责管理每个Node节点应该运行哪个容器或哪些容器,的控制中心,因此在Kubernetes中Master被称之为Control plane控制平面,而Node就是我们的dataplane叫数据平面;

image-20231219225024388

Registry:Kubernetes主要是在Node上运行容器化应用,那么容器化应用需要依托镜像,而镜像又来自于Registry,但Registry并不是Kubernetes集群的组成部分,但我们必须要有一个私有的Registry,当然也可以使用公共的镜像仓库;

CLient:无论客户端是通过API接口,还是WebUI接口、异或者CLI接口与Master交互,其实都是向Master发送请求,比如客户端申请创建容器、删除容器等,都是由Master负责在Node节点上对容器进行增删改查,而这些操作必须要通过Master,由Master控制着完成的,虽然我们将其称Master,但它并非是一个组件,而是由多个组件组成的;

2.Kubernetes集群组件

通过创建一个Pod或者DepLoyment资源来了解Kubernetes集群组件以及之间的关系。

image-20231219225248703

2.1 Master节点组件

集群的控制节点,负责整个集群的管理和控制,kubernetes的所有的命令基本都是发给Master,由它来负责具体的执行过程

2.1.1 kube-APIServer

Kubernetes API主要提供前端请求接入,然后验证客户端身份,以及客户端提交的请求。所有的组件都必须通过APIServer进行交互;--->(资源增删改查的入口)

2.1.2 Kube-Scheduler

负责监视APIServer新创建,但未指定运行至哪个节点的Pod,然后选择合适的节点让Pod在上面运行;调度决策考虑的因素有很多,其中有Pod亲和性、反亲和、节点亲和、数据位置、等--->负责资源调度(Pod调度)

2.1.3 Kube-ControllManager

控制器通过APIServer监控集群当前运行的容器状态,当控制器监控到运行的容器状态不符合期望状态时,控制器会致力于将当前状态转变为期望的状态,简单来说就是自动调节当前系统运行状态;控制循环的例子:房间里的温度自动调节器。当你设置了温度,告诉了温度自动调节器你的期望状态 (DesiredState)。房间的实际温度是**当前状态 (Current State)**通过对设备的控制,温度自动调节器让其当前状态接近期望状态。--->资源对象的大总管

这些控制器包括:

  • 节点控制器:(NodeControLler):负责在节点出现故障时进行通知和响应;
  • 副本控制器(ReplicaSetController):监视容器运行的副本,时刻让其维持期望状态;
  • 任务控制器(JobcontrolLer):监测一次性任务的Job对象,然后创建Pods来运行这些任务直至完成;
  • ...

2.2Node节点组件

Node是集群的工作负载节点,默认情况kubelet会向Master注册自己,一旦Node被纳入集群管理范围,kubelet会定时向Master汇报自身的情报,包括操作系统,Docker版本,机器资源情况等。

如果Node超过指定时间不上报信息,会被Master判断为“失联”,标记为Not Ready,随后Master会触发Pod转移

2.2.1 Kube-kubelet

kubelet 是集群中每个Node节点上运行的代理程序,用于接收APIServer提供给它的PodSpecs,确保这些PodSpecs中描述的容器处于运行状态且健康,主要作用就是管理容器的启动、停止、销毁、重建等;--->Pod的管家,与Master通信

2.2.2 Kube-kubeproxy

kube-proxy是集群中每个节点上运行的网络代理,它主要维护每台节点上的Iptables、IPVS规则创建和删除,这些规则允许从集群内部或集群外部与Pod进行网络通信;

kube-proxy负责实现容器的负载均衡,然后将指定的流量调度到对应的容器,通过iptables 或 ipvs规则来实现;--->实现kubernetes Service的通信与负载均衡机制的重要组件

2.2.3 ContainerRuntime

容器运行环境是负责运行容器的软件,Kubernetes支持容器运行时,比如DockerContainerd等;

2.3附加组件

2.3.1 CoreDNS

每创建一个内部负载均衡,则自动创建一条对应的DNS记录,这样就可以让Pod通过域名的方式访问对应的负载均衡;因为k8s分配的负载均衡IP不稳定,删除和添加都会发生变化,但如果分配一个稳定的DNS名称,则无需关系负载均衡的IP;

2.3.2 network

网络插件,为每个Pod分配一个IP地址,确保多个不同节点的Pod能够直接通信,而无需经过NAT地址转换等;

2.3.3 Dashboard

为Kubernetes提供图形界面,通过图形界面管理Kubernetes;

2.4 组件流程图

image-20240523214336841