编辑
🐇明明跟你说过:个人主页
🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅
🔖行路有良友,便是天堂🔖
一、引言
1、Kubernetes概述
Kubernetes单词起源于希腊语, 是“舵手”或者“领航员、飞行员”的意思。
Kubernetes(简称K8s)的前世今生可以追溯到谷歌(Google)内部的一个项目,它起源于2003年,当时谷歌正面临着不断增长的应用程序和服务的管理挑战。这个项目最初被称为"Borg",是一个早期的容器编排系统。Borg 的成功经验成为 Kubernetes 开发的契机。
有关k8s起源的介绍,请参考《初识K8s之前世今生、架构、组件、前景》这篇文章
编辑
Kubernetes的优点包括可移植性、可伸缩性和扩展性。它使用轻型的YAML清单文件实现声明性部署方法,对于应用程序更新,无需重新构建基础结构。管理员可以计划和部署容器,根据需要扩展容器并管理其生命周期。借助Kubernetes的开放源代码API,用户可以通过首选编程语言、操作系统、库和消息传递总线来构建应用程序,还可以将现有持续集成和持续交付(CI/CD)工具集成。
2、Kubernetes的发展与应用场景
- 容器编排和管理:Kubernetes 最初是作为一个容器编排平台而开发的,用于简化容器化应用程序的部署和管理。它提供了自动化的容器调度、水平扩展、滚动更新等功能,使得开发人员和运维人员可以更轻松地管理大规模的容器化应用。
- 混合云和多云部署:Kubernetes 的可移植性使得它成为在多个云平台和数据中心中部署应用程序的理想选择。它能够在私有云、公有云和混合云环境中无缝运行,从而为企业提供了灵活的部署选项。
编辑
- 微服务架构:Kubernetes 提供了强大的服务发现、负载均衡和自动扩展功能,使得它成为构建和管理微服务架构的首选平台。通过将应用程序拆分为多个小型服务,开发团队可以更快地迭代和部署新功能,并且更容易实现水平扩展和故障恢复。
- 大数据和机器学习:Kubernetes 不仅适用于传统的 Web 应用程序,还可以用于部署和管理大数据和机器学习工作负载。通过与其他开源项目(如Apache Spark、TensorFlow等)集成,Kubernetes 可以简化大数据分析和机器学习模型的部署和管理过程。
- 持续集成和持续部署(CI/CD):Kubernetes 可以与各种 CI/CD 工具(如Jenkins、GitLab CI等)集成,从而实现自动化的构建、测试和部署流程。开发团队可以通过使用 Kubernetes 提供的自动化功能来加速软件交付过程,并提高部署的一致性和可靠性。
- 边缘计算:随着边缘计算的兴起,Kubernetes 也在逐渐成为边缘环境中部署和管理应用程序的标准平台。通过在边缘节点上运行轻量级的 Kubernetes 集群,企业可以将应用程序和服务部署到距离用户更近的位置,从而提高性能和响应速度。
二、Kubernetes核心架构概述
1、总体架构
Master节点:
- kube-apiserver:作为 Kubernetes 的 API 服务器,负责提供 RESTful API 以及接收和处理来自用户和其他组件的请求。
- etcd:一个分布式键值存储系统,用于保存集群的状态和元数据信息。
- kube-scheduler:负责监视新创建的 Pod,并将它们调度到集群中的合适节点上,考虑节点资源和调度策略。
- kube-controller-manager:包含多个控制器,用于监视集群状态并确保集群的期望状态与实际状态保持一致,例如节点控制器、副本控制器等。
Node节点:
- kubelet:运行在每个节点上的代理服务,负责与主节点通信,管理节点上的容器和 Pod。
- kube-proxygongzuo负责实现 Kubernetes 服务的负载均衡和网络代理,为服务提供统一的访问入口。
编辑
2、工作原理
- 用户操作:用户通过 Kubernetes API 或命令行工具(kubectl)与 Kubernetes 集群进行交互,创建、更新或删除应用程序和资源对象(如 Pod、Service、Deployment 等)。
- API Server处理:API 请求首先发送到 kube-apiserver,kube-apiserver 对请求进行身份验证和授权,然后将其存储到 etcd 中。
- Scheduler调度:kube-scheduler 监视新创建的 Pod,根据调度策略选择合适的节点,并将 Pod 分配给该节点。
- Node执行:kubelet 接收到来自 API Server 的 Pod 创建请求,根据 Pod 规范在节点上启动相应的容器,并定期向 API Server 汇报节点和容器的状态。
- 网络代理:kube-proxy 在每个节点上负责实现 Kubernetes 服务的负载均衡和网络代理,为服务提供统一的访问入口。
- 控制器管理:kube-controller-manager 负责监视集群状态,并通过调整 Pod 的副本数和状态来保持集群的期望状态与实际状态一致。
编辑
3、集群通信
在K8s集群中,组件之间的通信是确保集群正常运行的关键。主要的通信方式包括API Server、Etcd以及各个组件之间的通信。API Server作为K8s集群的入口,负责处理来自客户端的请求,并将这些请求转发给相应的组件进行处理。Etcd则作为K8s集群的键值存储系统,用于保存集群的状态和配置信息。各个组件之间通过API和Etcd进行通信,确保集群状态的同步和一致性。
编辑
4、数据持久化
K8s支持多种类型的卷,如emptyDir、hostPath、nfs、glusterfs、cephfs等。每种卷都有其特定的用途和适用场景。例如,emptyDir类型的卷主要用于临时存储,其生命周期与Pod相同;而hostPath类型的卷则可以将宿主节点上的文件或目录挂载到容器中,适用于需要访问宿主机文件系统的场景。
除了卷之外,K8s还提供了持久卷(PersistentVolume,简称PV)和持久卷声明(PersistentVolumeClaim,简称PVC)的概念来实现更高级的数据持久化。PV是由管理员预先配置好的存储空间,而PVC则是用户申请存储空间的请求。通过PVC与PV的绑定,用户可以动态地获取所需的存储空间,并确保数据的持久性。
K8s还支持通过分布式存储系统(如Ceph、GlusterFS等)来实现数据持久化。
编辑
三、Kubernetes核心组件介绍
1、Master节点组件
API Server 集群管理中枢
API Server是Kubernetes集群的管理中枢。它作为Kubernetes集群的前端接口,提供了丰富的RESTful API,使得各种客户端工具以及Kubernetes的其他组件能够与之交互,从而实现对集群的各种资源的管理。
- 资源操作的唯一入口:无论是创建、更新还是删除Pod、Service等Kubernetes资源,都需要通过API Server进行。这使得API Server成为了资源操作的唯一入口,确保了操作的统一性和安全性。
- 认证与授权:API Server内置了认证与授权机制,可以确保只有经过授权的用户或组件才能对集群资源进行操作。这大大提高了集群的安全性。
- 集群状态存储与同步:API Server与Etcd(一个分布式键值存储系统)紧密集成,用于存储整个集群的状态。Etcd作为集群的后端存储,确保了状态的一致性和可靠性。同时,API Server还负责将集群状态的变化同步到其他组件,确保它们能够实时感知到集群的最新状态。
- 扩展性:API Server的设计使得Kubernetes能够轻松地扩展新的资源类型。通过注册自定义的API和相应的资源处理器,用户可以为Kubernetes添加新的功能或资源类型。
编辑
etcd 分布式键值存储系统
- etcd是一个分布式键值存储系统,专为共享配置和服务发现而设计。它由CoreOS开发,并使用Raft一致性算法来管理高可用复制日志。etcd以一致和容错的方式存储元数据,并提供了一个简单、安全且快速的接口来访问这些数据。
- etcd的名字来源于两个想法:unix的“/etc”文件夹和分布式系统"d"istibuted。在unix系统中,“/etc”文件夹用于存储单个系统的配置数据,而etcd则扩展了这个概念,用于存储大规模分布式系统的配置信息。因此,"d"istibuted的“/etc”就是“etcd”。
- etcd的主要应用场景包括配置管理、服务发现和分布式协调工作。它使得分布式系统中的各个组件能够共享和同步配置信息,从而确保系统的一致性和可靠性。同时,etcd还提供了分布式锁和领导选举等机制,以实现可靠的分布式协作。
编辑
- 在架构上,etcd是一个高可用的键值存储系统,专为集群化而设计。etcd使用Raft算法作为其一致性算法,这是一个工程上广泛使用的强一致性、去中心化、高可用的分布式协议。Raft算法确保了即使在部分节点故障、网络延迟或网络分割的情况下,多个节点也能对某个事情达成一致看法,从而提高了系统的容错性。
- etcd的分布式架构使得其能够支持负载均衡,每个etcd节点都可以处理用户的请求。这使得etcd在处理数据量小但访问频繁的消息时表现出色。
- etcd是一个强大而灵活的分布式键值存储系统,它为分布式系统提供了可靠、一致和高效的配置管理、服务发现和分布式协调功能。
Scheduler 资源调度器
Scheduler是Kubernetes集群中的资源调度器,它的核心任务是将待调度的Pod按照预定的调度策略分配到合适的Node节点上,以确保集群的资源得到高效、公平和合理的利用。
在Kubernetes中,一旦API Server接收到新建Pod的请求并识别其合法后,这个请求会被存入Etcd中。随后,Scheduler会通过watch机制从API Server获知这一需求,并开始其调度流程。Scheduler会根据一系列预定的调度策略,如资源的可用性、Pod的亲和性和反亲和性规则、Node的标签和污点设置等,来评估集群中各个Node节点的适用性,最终选择一个最合适的Node来运行这个Pod。
调度策略的设计考虑了多种因素。首先,为了保证公平性,Scheduler会尝试确保每个Node都能被分配到适量的资源,避免某些Node过载而另一些Node空闲。其次,资源的高效利用是另一个重要目标,Scheduler会尽量将Pod调度到那些资源充足且利用率较低的Node上,以最大化集群的整体资源利用率。同时,为了提高调度性能,Scheduler会采用一些优化算法和机制,以便尽快完成大批量的Pod调度工作。
编辑
除了基本的调度功能外,Scheduler还提供了灵活的调度策略配置选项。管理员可以根据实际需求,通过配置不同的调度策略来影响Pod的调度结果。例如,可以设置优先级规则,让某些重要或紧急的Pod优先获得调度;也可以定义自定义的调度策略,以满足特定的业务需求。
Scheduler还与其他Kubernetes组件紧密协作,共同维护集群的稳定性和可用性。例如,当集群中的某个Node节点出现故障或资源不足时,Scheduler会及时感知到这一变化,并尝试将运行在该Node上的Pod重新调度到其他合适的Node上,以确保业务的连续性。
Controller Manager 集群状态控制器
Controller Manager是Kubernetes集群状态的重要控制器。它作为Kubernetes中各种“操作系统”的管理者,是集群内部的管理控制中心,也是Kubernetes自动化功能的核心。Controller Manager负责监控Kubernetes对象的状态,并采取相应的措施以使其达到期望状态。
在Kubernetes中,Controller Manager是通过kube-controller-manager二进制程序运行的,它可以在Master节点上运行,也可以在独立的节点上运行。Kube Controller Manager是一个守护进程,内嵌随Kubernetes一起发布的核心控制回路。它通过API服务器监控集群的状态,确保集群处于预期的工作状态。
Kube Controller Manager由负责不同资源的多个控制器构成,包括副本控制器、节点控制器、命名空间控制器和服务账号控制器等。每种Controller都负责一种特定的资源控制器,而Controller Manager则是这些Controller的核心管理者。例如,ServiceAccount Contoller、Token Controller与安全相关的控制器就与Service Account、Token密切相关。
Controller Manager的作用在于管理和控制集群中的多个控制器,以确保它们按照预期运行。它采用主从架构,确保了集群的高可用性和可扩展性。
编辑
2、Node节点组件
Kubelet Node节点代理
在 Kubernetes 中,Kubelet 是运行在每个节点上的代理服务,负责管理节点上的容器和与 Master 节点的通信。Kubelet 是 Kubernetes 中最核心的组件之一,它负责监视 Pod 的生命周期,并根据集群的配置将 Pod 启动、停止和管理。
- 容器生命周期管理:Kubelet 负责监视节点上的 Pod,确保 Pod 的容器处于运行状态。当发现新的 Pod 被调度到节点上时,Kubelet 会根据 Pod 的规格创建相应的容器,并在需要时重新启动或停止容器。
- 与容器运行时的交互:Kubelet 通过容器运行时接口(如 Docker 或 Containerd)与节点上的容器运行时进行通信,与容器运行时交互以执行容器的启动、停止、重启等操作。
- 资源管理:Kubelet 负责监视节点的资源使用情况,包括 CPU、内存、磁盘等资源。它会定期报告节点的资源情况给 Master 节点,以便 Master 节点进行资源调度和分配。
- 与 Master 节点的通信:Kubelet 通过与 Master 节点的 kube-apiserver 进行通信,接收来自 Master 节点的指令,并向 Master 节点报告节点和容器的状态。这样可以确保集群中的状态一致性,并及时响应集群中的变化。
- 日志和监控:Kubelet 负责收集节点和容器的日志信息,并将日志发送到集中式日志系统(如 Elasticsearch、Fluentd、Kibana 等)。它还负责监控节点和容器的健康状态,并在发现异常情况时触发相应的报警和处理流程。
编辑
Container Runtime 容器运行时环境
容器运行时(Container Runtime)是 Kubernetes 中用于运行容器的核心组件之一,它负责管理和执行容器的生命周期,包括容器的创建、启动、停止和销毁等操作。在 Kubernetes 中,容器运行时通常是一个独立的进程或守护程序,负责与容器引擎交互并执行容器的操作。
编辑
下面是一些常见的容器运行时
1. Docker:
- Docker 是目前最流行的容器运行时,提供了完整的容器生态系统,包括容器镜像、容器网络和容器存储等功能。Docker 使用的容器格式为 Docker 格式(Docker Image),并通过 Docker Engine 运行容器。
2. Containerd:
- Containerd 是一个面向容器的核心运行时,最初是由 Docker 开发并捐赠给 CNCF 的一个项目。它提供了容器生命周期管理、镜像管理、网络和存储等核心功能,并与各种容器引擎(如 Docker、CRI-O 等)进行集成。
3. CRI-O:
- CRI-O 是一个专门为 Kubernetes 设计的轻量级容器运行时,实现了 Kubernetes 的容器运行时接口(CRI)规范。CRI-O 使用容器和 OCI 标准来运行容器,与 Kubernetes 紧密集成,并且专注于为 Kubernetes 提供最佳性能和安全性。
4. containerd-shim:
- containerd-shim 是 containerd 的一个子项目,负责与 Kubernetes CRI 进行交互,并在容器启动时创建容器的主进程。它充当了容器运行时和容器进程之间的中介,并提供了容器进程的生命周期管理和监控功能。
5. 其他容器运行时:
- 除了上述常见的容器运行时之外,还有一些其他的容器运行时,如 rkt、cri-o、runc 等。
编辑
Kube-proxy 服务代理与负载均衡
Kube-proxy是Kubernetes集群中的一个关键组件,负责为Service提供集群内部的服务发现和负载均衡。它运行在每个Node计算节点上,充当Pod网络代理的角色,确保Service的稳定性和可访问性。
Kube-proxy的主要功能包括:
- 服务发现:Kube-proxy通过监听API Server来获取Service和Endpoint的变化信息。一旦Service或Endpoint的状态发生改变,Kube-proxy会及时更新其本地缓存,并根据这些变化来调整网络规则和负载均衡策略。
- 负载均衡:Kube-proxy负责将到达Service的流量分发到后端的Pod上。它支持多种负载均衡策略,如随机选择、轮询等,以确保流量能够均匀地分布到各个Pod上。这种负载均衡机制有助于提高系统的吞吐量和可靠性。
- 网络规则维护:Kube-proxy根据Service的定义创建相应的iptables或IPVS规则,以确保流量能够正确地路由到目标Pod。这些规则包括将到达Service Cluster IP的流量转发到后端Pod的IP,以及处理跨Node的流量转发等。
Kube-proxy的负载均衡策略可以根据实际需求进行配置和调整。在默认情况下,Kube-proxy使用iptables模式进行负载均衡。在这种模式下,Kube-proxy会为每个Service创建一个监听端口,并将发向Cluster IP的请求重定向到该端口。然后,根据负载均衡算法选择一个后端Pod进行处理。
除了iptables模式外,Kube-proxy还支持其他负载均衡模式,如userspace模式和IPVS模式。Userspace模式下,Kube-proxy会作为一个四层的代理服务器来处理请求和转发流量。而IPVS模式则利用Linux内核中的IPVS模块来实现更高效的负载均衡。
编辑
由于篇幅的原因, 关于k8s资源对象和管理运维的分解,我们会在下一章节进行介绍
💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Docker的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺
🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!