Helm之深入浅出Kubernetes包管理工具基础

news2024/9/28 15:24:11

Helm 基础

作者:行癫(盗版必究)


一:Helm 简介

1.简介

​ Helm 是 Kubernetes 的包管理器;它提供了提供、共享和使用为 Kubernetes 构建的软件的能力;是CNCF的毕业项目,自 Helm 加入 CNCF 以来,贡献代码的公司总数增加了 41%,从 930 家增加到 1,314 家;另一个关键的项目健康指标是贡献者的数量。自项目加入 CNCF 以来,Helm 的个人贡献者在两年内增长了 216%。在加入 CNCF 之前的三年里,Helm 积累了 3,642 名贡献者。此后的两年里,Helm 增加了 11,514 名贡献者。

image-20230701231709675

2.安装部署

想成功和正确地使用Helm,需要以下前置条件

​ 一个 Kubernetes 集群(本文环境:1.27.3 操作系统 Stream 9 x86_64)

​ 确定你安装版本的安全配置

​ 安装和配置Helm;Helm可以用源码或构建的二进制版本安装;本次将采用二进制方式安装

下载地址

https://github.com/helm/helm/releases(包含所有版本)
https://get.helm.sh/helm-v3.12.1-linux-amd64.tar.gz(本环境所需)

安装

[root@xingdiancloud-master ~]# tar xf helm-v3.12.1-linux-amd64.tar.gz -C /usr/local
[root@xingdiancloud-master ~]# ln -s /usr/local/linux-amd/helm /usr/bin/helm

3.配置仓库

​ 包管理器类似于我们在 Ubuntu 中使用的apt、Centos中使用的yum 或者Python中的 pip 一样,能快速查找、下载和安装软件包

添加仓库(官方仓库)

[root@xingdiancloud-master ~]# helm repo add bitnami https://charts.bitnami.com/bitnami

阿里仓库

[root@xingdiancloud-master ~]# helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

测试仓库

[root@xingdiancloud-master ~]# helm search repo mysql

image-20230702013306030

4.chart简介

​ Kubernetes管理的对象叫做资源(比如pod);helm作为kubernetes生态工具之一,将互相关联的多个资源统一打包成一个整体,交给 kubernetes 去运行;这个被打包的整体就叫做 chart;可以把 chart 跟程序的源码包做类比。

​ 有了 chart,我们操作的对象不再是单个资源,而是实体;比如我们需要一个有负载均衡能力的 web 服务,如果不使用 chart,我们需要写 deployment,service 和 ingress 才可以让集群外部的客户使用;但是如果使用 chart,直接使用一个 install 命令便可以实现相同的功能。

二:Helm使用

1.Helm基础操作

helm search:    搜索chart
helm pull:      下载chart到本地目录查看
helm install:   上传chart到Kubernetes
helm list:      列出已发布的chart

image-20230702014918250

image-20230702015235520

image-20230702015539309

注意:

helm install name(自定义) chart_name

image-20230702015738099

2.相关指令

helm completion - 为指定的shell生成自动补全脚本
helm create - 使用给定的名称创建chart
helm dependency - 管理chart依赖
helm env - helm客户端环境信息
helm get - 下载命名版本的扩展信息
helm history - 检索发布历史
helm install - 安装chart
helm lint - 验证chart是否存在问题
helm list - 列举发布版本
helm package - 将chart目录打包
helm plugin - 安装、列举或卸载Helm插件
helm pull - 从仓库下载chart并(可选)在本地目录中打开
helm push - 推送chart到远程
helm registry - 从注册表登录或登出
helm repo - 添加、列出、删除、更新和索引chart仓库
helm rollback - 回滚发布到上一个版本
helm search - helm中搜索关键字
helm show - 显示chart信息
helm status - 显示命名版本的状态
helm template - 本地渲染模板
helm test - 执行发布的测试
helm uninstall - 卸载版本
helm upgrade - 升级版本
helm verify - 验证给定路径的chart已经被签名且是合法的
helm version - 打印客户端版本信息

3.相关变量

image-20230702020312310

$HELM_CACHE_HOME	设置一个存储缓存文件的可选位置
$HELM_CONFIG_HOME	设置一个存储Helm配置的可选位置
$HELM_DATA_HOME	设置一个存储Helm数据的可选位置
$HELM_DEBUG	表示Helm是否在Debug模式系运行
$HELM_DRIVER	设置后台存储驱动,可选值包括:configmap, secret, memory, sql
$HELM_DRIVER_SQL_CONNECTION_STRING	设置SQL存储驱动使用连接字符串
$HELM_MAX_HISTORY	设置发布历史记录的最大值
$HELM_NAMESPACE	设置用于helm操作的命名空间
$HELM_NO_PLUGINS	禁用插件,HELM_NO_PLUGINS=1 表示禁用插件
$HELM_PLUGINS	设置插件目录路径
$HELM_REGISTRY_CONFIG	设置注册配置文件的路径
$HELM_REPOSITORY_CACHE	设置仓库缓存目录路径
$HELM_REPOSITORY_CONFIG	设置仓库文件的路径
$KUBECONFIG	设置Kubernetes的可选配置文件(默认是"~/.kube/config")
$HELM_KUBEAPISERVER	设置用于身份认证的Kubernetes API服务端
$HELM_KUBECAFILE	设置Kubernetes证书机构文件
$HELM_KUBEASGROUPS	使用逗号分隔的列表设置用于模拟的组
$HELM_KUBEASUSER	为操作设置要模拟的用户名
$HELM_KUBECONTEXT	设置kubeconfig上下文的名称
$HELM_KUBETOKEN	设置用于身份验证的不记名KubeToken
$HELM_KUBEINSECURE_SKIP_TLS_VERIFY	设置 Kubernetes API 服务的证书验证是否跳过(不安全)
$HELM_KUBETLS_SERVER_NAME	设置用于验证 Kubernetes API 服务器证书的服务器名称
$HELM_BURST_LIMIT	设置当 kubernetes 服务包含很大量CRD时的默认上限值(默认100, -1是不可用)

注意:

Helm 基于以下配置顺序存储缓存,配置和添加数据:

​ 如果设置了 HELM_*_HOME 环境变量,则使用该变量

​ 当没有设置其他位置时,将根据操作系统使用默认位置

默认情况下,默认目录取决于操作系统,默认值如下:

操作系统	 缓存路径	                配置路径	                      数据路径
Linux	$HOME/.cache/helm	        $HOME/.config/helm	            $HOME/.local/share/helm
macOS	$HOME/Library/Caches/helm	$HOME/Library/Preferences/helm	$HOME/Library/helm
Windows	%TEMP%\helm	                 %APPDATA%\helm	                 %APPDATA%\helm

4.仓库使用

helm repo

​ 添加、列出、删除、更新和索引chart仓库

helm repo add - 添加chart仓库
helm repo index - 基于包含打包chart的目录,生成索引文件
helm repo list - 列举chart仓库
helm repo remove - 删除一个或多个仓库
helm repo update - 从chart仓库中更新本地可用chart的信息

添加:

helm repo add [NAME] [URL] [flags]

生成索引文件:

helm repo index [DIR] [flags]

​ 基于包含打包chart的目录,生成索引文件

​ 读取当前目录,并根据找到的 chart 生成索引文件

​ 这个工具用来为chart仓库创建一个’index.yaml’文件,使用’–url’参数创建一个chart的绝对URL

​ 要合并生成的索引和已经存在的索引文件时,使用’–merge’参数

​ 在这个场景中,在当前目录中找到的chart会合并到已有索引中, 本地chart的优先级高于已有chart

仓库列表:

helm repo list [flags]

删除仓库:

helm repo remove [REPO1 [REPO2 ...]] [flags]

​ 删除一个或多个仓库

仓库更新:

helm repo update [REPO1 [REPO2 ...]] [flags]

​ 从chart仓库中更新本地可用chart的信息

​ 更新从各自chart仓库中获取的有关chart的最新信息。信息会缓存在本地,被诸如’helm search’等命令使用

​ 你可以指定需要更新的仓库列表。 $ helm repo update <repo_name> … 使用 ‘helm repo update’ 更新所有仓库

5.包的使用

helm package

​ 将chart目录打包到chart归档中

​ 该命令将chart打包成一个chart版本包文件。如果给定路径,就会在该路径中查找chart(必须包含Chart.yaml文件)然后将目录打包

​ chart版本包会用于Helm包仓库

语法格式

helm package [CHART_PATH] [...] [flags]

​ 要签名一个chart,使用’–sign’参数,在大多数场景中,也要提供’–keyring path/to/secret/keys’和’–key keyname’

​ 如果’–keyring’未指定,除非配置了其他方式,不然Helm通常会指定公共秘钥环

[root@xingdiancloud-master ~]# helm package --sign ./mychart --key mykey --keyring ~/.gnupg/secring.gpg

6.chart升级

helm upgrade

语法格式

helm upgrade [RELEASE] [CHART] [flags]

注意

​ 该命令将发布升级到新版的chart

​ chart参数可以是:chart引用(‘example/mariadb’),chart目录路径,打包的chart或者完整URL

​ 对于chart引用,除非使用’–version’参数指定,否则会使用最新版本

​ 要在chart中重写value,需要使用’–values’参数并传一个文件或者从命令行使用’–set’参数传个配置

​ 要强制字符串值,使用’–set-string’;当值本身对于命令行太长或者是动态生成的时候,可以使用 ‘–set-file’ 设置独立的值

​ 可以在命令行使用’–set-json’参数设置json值(scalars/objects/arrays)

​ 可以多次指定’–set’参数,最后(最右边)指定的优先级最高

[root@xingdiancloud-master ~]# helm upgrade -f myvalues.yaml -f override.yaml redis ./redis
[root@xingdiancloud-master ~]# helm upgrade --set foo=bar --set foo=newbar redis ./redis

7.chart卸载

helm uninstall

语法格式

helm uninstall RELEASE_NAME [...] [flags]

注意

​ 该命令使用版本名称卸载版本

​ 会删除与最新版本chart相关的所有资源以及发布历史,释放以供将来使用

​ 使用’–dry-run’参数查看哪些版本将在不实际卸载的情况下能够被卸载

image-20230702025623802

8.发布历史

helm history

语法格式

helm history RELEASE_NAME [flags]

注意

​ 检索发布历史

​ 打印给定版本的历史修订

​ 默认会返回最大的256个历史版本。设置’–max’配置返回历史列表的最大长度

[root@xingdiancloud-master ~]# helm history angry-bird
REVISION    UPDATED                     STATUS          CHART             APP VERSION     DESCRIPTION
1           Mon Oct 3 10:15:13 2016     superseded      alpine-0.1.0      1.0             Initial install
2           Mon Oct 3 10:15:13 2016     superseded      alpine-0.1.0      1.0             Upgraded successfully
3           Mon Oct 3 10:15:13 2016     superseded      alpine-0.1.0      1.0             Rolled back to 2
4           Mon Oct 3 10:15:13 2016     deployed        alpine-0.1.0      1.0             Upgraded successfully

9.版本回滚

helm rollback

语法格式

helm rollback <RELEASE> [REVISION] [flags]

注意

​ 回滚发布到上一个版本

​ 回滚命令的第一个参数是发布的名称,第二是修订(版本)号,如果省略此参数,会回滚到上一个版本

​ 要查看修订号,执行’helm history RELEASE’

10.chart安装

helm install

语法格式

helm install [NAME] [CHART] [flags]

注意

​ 该命令用于安装chart包

​ 安装参数必须是chart的引用,一个打包后的chart路径,未打包的chart目录或者是一个URL

​ 要重写chart中的值,使用’–values’参数传递一个文件或者使用’–set’参数在命令行传递配置,强制使用字符串要用’–set-string’

[root@xingdiancloud-master ~]# helm install -f myvalues.yaml myredis ./redis
[root@xingdiancloud-master ~]# helm install --set name=prod myredis ./redis
[root@xingdiancloud-master ~]# helm install --set-string long_int=1234567890 myredis ./redis
[root@xingdiancloud-master ~]# helm install --set-file my_script=dothings.sh myredis ./redis
[root@xingdiancloud-master ~]# helm install --set-json 'master.sidecars=[{"name":"sidecar","image":"myImage","imagePullPolicy":"Always",ports":[{"name":"portname","containerPort":1234}]}]' myredis ./redis

多次指定’–values’/'-f’参数。最右侧指定的文件优先级最高

[root@xingdiancloud-master ~]# helm install -f myvalues.yaml -f override.yaml  myredis ./redis

可以指定’–set’参数多次,最右边的参数优先级最高

[root@xingdiancloud-master ~]# helm install --set foo=bar --set foo=newbar  myredis ./redis

示例中’foo’被设置成了’[“four”]’

[root@xingdiancloud-master ~]# helm install --set-json='foo=["one", "two", "three"]' --set-json='foo=["four"]' myredis ./redis

有六种不同的方式来标识需要安装的chart:

通过chart引用: helm install mymaria example/mariadb
通过chart包: helm install mynginx ./nginx-1.2.3.tgz
通过未打包chart目录的路径: helm install mynginx ./nginx
通过URL绝对路径: helm install mynginx https://example.com/charts/nginx-1.2.3.tgz
通过chart引用和仓库url: helm install --repo https://example.com/charts/ mynginx nginx
通过OCI注册中心: helm install mynginx --version 1.2.3 oci://example.com/charts/nginx

11.显示chart信息

helm show
helm show all - 显示chart的所有信息
helm show chart - 显示chart定义
helm show crds - 显示chart的CRD  自定义资源文件
helm show readme - 显示chart的README
helm show values - 显示chart的values

显示chart的所有信息

helm show all [CHART] [flags]

​ 该命令检查chart(目录、文件或URL)并显示所有的内容(values.yaml, Chart.yaml, README)

image-20230702192626581

12.Helm拉取

helm pull

语法格式

helm pull [chart URL | repo/chartname] [...] [flags]

​ 从仓库下载并(可选)在本地目录解压

​ 从包仓库中检索包并下载到本地

image-20230702193444423

13.Helm推送

helm push

语法格式

helm push [chart] [remote] [flags]

​ 将chart推送到远程

​ 上传chart到注册表

​ 如果chart有其他相关文件,也会一起上传

14.插件管理

helm plugin

​ 安装、列举或卸载Helm插件

helm plugin install - 安装一个或多个Helm插件
helm plugin list - 列举已安装的Helm插件
helm plugin uninstall - 卸载一个或多个Helm插件
helm plugin update - 升级一个或多个Helm插件

15.Helm搜索

helm search

​ helm中搜索关键字

​ 搜索提供了可以在已经添加的Artifact Hub和仓库等多个位置搜索Helm chart 的能力

helm search hub - 在Artifact Hub或自己的hub实例中搜索chart
helm search repo - 用chart中关键字搜索仓库

注意:Artifact Hub 是一个基于 Web 的应用程序,可以查找、安装和发布 Kubernetes 包

16.Helm 模板

helm template

语法格式

helm template [NAME] [CHART] [flags]

​ 本地渲染模板并显示输出

17.Helm 注册表

helm registry

​ 登录或登出注册表

helm registry login - 登录注册表
helm registry logout - 从注册表登出

18.Helm 测试

helm test

语法格式

helm test [RELEASE] [flags]

​ 执行发布版本的测试

​ 该命令使用的参数是部署版本的名称,要运行的测试在已安装的chart中定义

19.添加仓库

helm repo add

语法格式

helm repo add [NAME] [URL] [flags]

​ 添加、列出、删除、更新和索引chart仓库

20.Helm 创建

helm create

语法格式

helm create NAME

​ 使用给定名称创建新的chart

​ 该命令创建chart目录和chart用到的公共文件目录

foo/
├── .helmignore   # Contains patterns to ignore when packaging Helm charts.
├── Chart.yaml    # Information about your chart
├── values.yaml   # The default values for your templates
├── charts/       # Charts that this chart depends on
└── templates/    # The template files
    └── tests/    # The test files

image-20230702201030213

注意:

​ 如果给定目录路径不存在,Helm会自动创建。如果给定目录存在且非空,冲突文件会被覆盖,其他文件会被保留
20.Helm 创建

helm create

语法格式

helm create NAME

​ 使用给定名称创建新的chart

​ 该命令创建chart目录和chart用到的公共文件目录

foo/
├── .helmignore   # Contains patterns to ignore when packaging Helm charts.
├── Chart.yaml    # Information about your chart
├── values.yaml   # The default values for your templates
├── charts/       # Charts that this chart depends on
└── templates/    # The template files
    └── tests/    # The test files

[外链图片转存中…(img-5wMZBZkh-1688312428366)]

注意:

​ 如果给定目录路径不存在,Helm会自动创建。如果给定目录存在且非空,冲突文件会被覆盖,其他文件会被保留

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Canal】从原理、配置出发,从0到1完成Canal搭建

文章目录 简介工作原理MySQL主备复制原理canal 工作原理 Canal架构Canal-HA机制应用场景同步缓存 Redis /全文搜索 ES下发任务数据异构 MySQL 配置开启 binlog扩展statementrowmixed 配置权限 Canal 配置配置启动报错解决 实战引入依赖代码样例测试 前几天在网上冲浪的时候发现…

MYSQL03高级_新增用户、授予权限、授权底层表结构、角色理解

文章目录 ①. 登录服务器操作②. 用户的增删改③. 修改用户密码④. MySQL8密码管理⑤. 权限列表及原则⑥. 授予查看回收权限⑦. 底层权限表操作⑧. 角色的理解 ①. 登录服务器操作 ①. 启动MySQL服务后,可以通过mysql命令来登录MySQL服务器,命令如下: mysql –h hostname|hos…

chatgpt赋能python:搜索Python答案的软件

搜索Python答案的软件 介绍&#xff1a;什么是搜索Python答案的软件&#xff1f; 搜索Python答案的软件是一种工具&#xff0c;可以帮助编程人员快速地找到他们在编写Python代码时遇到的问题的答案。这种软件可以搜索各种不同的网站&#xff0c;以帮助用户找到最适合他们问题…

实例006 菜级联菜单

实例说明 如果管理程序功能菜单非常多&#xff0c;一些功能中又包括许多子功能&#xff0c;这时可以使用级联菜单来组织系统的各个功能。实例运行结果如图1.6所示。 图1.6 级联菜单 技术要点 制作级联菜单需要使用MenuStrip控件。 注意&#xff1a;在使用级联菜单时最好不要…

Redis三种模式——主从复制、哨兵、集群

目录 一、概述 二、 Redis 主从复制 1.主从复制的作用 2. 主从复制流程 3. 搭建Redis 主从复制 3.1准备环境 3.2安装redis 3.3创建redis工作目录 3.4环境变量 3.5定义systemd服务管理脚本 3.6修改 Redis 配置文件&#xff08;Master节点操作&#xff09; 3.7修改 …

我在「亚马逊云科技中国峰会」做讲师 - 「程序员的社区成长史」

文章目录 ⭐️ Part - 〇&#xff1a;开场的自我介绍⭐️ Part - ①&#xff1a;程序员的学习从技术社区开始&#x1f31f; 编程初学者共同面对的迷茫&#x1f31f; 加入一个适合自己的技术社区&#x1f31f; 反哺社区做有价值的贡献者 ⭐️ Part - ②&#xff1a;与技术社区的…

STM32F4 WiFi上传温度【ds18b20传感器、网络通信】

通过WIFI或GPRS上传温度到云端 本篇博客将介绍如何使用WIFI或GPRS模块将温度数据上传到云端。我们将涵盖连接网络的过程、上传数据的过程以及相关代码。 准备工作 在开始之前&#xff0c;我们需要准备以下材料&#xff1a; STM32F4开发板温度传感器&#xff08;例如18B20&a…

ch0_汇编介绍

1. 汇编作用 1.1 1.2 1.3 2.  机器语言到汇编语言 2.1 2.2 2.3 3.  计算机的组成 3.1 指令和数据是存放在存储器中的&#xff0c; 而计算机包含多种存储器&#xff1b; 但是&#xff0c;在计算机工作的过程中&#xff0c; 指令和数据则必须存放到内存中。 而对于…

代码随想录二刷day41 | 动态规划之 343. 整数拆分 96.不同的二叉搜索树

day41 343. 整数拆分确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp的初始化确定遍历顺序举例推导dp数组 96.不同的二叉搜索树确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 34…

【每日一题Day254】LC445两数相加Ⅱ | 链表反转 栈

两数相加Ⅱ【LC445】 给定两个 非空链表 l1和 l2 来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 可以假设除了数字 0 之外&#xff0c;这两个数字都不会以零开头。 原来是专题模拟 反转链表 2022/11/4 思…

MySQL 记一个调优记录:最大化获取 uid 和 mobile

目录 前言调优过程总结 前言 环境&#xff1a;MySQL 5.6、windows 11 前阵子&#xff0c;有一个 BI 看板跑不起来&#xff0c;每次执行跑了很久&#xff0c;还不一定有结果&#xff0c;急需维护迭代。 经过调试&#xff0c;发现看板的SQL 逻辑中有一个开销非常大的逻辑影响了整…

2 Prometheus 简介

目录 1. 起源 2. Prometheus 架构 2.1 指标收集 2.2 服务发现 2.3 聚合和警报 2.4 查询数据 2.5 服务自治 2.6 冗余和高可用性 2.7 可视化 3. Prometheus数据模型 3.1 指标名称 3.2 标签 3.3 采样数据 3.4 符号表示 3.5 保留时间 4. 安全模型 5. Prometheus生态…

AI会取代程序员吗?这几个事实告诉你真相

人工智能&#xff08;AI&#xff09;的迅猛发展引起了许多关于其对各行各业的影响的讨论&#xff0c;其中包括程序员的未来。有人认为&#xff0c;AI的出现可能会使程序员岗位面临消失的风险&#xff0c;因为它们可以自动化编码和解决问题的过程。然而&#xff0c;在我们下结论…

MySQL:UNION的使用

UNION的使用 前言一、合并查询结果二、语法格式&#xff1a;三、UNION操作符四、UNION ALL操作符五、使用 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识&#xff0c;有兴趣的小伙伴可以关注博主&#xff01; 也许一个人独行&#xff0c;可以走的很快…

全志V3S嵌入式驱动开发(full image制作和资料汇总)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 所谓的full image制作&#xff0c;就是制作一个image&#xff0c;上面包含了所有的嵌入式软件、库和配置文件。之前虽然我们也构建了spi-nor、spi-…

AC/DC(二): 整流

一、全波整流电路 全波整流电路可以看作是由两个半波整流电路组合而成&#xff0c;如图1所示&#xff0c; 图1 变压器次级线圈中间引出一个中心抽头&#xff0c;把次级线圈分成两个对称的绕组&#xff0c;从而引出大小相等但极性相反的两个电压VD1、VD2&#xff0c;构成VD1、…

14 MFC多进程

文章目录 创建进程win32子进程内容创建进程传递参数关闭进程通过配置文件读取全部代码 打开进程便利进程 创建进程 分别创建MFC应用程序和Win32应用程序 MFC应用程序界面设置 win32子进程内容 #include <Windows.h> int WINAPI wWinMain(HINSTANCE hInstance, HINSTAN…

分享在Linux下使用OSGi.NET插件框架快速实现一个分布式服务集群的方法

在这篇文章我分享了如何使用分层与模块化的方法来设计一个分布式服务集群。这个分布式服务集群是基于DynamicProxy、WCF和OSGi.NET插件框架实现的。我将从设计思路、目标和实现三方面来描述。 1 设计思路 首先&#xff0c;我来说明一下设计思路。我们先来看看目前OSGi.NET插件…

C++中生成二维码-libqrencode

文章目录 前言libqrencode在qt中调用libqrencode其他 前言 二维码的种类很多。本文仅介绍&#xff0c;如何用C生成QR码(QRcode)。通常而言&#xff0c;我们不需要知道QR码的详细结构&#xff0c;如QrCode的结构原理与实战 | 张展鹏的博客。我们只需要&#xff0c;可以将文本转…