当前位置: 首页 > news >正文

CKA认证 | Day1 k8s核心概念与集群搭建

第一章 Kubernetes 核心概念

1、主流的容器集群管理系统

容器编排系统:

  • Kubernetes
  • Swarm
  • Mesos Marathon

 

2、Kubernetes介绍

Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8s。

Kubernetes用于容器化应用程序的部署,扩展和管理,目标是让部署容器化应用简单高效。

官方网站:Kubernetes

官方文档:Kubernetes 文档 | Kubernetes

注意:熟悉文档中的【概念】、【任务】

3、Kubernetes集群架构与组件

3.1 Master 组件

  • kube-apiserver

Kubernetes API,集群的统一入口,各组件协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。

  • kube-scheduler

根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。

  • kube-controller-manager

处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的。例如:Deployment、Service

  • etcd

分布式键值存储系统。用于保存集群状态数据,比如Pod、Service等对象信息(可以部署在Master节点或者独立节点)

 

3.2 Work/node 组件

  • kubelet

kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器。

  • kube-proxy

在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。

  • 第三方容器引擎

容器引擎,运行容器, 例如docker、containerd、podman

 

第二章 Kubernetes集群部署、配置和验证

1、生产环境部署K8s的2种方式

  • kubeadm

Kubeadm是一个工具,提供 kubeadm init 和 kubeadm join,用于快速部署Kubernetes集群。

部署地址:Kubeadm | Kubernetes

  • 二进制

从官方下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。

下载地址:Releases · kubernetes/kubernetes · GitHub

  • 第三方工具或者Web

 

2、服务器硬件配置推荐

3、使用kubeadm快速部署一个K8s集群

参考:CKA认证 | 使用kubeadm部署K8s集群(v1.26)-CSDN博客

  1. 安装Docker(docker-ce容器引擎、cri-docker容器运行时)
  2. 创建 Master 、node节点
  3. kubeadm init初始化集群
  4. 将一个 Node 节点加入到当前集群中 (kubeadm join < Master节点的IP和端口 >)
  5. 部署容器网络(CNI)(kubectl apply -f calico.yaml)
  6. 部署Web UI(Dashboard)

部署k8s集群避坑:

  1. cri-docker 版本 必须使用的是 0.3(最新的版本),否则将会存在兼容性问题;
  2. 使用镜像拉取比较慢的问题(可能是网络问题),使用docker pull在别的服务器进行下载,通过docker save保存下来,通过 docker load 导入所有节点;
  3. 在master上 kubeadm init 时执行失败,大部分问题为kubelet无法启动,原因可能是主机的初始化为准备好、其次cri-docker没安装最新版本
  4. 安装有问题需要清空环境配置,通过 kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock 进行还原
  5. kubeadm init 会输出关于工作节点进行join的命令,有效期24小时,通过 kubeadm token create --print-join-command 生成新的token

 

4、部署的网络组件起什么作用?

Q: 不同docker服务器的两个容器间的访问遇到问题:

① 容器1和容器2 分配的IP有可能一样,是因为docker主机有各自的网络管理机制、独立的?

  • 思路:设置不同网段

② 容器1和容器2 分配的IP即使不一样,也是网络无法ping通,是因为容器1发送的数据包不知道送往何处?

  • 思路:配置路由

③ 即使知道将数据包送往何处,那通过什么方式通过容器送达?

  • 思路:容器的数据包需要通过宿主机网络将数据包发送到对端的宿主机再传送到里面的容器

A: 部署网络组件的目的是打通Pod到Pod之间网络、Node与Pod之间网络,从而集群中数据包可以任意传输,形成了一 个扁平化网络。所以网络组件的主要作用是可以实现容器跨主机通信


目前主流的网络组件:Flannel、Calico 等 ;而所谓的 CNI( Container Network Interface,容器网络接口)就是k8s对接这些第三方网络组件的接口。

补充:

CNI 容器网络接口,对接网络组件

CRI 容器运行时接口,对接容器引擎

CSI 容器存储接口,对接存储组件

 

5、Kubernetes将弃用Docker!

在Kubernetes平台中,为了解决与容器运行时(例如Docker)集成 问题,在早期社区推出了CRI(Container Runtime Interface,容 器运行时接口),以支持更多的容器运行时。

当我们使用Docker作为容器运行时之后,架构是这样的,如图所示:

Kubernetes 计划弃用就是kubelet中dockershim。即 Kubernetes kubelet 实现中的组件之一,它能够与 Docker Engine 进行通信。

Q:为什么这么做?

  • K8s核心代码优化
  • Docker内部调用链比较复杂,多层封装和调用,导致性能降低、提升故障率、不易排查
  • Docker还会在宿主机创建网络规则、存储卷,也带来了安全隐患

Q:如何应对?

可通过 cri-dockerd 继续使用Docker,并了解其他主流容器运行时。除了docker之外,CRI还支持很多容器运行时,例如:

  • containerd:containerd与Docker相兼容,相比Docker轻量很多,目前较为成熟
  • cri-o,podman:都是红帽(RedHat)项目,目前红帽主推podman

Q:相关 containerd 切换的其它疑问?

① 独立的容器运行时,在一个集群中可以有多个运行时,一般再测试环境下才会有两个容器运行时

② 正常要求下,在切换容器运行时,建议在所有的节点都要进行切换操作,不建议混用,不利于后期的维护

③ 目前主流的镜像都是通用的

 

6、kubeconfig配置文件

kubectl 使用 kubeconfig 认证文件连接K8s集群,使用 kubectl config 指令生成 kubeconfig文件。

了解:关于config文件 只是一个“管理工具” 无论在哪个节点 都可以访问 (例如:在本地虚拟机上也可以访问公司的集群)

 

7、kubectl命令行管理工具

官方文档参考地址:命令行工具 (kubectl) | Kubernetes

# 自动补全
yum -y install bash-completion
source <(kubectl completion bash)
vi .bashrc    //将 source <(kubectl completion bash) 写入,开机自启
# 查看客户端和服务端的版本
[root@k8s-master-1-71 ~]# kubectl version
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short.  Use --output=yaml|json to get the full version.   //提示未来会弃用需要加参数[root@k8s-master-1-71 ~]# kubectl version --output=yaml
clientVersion:      //客户端版本buildDate: "2022-12-08T19:58:30Z"compiler: gcgitCommit: b46a3f887ca979b1a5d14fd39cb1af43e7e5d12dgitTreeState: cleangitVersion: v1.26.0goVersion: go1.19.4major: "1"minor: "26"platform: linux/amd64
kustomizeVersion: v4.5.7
serverVersion:    //APIserver版本buildDate: "2022-12-08T19:51:45Z"compiler: gcgitCommit: b46a3f887ca979b1a5d14fd39cb1af43e7e5d12dgitTreeState: cleangitVersion: v1.26.0goVersion: go1.19.4major: "1"minor: "26"platform: linux/amd64
# 创建资源(功能),例如deployment、service等
例:kubectl create deployment java-demo --image=镜像来源
# --image=镜像来源
1、docker官方公共镜像仓库(hub.docker.com),默认使用,镜像地址没有带域名或者IP
2、指定镜像仓库,即镜像地址带域名或者IP
例:kubectl create deployment java-demo --image=镜像来源 --replices=1
# --replices 副本数(默认是1副本)# 暴露应用
例:kubectl expose deployment java-demo --port=端口 --target-port=端口 --type=NodePort
--port=service的端口
--target-port=镜像内服务运行的端口
--type=service的类型,例如NodePort# 查看相关镜像
例:kubectl get pods --show-lables
例:kubectl get pods -l app=ngix
--show-lables   //查看pods标签
-l 标签   //可以进行过滤# 查看服务
kubectl get service

 

8、快速部署一个网站

使用Deployment控制器部署镜像:

[root@k8s-master-1-71 ~]# kubectl create deployment java-demo --image=lizhenliang/java-demo
deployment.apps/java-demo created[root@k8s-master-1-71 ~]# kubectl get deployment
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
java-demo   1/1     1            1           5m51s[root@k8s-master-1-71 ~]# kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
java-demo-5cb596f979-47g2r   1/1     Running   0          5m46s

使用Service将Pod暴露出去:

[root@k8s-master-1-71 ~]# kubectl expose deployment java-demo --port=80 --target-port=8080 --type=NodePort
service/java-demo exposed[root@k8s-master-1-71 ~]# kubectl get services
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
java-demo    NodePort    10.105.177.89   <none>        80:32710/TCP   88s
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        3h7m
或者
[root@k8s-master-1-71 ~]# kubectl get svc   //svc为缩写

访问应用:

http://NodeIP:Port # 端口随机生成,通过kubectl get service获取

9、基本资源概念

  • Pod:K8s最小部署单元,一组容器的集合
  • Deployment:最常见的控制器,用于更高级别部署和管理Pod
  • Service:为一组Pod提供负载均衡,对外提供统一访问入口
  • Label :标签,附加到某个资源上,用于关联对象、查询和筛选
  • Namespaces :命名空间,将对象逻辑上隔离,也利于权限控制

 

9.1 标签(Label)

创建标签:kubectl label deployment/pod/其他 xxx -n 命名空间 标签名=标签值 --overwrite

[root@k8s-master-1-71 ~]# kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
java-demo-5cb596f979-47g2r   1/1     Running   0          28m# 查看资源的标签
[root@k8s-master-1-71 ~]# kubectl get pods --show-labels
NAME                         READY   STATUS    RESTARTS   AGE   LABELS
java-demo-5cb596f979-47g2r   1/1     Running   0          28m   app=java-demo,pod-template-hash=5cb596f979# 根据标签过滤显示资源   
[root@k8s-master-1-71 ~]# kubectl get pods -l app=java-demo
NAME                         READY   STATUS    RESTARTS   AGE
java-demo-5cb596f979-47g2r   1/1     Running   0          29m

 

9.2 命名空间(Namespace)

Kubernetes将资源对象逻辑上隔离,从而形成多个虚拟集群

应用场景:

  • 资源分类管理,可根据不同团队、项目划分命名空间
  • 基于命名空间权限授权

查看命名空间:kubectl get namespace

default:默认命名空间

kube-system:K8s系统方面的命名空间

kube-public:公开的命名空间,谁都可以访问

kube-node-lease:K8s内部命名空间

[root@k8s-master-1-71 ~]# kubectl get namespace
NAME                   STATUS   AGE
default                Active   55m
kube-node-lease        Active   55m
kube-public            Active   55m
kube-system            Active   55m
kubernetes-dashboard   Active   9m38s

创建命名空间:kubectl create namespace 命名空间

[root@k8s-master-1-71 ~]# kubectl create namespace test
namespace/test created
[root@k8s-master-1-71 ~]# kubectl get namespaces
NAME                   STATUS   AGE
default                Active   3h25m
kube-node-lease        Active   3h25m
kube-public            Active   3h25m
kube-system            Active   3h25m
kubernetes-dashboard   Active   160m
test                   Active   9s
或者
[root@k8s-master-1-71 ~]# kubectl get ns

两种方法指定资源所属的命名空间:

  • 命令行加 -n
  • yaml 资源元数据里指定 namespace字段
[root@k8s-master-1-71 ~]# kubectl create deployment java-demo2 --image=lizhenliang/java-demo -n test
deployment.apps/java-demo2 created
[root@k8s-master-1-71 ~]# kubectl get pods -n test
NAME                          READY   STATUS    RESTARTS   AGE
java-demo2-58bc68b877-46gq7   1/1     Running   0          30s

 


扩展实践

1、使用kubeadm搭建一个K8s集群

2、新建一个命名空间,创建一个deployment并暴露Service

  • 命名空间:aliang-cka
  • 名称:web
  • 镜像:nginx

3、列出命名空间下指定标签pod

  • 命名空间名称:kube-system
  • 标签:k8s-app=kube-dns

小结:

本篇为 【Kubernetes CKA认证 Day1 】的学习笔记,希望这篇笔记可以让您初步了解到 k8s核心概念与集群搭建,课后还有扩展实践,不妨跟着我的笔记步伐亲自实践一下吧!


Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解。

相关文章:

CKA认证 | Day1 k8s核心概念与集群搭建

第一章 Kubernetes 核心概念 1、主流的容器集群管理系统 容器编排系统&#xff1a; KubernetesSwarmMesos Marathon 2、Kubernetes介绍 Kubernetes是Google在2014年开源的一个容器集群管理系统&#xff0c;Kubernetes简称K8s。 Kubernetes用于容器化应用程序的部署&#x…...

[极客大挑战 2019]PHP 1

[极客大挑战 2019]PHP 1 审题 猜测备份在www.zip中&#xff0c;输入下载文件。 知识点 反序列化 解题 查看代码 看到index.php中包含了class.php,直接看class.php中的代码 查看条件 当usernameadmin&#xff0c;password100时输出flag 构造反序列化 输入select中&#…...

【c++丨STL】vector模拟实现

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C、STL 目录 前言 一、vector底层刨析 二、模拟实现 1. 属性、迭代器以及函数声明 2. 功能实现 交换两个容器的内容 构造函数 拷贝构造 赋值重载 析构…...

SQLAlchemy 介绍与实践

postgresql 实践 pydantic 实践 1. SQLAlchemy 介绍 SQLAlchemy 是一个 ORM 框架。SQLAlchemy 是一个用于 Python 的 SQL 工具和对象关系映射&#xff08;ORM&#xff09;库。它允许你通过 Python 代码来与关系型数据库交互&#xff0c;而不必直接编写SQL语句。 简单介绍一下…...

docker进行SRS直播服务器搭建

docker进行SRS直播服务器搭建 docker构建参考地址: 地址&#xff1a; https://github.com/ossrs/srs https://ossrs.net/lts/zh-cn/docs/v5/doc/getting-started docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 \-p 8000:8000/udp -p 10080:10080/udp ossrs/sr…...

windows server2019下载docker拉取redis等镜像并运行项目

一、基本概念 1、windows server 指由微软公司开发的“Windows”系列中的“服务器”版本。这意味着它是基于Windows操作系统的&#xff0c;但专门设计用于服务器环境&#xff0c;而不是普通的桌面或个人用户使用。主要用途包括服务器功能、用户和资源管理、虚拟化等 2、dock…...

数据结构(8.7_2)——败者树

多路平衡归并带来的问题 什么是败者树 败者树的构造 败者树的使用 败者树在多路平衡归并中的应用 败者树的实现思路 总结...

设计模式-七个基本原则之一-里氏替换原则

里氏替换原则&#xff08;LSP&#xff09;面向对象六个基本原则之一 子类与父类的替代性&#xff1a;子类应当能够替代父类出现的任何地方&#xff0c;且表现出相同的行为。行为的一致性&#xff1a;子类的行为必须与父类保持一致&#xff0c;包括输入和输出、异常处理等。接口…...

k8s中基于overlay网络和underlay网络的网络插件分别有哪些

在 Kubernetes 中&#xff0c;不同的网络插件会使用 overlay 或 underlay 网络来连接 Pod 和节点。以下是基于 overlay 网络和 underlay 网络的常见 Kubernetes 网络插件&#xff1a; 1. 基于 Overlay 网络的插件 这些插件通过隧道封装技术&#xff08;如 VXLAN、GRE 等&#…...

一文详解java的数据类型

1. 题记 Java是一门对数据类型敏感的语言&#xff0c;本博文主要总结介绍java语言的数据类型。 2. java的数据类型 Java 的数据类型分为基本数据类型&#xff08;Primitive Data Types&#xff09;和引用数据类型&#xff08;Reference Data Types&#xff09;。 2.1 基本数…...

Flink API 的层次结构

Apache Flink 提供了多层 API&#xff0c;每层 API 针对不同的抽象层次和用途&#xff0c;使得开发者可以根据具体需求选择合适的 API 层次。以下是 Flink API 的层次结构及其简要说明&#xff1a;...

lua入门教程:math

在Lua中&#xff0c;math库是一个非常重要的内置库&#xff0c;它提供了许多用于数学计算的函数。这些函数可以处理各种数学运算&#xff0c;包括基本的算术运算、三角函数、对数函数、随机数生成等。结合你之前提到的Lua中的数字遵循IEEE 754双精度浮点标准&#xff0c;我们可…...

ROS2简介与Ubuntu24.04中安装指南

之前安装了一个版本&#xff0c;但是不愿意写blog&#xff0c;现在想想自己就是个沙子立个flag&#xff0c;每次配置项目&#xff0c;写流程blog ROS简介 ROS&#xff08;Robot Operating System&#xff09;是一个开源的机器人软件平台&#xff0c;提供了许多工具和库来帮助…...

命令行工具PowerShell使用体验

命令行工具PowerShell使用 PowerShell是微软开发的一种面向对象的命令行Shell和脚本语言环境&#xff0c;它允许用户通过命令行的方式管理操作系统。相较于传统CMD&#xff0c;PowerShell增加了面向对象的程序设计框架&#xff0c;拥有更强大的功能和扩展性。使用PowerShell可…...

MongoDB 详解:深入理解与探索

在当今的数据库领域&#xff0c;MongoDB 以其独特的特性和强大的功能&#xff0c;成为了众多开发者和企业的首选。本文将对 MongoDB 进行详细的介绍&#xff0c;包括其特点、应用场景、流程图以及源码分析。 一、MongoDB 概述 MongoDB 是一个基于分布式文件存储的开源数据库系…...

使用 Elasticsearch 构建食谱搜索(一)

作者&#xff1a;来自 Elastic Andre Luiz 了解如何使用 Elasticsearch 构建基于语义搜索的食谱搜索。 简介 许多电子商务网站都希望增强其食谱搜索体验。正确使用语义搜索可以让客户根据更自然的查询&#xff08;例如 “something for Valentines Day - 情人节的礼物” 或 “…...

sealos部署K8s,安装docker时master节点突然NotReady

1、集群正常运行中&#xff0c;在集群master-1上安装了dockerharbor&#xff0c;却发现master-1节点NotReady&#xff0c;使用的网络插件为 Cilium #安装docker和harbor&#xff08;docker运行正常&#xff09; rootmaster-1:/etc/apt# apt install docker-ce5:19.03.15~3-0~u…...

使用vite+react+ts+Ant Design开发后台管理项目(五)

前言 本文将引导开发者从零基础开始&#xff0c;运用vite、react、react-router、react-redux、Ant Design、less、tailwindcss、axios等前沿技术栈&#xff0c;构建一个高效、响应式的后台管理系统。通过详细的步骤和实践指导&#xff0c;文章旨在为开发者揭示如何利用这些技术…...

Spring Boot实现多数据源连接和切换

文章目录 前言一、多数据源配置与切换方案二、实现步骤1. 创建多个 DataSource 配置类2. 创建 DataSource 配置类3. 创建动态数据源路由类4. 实现 DynamicDataSource 类5. 创建 DataSourceContextHolder 来存储当前的数据源标识6. AOP 方式切换数据源7. 自定义注解来指定数据源…...

发布 VectorTraits v3.0(支持 X86架构的Avx512系列指令集,支持 Wasm架构及PackedSimd指令集等)

文章目录 支持 X86架构的Avx512系列指令集支持Avx512时的输出信息 支持 Wasm架构及PackedSimd指令集支持PackedSimd时的输出信息VectorTraits.Benchmarks.Wasm 使用说明 新增了向量方法支持 .NET 8.0 新增的向量方法提供交织与解交织的向量方法YGroup3Unzip的范例代码 提供重新…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...