查看原文
其他

8图架构图,带大家穿透K8S,实现K8S自由(含视频)

40岁老架构师尼恩 技术自由圈 2024-03-25

说在前面:

现在拿到offer超级难,甚至连面试电话,一个都搞不到。

尼恩的技术社群(50+)中,很多小伙伴凭借 “左手云原生+右手大数据”的绝活,拿到了offer,并且是非常优质的offer,据说年终奖都足足18个月。

而云原生的核心组件是 K8S,但是 K8S 又很难。

市面上很多的pdf和视频,都是从技术角度来说的,讲的晦涩难懂。

在这里,尼恩从架构师视角出发,利用8张图+视频,对K8S的核心原理做一个宏观的介绍。

带大家穿透K8S,实现K8S自由,让大家不迷路。

注:本文以 PDF 持续更新,最新尼恩 架构笔记、面试题 的PDF文件,点这里获取

本文K8S的学习视角:不是普通的视角

尼恩从架构师视角,带大家通过8个图,穿透K8S,实现K8S自由

图0:K8S 的宏观组件架构图

图1:K8S 业务架构图

图2:K8S 元数据架构图

图3:K8S 容器管理流程架构

图4:容器元数据的数据传输架构

图5:容器对外暴露架构图

图6:总的架构图

图7:master 上 APIServer 内部架构图

图8:worker上 kubelet 内部架构图

视频参见视频号: 40岁老架构师-尼恩2

K8S的核心价值:带领大家从 容器管理的石器时代,进入工业时代

首先,回顾一下, 在石器时代,我们是怎么管理容器的:

  • docker 命令  (石器时代早期)
  • docker 编排  (石器时代晚期期)

图0:K8S 的宏观组件架构图

K8S,是一个围绕容器打造的分布式系统,和其他的分布式系统比如rocketmq、kafka、elasticsearch,其实宏观上非常类似

两个大组件:

  • master :集群管理+元数据管理
  • worker(node):容器的生命周期管理

master上的主要组件是 api-server + 一大堆的控制器

node上主要的组件就是  kubelet (容器管理)+   kube-proxy(流量负载均衡)

具体介绍,请参见前面的视频。

图1:K8S 业务架构图

在尼恩的 3高架构知识宇宙中, 系统的架构,都是从业务架构开始的。

K8S 业务架构:

  • 容器元数据管理    (管理镜像地址、资源信息、部署的副本数量、部署的节点信息,对外暴露的端口信息等等)
  • 容器什么周期管理 ( 管死管生管过程)

具体如下:

具体介绍,请参见前面的视频。

图2:K8S 元数据架构图

包括:镜像地址、资源信息、部署的副本数量、部署的节点信息,对外暴露的端口信息等等

Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器Service:pod对外服务的统一入口,下面可以维护者同一类的多个podLabel:标签,用于对pod进行分类,同一类pod会拥有相同的标签

Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行

Replication Controller

Replication Controller 保证了在所有时间内,都有特定数量的Pod副本正在运行,如果太多了,Replication Controller就杀死几个,如果太少了,Replication Controller会新建几个。

和直接创建的pod不同的是,Replication Controller会替换掉那些删除的或者被终止的pod,不管删除的原因是什么(维护阿,更新啊,Replication Controller都不关心)。

基于这个理由,我们建议即使是只创建一个pod,我们也要使用Replication Controller。

Replication Controller 就像一个进程管理器,监管着不同node上的多个pod,而不是单单监控一个node上的pod,Replication Controller 会委派本地容器来启动一些节点上服务(Kubelet ,Docker)。

ReplicaSet

ReplicaSet是下一代复本控制器。ReplicaSet和 Replication Controller之间的唯一区别是现在的选择器支持。Replication Controller只支持基于等式的selector(env=dev或environment!=qa),但ReplicaSet还支持基于集合的selector(version in (v1.0, v2.0)或env notin (dev, qa))。

在使用时官方推荐ReplicaSet。

Deployment

为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用。

典型的应用场景包括:

  • 定义Deployment来创建Pod和ReplicaSet
  • 滚动升级和回滚应用
  • 扩容和缩容
  • 暂停和继续Deployment

具体介绍,请参见前面的视频。

图3:K8S 容器管理流程架构

从容器管理的入口, 到最终容器的创建, 具体流程如下图所示:

第一步:用户向APIServer (数据总线)提交一份 部署文件,里边有用户视角的 容器元数据信息

第一步:APIServer 通知 一系列的控制器进行 部署文件处理, 得到最终的  元数据 对象,也就是 资源对象,持久化到 etcd,并且发布到 Node节点的 kubelet组件

第三部:Node节点的 kubelet组件判断是否属于自己管理的容器,如果是,则进行容器的创建

创建容器时,主要用到下面三个接口

(1)CRI(Container Runtime Interface):

容器运行时接口,提供计算资源。

kubernetes1.5版本之后,kubernetes项目推出了自己的运行时接口api–CRI(container runtime interface)。

(2)CNI(Container Network Interface)

容器网络接口,提供网络资源。

是和 CoreOS 主导制定的容器网络标准,它本身并不是实现或者代码,可以理解成一个协议。CNI旨在为容器平台提供网络的标准化。容器平台可以从CNI获取到满足网络互通条件的网络参数(如IP地址、网关、路由、DNS等)。

(3)CSI(Container Storage Interface):

容器存储接口,提供存储资源。

由 kubernetes、Mesos、Docker 等社区成员联合制定的一个行业标准接口规范,旨在将任意存储系统暴露给容器化应用程序。

kubernetes 1.9 版为alpha阶段-->kubernetes 1.10版为beta阶段-->kubernetes 1.13 GA。

具体介绍,请参见前面的视频。

图4:容器元数据的数据传输架构

内部的 api server 和 kublet 客户端 组件之间, 通过 长短链接 相结合的方式,完成高性能数据传输:

  • 长连接:进行增量元数据 推送 ,  推模式
  • 短连接:进行全量元数据 拉取 ,  推模式

具体介绍,请参见前面的视频。

图5:容器对外暴露架构图

两个阶段:

  • 元数据对象创建的阶段:完成容器的选择, 容器清理的建立,以及端口的映射
  • 流量路由阶段:由 kube-proxy组件 进行 流量的分发,和 pod 之间的负载均衡

具体介绍,请参见前面的视频。

图6:总的架构图

有了前面的基础之后,来一个总的架构图

K8S,是一个围绕容器打造的分布式系统,和其他的分布式系统比如rocketmq、kafka、elasticsearch,其实宏观上非常类似

两个大组件:

  • master :集群管理+元数据管理
  • worker(node):容器的生命周期管理

master上的主要组件是 api-server + 一大堆的控制器

node上主要的组件就是  kubelet (容器管理)+   kube-proxy(流量负载均衡)

另外通过etcd 进行元数据的持久化。

具体介绍,请参见前面的视频。

图7:master 上APIServer 内部架构图

Kube-APIServer是Kubernetes最重要的核心组件之一,主要提供以下功能:

  • 提供集群管理的RESTAPI接口,包括∶认证Authentication、 授权Authorization、准入Admission(Mutating&Valiating)。

  • 提供其他模块之间的数据交互和通信的枢纽(其他模块通过APIServer查询或修改数据,只有APIServer才直接操作etcd)。

  • APIServer提供etcd数据缓存以减少集群对etcd的访问。

APIServer对请求的处理流程,采用了类似 责任链 模式的架构, 由很多的处理器组成:

(1)APIHandler:APIServer 本质上是一个 RestServer,那么就需要注册不同对象的Handler

(2)AuthN:认证,除了可以使用Kubernetes 自带的认证机制外,还可以使用 webhook自己定义一些认证机制。当配置了外部的认证机制后,认证请求就可以被转发到外部去,这样就可以去集成企业统一的认证平台

(3)Rate Limit:限流

(4)Auditing:审计,所有的操作都会生成一条日志记录

(5)AuthZ:认证,可以使用 k8s 自带的 RBAC(role-base access control),也可以使用 webhook 自定义

(6)Aggregator:

可以像 nginx 一样做路由配置,如果 APIServer 是标准的 K8S APIServer,就会走默认的 K8S APIServer,包括Mutating、Validation等;

如果是自定义的 APIServer,就会走Aggregated APIServer(自定义、独立部署的 APIServer),包括自定义的Mutating、Validation等。

(7)Mutating:变形,可以加一些属性

(8)Validating:验证,加完属性后再做一些验证

图8:worker上 kubelet内部架构图

Kubelet 将 容器运行时, 容器网络和   容器存储抽象成了CRI,CNI,CSI。

主要的工作为:

(1)Kubelet 是node上 Kubernetes的初始化系统(init system)

(2)Kubelet 从不同源获取Pod清单,并按需求启停Pod的核心组件:

  • 可从本地文件目录获取Pod 清单

  • 从给定的HTTPServer或Kube-APIServer等源头获取Pod 清单;

(3)Kubelet负责汇报当前节点的资源信息和健康状态;

(4)Kubelet负责Pod的健康检查和状态汇报。

有关K8S 技术自由,更多的内容请参见

  • 《尼恩 K8S  学习圣经》
  • 前面视频末尾,所提到到的 配套  pdf 电子书
  • 尼恩Java 面试宝典里边 的 K8S 面试真题,含几个核心 的大厂真题


End





硬核文章推荐            

大厂Boy在用的Linux命令大全:2万字实现Linux自由

网络三张表:ARP表, MAC表, 路由表,实现你的网络自由!!

阿里一面:谈一下你对DDD的理解?2W字,帮你实现DDD自由

尼恩 响应式圣经:10W字,实现Spring响应式编程自由

尼恩 Disruptor 红宝书

尼恩 Caffeine 红宝书

全链路异步,含 Hystrix 熔断+ Webflux+ Lettuce 响应式CacheAside+ Dubbo 异步RPC

顶级、一流的Java 轮子 项目,在这 !!



硬核电子书            

👍尼恩Java面试宝典》(极致经典,不断升级)全网下载超过300万次

👍尼恩Java高并发三部曲:全网下载超过200万次



👍《顶级3高架构行业案例 + 尼恩架构笔记 》N 篇+,不断添加

👍100份简历模板

继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存