当前位置:首页 > 数码 > Kubernetes-中成功平滑缺点转移-优雅封锁和零停机部署 (kubernetes与docker的关系)

Kubernetes-中成功平滑缺点转移-优雅封锁和零停机部署 (kubernetes与docker的关系)

admin7个月前 (05-03)数码27

在Kubees中,创立和删除Pod是最经常出现的义务之一。

当你口头滚动降级、裁减部署、颁布新版本、口头作业和定时作业等操作时,都会创立Pod。

但是,在Pod被驱逐后,例如将节点标志为无法调度时,Pod也会被删除并从新创立。

假设这些Pod的性质是如此持久,那么当一个Pod正在照应恳求时,假设原告知封锁,会出现什么?在封锁之前,恳求能否会成功?那么后续的恳求呢?能否会被重定向到其他中央?

在讨论Pod被删除时会出现什么之前,有必要谈谈当Pod被创立时会出现什么。

假定你想在集群中创立以下Pod:

apiVersion:v1kind:Podmetadata:name:my-podspec:contners:-name:webimage:ports:-name:webcontainerPort:80

你可以经常使用以下命令将YAML定义提交到集群中:

$kubectlly-fpod.yaml

一旦你输入该命令,kubectl会将Pod定义提交给KubernetesAPI。

在数据库中保留集群的形态

Pod的定义被API接纳并启动审核,随后存储在数据库(etcd)中。

Pod也被参与到调度器的队列中。

调度器口头以下操作:

审核Pod的定义。

搜集关于上班负载的具体信息,例如CPU和内存恳求。

经过挑选器和判定的环节选择最适宜运转该Pod的节点。

在此环节完结时:

但是,此时Pod依然不存在。

图片

图片

3.调度器为该Pod调配了最适宜的节点,Pod的形态变为Pending。此时,Pod只存在于etcd中。

图片

在控制平面中出现了前述义务,并且形态存储在数据库中。

**那么是谁在你的节点上创立Pod呢?

Kubelet-Kubernetes代理

Kubelet的义务是轮询控制平面以失掉降级。

你可以构想kubelet始终地向主节点收回恳求:我担任治理上班节点1,能否有新的Pod须要我处置?

当有一个Pod须要处置时,kubelet会创立它,在某种水平上是这样的。

kubelet并不是间接创立Pod。相反,它将上班委托给其他三个组件:

在大少数状况下,容器运转时接口(CRI)的上班相似于:

容器网络接口(CNI)更幽默,由于它担任以下义务:

正如你所构想的,衔接容器到网络并调配有效的IP地址有多种方式(可以选用IPv4或IPv6,甚至可以调配多个IP地址)。

以Docker为例,它会创立虚构以太网对并将其附加到一个桥接器上;而AWS-CNI会间接将Pod衔接到虚构私有云(VPC)的其他局部。

当容器网络接口成功其上班时,Pod将衔接到网络的其他局部,并被调配一个有效的IP地址。

但是存在一个疑问。

kubelet知道IP地址(由于它调用了容器网络接口),但控制平面不知道。

没有人通知主节点Pod已被调配了IP地址,并且预备好接纳流量。在控制平面的视角中,Pod仍在创立中。

kubelet的上班是搜集Pod的一切细节,例如IP地址,并将其报告给控制平面。

你可以构想,审核etcd将不只提醒Pod的运转位置,还会显示其IP地址。

1.Kubelet活期向控制平面轮询降级。

2.当一个新的Pod被调配给它所在的节点时,kubelet会失掉该Pod的具体信息。

3.kubelet自身不会创立Pod,它依赖于三个组件:容器运转时接口(ContainerRuntimeInterface)、容器网络接口(ContainerNetworkInterface)和容器存储接口(ContainerStorageInterface)。

4.一旦这三个组件都成功成功,Pod就会在你的节点上运转,并调配了一个IP地址。

5.kubelet将IP地址报告给控制平面。

假设Pod不是任何服务的一局部,这就是义务的完结。Pod已创立并预备好经常使用。

当Pod是服务的一局部时,还须要启动一些额外的步骤。

Pods和服务

创立服务时,通常须要留意两个关键信息:

一个典型的服务的YAML定义如下:

service.yaml

apiVersion:v1kind:Servicemetadata:name:my-servicespec:ports:-port:80targetPort:3000selector:name:app

当你经常使用kubectlapply将服务提交到集群时,Kubernetes会查找一切具备与选用器(name:app)相反标签的Pod,并搜集它们的IP地址,但前提是它们经过了就绪探针(Readinessprobe)。

而后,关于每个IP地址,Kubernetes会将IP地址和端口衔接起来。

假设IP地址是10.0.0.3,目的端口是3000,Kubernetes会将这两个值衔接起来,并称其为一个端点(endpoint)。

IPaddress+port=endpoint---------------------------------10.0.0.3+3000=10.0.0.3:3000

这些端点将以另一个名为Endpoint的对象方式存储在etcd中。

有点困惑吗?

在Kubernetes中,以下术语实用:

endpoint(本文和Learnk8s资料中以小写字母e示意)是IP地址和端口对的组合(10.0.0.3:3000)。Endpoint(本文和Learnk8s资料中以大写字母E示意)是一组端点的汇合。Endpoint对象是Kubernetes中的一个实在对象,关于每个服务,Kubernetes会智能创立一个Endpoint对象。

你可以经常使用以下命令启动验证:

$kubectlgetservices,endpointsNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)service/my-service-1ClusterIP10.105.17.65<none>80/TCPservice/my-service-2ClusterIP10.96.0.1<none>443/TCPNAMEENDPOINTSendpoints/my-service-1172.17.0.6:80,172.17.0.7:80endpoints/my-service-2192.168.99.100:8443

Endpoint会搜集来自Pod的一切IP地址和端口。

但不只如此。当出现以下状况时,Endpoint对象会经常使用新的端点列表启动刷新:

因此,你可以构想,每当你创立一个Pod,并且kubelet将其IP地址提交给主节点后,Kubernetes会降级一切的端点以反映这种变动:

$kubectlgetservices,endpointsNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)service/my-service-1ClusterIP10.105.17.65<none>80/TCPservice/my-service-2ClusterIP10.96.0.1<none>443/TCPNAMEENDPOINTSendpoints/my-service-1172.17.0.6:80,172.17.0.7:80endpoints/my-service-2192.168.99.100:8443

很好,端点被存储在控制平面中,并且Endpoint对象已被降级。

1.在这张图片中,你的集群中部署了一个独自的Pod。该Pod属于一个服务。假设你要审核etcd,你会发现Pod的具体信息以及服务的信息。

2.当部署新的Pod时会出现什么?

3.Kubernetes须要跟踪Pod及其IP地址。服务应该将流量路由到新的端点,因此IP地址和端口应该被流传。

4.当另一个Pod被部署时会出现什么?

5.是的,齐全相反的环节。在数据库中创立了新的行来示意新的Pod,并将端点启动流传。

6.当删除一个Pod时会出现什么?

7.服务立刻移除该端点,最终该Pod也会从数据库中删除。

8.Kubernetes对你的集群中的每一个小变动都做出反响。

在Kubernetes中经常使用端点

端点在Kubernetes中被多个组件经常使用。

Kube-proxy经常使用端点来在节点上设置iptables规定。

因此,每当端点(Endpoint对象)出现变动时,kube-proxy会失掉新的IP地址和端口列表,并编写新的iptables规定。

2.当你创立一个服务(Service)时会出现什么?

3.Kubernetes创立了一个Endpoint对象,并搜集了来自Pod的一切端点(IP地址和端口对)。

4.kube-proxy守护程序订阅对Endpoint的更改。

5.当Endpoint被参与、删除或降级时,kube-proxy会失掉新的端点列表。

6.kube-proxy经常使用端点来在集群的每个节点上创立iptables规定。

Ingress控制器也经常使用相反的端点列表。

Ingress控制器是集群中将外部流量路由到集群内的组件。

当你设置一个Ingress性能文件时,通常会指定Service作为目的:

入口.yaml

apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:my-ingressspec:rules:-http:paths:-backend:service:name:my-serviceport:number:80path:/pathType:Prefix

实践上,流量并不会间接路由到Service。

相反,Ingress控制器建设了一个订阅,以便在Service的端点出现变动时收到通知。

Ingress间接将流量路由到Pods,跳过了Service。

正如你所构想的那样,每当Endpoint(对象)出现变动时,Ingress会失掉新的IP地址和端口列表,并从新性能控制器以包括新的Pods。

2.假设你想经过Ingress将外部流量路由到Pods,你应该创立一个Ingress性能文件(一个YAML文件)。

3.一旦你运转kubectlapply-fingress.yaml命令,Ingress控制器就会从控制平面中失掉性能文件。

4.Ingress的YAML文件中有一个serviceName属性,用于形容应该经常使用哪个Service。

5.Ingress控制器从Service中检索端点列表,并跳过该Service。流量间接流向端点(Pods)。

6.当创立一个新的Pod时会出现什么?

7.你曾经知道Kubernetes如何创立Pod并流传端点信息了。

8.Ingress控制器订阅对端点的更改。由于有一个新的变动,它会失掉新的端点列表。

9.Ingress控制器将流量路由到新的Pod上。

还有其他订阅端点更改的Kubernetes组件的示例。

集群中的组件CoreDNS就是其中之一。

假设你经常使用Headless类型的Service,CoreDNS将须要订阅端点的更改,并在每次参与或删除端点时从新性能自身。

雷同,服务网格(如Istio或Linkerd)、云服务提供商用于创立类型为LoadBalancer的服务,以及有数的操作员都会经常使用这些端点。

你必定记住,有多个组件订阅端点的更改,它们或许在不同的时期接纳到关于端点降级的通知。

这就足够了,或许还有在创立Pod后出现的事情吗?

创立Pod时出现的关键步骤的简明回忆:

假设你的Pod属于一个Service:

关于一个看似个别的义务——创立一个Pod来说,这个列表确实很长。

Pod曾经运转起来了。如今是时刻讨论一下当你删除Pod时会出现什么了。

删除Pod

你或许曾经猜到了,但是当删除Pod时,你须要依照相反的步骤但是逆序启动操作。

首先,应该从Endpoint(对象)中移除端点。

这次Readinessprobe会被疏忽,并且端点会立刻从控制平面中删除。

这反上来会触发kube-proxy、Ingress控制器、DNS、服务网格等一切事情。

这些组件将降级其外部形态,并中止将流量路由到该IP地址。

由于这些组件或许正在口头其他操作,无法保障从其外部形态中删除IP地址须要多长时期。关于某些组件来说,或许只要要不到一秒的时期;而关于其他组件来说,或许须要更长的时期。

对一些来说,这或许只要要不到一秒钟;对其他来说,这或许须要更多。

1.假设你经常使用kubectldeletepod删除一个Pod,该命令首先会发送到KubernetesAPI。

2.该信息会被控制平面中的特定控制器——Endpoint控制器所阻拦。

3.Endpoint控制器向API发送命令,将IP地址和端口从Endpoint对象中移除。

4.谁会监听Endpoint的更改?kube-proxy、Ingress控制器、CoreDNS等组件会收到关于这一变卦的通知。

5.一些组件,如kube-proxy,或许须要额外的时期来进一步流传这些更改。

与此同时,etcd中的Pod形态被更改为Terminating(终止中)。

kubelet收到此变卦的通知,并启动以下操作:

换句话说,Kubernetes依照与创立Pod齐全相反的步骤来启动反向操作。

1.假设你经常使用kubectldeletepod删除一个Pod,该命令首先会发送到KubernetesAPI。

2.当kubelet轮询控制平面以失掉降级时,它会留意到Pod已被删除。

3.kubelet将销毁Pod的义务委托给容器运转时接口(ContainerRuntimeInterface)、容器网络接口(ContainerNetworkInterface)和容器存储接口(ContainerStorageInterface)。

但是,这里存在一个巧妙但关键的区别。

当你终止一个Pod时,移除端点和向kubelet发送的信号同时收回。

当你初次创立一个Pod时,Kubernetes会期待kubelet报告IP地址,而后开局端点流传。

但是,当你删除一个Pod时,事情会并行出现。

这或许造成多种竞争条件的出现。

kubernetes与docker的关系

假设在端点流传之前删除了Pod会怎样呢?

1.删除端点和删除Pod同时启动。

2.因此,在kube-proxy降级iptables规定之前,你或许会先删除端点。

3.或许你或许更幸运,只要在端点齐全流传之后才删除Pod。

优雅封锁

当一个Pod在从kube-proxy或Ingress控制器中移除端点之前被终止时,你或许会遇到停机时期。

假设细心理考一下,这是有情理的。

Kubernetes依然将流量路由到该IP地址,但Pod曾经不存在了。

Ingress控制器、kube-proxy、CoreDNS等组件没有足够的时期将IP地址从其外部形态中移除。

现实状况下,Kubernetes应该在删除Pod之后期待集群中的一切组件都具备降级的端点列表。

但是Kubernetes并不是这样上班的。

Kubernetes提供了弱小的原始组件来散发端点(例如Endpoint对象和更初级的形象,如EndpointSlices)。

但是,Kubernetes并不验证订阅端点变卦的组件能否与集群形态坚持同步。

那么,为了防止这种竞争条件并确保在端点流传后删除Pod,你可以做些什么呢?

你应该期待。当Pod行将被删除时,它会收到一个SIGTERM信号。

你的运行程序可以捕捉该信号并开局封锁。

由于在Kubernetes中不太或许立刻从一切组件中删除端点,你可以:

你应该期待多长时期呢?自动状况下,Kubernetes会发送SIGTERM信号,并在强迫终止进程之后期待30秒钟。

因此,你可以在最后的15秒内继续反常运转。

宿愿这个时时期隔足够将端点移除的更改流传到kube-proxy、Ingress控制器、CoreDNS等组件。

随着时期的推移,越来越少的流量会抵达你的Pod,直到最终中止。

在15秒之后,可以安保地封锁与数据库(或任何耐久衔接)的衔接并终止进程。

假设你以为须要更多时期,可以在20或25秒时中止进程。

但是,请记住,Kubernetes将在30秒后强迫终止进程(除非你在Pod定义中更改了terminationGracePeriodSeconds)。

假设无法更改代码以期待更长时期怎样办?你可以调用一个脚本期待固定的时期,而后让运行程序分开。

在调用SIGTERM之前,Kubernetes在Pod中提供了一个preStop钩子。你可以将preStop钩子设置为期待15秒钟。

让咱们看一个示例:

apiVersion:v1kind:Podmetadata:name:my-podspec:containers:-name:webimage:nginxports:-name:webcontainerPort:80lifecycle:preStop:exec:command:["sleep","15"]

preStop钩子是Pod生命周期钩子之一。

15秒的提前是介绍的时期吗?这取决于状况,但这或许是开局测试的正当方式。

以下是你可以选用的选项的总结:

1.你曾经知道,当一个Pod被删除时,kubelet会收到这一变卦的通知。

图片

2.假设Pod具备preStop钩子,它会首先被调用。

3.当preStop钩子成功后,kubelet会向容器发送SIGTERM信号。从那时起,容器应该封锁一切长衔接并预备终止。

4.自动状况下,进程有30秒的时期分开,其中包括preStop钩子的口头时期。假设进程在此时期未分开,kubelet将发送SIGKILL信号并强迫终止进程。

5.kubelet通知控制平面成功删除了该Pod。

优雅期限和滚动降级

优雅封锁实用于被删除的Pod。

但假设你不删除Pod呢?即使你不删除Pod,Kubernetes也会活期删除Pod。

特意是,每当你部署运行程序的新版本时,Kubernetes会创立和删除Pod。

当你在部署中更改镜像时,Kubernetes会逐渐推出变卦。

apiVersion:apps/v1kind:Deploymentmetadata:name:appspec:replicas:3selector:matchLabels:name:apptemplate:metadata:labels:name:appspec:containers:-name:app#image:nginx:1.18OLDimage:nginx:1.19ports:-containerPort:3000

假设你有三个正本,并且在提交新的YAML资源给Kubernetes后,Kubernetes会:

而后它会重复上述步骤,直到一切的Pod都迁徙到新版本。

Kubernetes只要在新的Pod预备好接纳流量(也就是经过了就绪性审核)后才会重复每个周期。

Kubernetes在继续处置下一个Pod之前能否期待Pod被删除?

不会。

假设你有10个Pod,并且每个Pod须要2秒钟预备就绪和20秒钟封锁,状况如下:

在20秒钟之后,一切新的Pod都处于优惠形态(10个Pod,在2秒钟后预备就绪),而之前的10个Pod都处于终止形态(第一个终止的Pod行将分开)。

总体而言,在短时期内你将领有两倍数量的Pod(10个运转中,10个终止中)。

与就绪探针相比,宽限期限越长,你将同时领有更多的运转中(以及终止中)的Pod。

这是一件坏事吗?不必定,由于你要小心肠确保不失落衔接。

终止长时期运转的义务

那关于长时期运转的作业呢?

假设你正在转码一个大型视频,有没有方法提前中止Pod的操作?

构想一下,你有一个蕴含三个正本的部署。

每个正本被调配了一个视频启动转码,并且这个义务或许须要几个小时能力成功。

当你触发滚动降级时,Pod在被终止之前有30秒的时期来成功义务。

你如何防止提前封锁Pod的操作?你可以将terminationGracePeriodSeconds参与到几个小时。

但是,在那个时期点上,Pod的端点是无法访问的。

假设你将目的泄露用以监控Pod,你的监控工具将无法访问你的Pod。

为什么会这样?

像Prometheus这样的工具依赖于端点来抓取集群中的Pod。

但是,一旦你删除Pod,端点删除的信息会在集群中流传,甚至传递给Prometheus!

与其参与宽限期限,你应该思索为每个新版本创立一个全新的部署。

当你创立一个全新的部署时,现有的部署将坚持不变。

长时期运转的作业可以继续反常处置视频。一旦它们成功,你可以手动删除它们。

假设你宿愿智能删除它们,你可以设置一个智能缩放器,当义务用尽时,它可以将部署的正本数缩减为零。

这种Pod智能缩放器的一个例子是Osiris——一个Kubernetes的通用、缩放到零的组件。

这种技术有时被称为RainbowDeployments,在须要坚持先前的Pod运转时期善于宽限期限的状况下十分有用。

另一个很好的例子是WebSockets。假设你正在向用户实时传输降级,你或许不宿愿每次颁布时都终止WebSockets。

假设你在一天内频繁颁布,这或许会造成实时数据流终止屡次。

为每个颁布创立一个新的部署是一个不太直观但更好的选用。

现有用户可以继续传输降级,而最新的部署为新用户提供服务。

随着用户从旧的Pod断开衔接,你可以逐渐缩小正本并淘汰过去的部署。

总结

你应该留意从集群中删除的Pod,由于它们的IP地址或许依然被用于路由流量。

与立刻封锁Pod不同,你应该思索在运行程序中期待更长时期,或设置一个preStop钩子。

只要在集群中的一切端点都被流传并从kube-proxy、Ingress控制器、CoreDNS等中删除后,才应该删除Pod。

假设你的Pod运转长时期的义务,例如视频转码或经常使用WebSockets提供实时降级,请思索经常使用RainbowDeployments。在RainbowDeployments中,你为每个颁布创立一个新的部署,并在衔接(或义务)耗尽时删除先前的部署。

你可以在长时期运转的义务成功先手动删除旧的部署。或许,你可以智能将部署的正本数缩减为零,以智能化该环节。


这是怎么回事???高手来。。。

楼上说的简直。 。 。 。 我恨不得骂人,不要误导别人好不好。 一步一步来说吧:1、报错的是 是windows的一个自带的命令。 它的用处很广泛,用法也很多。 它的最主要的作用,是用来注册动态链接库文件。 2、按照报警的内容来说,是该内存地址不能writen,注意,这是写入,不是读取。 楼上几位,读取内存个P啊。 这个地址肯定是不能写入的,因为这已经是高权限锁死的内存区域了。 在windows运行的时候,系统会划分出低地址开始的一片区域,作为高权限的进程和系统内核进程存取的区域。 这个区域,是不允许这些进程以外的进程读取或写入的。 3、几分钟就报一次,说明几分钟就被调用运行一次。 而且,都是在网不允许的内存地址上写数据。 那么,原因就可能是:1、调用的进程本身的错误,而且调用的进程不停的在运行。 (可能性不大。 )2、或者调用的进程本身没有错误,它的目的就是在该区域内写数据。 (这个就有点意思了,典型的进程注入,但目标进程却是封锁的。 )所以,考虑的结果是:可能中毒了。 (前面其实都是废话。 )

如何在VMware vSphere上安装Kubernetes来运行Docker

安装Mater和Client首先,将CentOS更新到最新版本,同时重新启动机器。 然后,开始用yum命令行来安装master节点。 现在,让我们来安装client:为了验证它已经成功安装了,尝试以下命令行:创建一个新的集群/podKubernetes在真实“软件定义”样式中使用json文件描述POD蓝图。 我之前提到过的Docker书作者已经创建了一个不错的pod样本,如下图所示。 它有两个容器:一个是为网页服务器,另一个则是为DB的。 简单,用来阐述pod最好。

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Kubernetes

“Kubernetes-中成功平滑缺点转移-优雅封锁和零停机部署 (kubernetes与docker的关系)” 的相关文章

Kubernetes-网关-战略的流量治理-基于-API (kubernetes)

Kubernetes-网关-战略的流量治理-基于-API (kubernetes)

Kubees网关API经过形象复杂性并提供申明式的方法来定义路由和流量战略,简化了性能流程。 译自EffectiveTrafficManagementwithKubernetesGatewa...

Kubernetes-集群的十年历程-管理-踩过的十个大坑 (kubernetes)

Kubernetes-集群的十年历程-管理-踩过的十个大坑 (kubernetes)

Kubernetes是容器技术的绝对王者,它允许我们在YAML文件中描述应用程序的外观,然后Kubernetes会完成其余的工作。 高效管理Kubernetes集群至关重要。本文总结了管理K...

Kubernetes-Kubernetes-深化了解-中的网络原理和最佳通常-网络模型综合指南 (kubernetes与docker的关系)

Kubernetes-Kubernetes-深化了解-中的网络原理和最佳通常-网络模型综合指南 (kubernetes与docker的关系)

这篇详细的博文讨论了Kubees网络的复杂性,提供了关于如何在容器化环境中确保高效和安保通讯的见地。 译自NavigatingtheNetwork:AComprehensiveGuideto...

优秀Kubernetes工具的最终指南 (优秀库)

优秀Kubernetes工具的最终指南 (优秀库)

引言 Kubernetes 是用于管理容器化应用程序编排的领先平台。它提供了出色的功能,例如自动扩展、自动修复和负载平衡,这些功能使其成为软件工程师的首选解决方案。Kubernetes 的管理可...

深入了解-不够用时-调试的救星-superdebug-当debug-Kubernetes (深入了解不够)

深入了解-不够用时-调试的救星-superdebug-当debug-Kubernetes (深入了解不够)

kubectlexec 命令的限制 kubectlexec 命令用于在正在运行的 Pod 中执行命令,但它在 Kubernetes 中有以下限制: 不能以 root 身份运行:容...

Kubernetes-治理容器化运行程序-经常使用 (kubernetes与docker的关系)

Kubernetes-治理容器化运行程序-经常使用 (kubernetes与docker的关系)

引见 Kube-downscaler是一款开源工具,准许用户定义Kubees中pod资源智能缩减的时期。这有助于经过增加非高峰时段的资源经常使用量来降落基础设备老本。 在本文中,咱们将...

100个常用命令-Kubernetes-提升集群管理和故障排除效率 (100个常用的关联词)

100个常用命令-Kubernetes-提升集群管理和故障排除效率 (100个常用的关联词)

本指南提供了全面的命令清单,用于诊断 Kubernetes 集群以及在其中运行的应用程序。请在使用这些命令时务必将占位符(如 <namespace> 和...

ChatGPT避而不谈-揭开Kubernetes消费运行的十大秘诀 (chatgpt官网)

ChatGPT避而不谈-揭开Kubernetes消费运行的十大秘诀 (chatgpt官网)

理想证实,生成式在许多相对基础的用例中已施展作用,然而当它须要在技术方面给予更多指点时,体现又如何呢? 在推出时,咱们也和大家一样想将它给出的答案与惯例网络搜查获取的答案启动比拟。咱们启动试...