Kubernetes基础理论介绍

前言

随着企业数字化转型的深入,为云而生的云原生架构和思想已被大量企业所接受。容器云、微服务、DevOps、 Serverless 已成为企业落地云原生的关键技术,而 Kubernetes 作为容器云的核心基础和事实标准,已成为当今互联网企业和传统 IT 企业的云基础设施要素。本文将对 Kubernetes 基础内容做初步介绍。

什么是云原生?

目录

一、了解 Kubernetes

1. Kubernetes 是什么?

2. 为什么要用 K8S?

2.1 传统的后端部署方案

2.2 k8s 部署方案

3. K8S 的特性 

4. 主要功能 

二、Kubernetes 集群架构与组件 

1. 核心组件

1.1 Master 组件:

1.1.1 Kube-apiserver

1.1.2 Kube-controller-manager

1.1.3 Kube-scheduler 

1.2 配置存储中心

1.2.1 etcd

1.3 Node 组件

1.3.1 Kubelet

1.3.2 Kube-Proxy

1.3.3 docker 或 rocket

2. Kubernetes 核心概念

2.1 Pod

2.2 Pod 控制器

2.3 Label 

2.4 Label 选择器(Label selector)

2.5 Service

2.6 Ingress

2.7 Name

2.8 Namespace

三、Kubernetes 架构数据流向

1. 架构图

2. 相关概述


一、了解 Kubernetes

1. Kubernetes 是什么?

Kubernetes(简称K8S)是由云原生计算基金会(CNCF)维护的开源容器编排平台。它的主要功能是自动化部署、扩展和管理应用程序。Kubernetes提供了一种容器编排和管理的方式,让开发人员能够更轻松地管理他们的应用程序。

官网:Kubernetes

GitHub:

GitHub - kubernetes/kubernetes: Production-Grade Container Scheduling and Management

GitHub是一个基于网络的平台,用于软件开发项目的版本控制和协作。它允许用户托管和审查代码、管理项目,并与数百万其他开发人员一起构建软件。 

2. 为什么要用 K8S?

2.1 传统的后端部署方案

  • 将应用程序及其相关文件(如可执行二进制文件、配置文件等)部署到服务器上;
  • 使用启动脚本来启动应用程序;
  • 运行守护脚本以定期检查应用程序的运行状态,并在必要时重新启动应用程序;
  • 当服务请求量增加时,通过增加服务器数量来应对压力,并通过负载均衡来分担已有服务器的负载。

2.2 k8s 部署方案

  • 利用CNCF与云原生基金会的产品,即Kubernetes,这是一种开源的容器编排平台;
  • Kubernetes基于Docker等容器技术,为容器化的应用提供一整套部署运行、资源调度、服务发现和动态伸缩等功能;
  • 开发人员可以通过Kubernetes轻松管理化应用程序,无需手动处理每个容器的部署和运行状态;
  • Kubernetes提供自动化部署、扩展和管理应用程序的方式,使得大规模容器集群管理更加便捷。

3. K8S 的特性 

① 弹性伸缩

  • 快速扩容和缩容应用程序实例,根据命令、UI或者CPU使用情况进行操作,确保高峰时段的高可用性,同时在低峰时回收资源,最大程度地节约成本;
  • 自动资源占用调整,以应对不同负载情况。

② 自我修复

  • 在节点故障时,自动重新启动失败的容器,保证预期(用户的期望值)的副本数量,以确保服务的连续性;
  • 通过杀死健康检查失败的容器,并在容器就绪后再处理客户端请求,确保不中断线上服务。

③ 服务发现和负载均衡

  • 为多个容器提供统一的访问入口(内部IP地址和一个DNS名称),无需考虑容器IP问题;
  • 使用统一的访问地址和K8s主机名称进行负载均衡。

④ 自动发布(默认滚动发布模式)和回滚

  • 采用滚动更新策略,一次更新一个或部分Pod,确保升级不影响业务;
  • 在线更新,先更新一台,通过探针功能检测后再对外发布,以确保服务的稳定性。

⑤ 集中化配置管理和密钥管理

  • 管理敏感数据和应用程序配置,提高数据安全性,同时方便应用程序使用;
  • 将常用的配置存储在K8S中,提供方便的访问。

⑥ 存储编排

  • 支持外挂存储并对其进行编排,使其成为集群资源的一部分,提高存储使用的灵活性;
  • 挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、Glusterfs、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。 

⑦ 任务批处理运行

  • 提供一次性任务和定时任务,满足批量数据处理和分析的需求。

4. 主要功能 

Kubernetes 是谷歌开源的容器集群管理系统,是 Google 多年大规模容器管理技术 Borg(Borg是Google开发的一个大规模集群管理系统,用于管理Google内部的数据中心资源和应用程序。)的开源 版本,主要功能包括:

  • 基于容器的应用部署、维护和滚动升级
  • 负载均衡和服务发现
  • 跨机器和跨地区的集群调度
  • 自动伸缩
  • 无状态服务和有状态服务
  • 广泛的 Volume 支持
  • 插件机制保证扩展性

这些功能使得 Kubernetes 成为一个强大且灵活的容器管理平台,适用于各种规模和类型的应用部署和管理。 

二、Kubernetes 集群架构与组件 

K8S采用主从设备模型(Master-Slave 架构),其中Master节点负责集群的调度、管理和运维,而Slave节点则承载着集群中的运算工作负载。在K8S中,主节点通常被称为Master节点,而从节点则被称为Worker Node节点,每个Node都会被Master分配一定的工作负载。

Master组件可以在群集中的任何计算机上运行,但强烈建议Master节点占据独立的服务器。因为Master是整个集群的大脑,如果Master所在节点宕机或不可用,那么所有的控制命令都将失效。除了Master,K8S集群中的其他机器被称为Worker Node节点,当某个Node宕机时,其上的工作负载会被Master自动转移到其他节点上。

1. 核心组件

1.1 Master 组件:

1.1.1 Kube-apiserver

API Server是Kubernetes的请求入口服务,通过HTTP Restful API提供接口服务。所有资源的增删改查和监听操作都由API Server处理后提交给Etcd存储。简而言之,API Server是Kubernetes集群的大脑,负责接收并处理所有来自UI界面或CLI命令行工具的请求,并通知其他组件执行相应操作。

1.1.2 Kube-controller-manager

Controller Manager是Kubernetes集群中负责管理各种资源对象的后台线程,是自动化控制的中心。它由一系列控制器组成,通过API Server监控集群状态,确保集群正常运行。例如,当某个节点意外宕机时,Controller Manager会自动发现并执行修复流程,以保证集群正常运行。

这些控制器主要包括:

Node Controller(节点控制器)

  • 负责在节点出现故障时发现和响应。

Replication Controller(副本控制器)

  • 负责保证集群中一个 RC(资源对象 Replication Controller)所关联的 Pod 副本数始终保持预设值。可以理解成确保集群中有且仅有 N 个 Pod 实例,N 是 RC 中定义的 Pod 副本数量。

Endpoints Controller(端点控制器)

  • 填充端点对象(即连接 Services 和 Pods),负责监听 Service 和对应的 Pod 副本的变化。 可以理解端点是一个服务暴露出来的访问点,如果需要访问一个服务,则必须知道它的 endpoint。

Service Account & Token Controllers(服务帐户和令牌控制器)

  • 为新的命名空间创建默认帐户和 API 访问令牌。

ResourceQuota Controller(资源配额控制器)

  • 确保指定的资源对象在任何时候都不会超量占用系统物理资源。

Namespace Controller(命名空间控制器)

  • 管理 namespace 的生命周期。

Service Controller(服务控制器)

  • 属于 K8S 集群与外部的云平台之间的一个接口控制器。
1.1.3 Kube-scheduler 

是负责资源调度的进程,根据调度算法为新创建的 Pod 选择一个合适的 Node 节点。  62种

可以理解成 K8S 所有 Node 节点的调度器。当用户要部署服务时,Scheduler 会根据调度算法选择最合适的 Node 节点来部署 Pod。

  • 预选策略(predicate),选第一批合适的节点
  • 优选策略(priorities),在这批合适的节点里选择资源最佳的节点

API Server 接收到请求创建一批 Pod ,API Server 会让 Controller-manager 按照所预设的模板去创建 Pod,Controller-manager 会通过 API Server 去找 Scheduler 为新创建的 Pod 选择最适合的 Node 节点。比如运行这个 Pod 需要 2C4G 的资源,Scheduler 会通过预选策略过滤掉不满足策略的 Node 节点。Node 节点中还剩多少资源是通过汇报给 API Server 存储在 etcd 里,API Server 会调用一个方法找到 etcd 里所有 Node 节点的剩余资源,再对比 Pod 所需要的资源,如果某个 Node 节点的资源不足或者不满足 预选策略的条件则无法通过预选。预选阶段筛选出的节点,在优选阶段会根据优先策略为通过预选的 Node 节点进行打分排名, 选择得分最高的 Node。例如,资源越富裕、负载越小的 Node 可能具有越高的排名。

1.2 配置存储中心

1.2.1 etcd

etcd是Kubernetes的分布式键值存储系统,存储了关键配置和用户配置。在Kubernetes中,只有API Server具有读写权限,其他组件必须通过API Server的接口来读写数据。

1.3 Node 组件

1.3.1 Kubelet

Kubelet是Kubernetes集群中负责监视Node节点并与Master节点通信的组件。它定期向API Server报告节点上运行的服务状态,并接收Master节点的指令以调整状态。

Kubelet从Master节点获取Pod的期望状态,直接管理容器的生命周期,并确保节点上的镜像和容器不会占用过多资源或空间。在每个Node上运行一个kubelet服务进程,负责处理任务、管理Pod和容器,并定期向Master节点汇报节点资源使用情况。

1.3.2 Kube-Proxy

Kube-Proxy在每个Node节点上实现Pod网络代理,作为Kubernetes Service资源的载体,维护网络规则和负载均衡。它通过写入iptables和ipvs规则实现服务映射访问,管理虚拟Pod集群网络,并由Kube-apiserver监控更新和维护Kubernetes Service的端点。

在Kubernetes集群中,微服务的负载均衡由Kube-Proxy实现,它是集群内部的负载均衡器,每个节点都会运行一个Kube-Proxy组件。

1.3.3 docker 或 rocket

容器引擎,运行容器,负责本机的容器创建和管理工作。

2. Kubernetes 核心概念

Kubernetes 包含多种类型的资源对象:Pod、Label、Service、Replication Controller 等。

所有的资源对象都可以通过 Kubernetes 提供的 kubectl 工具进行增、删、改、查等操作,并将其保存在 etcd 中持久化存储。

Kubernets其实是一个高度自动化的资源控制系统,通过跟踪对比etcd存储里保存的资源期望状态与当前环境中的实际资源状态的差异,来实现自动控制和自动纠错等高级功能。

2.1 Pod

Pod是Kubernetes中创建或部署的最小基本单位,代表集群上运行的一个进程。在Pod中,容器共享网络、存储和计算资源,类似豌豆荚中的豌豆。Pod可以包含一个或多个容器,支持边车模式(SideCar),但在生产环境中通常是单个容器或具有强关联的多个容器组成一个Pod。

Pod内的容器可以通过localhost互相访问并挂载所有数据卷,但不同Pod中的容器无法使用localhost相互通信,也不能挂载其他Pod的数据卷。

2.2 Pod 控制器

Pod 控制器是 Pod 启动的一种模版,用来保证在K8S里启动的 Pod 应始终按照用户的预期运行(副本数、生命周期、健康状态检查等)。

K8S 内提供了众多的 Pod 控制器,常用的有以下几种:

Deployment:

  • 用于部署无状态应用。Deployment负责管理和控制Pod和ReplicaSet,确保它们处于用户定义的状态。

ReplicaSet

  • 用于维护Pod副本数量。ReplicaSet管理和控制Pod,确保它们正常运行。值得注意的是,ReplicaSet受Deployment控制。
  • 在Kubernetes中,可以将Deployment比喻为总包工头,负责监督底下的工人Pod,确保始终有用户期望数量的Pod在工作。一旦发现某个Pod出现问题,Deployment会迅速拉取新的Pod来替换它。ReplicaSet则类似于总包工头手下的小包工头。
  • 从Kubernetes使用者的角度来看,他们通常直接操作Deployment来部署服务。当部署Deployment时,Kubernetes会自动生成所需的ReplicaSet和Pod,让用户只需关注Deployment而无需过多关心ReplicaSet。
  • Replication Controller是ReplicaSet的前身,但官方推荐使用Deployment来部署服务以取代Replication Controller。

DaemonSet

  • 用于确保集群中每个节点都运行特定类型的Pod,保证每个节点都有一个该类型的Pod在运行,通常用于实现系统级后台任务。

StatefulSet

  • 用于部署有状态的应用程序。

Job

  • 用于一次性任务。根据用户设置,Job会管理Pod来执行任务,并在任务完成后自动终止Pod。

CronJob

  • 用于周期性计划任务的执行。

2.3 Label 

在Kubernetes中,标签是一种特色的管理方式,用于便于分类管理资源对象。标签可以附加到各种资源对象上,如Node、Pod、Service、Replication Controller等,用于关联对象、查询和筛选;

每个标签是一个键值对,其中键和值由用户指定。一个资源对象可以定义任意数量的标签,同一个标签也可以添加到任意数量的资源对象中,也可以在对象创建后动态添加或删除;

通过给资源对象添加一个或多个不同的标签,可以实现多维度的资源分组管理功能。类似于标签,还有注释(Annotation);

区别在于标签的值必须在63个字符以内,并且必须以字母数字字符开头和结尾,中间可以包含横杠、下划线、点和字母或数字。而注释值则没有字符长度限制。

2.4 Label 选择器(Label selector)

在Kubernetes中,给资源对象定义一个标签相当于为其打上一个标签,随后可以通过标签选择器(Label selector)来查询和筛选具有特定标签的资源对象。

目前,标签选择器有两种类型:

基于等值关系(等于、不等于)和基于集合关系(属于、不属于、存在)。

2.5 Service

在Kubernetes集群中,Pod虽然有单独的IP地址,但由于Pod的生命周期短暂,IP地址也会随Pod销毁而消失。为了解决这个问题,Kubernetes引入了Service这一核心概念。

Kubernetes中的Service类似于网关,为一组提供相同服务的Pod提供对外访问接口和流量均衡功能。Service通过标签选择器定义作用于哪些Pod。

每个Service有一个固定的虚拟IP(Cluster IP),自动绑定后端Pod,实现请求转发。Service提供稳定的对外访问方式和负载均衡功能,透明地将请求流量分发到后端服务上,支持水平扩展。

kube-proxy是实现Service功能的关键组件,通过监听API Server中服务对象的变化,使用不同的流量调度模式(userspace、iptables、ipvs)来实现网络转发。

Service屏蔽了服务细节,统一对外暴露服务接口,使得用户只需关注一个Service的入口,而不需要关心具体请求哪个Pod。这样外部用户无需感知Pod的变化,无论是Pod的崩溃重启、升级还是变更,都不会影响外部访问。

2.6 Ingress

Service 主要负责 K8S 集群内部的网络拓扑,那么集群外部怎么访问集群内部呢?这个时候就需要 Ingress 了。Ingress 是整个 K8S 集群的接入层,负责集群内外通讯。

Ingress 是 K8S 集群里工作在 OSI 网络参考模型下,第7层的应用,对外暴露的接囗,典型的访问方式是 http/https。

Service 只能进行第四层的流量调度,表现形式是 ip+port。Ingress 则可以调度不同业务域、不同URL访问路径的业务流量。

举例来说,当客户端请求 http://www.kgc.com:port时,流量将经过Ingress,然后路由到相应的Service,最终到达对应的Pod。


Service 和 Ingress 流量请求与负载均衡:

  • 用户请求通过指定的 IP 和端口号访问 Service;
  • Service 根据定义的标签将流量平均分配给对应后端的 Pod,实现负载均衡。即使 Pod 挂掉并重新启动,其新的实例会保留原有标签,确保流量分发正常;
  • 每个带有标签的负载均衡器(Service)会创建一个集群级别的虚拟 IP。一个 Service 可以关联一个或多个标签,实现更灵活的流量控制。

2.7 Name

由于 K8S 内部,使用 “资源” 来定义每一种逻辑概念(功能),所以每种 “资源”,都应该有自己的 “名称”。

“资源” 有 api 版本(apiversion)、类别(kind)、元数据(metadata)、定义清单(spec)、状态(status)等配置信息。

“名称” 通常定义在 “资源” 的 “元数据” 信息里。在同一个 namespace 空间中必须是唯一的。

2.8 Namespace

随着项目和人员增加,以及集群规模扩大,Kubernetes引入了Namespace来逻辑上隔离各种资源。

Namespace将一个Kubernetes集群划分为多个资源不可共享的虚拟集群组。在不同Namespace中,资源名称可以相同,但同一Namespace中相同类型的资源名称必须唯一。

通过合理使用Kubernetes的Namespace,集群管理员可以更好地对交付到Kubernetes中的服务进行分类管理和浏览。

Kubernetes中默认的Namespace包括:default、kube-system、kube-public等。要查询Kubernetes中特定的资源,需要指定相应的Namespace。

三、Kubernetes 架构数据流向

1. 架构图

2. 相关概述

① 管理员使用 kubectl 命令进行身份认证,与集群通过 API server 通信;

② API server 将管理员或其他组件的请求存储到 etcd 数据库中,作为集群状态的持久化存储; etcd 生成模板,通过 API server 联系 controll manager(控制器管理器);

③ 控制器管理器根据 API server 通知,发送需求给 scheduler(资源调度器);

④ 资源调度器根据控制器管理器的需求,将 Pod 调度到合适的节点上(预选和优选),并将调度记录写入etcd;

⑤ API server 通知 kubelet,节点上的 kubelet 接收调度任务,由 Docker 创建实例,并将实例信息记录到 etcd。注意,etcd 需部署为 3 台分布式存储,实现数据共享;

⑥ Kubernetes 组件之间通过 API server 通信和协调工作,确保集群中各组件的同步和一致性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/619008.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud学习笔记(Nacos):基础和项目启动

这是本人学习的总结,主要学习资料如下 - 马士兵教育 1、基础和版本选择2、启动项目2.1、源码启动项目2.2、命令行启动 1、基础和版本选择 Nacos是用于服务发现和注册,是Spring Cloud Alibaba的核心模块。 根据文档,Spring Cloud Alibaba的版…

如何给扫描好的3d模型贴图?---模大狮模型网

在数字化设计领域,3D模型的贴图是提升模型逼真度和视觉效果的重要步骤之一。尤其是对于扫描好的3D模型,通过添加适当的贴图,不仅可以增强模型的细节和真实感,还可以为设计带来更加生动的视觉体验。本文将为您详细介绍如何给扫描好…

Linux 操作系统MySQL 数据库1

1.MySQL 数据库 数据库是“按照数据结构来组织、 存储和管理数据的仓库”。 是一个长期存储在计算机内的、 有组织的、 可共享的、 统一管理的大量数据的集合。 它的存储空间很大, 可以存放百万条、 千万条、 上亿条数据。 但是数据库并不是随意地将数据进行…

【RAG 论文】AAR:训练一个LLM喜欢的检索器来做RAG

论文:Augmentation-Adapted Retriever Improves Generalization of Language Models as Generic Plug-In ⭐⭐⭐ ACL 2023, Tsinghua & Microsoft,arXiv:2305.17331 论文速读 以往 RAG 的工作通常联合微调 retriever 和 LLM 导致紧密耦合&#xff0…

Python网络爬虫原理及实践

1 网络爬虫 网络爬虫:是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。 网络爬虫相关技术和框架繁多,针对场景的不同可以选择不同的网络爬虫技术。 2 Scrapy框架(Python) 2.1. Scrapy架构 2.1.1. 系统…

每日两题 / 108. 将有序数组转换为二叉搜索树 543. 二叉树的直径(LeetCode热题100)

108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode) 每次将数组对半分,数组的中点作为树的节点 先选择整个数组的中点作为根节点,然后选择对半分后的两个子数组的中点作为根节点的左右节点… /*** Definition for a binary tre…

【数据结构】总结建堆方式、建堆时间复杂度对比分析

目录 一、建堆方式 1.堆的实现中——HeapPush()插入建堆 2.手动建堆——利用AdjustUp()向上调整建堆 3.手动建堆——利用AdjustDown()向下调整建堆 二、手动建堆时间复杂度对比分析 1.向上调整建堆时间复杂度O(N*logN) 2.向下调整建堆时间复杂度O(N) 一、建堆方式 1.堆…

GENRE

1、整体设计 该工作(GENRE)在新闻推荐的场景下,用 LLM 构造了三个不同的prompts,分别来进行新闻摘要的改写,用户画像的构建,还有样本增强。 2、分模块介绍 摘要改写:把新闻的title,…

java1.8 的 client runtime compiler和server runtime compiler

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…

南京观海微电子----开关电流与输入输出电流的关系

BOOST 结构的工作原理及波形 BOOST 结构简单原理图见图 1,工作时各点的电压电流波形见图 2。 不考虑上电时的情形,仅考虑稳定工作时,情况如下: 当开关管 Q 导通时(开关管电压为 0),电感 L 相当…

JVM的原理与性能

1 JVM 内存结构 1.1 运行时数据区 1.1.1 栈(虚拟机栈) 每个线程在创建时都会创建一个私有的Java虚拟机栈,在执行每个方法时都会打包成一个栈帧,存储了局部变量表、操作数栈、动态链接、方法出口等信息,然后放入栈中。…

实现echarts地图

效果图: 2.echarts.registerMap("xizang", XZ) 注册了一个名为 "xizang" 的地图,其中 XZ 是地图数据。 接下来是 option 对象,包含了图表的配置信息,比如图表的布局、提示框样式、地理组件配置和系列数据配置等。 在 t…

Day 28 MySQL的数据备份与恢复

数据备份及恢复 1.概述 ​ 所有备份数据都应放在非数据库本地,而且建议有多份副本 备份: 能够防止由于机械故障以及人为误操作带来的数据丢失,例如将数据库文件保存在了其它地方 冗余: 数据有多份冗余,但不等备份&…

vivado Virtex-7 配置存储器器件

Virtex-7 配置存储器器件 下表所示闪存器件支持通过 Vivado 软件对 Virtex -7 器件执行擦除、空白检查、编程和验证等配置操作。 本附录中的表格所列赛灵思系列非易失性存储器将不断保持更新 , 并支持通过 Vivado 软件对其中所列非易失性存储器 进行擦除、…

【Web后端】会话跟踪技术及过滤器

1.会话跟踪技术 1.1 会话的概念 在web应用中,浏览器和服务器在一段时间内发送请求和响应的连续交互的全过程 1.2 会话跟踪概念 对同一个用户跟服务器的连续请求和接收响应的监视过程 1.3 会话跟踪作用 浏览器和服务器是以http协议进行通信,http协议是…

day12-多线程

多线程 1.为什么要学习多线程 生活:流水线打工 public static void main(String[] args) { // 代码… for (int i 0; i < 10; i) { System.out.println(i); } // 代码... }多线程:多&#xff08;个&#xff09; 线程 1.1 进程和线程 线程&#xff1a;是进程中的…

Java日志总结

开发中&#xff0c;日志记录是不可或缺的一部分&#xff0c;应用日志的记录主要用于&#xff1a;记录操作轨迹数据、监控系统运行情况、系统故障定位问题&#xff0c;日志的重要性不言而喻&#xff0c;想要快速定位问题&#xff0c;日志分析是个重要的手段&#xff0c;Java也提…

企业信息系统的总体框架

1.信息系统体系结构的总体参考框架 信息系统的架构&#xff08;Information System Architecture&#xff0c;ISA&#xff09;中的Architecture含义具有丰富内涵和作用&#xff0c;相比计算机领域的Architecture来说它的单一性、片面性模型是难以描述ISA的全部的&#xff0c;IS…

docker八大架构之单机架构

单机架构 什么是单机架构&#xff1f; 单机架构指的是应用服务和数据库服务公用同一台服务器。如下边两个图所示&#xff0c;当我们进行购物时&#xff0c;所有的物品信息和用户信息都是在同一个服务器下进行运行的&#xff0c;之所以称为单机架构就是因为它所有的操作是在同…

文心一言 VS 讯飞星火 VS chatgpt (257)-- 算法导论19.2 1题

一、给出图19-4(m)中的斐波那契堆调用 FIB-HEAP-EXTRACT-MIN 后得到的斐波那契堆。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 由于我不能直接画出图19-4(m)中的斐波那契堆&#xff0c;我将基于斐波那契堆的基本结构和操作FIB-HEAP-EXTRACT-MIN的一般行为来…