Kubernetes中文文档:https://kubernetes.io/zh-cn/docs/home/
Kubernetes源码地址:https://github.com/kubernetes/kubernetes
而Kubernetes就是一个开源容器集群管理系统,可以在物理或虚拟机的Kubernetes集群上运行容器化应用,提供一个以“容器为中心的基础架构”,实现容器集群的自动化部署、自动扩缩容、维护等功能。
在生产环境中, 需要管理运行着应用程序的容器,并确保服务不会下线。 例如,如果一个容器发生故障,则你需要启动另一个容器。 这就可以交给Kubernetes ,它提供了一个可弹性运行分布式系统的框架。Kubernetes 可以通过一个命令为你提供集中式的管理集群机器和应用,加机器、版本升级、版本回滚,不停机的灰度更新,确保高可用、高性能、高扩展。
Kubernetes部署完成后一定是一个集群集群 。k8s 总体架构采用了经典的 master slave 架构模式,分 master 节点和 worker 节点,节点可以是虚拟机也可以是物理机。
控制平面(Master节点)——Control Plane控制平面四个逻辑组件组成:API Server、Scheduler、Controller、etcd,它们被称为是程序组件,每个组件之间都必须运行一个守护进程,API Server、Scheduler、Controller是k8s提供的,而etcd不是k8s提供的。
worker 节点由以下组件组成:
kubectl是Kubernetes命令行工具(command-line tool),用于管理Kubernetes集群和应用程序。kubectl可以通过命令行方式与Kubernetes API服务器进行通信,实现对集群的部署、维护和监控等操作。
kubectl官方介绍:https://kubernetes.io/zh-cn/docs/reference/kubectl/
APIServer提供了K8S各类资源对象的操作,是集群内各个功能模块之间数据交互和通信的中心枢纽,是整个系统的数据总线和数据中心。通常我们通过kubectl与APIServer进行交互。API服务提供Kubernetes API 的服务,试图通过把所有或者大部分的业务逻辑放到不两只的部件中从而使其具有CRUD特性。它主要处理REST操作,在etcd中验证更新这些对象(并最终存储)。
API Server是整个K8S上唯一接收客户端请求的入口,负责检查用户创建提交的命令是否合乎语法规范,如果合乎语法规范接下来他就把它保存到etcd当中。API Server是一个数据库,它负责用户通过任何一个接口完成对容器的增删改查,这个时候容器并没有跑起来,它只是存下来用户提交了一个创建容器得请求,这个容器有没有跑起来由Controller来负责,API Server会通知Controller,Controller会watch到 API server上得变动,比如创建删除操作,一旦有了变动,Controller会立即获得变动相关状态,然后Controller对用户下达指令进行操作。
kube-apiserver文档介绍:https://kubernetes.io/zh-cn/docs/concepts/overview/kubernetes-api/
Kubernetes 声明式API 文档介绍:https://www.topgoer.cn/docs/kubernetes_foundation/kubernetes_foundation-1drs2m9urd6a8
kube-Scheduler即调度器,负责监视新创建的、未指定运行节点(node)的 Pods, 并选择节点来让 Pod 在上面运行。
通过API、UI、CLI向master提起要创建一个容器,这个容器到底要运行在node节点中的哪一个呢,需要调度器去评估一下哪一个node是最佳目标节点,如果多个node节点都是最佳的那就从中随机选择一个,例如用户新建一个容器,Scheduler会watch到api server,Scheduler会把它调度到某一个节点上创建出来,创建出来健康与否,Controller去负责监控它。
通过调度算法,为待调度Pod列表的每个Pod,从Node列表中选择一个最合适的Node。然后,目标节点上的kubelet通过API Server监听到Kubernetes Scheduler产生的Pod绑定事件,获取对应的Pod清单,下载Image镜像,并启动容器。
Scheduler官方介绍:https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/kube-scheduler/
etcd:是一个k/v存储系统,可以定义容器是通过不同的k/v来描述一个容器的多个状态信息,如一个容器里面有容器名,有镜像,监听端口,为了能够确保用户能够合理合法的描述k8s所支持的资源的属性,API server对etcd进行了包装和抽象,使得用户只能按照api server中定的结构来定义数据。
etcd官网:https://etcd.io/docs/
在应用程序当中有两种api范式,一种叫陈述式,一种叫声明式,k8s的api提供的是一种声明式api,若某一个客户端想运行容器,通过API、UI、CLI来告诉maste运行一个容器,运行一个nginx容器,运行这个容器的镜像占多少内存,镜像从哪里来,是否能跑起来你都不用管,只需要告诉master给我运行一个nginx容器,Controller知道到哪去找镜像,拿过来以后通过Scheduler调度以后,Controller知道nginx容器运行健康与否,有没有正常监听用户所指定的端口,如果没有,Controller会试图把它干掉在重新启动,这叫自动创建,这个所有功能都是Controller来实现的。Controller是整个master当中的大脑,因为用户指令下来以后,真正能负责执行并监控它、能符合用户所指定的期望都由Controller负责。
在k8s之上一个资源有两种状态,一种是用户期望状态。用户请求并保存在etcd当中用户期望,第二种状态是当前实际状态。Controller把指令从etcd中取出来并确保在节点上可以运行起来,这个是真正运行它的容器,这个真正运行它的容器的状态和用户期望保存在etcd的状态有可能是不一致的,比如用户运行的状态etcd监听80端口,而Controller监听的是8080端口,就会不符合用户期望,Controller会对比etcd的状态和Controller上的状态是否一样,如果不一致,Controller就负责确保真正运行的状态和etcd的状态是否一致,不一致就Controller重启或者重建确保他们一致。
kube-controller-manager 集群控制器负责运行控制器进程。 从逻辑上讲, 每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在同一个进程中运行。这些控制器包括:
controller-manager官方介绍:https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/kube-controller-manager/
controller官方介绍:https://kubernetes.io/zh-cn/docs/concepts/architecture/controller/
节点组件会在每个节点上运行,负责维护运行的 Pod 并提供 Kubernetes 运行环境。
Kubernetes 不是直接调度容器的,而是将其封装成了一个个 Pod ,Pod 才是 k8s 的基本调度单位。Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。
Pod是一组(一个或多个) 容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 中的内容总是并置的并且一同调度,在共享的上下文中运行。 Pod 所建模的是特定于应用的 “逻辑主机”,其中包含一个或多个应用容器, 这些容器相对紧密地耦合在一起。
Pod官方介绍:https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/
kubelet 会在集群中每个节点(node)上运行,用于管理pod和container,每个kubelet会向apiserver注册本节点的信息,并向master节点上报本节点资源使用的情况 它保证容器(containers)都运行在 Pod 中。
kubelet 是在每个工作节点上运行的代理,负责管理该节点上的容器。它与主节点通信,并接收有关运行哪些容器并管理其生命周期的指令。kubelet 负责以下任务
kubelet 与容器运行时密切合作,以确保容器正常运行。它还与其他 Kubernetes 组件配合使用,以管理网络连接和存储资源。
kubelet官方介绍:https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/kubelet/
kube-proxy 是在每个工作节点上运行的网络代理,实现 Kubernetes 服务(Service) 概念的一部分,负责管理与在该节点上运行的容器的网络连接。它维护网络规则并管理每个容器的网络接口。kube 代理负责以下任务:
kube-proxy 与 kubelet 和其他 Kubernetes 组件密切合作,以确保保持网络连接并正确路由流量。
kube-proxy官方介绍:https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/kube-proxy/
容器运行环境是负责运行容器的软件。Kubernetes 支持许多容器运行环境,例如 containerd、 CRI-O 以及 Kubernetes CRI (容器运行环境接口) 的其他任何实现。容器运行时负责以下任务:
官方介绍文档:https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/
DNS组件为Pod提供了服务发现、域名解析功能,使得Pod可以通过名称而非IP地址来相互通信。
Kubernetes使用名为kube-dns的开源DNS解决方案作为其集群内部DNS服务器。kube-dns具有高可用性和水平扩展能力,以适应大规模部署的需求。它为每个Service分配一个固定的DNS名称,并在需要时将它们映射到相关的Pod的IP地址。这种方式简化 了服务发现的过程,使得服务之间的通信更加灵活和可靠。
Kubernetes Dashboard是一个基于Web的UI工具,提供了一种直观的方法来管理和监控Kubernetes集群。
Dashboard支持查看和编辑应用程序、管理Pod和容器、检查系统日志和监视集群资源等操作。Dashboard具有用户友好的界面和易于导航的菜单,可帮助用户更好地理解和掌握整个Kubernetes集群的运行状况。除此之外,Dashboard还允许管理员配置和管理用户访问权限,并与其他Kubernetes API组件集成以提供更全面的集群管理体验。
容器资源监控 将关于容器的一些常见的时间序列度量值保存到一个集中的数据库中, 并提供浏览这些数据的界面。
集群层面日志机制负责将容器的日志数据保存到一个集中的日志存储中, 这种集中日志存储提供搜索和浏览接口
容器的创建过程涉及到多个组件协同工作。用户创建一个容器时,首先向API server发请求,Scheduler watch到api server创建容器的请求开始调度,从当前集群中的node节点中选一个作为真正运行这个容器的节点,之后Scheduler把调度的结果保存到etcd当中,node组件中的kubelet组件监视 API server上的资源变动,如果说Scheduler调度某个容器给Node节点以后,这个节点可以通过 api server得到消息,kubelet会创建执行容器的任务,kubelet会调用容器、下载镜像、启动容器。