helm介绍及使用

2026-05-20-helm介绍及使用

Helm

一、Helm是什么?

Helm 是一个用于 Kubernetes 应用的包管理器,类似 Linux 的 apt/yum,它使安装和升级复杂应用变得简单。

核心概念(Chart / Release / Repository / Values)

1
2
3
4
5
6
7
8
9
10
没有 Helm:
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f configmap.yaml
kubectl apply -f ingress.yaml
... 一堆文件分开管理

有了 Helm:
helm install myapp ./mychart
一条命令部署所有资源,版本化管理,支持回滚
概念 说明 类比
Chart 应用的打包格式(一堆模板文件) deb/rpm 包
Release Chart 的一次部署实例 已安装的软件
Repository Chart 仓库 apt 源/yum 源
Values 配置参数文件 配置文件
Revision Release 的每次变更版本号 提交记录

二、Chart 文件结构 — 完整目录树

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
mychart/                          ← Chart 根目录(即 Chart 名称)

├── Chart.yaml ← Chart 元数据(必须)
├── values.yaml ← 默认配置参数(必须)
├── values.schema.json ← values 的 JSON Schema 校验(可选)

├── charts/ ← 子 Chart 依赖目录
│ ├── redis-17.0.0.tgz ← 依赖的其他 Chart(打包后)
│ └── postgresql/ ← 或者解压的依赖 Chart

├── templates/ ← 模板文件目录(必须)
│ ├── _helpers.tpl ← 模板辅助函数(下划线开头不渲染)
│ ├── NOTES.txt ← 安装完成后的提示信息
│ ├── deployment.yaml ← Deployment 模板
│ ├── service.yaml ← Service 模板
│ ├── ingress.yaml ← Ingress 模板
│ ├── configmap.yaml ← ConfigMap 模板
│ ├── secret.yaml ← Secret 模板
│ ├── serviceaccount.yaml ← ServiceAccount 模板
│ ├── hpa.yaml ← HPA 模板
│ └── tests/ ← 测试模板目录
│ └── test-connection.yaml ← 连接测试 Pod

├── crds/ ← CRD 资源定义目录(安装时最先应用)
│ └── myresource.yaml

└── .helmignore ← 打包时忽略的文件(类似 .gitignore)

三、核心文件详解

Chart.yaml(Chart 描述文件)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: v2                    # Helm 版本,v2 对应 Helm 3
name: mychart # Chart 名称
version: 1.0.0 # Chart 版本(必须是 SemVer)
appVersion: "2.11.0" # 应用版本(Harbor、Nginx 等的版本)
description: A Helm chart # 描述
type: application # 类型:application 或 library
keywords: # 关键词(搜索用)
- harbor
- registry
home: https://github.com/xxx # 项目主页
sources: # 源码地址
- https://github.com/xxx
maintainers: # 维护者
- name: xy
email: xy@example.com
icon: https://example.com/icon.png
dependencies: # 依赖的子 Chart
- name: redis
version: "17.x.x"
repository: https://charts.bitnami.com/bitnami
condition: redis.enabled # 可选:控制是否启用
- name: postgresql
version: "12.x.x"
repository: https://charts.bitnami.com/bitnami

values.yaml(默认配置文件)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 这是用户最常修改的文件
# helm install 时可以用 -f 覆盖,或 --set 单独覆盖

replicaCount: 1

image:
repository: nginx
pullPolicy: IfNotPresent
tag: "1.25"

service:
type: ClusterIP
port: 80

ingress:
enabled: false
className: nginx
hosts:
- host: myapp.local
paths:
- path: /
pathType: Prefix

resources:
requests:
memory: 128Mi
cpu: 100m
limits:
memory: 256Mi
cpu: 500m

nodeSelector: {}
tolerations: []
affinity: {}

templates/_helpers.tpl(模板辅助函数)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 下划线开头的文件不会被直接渲染成 K8s 资源
# 用于定义可复用的模板片段

{{/*
生成应用名称
*/}}
{{- define "mychart.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}

{{/*
生成完整的 release 名称
*/}}
{{- define "mychart.fullname" -}}
{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 | trimSuffix "-" }}
{{- end }}

{{/*
通用标签
*/}}
{{- define "mychart.labels" -}}
helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
app.kubernetes.io/name: {{ include "mychart.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Chart.AppVersion }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}

templates/deployment.yaml(模板文件示例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "mychart.fullname" . }}
labels:
{{- include "mychart.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app.kubernetes.io/name: {{ include "mychart.name" . }}
template:
metadata:
labels:
app.kubernetes.io/name: {{ include "mychart.name" . }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: 80
resources:
{{- toYaml .Values.resources | nindent 10 }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}

NOTES.txt(安装提示)

1
2
3
4
5
6
7
8
9
10
11
12
安装完成后显示给用户的提示信息,支持模板语法

1. 获取应用 URL:
{{- if .Values.ingress.enabled }}
http://{{ (index .Values.ingress.hosts 0).host }}
{{- else }}
export POD_NAME=$(kubectl get pods -l "app={{ include "mychart.name" . }}" -o jsonpath="{.items[0].metadata.name}")
kubectl port-forward $POD_NAME 8080:80
{{- end }}

2. 管理员密码:
kubectl get secret {{ include "mychart.fullname" . }} -o jsonpath="{.data.password}" | base64 -d

.helmignore(打包忽略)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 打包 Chart 时忽略这些文件

# Git 相关
.git/
.gitignore

# 文档
README.md
docs/

# 开发相关
*.tmp
*.bak
.DS_Store

# CI 相关
.github/
.gitlab-ci.yml

values.schema.json(参数校验)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"$schema": "http://json-schema.org/draft-07/schema",
"properties": {
"replicaCount": {
"type": "integer",
"minimum": 1,
"description": "副本数量"
},
"image": {
"type": "object",
"properties": {
"repository": {
"type": "string"
},
"tag": {
"type": "string"
}
},
"required": ["repository"]
}
}
}

四、常用命令手册

4.1 仓库管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 添加仓库
helm repo add <仓库名> <URL>
helm repo add stable https://charts.helm.sh/stable
helm repo add harbor https://helm.goharbor.io
helm repo add prometheus-community http://mirror.azure.cn/kubernetes/charts-prometheus-community/
helm repo add grafana http://mirror.azure.cn/kubernetes/charts-grafana/

# 查看仓库列表
helm repo list

# 更新仓库索引
helm repo update
helm repo update prometheus-community # 只更新指定仓库

# 删除仓库
helm repo remove <仓库名>
helm repo remove harbor

# 搜索 Chart
helm search repo <关键词>
helm search repo harbor
helm search repo prometheus-community/prometheus
helm search repo harbor/harbor --versions # 看所有版本

4.2 安装(install)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 基础安装
helm install <release名> <chart>
helm install harbor harbor/harbor

# 指定 namespace
helm install harbor harbor/harbor -n harbor
helm install harbor harbor/harbor -n harbor --create-namespace

# 使用自定义 values 文件
helm install harbor harbor/harbor -f values.yaml
helm install harbor harbor/harbor -f values.yaml -f override.yaml # 多个文件后面的覆盖前面的

# 使用 --set 覆盖单个参数
helm install harbor harbor/harbor --set harborAdminPassword=Harbor12345
helm install harbor harbor/harbor --set core.replicas=2,portal.replicas=2

# 使用 --set-string 强制字符串类型
helm install harbor harbor/harbor --set-string image.tag="v2.11.0"

# 指定 Chart 版本
helm install harbor harbor/harbor --version 1.14.0

# 指定超时
helm install harbor harbor/harbor --timeout 15m

# 等待所有资源就绪
helm install harbor harbor/harbor --wait

# dry-run(不真正安装,只渲染模板)
helm install harbor harbor/harbor -f values.yaml --dry-run

# dry-run + debug(显示渲染后的完整 YAML)
helm install harbor harbor/harbor -f values.yaml --dry-run --debug

# 从本地 Chart 目录安装
helm install myapp ./mychart

# 从本地 tgz 包安装
helm install myapp ./mychart-1.0.0.tgz

# install 或 upgrade(不存在就装,存在就升级)
helm upgrade --install harbor harbor/harbor -f values.yaml -n harbor --create-namespace

4.3 查看(list / get)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 查看所有 Release
helm list
helm list -A # 所有 namespace
helm list -n harbor # 指定 namespace
helm list --all # 包括失败的
helm list --failed # 只显示失败的
helm list --uninstalled # 显示卸载但保留历史的

# 查看 Release 状态
helm status harbor -n harbor

# 查看 Release 的 values(安装时传入的)
helm get values harbor -n harbor # 只看用户自定义的
helm get values harbor -n harbor --all # 包括默认值

# 查看 Release 渲染后的 YAML
helm get manifest harbor -n harbor

# 查看 Release 的 hooks
helm get hooks harbor -n harbor

# 查看 Release 的所有信息
helm get all harbor -n harbor

# 查看 Release 历史版本
helm history harbor -n harbor

4.4 升级(upgrade)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 基础升级
helm upgrade harbor harbor/harbor -f values.yaml -n harbor

# 升级,继承上次的 values
helm upgrade harbor harbor/harbor --reuse-values -n harbor

# 升级,继承上次的 values 并覆盖部分
helm upgrade harbor harbor/harbor --reuse-values \
--set harborAdminPassword=NewPassword -n harbor

# 升级指定版本
helm upgrade harbor harbor/harbor --version 1.15.0 -n harbor

# upgrade 失败自动回滚
helm upgrade harbor harbor/harbor -f values.yaml \
--atomic \
--timeout 10m \
-n harbor

# dry-run 验证升级
helm upgrade harbor harbor/harbor \
-f values.yaml \
--dry-run \
-n harbor

# 强制升级(重建 Pod)
helm upgrade harbor harbor/harbor \
-f values.yaml \
--force \
-n harbor

4.5 回滚(rollback)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 查看历史
helm history harbor -n harbor

# 输出示例:
# REVISION STATUS DESCRIPTION
# 1 superseded Install complete
# 2 superseded Upgrade complete
# 3 deployed Upgrade complete

# 回滚到上一个版本
helm rollback harbor -n harbor

# 回滚到指定版本
helm rollback harbor 1 -n harbor
helm rollback harbor 2 -n harbor

# 回滚并等待完成
helm rollback harbor 1 --wait -n harbor

# 回滚并清理历史
helm rollback harbor 1 --cleanup-on-fail -n harbor

4.6 卸载(uninstall)

1
2
3
4
5
6
7
8
9
10
11
# 卸载
helm uninstall harbor -n harbor

# 卸载但保留历史记录(可以回滚)
helm uninstall harbor -n harbor --keep-history

# 查看保留的历史
helm list --uninstalled -n harbor

# 从保留历史中回滚
helm rollback harbor 1 -n harbor

4.7 Chart 开发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 创建新 Chart
helm create mychart

# 生成的目录结构:
# mychart/
# ├── Chart.yaml
# ├── values.yaml
# ├── charts/
# └── templates/
# ├── deployment.yaml
# ├── service.yaml
# ├── ingress.yaml
# ├── serviceaccount.yaml
# ├── hpa.yaml
# ├── _helpers.tpl
# ├── NOTES.txt
# └── tests/
# └── test-connection.yaml

# 校验 Chart 格式
helm lint mychart
helm lint mychart -f values.yaml # 带 values 校验

# 渲染模板(不安装,只看渲染结果)
helm template mychart ./mychart
helm template mychart ./mychart -f values.yaml
helm template mychart ./mychart --set image.tag=v1.0
helm template mychart ./mychart > rendered.yaml # 输出到文件

# 打包 Chart
helm package mychart
helm package mychart --version 1.0.0
helm package mychart -d ./output/ # 指定输出目录

# 更新依赖
helm dependency update mychart
helm dependency build mychart

# 列出依赖
helm dependency list mychart

# 推送到 OCI 仓库(Harbor)
helm push mychart-1.0.0.tgz oci://harbor.k8s.local/charts

4.8 查看 Chart 信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看 Chart 的 README
helm show readme harbor/harbor

# 查看 Chart 的 values(默认值)
helm show values harbor/harbor

# 查看 Chart 的元数据
helm show chart harbor/harbor

# 查看 Chart 所有信息
helm show all harbor/harbor

# 保存默认 values 到文件
helm show values harbor/harbor > harbor-default-values.yaml

# 查看指定版本的 values
helm show values harbor/harbor --version 1.14.0

4.9 插件管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装插件
helm plugin install https://github.com/chartmuseum/helm-push
helm plugin install https://github.com/databus23/helm-diff

# 查看已安装插件
helm plugin list

# 更新插件
helm plugin update <插件名>
helm plugin update push

# 删除插件
helm plugin uninstall <插件名>
helm plugin uninstall push

4.10 其他常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 查看 Helm 版本
helm version

# 查看环境变量
helm env

# 输出示例:
# HELM_BIN="helm"
# HELM_CACHE_HOME="/root/.cache/helm"
# HELM_CONFIG_HOME="/root/.config/helm"
# HELM_DATA_HOME="/root/.local/share/helm"
# HELM_REPOSITORY_CACHE="/root/.cache/helm/repository"
# HELM_REPOSITORY_CONFIG="/root/.config/helm/repositories.yaml"

# 补全(bash)
helm completion bash > /etc/bash_completion.d/helm
source /etc/bash_completion.d/helm

# 补全(zsh)
helm completion zsh > ~/.zsh/completion/_helm

# 验证 Chart
helm verify mychart-1.0.0.tgz

# 拉取 Chart 到本地
helm pull harbor/harbor
helm pull harbor/harbor --version 1.14.0
helm pull harbor/harbor --untar # 解压
helm pull harbor/harbor --untar -d ./charts/ # 解压到指定目录

五、Helm 模板语法速查

5.1 基本语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# 引用 Values
{{ .Values.replicaCount }}
{{ .Values.image.repository }}

# 引用 Chart 信息
{{ .Chart.Name }}
{{ .Chart.Version }}
{{ .Chart.AppVersion }}

# 引用 Release 信息
{{ .Release.Name }}
{{ .Release.Namespace }}
{{ .Release.Service }}

# 条件判断
{{- if .Values.ingress.enabled }}
# ingress 配置
{{- else }}
# 其他配置
{{- end }}

# 循环
{{- range .Values.ingress.hosts }}
- host: {{ .host }}
{{- end }}

# with(改变 . 的作用域)
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}

# 默认值
{{ .Values.image.tag | default "latest" }}
{{ default "nginx" .Values.image.repository }}

# 字符串处理
{{ .Values.name | upper }} # 大写
{{ .Values.name | lower }} # 小写
{{ .Values.name | title }} # 首字母大写
{{ .Values.name | trunc 63 }} # 截取
{{ .Values.name | trimSuffix "-" }} # 去掉后缀
{{ .Values.name | quote }} # 加引号

# YAML 转换
{{- toYaml .Values.resources | nindent 10 }}
{{- toJson .Values.config | nindent 4 }}

# 缩进
{{- include "mychart.labels" . | nindent 4 }}

# 减号(去掉空白)
{{- # 去掉前面的空白
-}} # 去掉后面的空白

5.2 常用内置函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 字符串
{{ "hello" | upper }} # HELLO
{{ "hello world" | replace " " "-" }} # hello-world
{{ printf "%s-%s" "foo" "bar" }} # foo-bar
{{ contains "cat" "catch" }} # true

# 数学
{{ add 1 2 }} # 3
{{ sub 5 3 }} # 2
{{ mul 2 3 }} # 6
{{ div 10 2 }} # 5
{{ mod 10 3 }} # 1
{{ max 3 5 }} # 5
{{ min 3 5 }} # 3

# 列表
{{ list 1 2 3 }} # [1 2 3]
{{ has "cat" (list "cat" "dog") }} # true
{{ len (list 1 2 3) }} # 3

# 字典
{{ dict "key" "value" }}
{{ get .Values.map "key" }}
{{ hasKey .Values.map "key" }}

# 类型转换
{{ "123" | int }} # 123
{{ 123 | toString }} # "123"
{{ "true" | toBool }} # true

# 编码
{{ "hello" | b64enc }} # base64 编码
{{ "aGVsbG8=" | b64dec }} # base64 解码
{{ "hello" | sha256sum }} # SHA256

# 文件
{{ .Files.Get "config.yaml" }} # 读取文件内容

六、常用操作场景

场景 1:安装并自定义配置

1
2
3
4
5
6
7
8
9
10
11
12
# 查看默认配置
helm show values prometheus-community/prometheus > prom-values.yaml

# 修改 prom-values.yaml 后安装
helm install prometheus prometheus-community/prometheus \
-f prom-values.yaml \
-n monitoring \
--create-namespace

# 验证
helm list -n monitoring
kubectl get pods -n monitoring

场景 2:升级时不改 values

1
2
3
4
5
# 只升级版本,保留原有配置
helm upgrade harbor harbor/harbor \
--reuse-values \
--version 1.15.0 \
-n harbor

场景 3:查看某次部署用的配置

1
2
helm get values harbor -n harbor
helm get values harbor -n harbor --all # 包括默认值

场景 4:回滚误操作

1
2
3
4
5
6
7
8
# 查看历史
helm history harbor -n harbor

# 回滚
helm rollback harbor 2 -n harbor

# 等待回滚完成
helm rollback harbor 2 --wait -n harbor

场景 5:调试模板

1
2
3
4
5
6
7
8
9
10
11
# 渲染模板,不实际部署
helm template harbor harbor/harbor -f values.yaml

# 渲染并写到文件
helm template harbor harbor/harbor -f values.yaml > rendered.yaml

# 安装时调试
helm install harbor harbor/harbor \
-f values.yaml \
--dry-run \
--debug 2>&1 | grep -A 10 "harbor-ingress"

场景 6:备份和迁移

1
2
3
4
5
6
7
8
9
10
11
# 导出当前 Release 的 values
helm get values harbor -n harbor > harbor-backup-values.yaml

# 导出渲染后的 YAML(用于迁移)
helm get manifest harbor -n harbor > harbor-manifest-backup.yaml

# 在新集群还原
helm install harbor harbor/harbor \
-f harbor-backup-values.yaml \
-n harbor \
--create-namespace

场景 7:使用 OCI 仓库(Harbor 存 Chart)

1
2
3
4
5
6
7
8
9
10
11
# 登录 OCI 仓库
helm registry login harbor.k8s.local \
--username admin \
--password Harbor12345

# 推送 Chart
helm push mychart-1.0.0.tgz oci://harbor.k8s.local/charts

# 从 OCI 仓库安装
helm install myapp oci://harbor.k8s.local/charts/mychart \
--version 1.0.0

七、Helm 目录和配置文件位置

1
2
3
4
5
6
7
8
9
10
helm env    # 查看所有路径

# 常用路径
~/.cache/helm/repository/ # Chart 索引和下载的 tgz 缓存
~/.config/helm/repositories.yaml # 已添加的仓库列表
~/.local/share/helm/plugins/ # 已安装的插件

# 清理缓存
rm -rf ~/.cache/helm/repository/
helm repo update

八、常见问题速查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 查看 Chart 里有哪些可配置项
helm show values <chart>

# 查看实际部署的资源
helm get manifest <release> -n <namespace>

# 查看部署状态
helm status <release> -n <namespace>

# 查看 Chart 的所有版本
helm search repo <chart> --versions

# 删除失败的 Release
helm uninstall <release> -n <namespace>

# 强制重新安装
helm uninstall <release> -n <namespace>
helm install <release> <chart> -f values.yaml -n <namespace>

# 只升级 values,不换版本
helm upgrade <release> <chart> \
--reuse-values \
--set key=value \
-n <namespace>

# 检查 YAML 格式是否正确
helm lint <chart目录>

# 渲染模板检查
helm template <release> <chart> -f values.yaml | kubectl apply --dry-run=client -f -

九、命令速查表

分类 命令 说明
仓库 helm repo add <名> <URL> 添加仓库
helm repo list 查看仓库
helm repo update 更新索引
helm repo remove <名> 删除仓库
helm search repo <关键词> 搜索 Chart
安装 helm install <release> <chart> -f values.yaml -n <ns> 安装
helm upgrade --install <release> <chart> -f values.yaml 不存在就装
helm install ... --dry-run 模拟安装
查看 helm list -A 查看所有 Release
helm status <release> 查看状态
helm get values <release> 查看配置
helm get manifest <release> 查看资源 YAML
helm history <release> 查看历史
升级 helm upgrade <release> <chart> -f values.yaml 升级
helm upgrade ... --reuse-values 保留原配置升级
helm upgrade ... --atomic 失败自动回滚
回滚 helm rollback <release> <版本号> 回滚到指定版本
helm rollback <release> 回滚到上一版本
卸载 helm uninstall <release> -n <ns> 卸载
helm uninstall ... --keep-history 卸载保留历史
开发 helm create <名> 创建 Chart
helm lint <chart> 校验 Chart
helm template <release> <chart> 渲染模板
helm package <chart> 打包 Chart
helm show values <chart> 查看默认 values
插件 helm plugin install <URL> 安装插件
helm plugin list 查看插件

helm介绍及使用
https://anyue967.github.io/posts/f87d3b7.html
作者
anyu967
发布于
2026年5月20日
许可协议