Kubernetes---基本理论与架构图
Kubernetes或简称k8s,是Google在2014年开源的一个容器集群管理系统;K8s 提供了容器编排、资源调度、弹性伸缩、部署管理,服务发现等一系列功能;这里介绍了K8s具备的特性与相关组件功能
文章目录
前言
Kubernetes是用于管理容器化应用程序集群的工具,在计算机领域中,此过程通常称为编排;
用管弦乐编排比喻上面的服务编排是很恰当的,就像乐队指挥一样,Kubernetes协调地将许多微服务组合在一起构成了应用程序。Kubernetes会自动且持续地监视集群并对其组成进行调整;
了解Kubernetes架构对于部署和维护容器化的应用程序至关重要。
一、什么是Kubernetes
-
Kubernetes或简称k8s,是Google在2014年开源的一个容器集群管理系统;
-
K8s 是一个用于自动执行应用程序部署的系统。现代应用程序分散在云,虚拟机和服务器之间,手动管理应用程序不再是可行的选择。
-
K8s 将虚拟机和物理机转换为统一的API切面。然后,开发人员可以使用Kubernetes API来部署,扩展和管理容器化的应用程序。
-
它的体系结构还为分布式系统提供了一个灵活的框架。K8s为您的应用程序自动协调扩展和故障转移,并提供部署模式。
-
它有助于管理运行应用程序的容器,并确保生产环境中没有停机时间。例如,如果某个容器发生故障,则另一个容器会自动取代其位置,而最终用户根本不会注意到。
-
-
Kubernetes不仅是一个编排系统。它是一组独立的,相互关联的控制过程。它的作用是在当前状态下连续工作,并朝着期望的方向移动过程;
-
K8s 提供了容器编排、资源调度、弹性伸缩、部署管理,服务发现等一系列功能;
-
Kubernetes 目标是让容器化应用简单、高效。Kubernetes 的服务、支持和工具被广泛可用。
二、K8s的发展
-
传统部署时代
- 早期,组织在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。
- 缺点:当在物理服务器上运行多个应用程序,可能会出现一个应用程序占用大部分资源的情况,结果可能导致其他应用程序的性能下降。并且组织维护许多物理服务器的成本很高
-
虚拟化部署时代
- 作为解决方案,引入了虚拟化功能,它允许您在单个物理服务器的 CPU 上运行多个虚拟机(VM)。虚拟化功能允许应用程序在 VM 之间隔离,并提供安全级别,因为一个应用程序的信息不能被另一应用程序自由地访问。
- 因为虚拟化可以轻松地添加或更新应用程序、降低硬件成本等等,所以虚拟化可以更好地利用物理服务器中的资源,并可以实现更好的可伸缩性;
-
容器部署时代
- 容器类似于 VM,但是它们具有轻量级的隔离属性,可以在应用程序之间共享操作系统(OS)。因此,容器被认为是轻量级的。
- 容器与 VM 类似,具有自己的文件系统、CPU、内存、进程空间等。由于它们与基础架构分离,因此可以跨云和 OS 分发进行移植;
三、K8s 具备的特性
-
1)自我修复
- ①在节点故障时重新启动失败后的容器,替换和重新部署,保证预期副本数量;
- ②杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。
-
2)弹性伸缩
- 使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务;
-
3)自动部署和回滚
- K8s 采用滚动更新策略更新应用,一次更新一个pod,而不是同时删除所有pod;如果更新过程中出现问题,将回滚更改,确保升级不受业务影响;
-
4)服务发现和负载均衡
- K8s 为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题;
-
5)机密和配置管理
- 管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8s 中,方便应用程序使用;
-
6)存储编排
- 挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性;
-
7)批量处理
- 提供一次性任务,定时任务;满足批量数据处理和分析的场景。
四、K8s 架构图与核心组件
4.1 Kubernetes 集群架构图
4.2 Kubernetes 各组件详解
- 从架构图中,我们可以看出:
- ①master节点主要由 apiserver、controller-manager 和 scheduler 三个组件,以及一个用于集群状态存储的etcd存储服务组成;
- ②而每个node节点则主要包含 kubelet、kube-proxy 及容器引擎等组件。此外,完整的集群服务还依赖于一些附加组件,如 kubedns 等。
4.2.1 Master 节点组件
-
Master组件:提供集群的管理控制中心。
- Master组件可以在集群中任何节点上运行,但是为了简单起见,通常在一台VM/机器上启动所有Master组件,并且不会在此VM/机器上运行用户容器。
-
① kube-apiServer(核心组件)
- Kubernetes API,集群的统一端口,各组件协调者,以 RESTful api 提供接口服务,所有的对象资源的增删改查和监听操作都是叫给 APIServer 处理后再提交给 Etcd 进行存储。
-
② kube-controller-manager
- 处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManaager就是负责管理这些控制器的
- 控制器包括(部分):
1. 节点控制器:负责在节点出现故障时进行通知和响应;
2. 复制控制器:负责为系统中的每个复制控制器对象维护正确数量的Pod;
3. 端点控制器:填充“端点”对象(即,加入“服务和窗格”);
4. 服务帐户和令牌控制器:为新的名称空间创建默认帐户和API访问令牌。
-
③ kube-scheduler
- 根据调度算法为新创建的pod选择一个Node节点,可以任意部署;
可以部署在同一个节点上,也可以部署在不同的节点上。 - 调度算法有:
预选算法,过滤nodes
优选算法,对nodes打分
- 根据调度算法为新创建的pod选择一个Node节点,可以任意部署;
-
④ Etcd
- 分布式键值存储系统,用于保存集群状态数据,比如Pod、Service等对象信息;
- Etcd 具有服务发现系统,这是mysql、Oracle数据库锁没有的,同时还有以下特点:
1. 简单:安装配置简单,而且提供了HTTP API进行交互,使用也很简单
2. 安全:支持SSL证书验证
3. 快速:根据官方提供的benchmark数据,单实例支持每秒2K+读操作
4. 可靠:采用raft算法,实现分布式系统数据的可用性和一致性
4.2.2 Node 节点组件
-
提供Kubernetes运行时环境,以及维护pod,节点组件有:
-
① kublet
- kubelet 是Master在Node节点上的Agent,管理本机运行容器的生命周期。比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器
-
② kube-proxy
- 在Node节点上维护网络规则,实现pod网络代理,四层负载均衡工作。
-
③ docker或rocket
- 容器引擎,运行容器
4.2.3 Add-ons 附加组件
1. kube-dns:负责为整个集群提供DNS服务;
2. Ingress Controller:为服务提供外网入口;
3. Heapster:提供资源监控;
4. Dashboard:提供GUI;
5. Federation:提供跨可用区的集群;
6. Fluentd-elasticsearch:提供集群日志采集、存储与查询
五、K8s 单节点架构
5.1 单节点简易图
5.2 流程详解
1. 假设用户需创建 tomcat 资源(网站/调度);
2. 请求发送至master 首先需要经过apiserver(资源控制请求的唯一入口);
3. apiserver 接收到请求后首先会先记载在Etcd中;
4. Etcd的数据库根据controllers manager(控制器) 查看创建的资源状态(有无状态化);
5. 通过controllers 触发 scheduler (调度器);
6. scheduler 通过验证算法 验证架构中的nodes节点,筛选出最适合创建该资源,接着分配给这个节点进行创建;
7. node节点中的kubelet 负责执行master给与的资源请求,根据不同指令,执行不同操作;
8. 对外提供服务则由kube-proxy开设对应的规则(代理);
9. container 容器开始运行(runtime 生命周期开始计算);
10. 外界用户进行访问时,需要经过kube-proxy 访问到container;
11. 如果container 因故障而被销毁了,master节点的controllers 会再次通过scheduler 资源调度通过kubelet再次创建容器,恢复基本条件限制。
六、Kubernetes 核心概念详解
-
Pod
- ① 最小部署单元
- ② 一组容器的集合
- ③ 一个pod中的容器共享网络命名空间(可以理解在同一个局域网)
- ④ pod 是短暂的(有生命周期)
-
Controllers
-
① ReplicaSet:确保预期的 Pod 副本数量(参数,可进行设置)
-
② Deployment:无状态应用(例如:web、nignx、apache、tomcat)
-
③ StatefulSet:有状态应用部署,该应用独一无二无法重新创建进行完美替代,例如mysql、Oracle数据库
-
④ DaemonSet:确保所有的Node运行同一个Pod(把所有的Node设置为同一个命名空间)
-
⑤ Job:一次性任务(类比 linux:at)
-
⑥ Cronjob:定时任务(类比 linux:crontab)
-
更高层次对象,部署和管理Pod
-
-
Service
- ① 防止pod失联
- ② 定义一组pod访问的策略(主要作用)
- ③ 确保每个pod之间的独立性(安全)
-
Label
- 标签,附加到某个资源上,用于关联对象、查询和筛选
-
Namespaces
- 命名空间,将对象逻辑上隔离
-
Annotations
- 注释
七、kubernetes部署方式
- 官方提供的三种部署方式分别为:
- ① minikube
是一个工具,可以在本地快速运行一个单点的kubernetes,仅用于尝试kubernetes或日常开发的用户使用。 - ② kubeadm
也是一个工具,提供 kubeadm init 和 kubeadm join,用于快速部署kubernetes集群 - ③ 二进制包
推荐使用,从官方下载发行版的二进制包,手动部署每个组件,组成kubernetes集群。
- ① minikube
更多推荐
所有评论(0)