K8S(Kubernetes)是一个用于自动部署、扩展和管理容器化应用程序的开源系统。它采用主从设备模型(Master-Slave 架构),其中Master节点负责集群的调度、管理和运维,Slave节点(也被称为Worker Node节点)负责执行工作负载。
Kubernetes(K8s)主要由以下几个核心组件组成:
一、Master 节点组件
-
API Server:
- 原理:作为 Kubernetes 系统的前端控制层,提供 HTTP/HTTPS RESTful API,以供客户端(如 kubectl 工具、其他管理平台等)和内部组件之间进行通信。它将接收到的请求转换为对后端存储(通常是 etcd)的操作,并将结果返回给请求者。
- 功能:
- 资源操作的入口,支持对 Pod、Service、Deployment 等各种 Kubernetes 资源对象的增删改查操作。
- 提供认证、授权和准入控制机制,确保只有经过授权的用户可以执行特定的操作。
- 作为集群状态的存储和查询接口,其他组件可以通过 API Server 来获取集群的当前状态信息。
- 作用:是用户和其他组件与 Kubernetes 集群交互的桥梁,负责接收和处理各种请求,维护集群的状态一致性。
-
Scheduler:
- 原理:Scheduler 持续监视新创建的未被调度到节点上的 Pod,并根据一系列的调度策略和可用资源信息,为 Pod 选择一个最合适的 Node 节点进行部署。
- 功能:
- 分析 Pod 的资源需求(如 CPU、内存等)和各种约束条件(如节点标签、亲和性和反亲和性等)。
- 评估各个 Node 节点的可用资源和负载情况,选择一个最适合的节点来运行 Pod。
- 作用:确保 Pod 能够被合理地分配到集群中的各个节点上,实现资源的高效利用和负载均衡。
-
Controller Manager:
- 原理:Controller Manager 由多个控制器组成,每个控制器都是一个独立的控制循环。这些控制器通过持续监控集群的状态,并与期望状态进行比较,然后采取相应的行动来使实际状态趋向于期望状态。
- 功能:
- ReplicaSet 控制器:确保指定数量的 Pod 副本始终在运行。如果有 Pod 故障,它会创建新的 Pod 来维持副本数量。
- Node 控制器:负责管理 Node 节点的状态,例如当节点不可达时,将该节点上的 Pod 重新调度到其他节点上。
- Deployment 控制器:管理 Deployment 对象,实现应用的滚动更新、回滚等操作。
- 作用:维护 Kubernetes 集群的稳定性和可靠性,确保各种资源对象按照预期的状态运行。
- etcd
- 原理
- 采用k/v(键值对)方式存储数据,确保数据的一致性和高可用性
- 作用
- 作为K8S的后端数据库,存储集群的所有状态信息。
- 原理
二、Node 节点组件
-
Kubelet:
- 原理:Kubelet 是在每个 Node 节点上运行的主要代理程序。它通过 API Server 注册自身所在的节点信息,并持续监控节点上的容器和 Pod 的状态。当有新的 Pod 被调度到该节点时,Kubelet 负责启动容器并确保其正常运行。
- 功能:
- 管理节点上的容器生命周期,包括启动、停止、重启容器等操作。
- 定期向 API Server 报告节点的状态信息,包括资源使用情况、容器状态等。
- 实现容器的健康检查,确保容器处于正常运行状态。
- 作用:是 Node 节点上的实际执行者,负责管理和维护节点上的容器和 Pod,确保它们按照预期运行。
-
Container Runtime:
- 原理:负责实际运行容器的软件层,它与操作系统内核交互,为容器提供隔离的运行环境。常见的容器运行时有 Docker、Containerd 等。
- 功能:
- 创建、启动、停止和删除容器。
- 管理容器的镜像存储和加载。
- 提供容器的资源隔离和限制功能,如 CPU、内存、磁盘等资源的限制。
- 作用:为容器化应用提供底层的运行环境支持。
-
Kube Proxy:
- 原理:Kube Proxy 通过在节点上设置 iptables 规则或 IPVS(IP Virtual Server)规则,实现对服务的访问代理和负载均衡。它持续监听 API Server 上 Service 和 Endpoint 对象的变化,并根据这些变化动态更新本地的网络规则。
- 功能:
- 将对 Service 的访问请求转发到后端的 Pod 上。
- 实现服务的负载均衡,根据一定的策略将请求分发到不同的 Pod 上。
- 作用:提供了 Kubernetes 集群中服务的发现和负载均衡功能,使得客户端可以通过稳定的服务地址访问到一组 Pod。
三、K8S架构的其他组件
- kubectl
- K8S的命令行工具集,用于通过命令行与API server进行交互,对K8S进行操作。
- kube-dns
- 可选组件,记录启动的Pod和服务地址,提供域名到地址的转换映射。
- 监控和日志组件
- 如Fluentd等,用于收集和转发集群的日志信息,便于问题排查和性能监控。
四、关键概念
- Pod:是 Kubernetes 中最小的可部署单元,一个 Pod 可以包含一个或多个容器。这些容器共享网络命名空间、存储卷等资源,并且被一起调度到同一个 Node 上。
- Deployment:用于管理 Pod 的副本数量、更新策略等。它可以确保指定数量的 Pod 始终在运行,并在需要时进行滚动更新。
- Service:提供了一种抽象方式,将一组 Pod 暴露为一个稳定的网络服务。Service 通过标签选择器来确定哪些 Pod 属于该服务,并提供负载均衡和服务发现功能。
- Namespace:用于对资源进行逻辑分组,不同的 Namespace 可以有不同的用户、权限和资源配额。
- Label 和 Selector:标签(Label)是附加到 Kubernetes 对象上的键值对,用于标识和选择对象。选择器(Selector)用于根据标签来筛选对象,例如选择特定的 Pod 或 Service。
- Volume:用于为容器提供持久化存储或共享存储。Kubernetes 支持多种类型的存储卷,如本地存储、网络存储等。
五、工作流程
- 用户通过 kubectl 命令行工具或其他客户端向 Kubernetes API Server 提交创建 Pod、Deployment、Service 等资源的请求。
- API Server 验证请求并将资源对象存储在 etcd(一个高可用的分布式键值存储)中。
- Scheduler 监听到新的 Pod 创建请求后,根据资源需求和节点的可用性,选择一个合适的 Node 节点来调度该 Pod。
- Kubelet 在被选中的 Node 上启动 Pod,并与容器运行时交互来创建和管理容器。
- Kube Proxy 在 Node 上设置网络规则,以便将对 Service 的请求转发到相应的 Pod 上。
- 如果需要对应用进行更新,用户可以通过修改 Deployment 等资源对象来触发滚动更新等操作。Controller Manager 会监控资源的变化,并确保系统的状态与期望的状态一致。