解析Kubernetes集群的架构以便更容易理解
Kubernetes 的概述
Kubernetes集群的架构
师傅:控制节点
- 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网络的关键部分。
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应用编排的基本运行逻辑。
- 基本上,容器是一组共享网络、IPC和UTS命名空间以及存储资源的实体,可以被视为物理或虚拟机上的进程。
- 每个容器共享网络协议栈、网络设备、路由、IP地址、端口等,但挂载、PID和用户仍然是分离的。文件、进程和用户命名空间默认是分离的,PID共享需要明确声明。
- 每个Pod还可以将”卷”连接为外部存储,这些卷是与Pod的生命周期独立的,可以在Pod内的所有容器之间共享。通过资源清单,可以模拟”不变基础设施”,即在删除后可以通过重新创建来恢复。
- 在Pod的创建和更新过程中,采用了删除和重建的方法,从而有效地建立资产历史记录并容易地追溯状态。它是动态的,可以容忍意外情况,如错误删除或主机故障。
- 存储卷使数据能够保存在Pod的生命周期之外。
- 从设计的角度来看,只有具有非常密切关系的应用程序需要以不同容器的形式在同一个Pod中运行。
- 每个Pod的容器共享暂停命名空间,这是一个处于暂停状态且不占用资源的容器。其主要目的是为Pod提供需要添加到Pod容器中的命名空间,以供正常使用。
服务资源的设计逻辑 de
Pod需要支持服务发现机制,因为它是动态的,并且在重建后根据配置列表重新分配IP地址。
Kubernetes使用服务资源和DNS服务(CoreDNS)来进行服务发现。
• 服务可以为提供相同服务的Pod组提供负载均衡机制,并将其IP地址(也称为服务IP或集群IP)作为客户端流量的入口。
• Service对象存在于集群中的每个节点上,不会因为个别节点的故障而丢失,并可以为Pod提供固定的前端入口。
• 服务使用标签选择器(Label Selector)来过滤和匹配Pod对象的标签,以便发现Pod。只有具有与标签选择器过滤器匹配的标签的Pod会被检测到。
Pod和工作负载控制器
路由控制器通过标签选择器对Pod标签进行过滤处理,并完成相关联。
作为负载控制器的重心。
• 确保所选的Pod与目标数量完全匹配,并根据Pod模板创建不足数量的Pod,超出数量的则丢弃冗余对象。
• 根据配置定义的扩容和缩容。
• 根据策略和配置应用更新。
ReplicaSet和Deployment – 调整无状态应用程序
DaemonSet – 调整系统级应用程序
StatefulSet – 调整有状态应用程序
Job和CronJob – 调整定期任务应用程序
应用程序的部署
创建工作负载控制器对象,以确保适当数量的Pod对象运行。
创建一个Service对象,为Pod对象组提供固定访问入口。
请求访问 Service 对象的服务。
服务和集群外部的客户端之间的通信流量被称为北南流量,客户端是集群外部的进程。
• 集群中的 Pod 也可以与集群外部的服务进程进行通信。
Kubernetes网络的基本原理
Kubernetes网络模型。
节点内的路由模块、iptables/netfilter、ipvs 完成网络之间的流量传输。
访问集群内节点网络上的主机 -> 主机会被转发到集群内的服务网络 -> 分发过程由服务网络执行 -> 集群内的Pod网络如何从外部访问集群内部:
从外部访问集群内部的方法是,首先访问特定主机的节点网络,通过主机转发到服务网络,最后由服务网络进行分布式处理,最终到达Pod。
通信网络:
(外部 -> 集群内节点网络上的主机 -> 主机被转发到集群内的服务网络 -> 服务网络用于分布式处理 -> 集群内的Pod网络)
节点网络是用于集群节点之间通信的网络。它负责与集群的外部终点进行通信。
各个节点的网络和地址不是由Kubernetes管理,而是在部署Kubernetes之前需要进行配置,因此管理员需要手动配置或借助宿主虚拟化管理程序来进行配置。
• Pod 网络是提供给集群中的 Pod 对象的网络。
例如:
如果使用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网络需要依靠与CNI规范兼容的第三方网络插件进行完成,这些插件需要满足以下功能要求:
• 所有的Pod可以直接通信,无需经过NAT机制。
• 所有的节点可以直接与所有的Pod通信,无需使用NAT机制。
• 所有的Pod对象位于同一扁平网络上。