从零开始入门 K8s| 阿里技术专家详解 K8s 核心概念
Kubernetes 的架构
Kubernetes 架构是一个比较典型的二层架构和 server-client 架构。Master 作为中央的管控节点,会去与 Node 进行一个连接。所有 UI 的、clients、这些 user 侧的组件,只会和 Master 进行连接,把希望的状态或者想执行的命令下发给 Master,
Master 会把这些命令或者状态下发给相应的节点,进行最终的执行。Node 用于托管正在运行的应用。
可以是一个虚拟机或者物理机,它在Kubernetes集群中充当工作机器的角色,
每个Node都有Kubelet,它管理Node而且是Node与Master通信的代理,
Node还具有用于处理容器操作的工具,例如Docker或rkt。
![在这里插入图片描述](https://img.php1.cn/3cd4a/1eebe/cd5/2fdc212433a29829.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzg3MTY3OA==,size_16,color_FFFFFF,t_70)
Kubernetes 的 Master 包含四个主要的组件:API Server、Controller、Scheduler 以及 etcd。如下图所示:**API Server:**
顾名思义是用来处理 API 操作的,Kubernetes 中所有的组件都会和 API Server 进行连接,
组件与组件之间一般不进行独立的连接,都依赖于 API Server 进行消息的传送;**Controller:**
是控制器,它用来完成对集群状态的一些管理。
比如刚刚我们提到的两个例子之中,第一个自动对容器进行修复、第二个自动进行水平扩张,
都是由 Kubernetes 中的 Controller 来进行完成的;**Scheduler:**
是调度器,“调度器”顾名思义就是完成调度的操作,
就是我们刚才介绍的第一个例子中,把一个用户提交的 Container,依据它对 CPU、对 memory 请求大小,找一台合适的节点,进行放置;**etcd:**
是一个分布式的一个存储系统,API Server 中所需要的这些原信息都被放置在 etcd 中,
etcd 本身是一个高可用系统,通过 etcd 保证整个 Kubernetes 的 Master 组件的高可用性。
基础概念
K8S全称kubernetes,是一个容器编排系统。Kubernetes 有如下几个核心的功能:
1、服务的发现与负载的均衡;
2、容器的自动装箱,我们也会把它叫做 scheduling,就是“调度”,
把一个容器放到一个集群的某一个机器上,Kubernetes 会帮助我们去做存储的编排,让存储的声明周期与容器的生命周期能有一个连接;
3、Kubernetes 会帮助我们去做自动化的容器的恢复。
在一个集群中,经常会出现宿主机的问题或者说是 OS 的问题,导致容器本身的不可用,Kubernetes 会自动地对这些不可用的容器进行恢复;
4、Kubernetes 会帮助我们去做应用的自动发布与应用的回滚,以及与应用相关的配置密文的管理;
5、对于 job 类型任务,Kubernetes 可以去做批量的执行;
6、为了让这个集群、这个应用更富有弹性,Kubernetes 也支持水平的伸缩。下面,我们希望以三个例子跟大家更切实地介绍一下 Kubernetes 的能力。
1、调度
Kubernetes 可以把用户提交的容器放到 Kubernetes 管理的集群的某一台节点上去。
Kubernetes 的调度器是执行这项能力的组件,它会观察正在被调度的这个容器的大小、规格。
比如说它所需要的 CPU以及它所需要的 memory,然后在集群中找一台相对比较空闲的机器来进行一次 placement,也就是一次放置的操作。
在这个例子中,它可能会把红颜色的这个容器放置到第二个空闲的机器上,来完成一次调度的工作。
![在这里插入图片描述](https://img.php1.cn/3cd4a/1eebe/cd5/d34245582687a4e6.webp?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzg3MTY3OA==,size_16,color_FFFFFF,t_70)
2、自动修复
Kubernetes 有一个节点健康检查的功能,它会监测这个集群中所有的宿主机,
当宿主机本身出现故障,或者软件出现故障的时候,这个节点健康检查会自动对它进行发现。
下面 Kubernetes 会把运行在这些失败节点上的容器进行自动迁移,
迁移到一个正在健康运行的宿主机上,来完成集群内容器的一个自动恢复。
![在这里插入图片描述](https://img.php1.cn/3cd4a/1eebe/cd5/d84f9786330d9e41.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzg3MTY3OA==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img.php1.cn/3cd4a/1eebe/cd5/60405fda58cd0acd.webp?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzg3MTY3OA==,size_16,color_FFFFFF,t_70)
3、水平伸缩
Kubernetes 有业务负载检查的能力,它会监测业务上所承担的负载,
如果这个业务本身的 CPU 利用率过高,或者响应时间过长,它可以对这个业务进行一次扩容。
比如说在下面的例子中,黄颜色的过度忙碌,Kubernetes 就可以把黄颜色负载从一份变为三份。
接下来,它就可以通过负载均衡把原来打到第一个黄颜色上的负载平均分到三个黄颜色的负载上去,以此来提高响应的时间。
![在这里插入图片描述](https://img.php1.cn/3cd4a/1eebe/cd5/8373b1277127c518.webp?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzg3MTY3OA==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img.php1.cn/3cd4a/1eebe/cd5/857a46d091981bac.webp?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzg3MTY3OA==,size_16,color_FFFFFF,t_70)
Kubernetes 的 Node 是真正运行业务负载的,每个业务负载会以 Pod 的形式运行。
核心概念
第一个概念:Pod
Pod 是 Kubernetes 的一个最小调度以及资源单元。
用户可以通过 Kubernetes 的 Pod API 生产一个 Pod,让 Kubernetes 对这个 Pod 进行调度,
也就是把它放在某一个 Kubernetes 管理的节点上运行起来。一个 Pod 简单来说是对一组容器的抽象,它里面会包含一个或多个容器。比如像下面的这幅图里面,它包含了两个容器,每个容器可以指定它所需要资源大小。比如说,一个核一个 G,或者说 0.5 个核,0.5 个 G。当然在这个 Pod 中也可以包含一些其他所需要的资源:
比如说我们所看到的 Volume 卷这个存储资源;
比如说我们需要 100 个 GB 的存储或者 20GB 的另外一个存储。在 Pod 里面,我们也可以去定义容器所需要运行的方式。
比如说运行容器的 Command,以及运行容器的环境变量等等。
Pod 这个抽象也给这些容器提供了一个共享的运行环境,它们会共享同一个网络环境,
这些容器可以用 localhost 来进行直接的连接。而 Pod 与 Pod 之间,是互相有 isolation 隔离的。
![在这里插入图片描述](https://img.php1.cn/3cd4a/1eebe/cd5/d84f9786330d9e41.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzg3MTY3OA==,size_16,color_FFFFFF,t_70)
第二个概念:Volume
Volume 就是卷的概念,它是用来管理 Kubernetes 存储的,
是用来声明在 Pod 中的容器可以访问文件目录的,一个卷可以被挂载在 Pod 中一个或者多个容器的指定路径下面。
而 Volume 本身是一个抽象的概念,一个 Volume 可以去支持多种的后端的存储。
比如说 Kubernetes 的 Volume 就支持了很多存储插件,它可以支持本地的存储,可以支持分布式的存储,比如说像 ceph,GlusterFS ;
它也可以支持云存储,比如说阿里云上的云盘、AWS 上的云盘、Google 上的云盘等等。
![在这里插入图片描述](https://img.php1.cn/3cd4a/1eebe/cd5/bcafc120671304eb.webp?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzg3MTY3OA==,size_16,color_FFFFFF,t_70)
第三个概念:Deployment
Deployment 是在 Pod 这个抽象上更为上层的一个抽象,它可以定义一组 Pod 的副本数目、以及这个 Pod 的版本。
一般大家用 Deployment 这个抽象来做应用的真正的管理,而 Pod 是组成 Deployment 最小的单元。Kubernetes 是通过 Controller,也就是我们刚才提到的控制器去维护 Deployment 中 Pod 的数目,
它也会去帮助 Deployment 自动恢复失败的 Pod。比如说我可以定义一个 Deployment,这个 Deployment 里面需要两个 Pod,
当一个 Pod 失败的时候,控制器就会监测到,它重新把 Deployment 中的 Pod 数目从一个恢复到两个,通过再去新生成一个 Pod。
通过控制器,我们也会帮助完成发布的策略。比如说进行滚动升级,进行重新生成的升级,或者进行版本的回滚。
![在这里插入图片描述](https://img.php1.cn/3cd4a/1eebe/cd5/ed19db63ee478b98.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzg3MTY3OA==,size_16,color_FFFFFF,t_70)
第四个概念:Service
Service 提供了一个或者多个 Pod 实例的稳定访问地址。
比如在上面的例子中,我们看到:一个 Deployment 可能有两个甚至更多个完全相同的 Pod。
对于一个外部的用户来讲,访问哪个 Pod 其实都是一样的,所以它希望做一次负载均衡,
在做负载均衡的同时,我只想访问某一个固定的 VIP,也就是 Virtual IP 地址,而不希望得知每一个具体的 Pod 的 IP 地址。我们刚才提到,这个 pod 本身可能 terminal go(终止),如果一个 Pod 失败了,可能会换成另外一个新的。对一个外部用户来讲,提供了多个具体的 Pod 地址,这个用户要不停地去更新 Pod 地址,
当这个 Pod 再失败重启之后,我们希望有一个抽象,把所有 Pod 的访问能力抽象成一个第三方的一个 IP 地址,
实现这个的 Kubernetes 的抽象就叫 Service。实现 Service 有多种方式,Kubernetes 支持 Cluster IP,
上面我们讲过的 kuber-proxy 的组网,它也支持 nodePort、 LoadBalancer 等其他的一些访问的能力。
![在这里插入图片描述](https://img.php1.cn/3cd4a/1eebe/cd5/d84f9786330d9e41.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzg3MTY3OA==,size_16,color_FFFFFF,t_70)
第五个概念:Namespace
Namespace 是用来做一个集群内部的逻辑隔离的,它包括鉴权、资源管理等。
Kubernetes 的每个资源,比如刚才讲的 Pod、Deployment、Service 都属于一个 Namespace,
同一个 Namespace 中的资源需要命名的唯一性,不同的 Namespace 中的资源可以重名。
Namespace 一个用例,比如像在阿里巴巴,我们内部会有很多个 business units,
在每一个 business units 之间,希望有一个视图上的隔离,并且在鉴权上也不一样,
在 cuda 上面也不一样,我们就会用 Namespace 来去给每一个 BU 提供一个他所看到的这么一个看到的隔离的机制。
![在这里插入图片描述](https://img.php1.cn/3cd4a/1eebe/cd5/8ad8f3bf8da691df.webp?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzg3MTY3OA==,size_16,color_FFFFFF,t_70)
搭建环境
搭建参考这篇文章