介绍
Kubernetes 是一个开源的容器编排引擎,用来对容器化应用进行自动化部署、 扩缩和管理。
Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。 Kubernetes 建立在 Google 大规模运行生产工作负载十几年经验的基础上, 结合了社区中最优秀的想法和实践。
在生产环境中部署一个应用程序时, 通常要部署该应用的多个实例以便对应用请求进行负载均衡。
在 Kubernetes 中, 我们可以创建多个容器, 每个容器里面运行一个应用实例, 然后通过内置的负载均衡策略, 实现对这一组应用实例的管理、 发现、 访问, 而这些细节都不需要运维人员去进行复杂的手工配置和处理。
传统部署时代
传统的应用部署方式是通过插件或脚本来安装应用。 这样做的缺点是应用的运行、 配置、 管理、 所有生存周期将与当前操作系统绑定, 这样做并不利于应用的升级更新/回滚等操作,
虚拟化部署时代
因此,虚拟化技术被引入了。虚拟化计数能够更好地利用物理服务器的资源,并且因为可轻松地添加或更新应用程序,而有更高的可扩展性, 但是虚拟机非常重, 并不利于可移植性。
容器部署时代
新的方式是通过部署容器方式实现,容器类似于 VM,但是更宽松的隔离特性,使容器之间可以共享操作系统(OS)。 因此,容器比起 VM 被认为是更轻量级的。
每个容器之间互相隔离, 每个容器有自己的文件系统 , 容器之间进程不会相互影响, 能区分计算资源。 相对于虚拟机, 容器能快速部署,由于容器与底层设施、 机器文件系统解耦的, 所以它能在不同云、 不同版本操作系统间进行迁移
kubernetes 功能和架构
Kubernetes 是一个轻便的和可扩展的开源平台, 用于管理容器化应用和服务。 通过Kubernetes 能够进行应用的自动化部署和扩缩容。 在 Kubernetes 中, 会将组成应用的容器组合成一个逻辑单元以更易管理和发现。
kubernetes 的功能
(1) 自动装箱基于容器对应用运行环境的资源配置要求自动部署应用容器,可以快速、可靠地部署容器,并处理容器之间的依赖关系
(2) 自我修复(自愈能力):
当容器失败时, 会对容器进行重启当所部署的 Node 节点有问题时, 会对容器进行重新部署和重新调度,当容器未通过监控检查时, 会关闭此容器直到容器正常运行时, 才会对外提供服务
(3) 水平扩展通过简单的命令、 用户 UI 界面或基于 CPU 等资源使用情况, 对应用容器进行规模扩大或规模剪裁,可以根据应用负载的变化自动调整容器的数量,以确保应用程序始终具有所需的资源。
(4)服务发现和负载均衡:
服务发现用户不需使用额外的服务发现机制, 就能够基于 Kubernetes 自身能力实现服务发现和负载均衡,Kubernetes 使用 DNS 名称或自己的 IP 地址来暴露容器。 如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
(5) 滚动更新:
可以根据应用的变化, 对应用容器运行的应用, 进行一次性或批量式更新
(6) 版本回退:
可以根据应用部署情况, 对应用容器运行的应用, 进行历史版本即时回退
(7) 密钥和配置管理:
允许存储和管理敏感信息,例如密码、OAuth 令牌和 SSH 密钥。在不需要重新构建镜像的情况下, 可以部署和更新密钥和应用配置, 类似热部署。
(8) 存储编排:
自动实现存储系统挂载及应用, 特别对有状态应用实现数据持久化非常重要存储系统可以来自于本地目录、 网络存储(NFS、 Gluster、 Ceph 等)、 公共云存储服务
(9) 批处理:
提供一次性任务, 定时任务; 满足批量数据处理和分析的场景
Kubernetes集群架构
当你部署完 Kubernetes,便拥有了一个完整的集群。
一组工作机器,称为 节点, 会运行容器化应用程序。每个集群至少有一个工作节点。
工作节点会托管 Pod ,而 Pod 就是作为应用负载的组件。 控制平面管理集群中的工作节点和 Pod。 在生产环境中,控制平面通常跨多台计算机运行, 一个集群通常运行多个节点,提供容错性和高可用性。
控制平面组件(Control Plane Components)
控制平面组件会为集群做出全局决策,比如资源的调度。 以及检测和响应集群事件,例如当不满足部署的 replicas 字段时, 要启动新的 pod)。
api server
提供 Kubernetes 集群的 API 接口。它作为 Kubernetes 集群中的控制中心,负责各组件之间的协调和管理,包括维护集群状态、接收和处理用户请求、授权和认证等。
Api server 接收客户端的 RESTful 请求,并将其转换为相应的内部操作,然后通过其他核心组件(如 etcd、kube-scheduler、kube-controller-manager、kubelet 等)完成对 Kubernetes 集群的管理和控制。在请求处理期间,api server 还会执行安全检查、身份验证和授权等任务,以确保用户请求的安全性和正确性。
etcd
一个分布式的键值存储系统,用于存储 Kubernetes 集群的状态和元数据。etcd 中存储的数据包括:
- Kubernetes 集群的配置信息(如 API server 的地址、容器运行时的地址等);
- Kubernetes 对象的定义(如 Pod、Service、ReplicaSet 等);
- Kubernetes 对象的状态(如 Pod 的状态、Service 的 IP 地址等);
- 一些运行时状态信息(如节点的状态、容器的状态等)。
etcd 的分布式存储模式保证了数据的高可用和一致性,作为 Kubernetes 所有集群数据的后台数据库。。当集群中的一个节点故障时,etcd 会自动将该节点上的数据同步到其他节点上,保证数据不会丢失。同时,etcd 使用 Raft 算法保证数据一致性,即使在网络分区或节点故障的情况下也能保证数据的一致性。
scheduler
负责将新建的Pod调度到节点上运行。它通过监控未分配的Pod,并基于节点的可用资源和调度策略来选择合适的节点进行调度。
Scheduler通过调用Kubernetes API来获取未分配的Pod,并使用调度策略对它们进行评估,以决定应该将它们分配到哪个节点上。
Kubernetes中的scheduler支持多种调度算法,包括最佳节点选择算法、负载均衡算法等。它可以根据不同的Pod的需求进行调度,调度决策考虑的因素包括单个 Pod 及 Pods 集合的资源需求、软硬件及策略约束、 亲和性及反亲和性规范、数据位置、工作负载间的干扰及最后时限。同时,scheduler还会监测节点的状态,如节点的可用资源情况、节点的连接状态等,以保证节点的可用性。
一旦确定了最佳节点,Scheduler会将Pod的调度信息写入Kubernetes API服务器,以便kubelet能够获取并启动相关的容器。如果没有合适的节点可用,则Pod将保持未调度状态,直到有合适的节点可用为止。
controller manager
Kubernetes的Controller Manager是一个独立的进程,它负责管理集群中的控制器,以确保集群中的资源状态与期望状态保持一致。控制器管理器由多个控制器组成,每个控制器都是一个独立的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在同一个进程中运行。它们负责监视和调节集群中资源的状态。
Controller manager 负责监控 Kubernetes 集群中的资源对象,例如 Pods、Services、ReplicationControllers、Endpoints 等,并根据定义好的规则进行控制和管理。它可以执行多种控制器,例如 ReplicaSet、Deployment、StatefulSet、DaemonSet 等,确保它们的行为符合用户定义的期望状态。
控制器管理器中的控制器例如:
- Replication Controller(RC)控制器:它用于确保Pod的副本数始终符合定义。
- Node Controller节点控制器:当节点不可用时,它会检测并采取相应措施,如重新分配Pods。
- Service Controller服务控制器:它将Service Pod与Endpoint的关联保持同步,确保Pod可以被正确路由到。
- Namespace Controller控制器:它负责确保任何新创建的对象都被分配到正确的命名空间中。
- PersistentVolume Controller控制器:它监视PersistentVolume的状态,并确保Pod可以正确地访问它们。
- Job Controller任务控制器:用于管理集群中的任务,例如批处理作业或单次作业。
Node组件
节点组件会在每个节点上运行,负责维护运行的 Pod 并提供 Kubernetes 运行环境。
kubelet
负责管理和维护节点上的容器化应用程序。Kubelet运行在每个节点上,与master节点通信,管理节点上的容器和它们的生命周期,确保他们按照规定运行。
Kubelet的主要职责包括:
- 与API服务器通信,接收来自于Scheduler的Pod调度信息,并创建该节点上的Pod。
- 与Docker等容器运行时进行交互,确保Pod中的容器正确启动、运行、停止和删除。
- 持续监视节点上的容器和Pod,确保它们处于健康状态,如果出现故障,则进行重启或清理。
- 与CRI(Container Runtime Interface)进行交互,以支持不同的容器运行时,比如Docker、rkt和CRI-O等。
kube-proxy
kube-proxy 是一个网络代理,它负责将 Kubernetes 集群内部的网络流量转发到正确的目的地。kube-proxy 运行在每个节点上,对外暴露一个虚拟IP地址,在Kubernetes中被称为"Service IP"。当有新的服务被创建时,kube-proxy会监视服务的变化,并动态调整负载均衡规则,确保流量能够被正确地路由到正确的Pod上。
Kube-proxy的具体实现方式有多种,包括iptables、IPVS和userspace等方式。其中,iptables是最常使用的一种方式,它可以利用Linux内核提供的网络功能,实现基础的负载均衡和端口转发。但随着集群规模的增大,iptables的性能和可扩展性会越来越受限。因此,IPVS成为了一种更为高效的替代方案,它使用Linux内核的高级网络功能,可以实现更加复杂的负载均衡需求,并支持动态调整规则。而userspace的方式则是一种较为灵活的解决方案,可以通过自定义程序实现各种负载均衡算法和协议。
Master node
在 Kubernetes 架构中,Master node 是集群的控制中心。它负责管理整个集群的状态和资源分配,包括:
- API Server:是集群的核心组件,负责接收和处理来自其他组件的请求,以及维护整个集群的状态信息。
- Etcd:一个高可用的分布式键值存储系统,用于存储集群的所有配置信息和状态信息。
- Controller Manager:管理集群中的各种控制器,比如Replication Controller、Endpoint Controller等,在集群中维护期望状态并对实际状态进行调整来保持它们一致。
- Scheduler:负责将Pod调度到集群中的节点上,并根据节点上的资源使用情况和Pod的需求来做出最优的调度决策。
Master node 一般不承载应用程序容器,其主要作用是负责集群的管理和控制,并且为 worker node 提供 API Server 和其他必要的组件,是整个 Kubernetes 集群的大脑。
Master节点是Kubernetes集群中最重要的组件之一,必须保证其高可用性,因为如果Master节点宕机,整个集群都将失去管理和协调的能力。因此,在生产环境中,通常会将多个Master节点部署在不同的服务器上,以确保高可用性。
worker node
Worker 节点是 Kubernetes 集群中的工作节点,它承担着容器的运行和管理任务。
Worker node通过Kubernetes节点代理与集群通信,并执行由Kubernetes master指定的Pod的启动、停止和重启操作。每个worker node都运行一个容器运行时环境,比如Docker,以便能够运行Pod中的容器。
Worker 节点包括 Docker 或其他容器运行时、kubelet(负责管理节点上的容器)、kube-proxy(负责服务发现和负载均衡)、Pod 网络接口和一些其他的插件(如 CNI 插件)等组件,这些组件协同工作,通过与 Master 节点交互来确保容器的高可用性和可靠性。Worker 节点的数量可以根据业务负载的大小进行扩展。
kubectl
kubectl是Kubernetes命令行工具,用于与Kubernetes集群进行交互。它允许开发人员和系统管理员管理Kubernetes对象,如Pod、Deployment、Service等。还可以查看集群状态、日志和排查故障。
kubectl的工作原理是将命令行参数解析和API请求封装在一个命令行工具中。它通过调用Kubernetes API服务器来执行请求,并从结果中提取信息并显示给用户。
kubectl的主要功能包括创建、更新和删除Kubernetes对象、查看资源、管理应用程序等。它还提供了一些有用的功能,如日志跟踪、端口转发、执行命令等。
pod
Pod 是最小的可部署单元。一个 Pod 包含一个或多个紧密关联的容器,这些容器共享网络和存储资源,并被放置在同一个节点上。Pod 也包含一组配置控制器,用于描述容器如何运行,并可与其他 Pod 通信。每个 Pod 在其生命周期中都有一个唯一的 IP 地址,并且可以被其他容器轻松访问。Pod 是可替换的,当需要更新或重启 Pod 时,可以轻松地进行替换。在 Kubernetes 中,Pod 通常是水平扩展应用程序的主要方式,以满足高负载的要求。
docker
Kubernetes 利用 Docker 来运行和管理容器化的应用程序。在 Kubernetes 架构中,Docker 扮演着一个重要的角色,它负责创建和运行应用程序的容器,并与 Kubernetes 运行时环境交互。
具体来说,Kubernetes 使用 Docker 来实现以下功能:
- 容器化应用程序:Kubernetes 允许用户将应用程序打包成 Docker 容器,并将它们发布到一个容器仓库中,方便部署和管理。
- 管理容器:Kubernetes 可以通过 Docker 镜像来创建和管理容器,并确保容器的健康状态。它可以监控容器运行状态并重启故障容器,也可以调整容器的资源限制和分配。
- 负载均衡和服务发现:Kubernetes 可以通过 Docker 容器来实现负载均衡和服务发现。它可以自动将容器分配到可用节点上,并提供一组负载均衡规则来确保应用程序的高可用性和可伸缩性。
- 管理容器:Kubernetes 可以通过 Docker 镜像来创建和管理容器,并确保容器的健康状态。它可以监控容器运行状态并重启故障容器,也可以调整容器的资源限制和分配。
- 负载均衡和服务发现:Kubernetes 可以通过 Docker 容器来实现负载均衡和服务发现。它可以自动将容器分配到可用节点上,并提供一组负载均衡规则来确保应用程序的高可用性和可伸缩性。
- 网络管理:Kubernetes 可以使用 Docker 提供的网络服务来管理容器网络。它可以创建和管理容器间的网络,并允许容器之间进行通信。