解析Kubernetes集群的架构以便更容易理解

Kubernetes 的概述

屏幕截图 2023-07-19 123125.png
屏幕截图 2023-07-19 124050.png

Kubernetes集群的架构

屏幕截图 2023-07-19 124316.png
计算接口和存储接口通过主API服务器公开。客户端通过API发送应用程序执行请求,主节点通过调度算法自动将其分配给特定的工作节点,并以Pod对象的形式执行。主节点自动处理对Pod的影响,如增加、故障和删除的更改。

师傅:控制节点

API服务器

 

•整个集群的API网关。相关应用程序为kube-apiserver。

 

•以基于http/https协议的REST风格提供,几乎所有功能都被抽象为与“资源”相关的“对象”。

 

•声明式API。仅用于声明对象的“最终状态”,特定的业务逻辑由与每个资源相关的控制器完成。

 

•无状态,数据存储在etcd中。

集群存储
•集群状态数据存储系统。通常指的是etcd。
•仅与API服务器进行交互。

控制器管理器
•负责实现由客户端通过API发送的最终状态声明,相应的应用程序为kube-controller-manager。
•API对象的“实际状态”通过一系列步骤由相关代码驱动,使其接近或等于“期望状态”,以循环方式工作。

调度器
•调度器。选择最适合Pod运行的节点(在当前情况下进行评估)。
•相关程序为kube-scheduler。

WorkerNode: 工作节点

Kubelet(又称节点代理)

 

• Kubelet是安装在每个工作节点上的Kubernetes集群代理,它负责执行主节点发送的命令,并管理通过调度器与当前节点上绑定的容器。

 

• 通过API服务器接收Pod资源定义,或者从节点的本地目录加载静态Pod配置。

 

• 使用符合CRI规范的容器运行时管理和监视与Pod相关的容器。

 

Kube Proxy(又称代理)

 

• Kube Proxy在每个工作节点上运行,专门将服务资源定义转换为节点的本地实现。

 

• iptables模式:将服务资源定义转换为适用于当前节点的iptables规则。

 

• ipvs模式:将服务资源定义转换为适用于ipvs和当前节点的一些iptables规则。

 

• 是通过服务网络传输到Pod网络的关键部分。
如果集群中的服务数量较多,则与ipvs相比,iptables的配置更简单,但生成的服务规则冗长,且当集群中的服务数量较多时,iptables规则的数量将变得庞大。考虑到性能问题的影响不可忽视,可以大大改善使用ipvs,减少类似iptables规则,并提高性能。

Kubernetes 插件

在Kubernetes中,附件的差异在于附件能够独立运行,而且与应用程序无关。

负责扩展Kubernetes集群功能的应用程序。通常以Pod的形式在Kubernetes集群上托管和执行。

必需的插件

 

• 网络插件:网络插件通过CNI接口为Pod提供专用的通信网络,并有多个实现。

 

• 集群DNS:集群DNS服务器,负责服务注册、发现和名称解析。目前的实现是CoreDNS。

 

重要的插件

 

• Ingress控制器:Ingress控制器为Ingress资源提供特定的实现,负责实现http/https协议的第7层路由和流量调度,并有多个实现。

 

• 仪表盘:基于Web的用户界面

 

• 指标监控系统:Prometheus

 

• 日志系统:ELK、PLG等。
网络插件有很多种,选择合适的插件是云原生工程师的重要责任之一。
• 网络插件:Flannel、ProjectCalico、Cilium、WeaveNet、…
• 集群 DNS:SkyDNS、KubeDNS、CoreDNS、…
• 入口控制器:Ingress Nginx、Traefik、Contour、Kone、Gloo、APISIX Ingress、…
• 仪表盘:Kubernetes 仪表盘、Kuboard、…

Kubernetes应用编排的基本运行逻辑。

屏幕截图 2023-07-19 140248.png
基本上,容器是一组共享网络、IPC和UTS命名空间以及存储资源的实体,可以被视为物理或虚拟机上的进程。

 

每个容器共享网络协议栈、网络设备、路由、IP地址、端口等,但挂载、PID和用户仍然是分离的。文件、进程和用户命名空间默认是分离的,PID共享需要明确声明。

 

每个Pod还可以将”卷”连接为外部存储,这些卷是与Pod的生命周期独立的,可以在Pod内的所有容器之间共享。通过资源清单,可以模拟”不变基础设施”,即在删除后可以通过重新创建来恢复。

 

在Pod的创建和更新过程中,采用了删除和重建的方法,从而有效地建立资产历史记录并容易地追溯状态。它是动态的,可以容忍意外情况,如错误删除或主机故障。

 

存储卷使数据能够保存在Pod的生命周期之外。

 

从设计的角度来看,只有具有非常密切关系的应用程序需要以不同容器的形式在同一个Pod中运行。

 

每个Pod的容器共享暂停命名空间,这是一个处于暂停状态且不占用资源的容器。其主要目的是为Pod提供需要添加到Pod容器中的命名空间,以供正常使用。

服务资源的设计逻辑 de

屏幕截图 2023-07-19 162725.png

Pod需要支持服务发现机制,因为它是动态的,并且在重建后根据配置列表重新分配IP地址。

Kubernetes使用服务资源和DNS服务(CoreDNS)来进行服务发现。
• 服务可以为提供相同服务的Pod组提供负载均衡机制,并将其IP地址(也称为服务IP或集群IP)作为客户端流量的入口。
• Service对象存在于集群中的每个节点上,不会因为个别节点的故障而丢失,并可以为Pod提供固定的前端入口。
• 服务使用标签选择器(Label Selector)来过滤和匹配Pod对象的标签,以便发现Pod。只有具有与标签选择器过滤器匹配的标签的Pod会被检测到。

Pod和工作负载控制器

屏幕截图 2023-07-19 163414.png

路由控制器通过标签选择器对Pod标签进行过滤处理,并完成相关联。

作为负载控制器的重心。
• 确保所选的Pod与目标数量完全匹配,并根据Pod模板创建不足数量的Pod,超出数量的则丢弃冗余对象。
• 根据配置定义的扩容和缩容。
• 根据策略和配置应用更新。

根据工作负载控制器,创建同名资源
ReplicaSet和Deployment – 调整无状态应用程序
DaemonSet – 调整系统级应用程序
StatefulSet – 调整有状态应用程序
Job和CronJob – 调整定期任务应用程序

应用程序的部署

屏幕截图 2023-07-19 164206.png

创建工作负载控制器对象,以确保适当数量的Pod对象运行。

创建一个Service对象,为Pod对象组提供固定访问入口。

请求访问 Service 对象的服务。

屏幕截图 2023-07-19 164520.png

服务和集群外部的客户端之间的通信流量被称为北南流量,客户端是集群外部的进程。
• 集群中的 Pod 也可以与集群外部的服务进程进行通信。

Kubernetes网络的基本原理

Kubernetes网络模型。

屏幕截图 2023-07-19 164944.png
这三个网络可以通过内核完成三个网络的路由公开,并在此之后进行通信。节点网络需要在我们这里进行定制化。Pod网络由CNI工具生成,只需要用户指定的网络段。服务由Kubernetes自身管理,只需要用户指定的网络段。

节点内的路由模块、iptables/netfilter、ipvs 完成网络之间的流量传输。

如何访问集群内部:
访问集群内节点网络上的主机 -> 主机会被转发到集群内的服务网络 -> 分发过程由服务网络执行 -> 集群内的Pod网络如何从外部访问集群内部:
从外部访问集群内部的方法是,首先访问特定主机的节点网络,通过主机转发到服务网络,最后由服务网络进行分布式处理,最终到达Pod。
通信网络:
(外部 -> 集群内节点网络上的主机 -> 主机被转发到集群内的服务网络 -> 服务网络用于分布式处理 -> 集群内的Pod网络)

节点网络是用于集群节点之间通信的网络。它负责与集群的外部终点进行通信。

每个主节点和工作节点之间通过网络接口卡连接。如果没有跨路由,它们默认位于同一个二层网络内。如果有跨路由,主节点默认位于三层网络内,而工作节点位于二层网络内。我们需要提前计划节点和接口的数量来布置这些网络。然后就可以部署Kubernetes集群了。

各个节点的网络和地址不是由Kubernetes管理,而是在部署Kubernetes之前需要进行配置,因此管理员需要手动配置或借助宿主虚拟化管理程序来进行配置。

• Pod 网络是提供给集群中的 Pod 对象的网络。

这存在于Pod之间,并且每个Pod的虚拟NIC接口都有特定的地址。根据所使用的网络插件,默认地址也会不同。
例如:
如果使用Flannel,Pod的默认IP是10.244.0.0/12。
如果使用ProjectCalico,Pod的默认IP将是192.168.0.0/12。

虚拟网络需要通过Flannel、Calico和Cilium等CNI网络插件来实现。

• 服务网络: 当部署Kubernetes集群时指定,每个服务对象将从该网络中分配使用的地址。

服务网络的网络段和节点网络段属于不同的网络。
服务网络在任何节点上都不存在。使用特定工具进行集群部署时,存在默认的网络段10.96.0.0/12。

服务对象的IP地址存在于相关的iptables或ipvs规则中。

由Kubernetes集群本身进行管理

Kubernetes集群的通信流程

在Kubernetes网络中,主要有四种通信流量:
• 容器之间的同一Pod内通信 – 回环接口
• Pod之间的通信
• Pod与服务之间的通信
• 集群外部流量与服务之间的通信

尽管Pod可以直接进行通信,但依赖服务来分散网络通信的原因是:Pod节点可以随时删除和重建,网络也是动态的。为了检测Pod,需要Pod服务注册中心和服务发现总线,这些任务由Service处理。如果有多个服务,Service会自动执行负载均衡。

Pod网络需要依靠与CNI规范兼容的第三方网络插件进行完成,这些插件需要满足以下功能要求:
• 所有的Pod可以直接通信,无需经过NAT机制。
• 所有的节点可以直接与所有的Pod通信,无需使用NAT机制。
• 所有的Pod对象位于同一扁平网络上。

广告
将在 10 秒后关闭
bannerAds