category
2012年,我参加了JavaOne会议。在其中一次会谈中,易趣的工程师谈到了易趣是如何运行50000台服务器的。他们还提到,eBay正在试验一种自我修复系统,以管理50000台服务器。这在与会者中引起了很大的反响。自我疗愈在当时是一个相当初级的概念。但现在不行了。您不需要理解复杂的系统概念就可以构建自修复系统。您可以使用Kubernetes。
什么是Kubernetes?
Kubernetes,也称为K8s,是一个开源系统,用于自动化容器化应用程序的部署、扩展和管理。它将组成应用程序的容器分组为逻辑单元,以便于管理和发现。
Kubernetes这个名字源自希腊语,意思是舵手或飞行员。K8s作为一个缩写是通过计算“K”和“s”之间的八个字母得出的。谷歌在2014年开源了Kubernetes项目。Kubernetes将谷歌15年来大规模运行生产工作负载的经验与社区中的最佳想法和实践相结合
https://kubernetes.io/
最近,Kubernetes已经成为在公共、私有或混合云基础设施中部署容器化应用程序的事实标准。Kubernetes是一个开源的容器编排平台。Kubernetes提供的一些重要功能包括:
- 自动推出和回滚
- 服务发现
- 自愈(Self-healing)
- 水平缩放
让我们试着了解Kubernetes体系结构及其主要组件。
Kubernetes架构
Kubernetes在一个称为Kubernete集群的逻辑单元中对机器车队进行分组。Kubernetes集群由控制平面和一组称为节点的工作机器组成。您可以在高可用性模式下运行许多控制平面组件。
控制平面
控制平面公开了用于定义、部署和管理容器生命周期的API。控制平面由许多逻辑单元组成。控制平面组件负责管理Kubernetes基础设施。
工作节点
工作节点运行容器化的应用程序。在Kubernetes中,应用程序工作负载被称为pod。吊舱由工作节点承载。控制平面管理集群中的工作节点和pod。
控制平面组件
Kubernetes将机器车队组合在单个逻辑单元中,这些逻辑单元可以由API管理。控制平面组件负责管理Kubernetes基础设施。控制平面由许多逻辑组件组成。让我们看看控制平面组件。
API服务器
API服务器是Kubernetes集群的主要入口点。它公开了一组Kubernetes API,用户和其他组件可以访问这些API。API服务器通过HTTP实现RESTful API。API服务器是无状态的,可以水平缩放。API服务器将状态存储在etcd存储中。
Kubernetes组件仅与API服务器通信。他们不会直接交谈。如上图所示,API服务器和其他组件之间的连接总是由组件建立的。
客户端如何与API服务器通信?
当您使用kubectl(或直接调用API)创建Kubernetes资源时,API服务器将执行许多操作(如下所示)。
身份验证插件
首先,API服务器使用众多身份验证插件中的一个对请求进行身份验证。Kubernetes支持使用身份验证插件的多种身份验证方法。身份验证方法的一些示例包括–X.509客户端证书、静态HTTP承载令牌和OpenID Connect。每个身份验证插件都实现了一种特定的身份验证方法。
传入请求由每个身份验证插件按顺序处理。如果任何身份验证插件都能成功验证请求中的凭据,那么身份验证就完成了。请求进入授权阶段。
授权插件
请求通过身份验证后,API服务器使用许多授权插件/模块中的一个进行授权检查。授权插件的职责是验证经过身份验证的用户是否可以对请求的资源执行请求的操作。如果配置了许多授权插件,那么每个插件都会按顺序进行验证。每个授权插件都可以批准或拒绝请求,并立即返回结果(短路操作)。
准入控制器(Admission Controller)
准入控制器插件在将请求持久化到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连接来观察更改。通过此连接,客户端将通过监视对象接收修改流。
计划程序
当您要求Kubernetes创建一个pod时,通常不会告诉您应该运行哪个节点pod。此任务由计划程序完成。Kube调度器监视未分配给任何节点的新创建的pod,并选择一个节点供其运行。
当第一次创建pod时,它通常没有nodeName字段。nodeName字段指示要在其上运行pod的节点。然后,Scheduler为pod选择适当的节点,并使用nodeName更新pod定义。设置nodeName后,会通知在节点上运行的kubelet,它开始在该节点上执行pod。
许多因素影响调度器如何选择节点。有些是由用户提供的,如污点和容差、节点亲和性等。有些因素由调度器决定。为要运行的pod选择节点是一个两步过程:
过滤
过滤步骤发现调度器可以调度pod的节点的可行性。过滤步骤由谓词配置。谓词是硬约束,如果违反了这些约束,将导致pod无法在该节点上正确运行。例如,在pod上指定的节点选择器是一个硬约束。
调度器可以应用的一些预先配置的谓词函数有:
- 节点能否满足pod所需的硬件资源?
- 节点是否有与pod规范中的节点选择器匹配的标签?
- 吊舱能承受节点的污染吗?
- 节点是否满足pod亲和规则或反亲和规则?
- 节点是否资源不足?
评分
在应用过滤步骤之后,调度器基于优先级函数对可用节点进行排序。调度器根据优先级函数为每个节点分配一个分数。调度器然后将pod分配给具有最高排名的节点。如果存在多个得分相等的节点,则调度器随机选择其中一个。
优先级函数的一个例子是扩展函数。此函数对节点进行优先级排序,使与Kubernetes服务相关联的所有pod不存在于一个节点上。这确保了可靠性,因为它减少了机器故障禁用与特定Kubernetes服务相关联的所有端点的可能性。
控制器管理器
在Kubernetes中,控制器是一个控制平面组件,它监视Kubernete集群的当前状态,并试图将当前状态移动到更接近所需的状态。控制器运行控制循环(调节系统状态的非终止循环),该控制循环跟踪至少一个Kubernetes资源类型,并且如果当前状态与期望状态不匹配则向API服务器发送消息。
控制器之间从不直接交谈。他们甚至不知道存在任何其他控制器。控制器监视对资源(部署、服务等)的更改,并为每次更改执行操作。此操作可以是创建新对象,也可以是更新或删除现有对象。
Kubernetes中包含的一些重要控制器包括:
- Replication Manager:负责确保所需数量(副本计数)的pod正在运行。
- DaemonSet控制器:通过将DaemonSet定义发布到API服务器来创建、管理和删除DaemonSSet资源。
- 作业控制器:通过将作业定义发布到API服务器来创建、管理和删除作业资源。
- StatefulSet控制器:根据StatefulSet资源的规范创建、管理和删除pod
- 节点控制器:管理工作节点资源。
节点组件
除了在主节点(控制平面)上运行的组件外,很少有组件在每个辅助节点上运行。这些组件提供了所有节点所需的基本功能。
Kubelet
Kubelet是在Kubernetes集群的所有机器上运行的节点代理。它负责工作节点上运行的所有内容。它通过在API服务器中创建node资源来注册正在运行的节点。Kubelet充当一个桥梁,将节点的可用CPU、磁盘和内存连接到大型Kubernetes集群中。
Kubelet与API服务器通信,以查找应该在其节点上运行的容器。Kubelet还将容器的状态传递给API服务器,以便控制器可以观察这些容器的当前状态。
Kubelet还负责机器的健康检查。如果Kubelet运行的容器死亡或健康检查失败,Kubelet会重新启动容器,同时将此健康状态和重新启动通知给API服务器。当从API服务器删除pod时,它终止容器,并通知服务器pod已经终止。
Kube代理
Kubernetes服务是将运行在一组pod上的应用程序公开为网络服务的一种方式。Kubernetes为一组pod分配一个DNS名称,并根据它们对请求进行负载平衡。kube代理的目的是确保客户端可以连接到Kubernetes服务。它负责实现Kubernetes服务负载均衡器网络模型。
kube-proxy总是监视Kubernetes集群中所有服务的API服务器。当创建Kubernetes服务时,它会立即被分配一个虚拟IP地址,即不分配给任何网络接口。API服务器然后通知所有kube-proxy代理关于新服务。kube代理设置了一些iptables规则,将客户端对服务的调用重定向到后台。
容器运行时
容器运行时是负责运行容器的软件。Kubernetes支持多个容器运行时:Docker、containerd、CRI-O和KubernetesCRI(容器运行时接口)的任何实现。
总结
Kubernetes集群由控制平面和一组称为节点的工作机器组成。控制平面负责管理Kubernetes基础设施。控制平面组件包括:
- API服务器:API服务器是Kubernetes集群的主要入口点。它公开了一组Kubernetes API,用户和其他组件可以访问这些API。
- etcd:etcd是一个分布式、可靠、快速的键值存储。Kubernetes将所有集群数据存储在etcd中。
- 调度器:调度器负责调度一个pod。
- 控制器:控制器负责保持集群的当前状态更接近所需状态。
在工作节点上运行的组件包括:
- Kubelete:kubelet是一个在所有工作节点上运行的代理,负责运行容器。
- Kube代理:Kube代理负责服务发现和管理Kubernetes内部网络。
- 容器运行时:容器运行时负责运行容器。
- 登录 发表评论
- 4 次浏览
Tags
最新内容
- 2 days 6 hours ago
- 2 days 8 hours ago
- 2 days 8 hours ago
- 5 days ago
- 5 days 7 hours ago
- 5 days 8 hours ago
- 5 days 8 hours ago
- 5 days 8 hours ago
- 1 week 2 days ago
- 1 week 2 days ago