背景
在2022年,k8s已经是每一位程序员不得不了解的东西,不论是前端、后端、运维等。那么k8s到底是啥?解决了啥子重要的问题?我到底怎么了解一大堆的官方文档概念呢?于是,这篇系列文章就是通过白话叙述+实际部署的方式和你一起了解一下k8s。
简介
我们知道,在以前我们的应用程序都是部署在一台台物理机上的,笨重,后来有了虚拟机,我们就把应用部署在虚拟机上。但是随着时代的发展,人类这个渣男觉得虚拟机也笨重了,于是docker就孕育而生了(这里不做详细说明),但是我们知道docker也就是在单机里面随便部署,要是涉及一个大型项目需要半个机房的那种,难道我们还一台机器一台机器上部署docker吗?显然是不合适的。那么怎么在多个物理机器中部署应用,然后每个应用之间肯定是要有关联的,包括传输数据啥的,同时还要有一定的抗风险能力(就是所谓的高可用)。不能一台机器挂了,所有的应用都暂停了吧!至少有那种当一台物理机挂了,可以再次启动,并且找别的物理机代替其工作,直到其被人工恢复。
那k8s有哪些能力呢,比如可以连接多台物理机,一键部署应用并且均衡部署到任意一个物理机里、比如可以统一处理请求,通过负载均衡让某个物理机去处理这个应用、比如可以将在所有的物理机之间共享存储、通信、数据等,如果这写问题都解决了,那是不是就可以部署一个超大的应用,至少是可以部署在企业的级别的应用。
概述组件
那知道了k8s是个啥,解决了啥,是不是有点感觉了。知道我要学的是个啥了?现在我再来介绍一下k8s的组成,k8s有哪些东西,这些东西解决了什么问题?首先我们看一个图。这是官网的图,要是我的图不够清晰,各位可以去官网查看
那怎么看这张图呢?这张图我们不应该看每个组件时干嘛的,我们应该看各个组件之间的关系,然后在了解各个组件是干嘛的,有时候我们都是先了解每个组件时干嘛的,然后不清楚各个组件之间的关联,形成不了整体架构的思想,导致渐渐地记住的东西都是死记硬背的,过段时间都忘了,而我写这个文章也是为了自己在回忆一遍,不至于忘得太多😓,
首先我们最先看到的是庚斯博罗灰rgb(230,230,230)(来自前端的严谨)背景的Node
,这个叫做节点
。每个节点就是一台物理机或者虚拟机。我们一下再图中至少看到了3个node
,说明k8s是作用在多台物理机或者虚拟机上(下面统称机器吧)的,我们把这些机器统称集群
。也就是一个k8s部署了一个集群,一个集群由多个节点组成。其实节点也是根据不同的工作角色人为划分一下,分成工作节点
和管理节点
,就像是🏫很多间教室,有的是给孩子上课,有的给👩🏻🏫办公,上课的教室就是工作节点,👩🏻🏫办公室就是管理节点,老师管理学生,一个🏫通常都是上课教室多,办公室少,k8s也是这样。工作节点多,管理节点少。
大家知道什么是节点了,那就来看看节点是如何工作的吧。
Node节点
首先节点就是一台机器,那这个节点中自然可以跑多个容器
,这个没问题吧每个容器就是做自己的事情,大家要注意一点哦。docker是容器运行时的环境。,具体容器里面我们就暂不讨论了。那一个节点有这么多的容器,那么怎么管理呢?怎么让这个容器跑起来呢?这就要介绍第二个组件--kuebelet
了。
kubelet
会在集群中每个节点(node)上运行。 它保证容器(containers)都运行在 Pod 中。
这个是官方的解释,前半句好理解,后半句怎么理解呢?就是说kebelet
会主动的让这些容器启动并且都健康的运行着,要是出现了不健康的容器,这个组件也会尝试重启、修复这些容器。这里k8s做的比较智能吧,你几乎不太需要关心每个容器,你只需要等着kubelet给你反馈就行了,这就像是一个班级的班主任,查看着每个班学生的情况,及时正确定的干预学生的学习。当然,kubelet 不会管理不是由 Kubernetes 创建的容器。
k-proxy和pod
那还有一个组件k-proxy
,proxy这个词大家都比较熟悉,代理的意思,一般与网络有关,而这个组件就是集群中每个节点都会运行的网络代理,就要就是负责维护集群内部和外部的网络会话和pod
进行通信。那什么是pod
内?
Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。
其实为了方便管理容器,k8s将一个或者多个容器称为一个pods,然后这些容器会共享网络,文件存储。就像是拼乐高一样,这样这些容器就像是一个个积木,拼起来的一个单元(可能是一个机器人的✋🏻,头啥的),然后我们直接拿这些✋🏻就可以拼成一个机器人。pod自然是部署在一个个机器上的,我们给每个机器安装k-proxy
组件,就可以在整个集群中控制每个pod的网络了。这就是pod
和k-proxy
。
控制平面组件(Control Plane Components)
上面介绍的这些官方称之为Node组件
,也就是工作节点,那下面我们介绍一个管理节点,有很多称呼啊,比如Master节点
、管理节点
,官方称之为控制平面组件(Control Plane Components)
控制平面节点一般不会运行容器,主要是进行管理操作的,比如资源的查看和调度等全局决策。
api-server
api-server可以公开所有的k8s的api,API 服务器负责提供 HTTP API,以供用户、集群中的不同部分和集群外部组件相互通信,这样几乎所有关于调用k8s的api接口都是使用openapi规范,经过api-server的,而这样一个在服务的实现就是kube-apiserver
组件。
service
大家要注意将api-server
和service
区分开,service是将一组pod的应用程序公开对接网络服务的抽象方法,白话说就是我们将几个pod的定义成一个service,可以统一定义对外开放的端口的等数据。大家很好奇为什么要定义这个service呢,原因是我们知道为了实现高可用,也就是一个pod坏了,我们可以用其他的pod顶上,那这样必然要有一个和这个pod一模一样的副本,这样就可以代替工作,实现高可用,而这些副本的创建都是前面说的的kubelet
做的,万一一个pod坏了,它会自动使用副本来顶替原pod工作,那这样每个pod都有自己的IP,kubelet直接切换pod,那IP怎么处理呢?接口啥的是没法知道你的新的pod的IP是啥。
这个时候就需要service了。我们将几个pod定义成一个service,由这个service统一管理pod的IP,(也就是常说的服务注册
,将每个pod注册到service中,service可以随时找到这些pod的IP,从而实现流量的转发和负载均衡)。
kube-scheduler
图中我们还可以看到一个有一个scheduler
,这个是k8s的调度器。我们之前说到pod是被“智能”的分配到某个机器中运行的。其实就是kube-scheduler
做的这件事。
调度器通过 Kubernetes 的监测(Watch)机制来发现集群中新创建且尚未被调度到节点上的 Pod。 调度器会将所发现的每一个未调度的 Pod 调度到一个合适的节点上来运行。 调度器会依据下文的调度原则来做出调度选择。
这是官网的描述,其中提到了新创建且尚未被调度到节点上的 Pod
这句话,这句话其实就是说kubelet
会创建根据需要(你定义的副本的数量)来始终维持着数量的pod在运行,要是有坏的就及时启动一个补充上。而kube-scheduler
就是负责将这些创建的pod合理分配到不同的机器中运行,这就是kubelet
和kube-scheduler
的配合。
etcd
etcd是一个分布式键值对存储数据库。专门为高可用集群设计的,其本身是独立的,并不是k8s设计的,只是k8s使用到了。
etcd
是兼顾一致性与高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。
这个大家可能比较好理解,毕竟我们知道一些数据是需要存储并检索的,那肯定需要这么一个数据库在进行存储和使用。
kube-controller-manager
这个从名字上就知道了,这个组件是为了控制管理一组pod的。负责运行控制器(controller)进程,而这个控制器到底是干嘛的呢?
我们都知道一个高可用的集群除了要应对风险,还有很多的要求,比如伸缩、滚动升级等需求,伸缩就是可以动态的定义pod的数量,滚动升级就是我们理解的平滑升级,当升级pod的时候,我们不可以直接先删除一个pod,然后创建一个新的,这样会有没有服务的真空期。而controller的存在就是可以实现pod的运维的。controller的具体实现有
- Deployment--这个主要是部署无状态应用的pod,什么是无状态呢,简单理解就是每一个pod都是一样的,没有需要维护的特殊状态,每个服务发送的请求对于服务器而言是一样的。而我们的创建语句就是使用的关键词就是
deployment
,比如kubectl create deployment myDeployment --image=nginx
。 - Stateful,这个就专门部署有状态的pod,所谓的有状态就是保持数据持久化的服务,比如数据库,队列等等服务
- DaemonSet,这个一般用于运行守护进程的,就是每个pod在创建的时候都会运行一个并且在pod结束的时候也会销毁的进程,主要的用途是部署日志采集工作,守护线程,资源监控等工作
每个controller就是将多个pod划分成一个控制器,然后统一管理,所以控制器和pod是多对多的关系,就是一个控制器可以包含多个pod,一个pod可以被多个控制器包含
cloud-controller-manager
这个和上面的一样,只是这个是用于云端的。允许你将你的集群连接到云提供商的 API 之上,这样我们将和云平台打交道的组件和本地的组件区分开,方便管理和运维
总结
以上就是关于白话K8S的第一篇文章,其实主要叙述的就是简单的k8s的组件介绍和每个组件的作用,在支撑k8s这个集群中扮演了什么角色,当然,我所介绍的每个组件其实还没有深入去介绍,在之后的文章里会使用白话的方式详细介绍每个组件的用法。希望大家喜欢!