2012年,eBay的工程师谈到了eBay是如何运行50000台服务器的。他们还提到,eBay正在试验一种自我修复系统来管理50000台服务器。这在参与者中引起了相当大的轰动。在那些日子里,自我康复是一个相当新生的概念。但现在不是了。构建自愈系统不需要理解复杂的系统概念。你可以用Kubernetes代替。
什么是Kubernetes?
Kubernetes,也称为K8s,是一个开源系统,用于自动化容器化应用程序的部署、扩展和管理。它将构成应用程序的容器分组到逻辑单元中,以便于管理和发现。
Kubernetes这个名字源于希腊语,意思是舵手或飞行员。K8s作为一个缩写,是通过计算“K”和“s”之间的八个字母得出的。谷歌在2014年开放了Kubernetes项目。Kubernetes将谷歌15年来大规模运行生产工作负载的经验与社区的最佳想法和实践相结合
https://kubernetes.io/
最近,Kubernetes已经成为在公共、私有或混合云基础设施中部署容器化应用程序的事实标准。Kubernetes是一个开源容器编排平台。Kubernetes提供的一些重要功能包括——
- 自动展开和回滚
- 服务发现
- 自愈
- 水平缩放
让我们尝试了解Kubernetes体系结构及其主要组件。
Kubernetes架构
Kubernetes在一个称为Kubernetes集群的逻辑单元中对机器车队进行分组。Kubernetes集群由控制平面和一组称为节点的工作机器组成。可以在高可用性模式下运行许多控制平面组件。
控制平面
控制平面公开用于定义、部署和管理容器生命周期的API。控制平面由许多逻辑单元组成。控制平面组件负责管理Kubernetes基础设施。
工作节点
工作节点运行容器化应用程序。在Kubernetes中,应用程序工作负载称为POD。POD由工作节点承载。控制平面管理集群中的工作节点和POD。
控制平面组件
Kubernetes将机器机队组合在一个可以由API管理的逻辑单元中。控制平面组件负责管理Kubernetes基础设施。控制平面由许多逻辑组件组成。让我们看看控制平面组件。
API服务器
API服务器是Kubernetes集群的主要入口点。它公开了一组用户和其他组件可以访问的Kubernetes API。API服务器通过HTTP实现RESTful API。API服务器是无状态的,可以水平扩展。API服务器将状态存储在etcd存储中。
Kubernetes组件仅与API服务器通信。他们不直接交谈。如上图所示,API服务器和其他组件之间的连接总是由组件建立的。
客户端如何与API服务器通信?
当您使用kubectl(或直接调用API)创建Kubernetes资源时,API服务器将执行许多操作(如下所示)。
身份验证插件
首先,API服务器使用许多身份验证插件中的一个对请求进行身份验证。Kubernetes支持使用身份验证插件的多种身份验证方法。身份验证方法的一些示例有–X.509客户端证书、静态HTTP承载令牌和OpenID Connect。每个身份验证插件都实现特定的身份验证方法。
每个身份验证插件依次处理传入请求。如果任何身份验证插件都可以成功验证请求中的凭据,则身份验证完成。请求进入授权阶段。
授权插件
请求经过身份验证后,API服务器使用多个授权插件/模块中的一个进行授权检查。授权插件的职责是验证经过身份验证的用户是否可以对请求的资源执行请求的操作。如果配置了多个授权插件,则会依次验证每个插件。每个授权插件都可以批准或拒绝请求,并立即返回结果(短路操作)。
准入控制器
准入控制器插件在将请求持久化到etcd之前拦截请求(创建、修改或删除)。许可控制器可以改变或验证请求。变异准入控制可能会初始化缺失的字段、配置默认值甚至覆盖字段。验证接纳控制器可以拒绝请求。
ETCD
Kubernetes将所有集群数据存储在etcd中。ETCD是一个分布式、可靠、快速的键值存储。您可以运行多个etcd实例,以提供高可用性和更好的性能。
在高可用性模式下,etcd集群实现分布式一致性算法(RAFT)。这确保了即使其中一个副本出现故障,其他副本也可以可靠地为请求提供服务。
ETCD存储所有集群数据。ETDC集群实现了分布式一致性算法(Raft),以确保即使其中一个副本出现故障,也有其他副本可以可靠地为请求提供服务。
etcd服务器提供的其他两项重要服务包括:
- 乐观锁定:etcd中存储的每个值都有一个资源版本。写入etcd的任何键值都可以根据资源版本设置条件。
- 监视协议:etcd服务器实现了监视协议,该协议使客户端能够监视键值存储中的更改并做出相应的反应。
Kubernetes API服务器是唯一直接与etcd对话的组件。API服务器为客户端提供“乐观锁定”和“监视协议”等功能。
API服务器如何通知资源更改?
API服务器的职责是对请求进行身份验证、授权、验证和持久化。它不会创建任何资源,也不会做出任何调度决策。API服务器使控制器和调度器能够观察已部署资源中的更改。每当对资源执行任何操作时,Kubernetes组件都可以请求通知API服务器。这使组件能够执行它需要的任何任务。
感兴趣的客户端可以通过打开到API服务器的HTTP连接来监视更改。通过此连接,客户端将通过监视的对象接收修改流。
Scheduler
当您要求Kubernetes创建一个pod时,通常您不会告诉应该运行哪个节点pod。此任务由调度程序完成。Kube调度器监视新创建的POD,这些POD没有分配给任何节点,并为它们选择一个要运行的节点。
第一次创建pod时,它通常没有节点名字段。nodeName
字段指示要在其上运行pod的节点。然后,调度器为pod选择适当的节点,并使用nodeName
更新pod定义。设置节点名称后,将通知节点上运行的kubelet,该kubelet将开始在该节点上执行pod。
许多因素影响调度器选择节点的方式。有些是由用户提供的,如污染和容忍度、节点亲和力等。有些因素由调度器确定。POD运行节点的选择分为两步:
过滤
过滤步骤发现调度器可以在其中调度POD的节点的可行性。过滤步骤由谓词配置。谓词是硬约束,如果违反,将导致pod无法在该节点上正确运行。例如,pod上指定的节点选择器是硬约束。
调度器可以应用的一些预先配置的谓词函数包括:
- 节点能否满足pod所需的硬件资源?
- 节点是否具有与pod规范中的节点选择器匹配的标签?
- pod是否容忍节点的污染?
- 节点是否满足pod关联规则或反关联规则?
- 节点是否正在耗尽资源?
得分
应用过滤步骤后,调度器根据优先级函数对可用节点进行排序。调度器根据优先级函数为每个节点分配分数。调度器然后将pod分配给排名最高的节点。如果有多个节点具有相同的分数,调度程序将随机选择其中一个节点。
优先级函数的一个例子是扩展函数。此函数对节点进行优先级排序,以便与Kubernetes服务相关联的所有POD不在一个节点上。这确保了可靠性,因为它减少了机器故障将禁用与特定Kubernetes服务相关联的所有端点的可能性。
控制管理器
在Kubernetes中,控制器是一个控制平面组件,用于监视Kubernetes群集的当前状态,并尝试将当前状态移近所需状态。控制器运行一个控制循环(调节系统状态的非终止循环),该循环跟踪至少一种Kubernetes资源类型,并在当前状态与所需状态不匹配时向API服务器发送消息。
控制器从不直接相互交谈。他们甚至不知道还有其他控制器存在。控制器监视资源(部署、服务等)的更改,并为每次更改执行操作。此操作可以是创建新对象或更新或删除现有对象。
Kubernetes中包括的一些重要控制器包括:
- Replication Manager:负责确保所需数量(副本计数)的POD正在运行。
- 守护程序集控制器:通过将守护程序集定义发布到API服务器来创建、管理和删除守护程序集资源。
- Job控制器:通过将作业定义发布到API服务器来创建、管理和删除作业资源。
- StatefulSet控制器:根据StatefulSet资源的规范创建、管理和删除POD
- Node控制器:管理工作节点资源。
节点组件
除了在主节点(控制平面)上运行的组件外,很少有组件在每个辅助节点上运行。这些组件提供了所有节点所需的基本功能。
Kubelet
Kubelet是在Kubernetes群集的所有计算机上运行的节点代理。它负责工作节点上运行的所有内容。它通过在API服务器中创建节点资源来注册正在运行的节点。Kubelet充当桥梁,将节点的可用CPU、磁盘和内存连接到大型Kubernetes集群中。
Kubelet与API服务器通信,以查找应该在其节点上运行的容器。Kubelet还将容器的状态传递给API服务器,以便控制器可以观察这些容器的当前状态。
Kubelet还负责机器的健康检查。如果Kubelet运行的容器死亡或运行状况检查失败,Kubelet将重新启动该容器,同时还将此运行状况状态和重新启动通知API服务器。当pod从API服务器中删除时,它会终止容器,并通知服务器pod已终止。
Kube代理
Kubernetes服务是将运行在一组pod上的应用程序作为网络服务公开的一种方式。Kubernetes为一组POD分配一个DNS名称,并根据这些名称对请求进行负载平衡。kube代理的目的是确保客户端可以连接到Kubernetes服务。它负责实现Kubernetes服务负载平衡器网络模型。
kube代理始终监视API服务器以获取Kubernetes集群中的所有服务。创建Kubernetes服务时,会立即为其分配一个虚拟IP地址,即未将其分配给任何网络接口。然后,API服务器将新服务通知所有kube代理。kube代理设置了一些iptables规则,以将客户端对服务的调用重定向到备用pod。
容器运行时间
容器运行时是负责运行容器的软件。Kubernetes支持多个容器运行时:Docker、containerd、CRI-O和Kubernetes CRI(容器运行时接口)的任何实现。
总结
Kubernetes集群由控制平面和一组称为节点的工作机器组成。控制平面负责管理Kubernetes基础设施。控制平面组件包括:
- API服务器:API服务器是Kubernetes集群的主要入口点。它公开了一组用户和其他组件可以访问的Kubernetes API。
- etcd:etcd是一个分布式、可靠、快速的键值存储。Kubernetes将所有集群数据存储在etcd中。
- 调度程序:调度程序负责调度pod。
- 控制器:控制器负责将集群的当前状态保持在更接近所需状态的状态。
在工作节点上运行的组件包括:
- Kubelete:kubelet是一个在所有工作节点上运行的代理,负责运行容器。
- Kube代理:Kube代理负责服务发现和管理Kubernetes内部网络。
- 容器运行时:容器运行时负责运行容器。
原文地址:https://techdozo.dev/kubernetes-architecture/
除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/2464.html
暂无评论