使用K3S+ Kilo部署安全多区云原生ARM集群,支持nginx-ingress及velero备份

申请Oracle甲骨文的Arm实例已经很久了,甲骨文的配置相当的高,4核24G内存100G硬盘5TB流量,但一直没有正儿八经地用起来,属实是有些浪费资源了。于是前些天就把手上有的这些机子组了一个ARM集群,分属三个区域,分别为:春川(Chuncheon)、东京(Tokyo)、首尔(Seoul)。由于三个机房是物理隔离开的,没有直接组在一起的链路,于是除了使用甲骨文官方的VPN之外,我们这次直接使用Wireguard将这三台机子组到一个局域网内,这样就方便组建集群了。

先来看看夸张的ARM 12核心,70G内存,158G可用存储的k3s集群。

85deea9266171022

52eaa5b575150027

e9e0ebb70b171141

OK~前情交待完毕,以下是这次部署所需达成的目标:

  1. 前面提到,三个机器不是一个区域的,所以需要将三台主机使用Wireguard组成一个局域网
  2. 先不考虑高可用问题,由首尔作为控制节点,与春川和东京共为工作节点提供服务
  3. 不使用甲骨文的LB,由主机自行提供服务,域名指向其中任意一台都可以访问,也可搭配智能解析系统
  4. 需要在lb位置集成modsecurity,过滤一些恶意请求
  5. 不使用traefik作为前端暴露组件,需要使用nginx ingress(因为里面自带集成了modsecurity)
  6. 需要一个好用的控制面板,kubectl操作起来还得连接服务器,稍显麻烦。这里还是直接使用rancher,习惯了。
  7. 需要使用分布式存储,这里直接使用rancher的Longhorn进行部署
  8. 需要部署数据备份组件,这里使用开源的velero,可以定期备份到远程的S3存储服务器,作为最后的灾备恢复选项。(鬼知道什么时候会被k掉)

以下为实操步骤:

注意:这里统一使用ubuntu 20.04的发行版,不建议用ubuntu 22.04,最低版本为18.04,kubernetes使用v1.22稳定版,版本太新会有其他问题的

注意2:这里有两个概念,一个是公网IP,一个是网卡IP,在甲骨文、阿里云等等的云服务厂商那里,公网IP是不会直接给到实例中的系统的,而是给一个nat后的IP,这个IP在外部是不能访问的。而公网IP是可以给外部访问的。因此,在进行接下来的配置中,要注意这点。wireguard需要使用公网IP地址,而k3s里,则是使用网卡IP地址。

使用Wireguard组局域网

在本例中,我们需要组建一个局域网,但与网上搜索到的直接使用wireguard不同,我们需要借助Kilo对wireguard进行管理和连接,因此在这里只需要安装好wireguard即可,后续操作在k3s中进行。

安装wireguard

由于使用ubuntu 20.04的版本,因此不用额外操作,直接在终端内分别为三个区域的主机安装wireguard即可,使用命令:

安装部署 k3s server 节点

简要说明:

  1. K3S_CLUSTER_INIT=true : 集群模式,会安装内置的 etcd,而不是 sqlite3;
  2. INSTALL_K3S_EXEC=”server” : 指定为server节点
  3. INSTALL_K3S_CHANNEL=v1.22 : 安装的K3S版本,这里选择1.22 稳定版本,不选择太新的版本;
  4. –node-label “topology.kubernetes.io/region=seoul” : 设置当前服务器的label为首尔区域;
  5. –node-label “master-node=true” : 设置为主节点;
  6. –tls-san {{ server_public_ip }}: {{ server_public_ip }} 改为当前服务器公网 IPv4地址,–tls-san
    这个选项在 TLS 证书中增加了一个额外的主机名或 IP 作为备用名称,如果你想通过 IP 和主机名访问,可以多次指定,多个值之间用英文半角逗号分隔。注意:如果不指定 –tls-san {{ server_public_ip }},可能会导致 kubectl 无法通过 server_public_ip 来访问集群;
  7. –advertise-address {{ server_public_ip }}:{{ server_public_ip }} 改为当前服务器公网 IPv4地址,用于agent连接K3S Server的API,但是注意不要指定 –node-external-ip {{ server_public_ip }},会导致无法获得用户真实IP;
  8. –disable traefik : 关闭traefik,后面安装nginx-ingress
  9. –flannel-backend none : 关闭默认的flannel CNI,后面安装Kilo
  10. –kube-proxy-arg “metrics-bind-address=0.0.0.0” : kube-proxy 参数,这个参数直接影响 Metrics 的获取;
  11. –kube-apiserver-arg “feature-gates=EphemeralContainers=true” :  (可选)启用 feature-gates:EphemeralContainers,方便在不重启 pod 的情况下附加 sidecar 进行调试。

执行后,检查安装结果,可以看到节点已经可以找到了:

# kubectl get node 
NAME                     STATUS   ROLES                       AGE     VERSION
instance-20190921-1325   NotReady    control-plane,etcd,master   0h01m   v1.22.12+k3s1

可以看到节点状态为 NotReady ,这是正常的,因为我们还没有添加网络CNI网络组件,接下来就开始安装它。

安装Kilo CNI网络组件

网络拓扑

然后我们需要指定第一台节点的拓扑,后续添加上来的agent节点会自动添加进来,但仍然建议对其网络进行拓扑定义,现在先定义第一台:

简单说明:

  1. location : 对节点进行位置定义,方便维护
  2. force-endpoint : 自动发现节点时,会有endpoint的定义,这个地址如果你是用内网ipv4,就容易变成不可路由的地址,所以这里建议直接用绑定到网卡上的IPv6地址,进行覆盖定义
  3. persistent-keepalive : 是wireguard的配置选项,保活

安装Kilo CNI组件

在第二步使用wget,是因为需要对Kilo的DaemonSet进行修改,在我们案例中,各区没有直接的网络连接,最好使用fullmesh模式,这部分的说明,参考:https://kilo.squat.ai/docs/topology/#full-mesh,添加–mesh-granularity=full到kilo-k3s.yaml守护程序pod模板中:

然后执行安装

kubectl apply -f kilo-k3s.yaml

验证Kilo安装

  1. 在 kube-system 命名空间下的 pod 中,可以找到koli的pod已经成功运行,状态为 RUNNING
  2. 执行 kubectl get node 时查看到的节点状态由 NotReady 变为 Ready
  3. 在 k3s server 节点上,已经有 kilo 的相关 annotations,示例如下:
    apiVersion: v1
    kind: Node
    metadata:
      annotations:
        k3s.io/external-ip: {{ server_public_ip }}
        k3s.io/hostname: instance-20190921-1325
        k3s.io/internal-ip: 10.0.0.170
        ...
        kilo.squat.ai/discovered-endpoints: '{"{{ public_key_1 }}":{"IP":"{{ agent_public_ip_1 }}","Port":51820,"Zone":""},"{{ public_key_2 }}":{"IP":"{{ agent_public_ip_2 }}","Port":51820,"Zone":""}}'
        kilo.squat.ai/endpoint: '{{ server_public_ip }}:51820'
        kilo.squat.ai/force-endpoint: '{{ server_public_ip }}:51820'
        kilo.squat.ai/granularity: location
        kilo.squat.ai/internal-ip: 10.0.0.170/24
        kilo.squat.ai/key: {{ private_key }}
        kilo.squat.ai/last-seen: "1658647061"
        kilo.squat.ai/location: seoul
        kilo.squat.ai/persistent-keepalive: "20"
        kilo.squat.ai/wireguard-ip: 10.4.0.2/16
    ...

    可以看到 discovered-endpoints 这个是内网自动发现到的节点

安装部署 k3s agent节点

部署agent节点前,需要在server节点先获取到token,后面添加agent节点时都需要带上,可以添加多台agent节点,这里以添加两台为例子。

获取token:

cat /var/lib/rancher/k3s/server/node-token

执行命令添加agent节点

简要说明:

  1. INSTALL_K3S_EXEC=”agent” : 定义添加的是agent节点,将只作为工作节点加入集群,没有etcd;
  2. INSTALL_K3S_CHANNEL=v1.22 : 安装的K3S版本,这里选择1.22 稳定版本,不选择太新的版本;
  3. K3S_URL=https://{{ server_public_ip }}:6443 : 指定server节点api访问地址
  4. K3S_TOKEN={{ server_token }} : 使用上一步获取到的token值
  5. –node-label “topology.kubernetes.io/region=chuncheon” : 设置当前服务器的label为春川区域;
  6. –node-label “worker-node=true” : 设置为工作节点;
  7. –kube-proxy-arg “metrics-bind-address=0.0.0.0” : kube-proxy 参数,这个参数直接影响 Metrics 的获取;

执行后等待1分钟左右,回到k3s server节点,执行kubectl get node,即可看到新添加的节点,同样,这里我们对添加进来的节点进行拓扑定义

Kilo CNI的网卡说明

网卡列表

  1. kilo0:WireGuard VPN 网络,用以 Node 间组建 VPN 内网;如果同一个区域内存在VPC,内网连接则优先使用VPC内网,只有走外部其他区域的链路才会走WireGuard 加密网络;
  2. kube-bridge: 桥接网络,Node内 Pod 的网卡与宿主机的网卡进行连接,如需跨网通信,则会路由到WireGuard VPN 网络共享通信;
  3. tunl0:Bridge 模式下,多主机网络通信需要额外配置主机路由,或使用 overlay 网络。通过 Kilo 来自动配置。引用网上的一张图:

bad9ff3733235040

路由表

首尔机器上的路由表:

# ip r
default via 10.0.0.1 dev enp0s3 proto dhcp src 10.0.0.170 metric 100 
10.0.0.0/24 dev enp0s3 proto kernel scope link src 10.0.0.170 
10.0.0.98 via 10.4.0.1 dev kilo0 proto static onlink 
10.0.0.246 via 10.4.0.3 dev kilo0 proto static onlink 
10.4.0.0/16 dev kilo0 proto kernel scope link src 10.4.0.2 
10.42.0.0/24 dev kube-bridge proto kernel scope link src 10.42.0.1 
10.42.1.0/24 via 10.4.0.1 dev kilo0 proto static onlink 
10.42.2.0/24 via 10.4.0.3 dev kilo0 proto static onlink 
169.254.0.0/16 dev enp0s3 proto dhcp scope link src 10.0.0.170 metric 100

春川的路由表:

# ip r
default via 10.0.0.1 dev enp0s3 proto dhcp src 10.0.0.98 metric 100 
10.0.0.0/24 dev enp0s3 proto kernel scope link src 10.0.0.98 
10.0.0.170 via 10.4.0.2 dev kilo0 proto static onlink 
10.0.0.246 via 10.4.0.3 dev kilo0 proto static onlink 
10.4.0.0/16 dev kilo0 proto kernel scope link src 10.4.0.1 
10.42.0.0/24 via 10.4.0.2 dev kilo0 proto static onlink 
10.42.1.0/24 dev kube-bridge proto kernel scope link src 10.42.1.1 
10.42.2.0/24 via 10.4.0.3 dev kilo0 proto static onlink 
169.254.0.0/16 dev enp0s3 proto dhcp scope link src 10.0.0.98 metric 100

东京的路由表:

# ip r
default via 10.0.0.1 dev enp0s3 proto dhcp src 10.0.0.246 metric 100 
10.0.0.0/24 dev enp0s3 proto kernel scope link src 10.0.0.246 
10.0.0.98 via 10.4.0.1 dev kilo0 proto static onlink 
10.0.0.170 via 10.4.0.2 dev kilo0 proto static onlink 
10.4.0.0/16 dev kilo0 proto kernel scope link src 10.4.0.3 
10.42.0.0/24 via 10.4.0.2 dev kilo0 proto static onlink 
10.42.1.0/24 via 10.4.0.1 dev kilo0 proto static onlink 
10.42.2.0/24 dev kube-bridge proto kernel scope link src 10.42.2.1 
169.254.0.0/16 dev enp0s3 proto dhcp scope link src 10.0.0.246 metric 100

在这里可以看到,这三台机器,已经通过各自的路由,分别都找到了对方。

安装helm部署软件

helm常用于k8s里的软件部署,在k3s里同样需要安装,执行命令:

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

安装部署nginx-ingress

nginx-ingress 直接使用helm进行安装,执行命令:

安装部署rancher控制面板

新版本rancher 2.6的安装与2.5之前不一样,2.6版本依赖helm,直接运行以下命令进行安装,需要提前准备的是管理后台域名的证书

首先添加helm的repo

接着将域名证书放在/etc/rancher/cert路径中

然后创建cattle-system的命名空间和tls密钥

最后安装rancher面板

等待2分钟后,执行命令获取登录信息,复制粘贴到浏览器打开进行初始化,访问前请先对域名进行解析。

安装部署Longhorn分布式存储

完成上步对rancher部署后,进入左下角带齿轮图标的 Cluster Tools,找到 Longhorn 点击安装,一路默认点下一步就好,等待安装完成就好。

安装部署velero备份还原组件

velero是k8s下用于备份命名空间下容器的最佳利器,同样也适用于k3s,以下为安装步骤

安装velero

首先从官方github上下载软件进行安装,注意选择arm64的软件架构

复制到运行环境中,检查版本是否为目标版本

# cp velero /usr/local/bin/
# velero version --client-only
Client:
	Version: v1.9.0
	Git commit: 6021f148c4d7721285e815a3e1af761262bff029

配置命令行自动补全

配置velero

velero一般使用是搭配s3存储,然后定义好备份时间后,就会在时间到达的时候,自动备份到指定的s3存储,所以在配置velero之前,请先准备一个s3存储服务,可以说aws的s3,也可以是自己搭建的minio服务,首先定义好access_key和secret_key:

然后定义环境变量,为该s3存储的位置信息和存储桶信息(以下值根据你的服务情况而定)

然后开始安装,在这里需要定义k3s的kubeconfig文件,我遵从k8s的使用习惯,是将rancher k3s的配置信息写进本地家路径下的.kube/config中,实际情况你需要根据情况而进行修改

验证安装结果,如果有报错,可以在日志中看到的,执行命令:

kubectl logs deployment/velero -n velero

卸载velero

如果配置出错或不想使用velero进行备份了,可以非常方便地进行卸载操作,执行命令:

velero uninstall

使用velero进行单次备份

velero backup create app-1 
  --include-namespaces app 
  --default-volumes-to-restic

简要说明:

  1. app-1 为本次备份的名称,方便后续查找和恢复,唯一
  2. –include-namespaces app : velero遵从按命名空间进行备份,所有位于该命名空间下的资料都会被当成一个备份条件进行备份
  3. –default-volumes-to-restic : 开启这个选项后,就可以备份到 pvc 里面的内容了,就不仅仅是yaml配置信息,是完整的备份。

tips:可以随时查看备份的详情,例如在备份进行中时,可以使用命令查看进度

velero backup describe app-1

使用velero进行循环定时备份

velero schedule create app-12h 
  --include-namespaces app 
  --default-volumes-to-restic 
  --schedule="@every 12h"

简要说明:

  1. 与单次备份不同,这里使用schedule create,创建一个计划任务的方式创建备份任务
  2. –schedule : 定义了间隔时间,例如 @every 12h,代表间隔12小时备份一次,例如 @daily ,则为每日备份一次

使用velero进行还原

还原操作适用于回档或进行迁移,首先在集群b安装好运行环境和velero后,配置好s3的信息,就可以执行命令获取备份列表:

# velero backup get

执行恢复:

velero restore create --from-backup app-1

配置ModSecurity

在nginx-ingress中,默认已经包含ModSecurity的库,并也有OWASP的规则,只是默认情况下没有开启,我们可以在ingress-nginx的configmaps里,添加配置开启这部分的功能,其他功能可以参考这个网址,酌情开启。

这里开启后会对所有ingress都起作用,如果不需要modsecurity的,注意可以不用理会这条,不必修改就好

开启modsecurity之后的朋友,还需要对rancher的ingress,关闭功能,防止一些莫名其妙的控制面板报错

安装Cert-manager管理证书

直接kubectl 一把梭了,执行:

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.8.2/cert-manager.yaml

然后给需要分配证书的ns分配发行者,这里我们直接用letsencrypt提供的证书,太方便了

然后给域名分配证书

等待数分钟后,或者通过命令查询证书分配情况,当看到Type:       Ready时,即代表证书已经申请成功,回到ingress那里,给域名指定一个证书就可以了。

至此安装完毕,所有pod如下:

# kubectl get po -A
NAMESPACE                   NAME                                                     READY   STATUS    RESTARTS       AGE
cattle-fleet-local-system   fleet-agent-57497ff7dc-b8kl5                             1/1     Running   0              3h12m
cattle-fleet-system         fleet-controller-5746685958-szdjn                        1/1     Running   0              3h13m
cattle-fleet-system         gitjob-cc9948fd7-xzb75                                   1/1     Running   0              3h13m
cattle-monitoring-system    alertmanager-rancher-monitoring-alertmanager-0           2/2     Running   0              3h7m
cattle-monitoring-system    prometheus-rancher-monitoring-prometheus-0               3/3     Running   0              3h7m
cattle-monitoring-system    pushprox-k3s-server-client-5gck9                         1/1     Running   0              3h7m
cattle-monitoring-system    pushprox-k3s-server-client-hhfj8                         1/1     Running   0              3h7m
cattle-monitoring-system    pushprox-k3s-server-client-pgrbh                         1/1     Running   0              3h7m
cattle-monitoring-system    pushprox-k3s-server-proxy-f4f5d4874-gfkmc                1/1     Running   0              3h7m
cattle-monitoring-system    rancher-monitoring-grafana-57777cc795-2pzs6              3/3     Running   0              3h7m
cattle-monitoring-system    rancher-monitoring-kube-state-metrics-5bc8bb48bd-jmb2j   1/1     Running   0              3h7m
cattle-monitoring-system    rancher-monitoring-operator-f79dc4944-lg8m8              1/1     Running   0              3h7m
cattle-monitoring-system    rancher-monitoring-prometheus-adapter-8846d4757-qcjcd    1/1     Running   0              3h7m
cattle-monitoring-system    rancher-monitoring-prometheus-node-exporter-hq82r        1/1     Running   0              3h7m
cattle-monitoring-system    rancher-monitoring-prometheus-node-exporter-mmp8n        1/1     Running   0              3h7m
cattle-monitoring-system    rancher-monitoring-prometheus-node-exporter-z99jt        1/1     Running   0              3h7m
cattle-system               rancher-7649d589ff-gj894                                 1/1     Running   0              3h14m
cattle-system               rancher-7649d589ff-mm5jx                                 1/1     Running   0              3h14m
cattle-system               rancher-7649d589ff-xfcm7                                 1/1     Running   0              3h14m
cattle-system               rancher-webhook-6958cfcddf-xhqwk                         1/1     Running   0              3h12m
cert-manager                cert-manager-66b646d76-qmxms                             1/1     Running   0              165m
cert-manager                cert-manager-cainjector-59dc9659c7-tzhzm                 1/1     Running   0              165m
cert-manager                cert-manager-webhook-7d8f555998-kh5zl                    1/1     Running   0              165m
icodex                      nginx-6dd7b9db9b-79rdp                                   1/1     Running   0              178m
icodex                      nginx-6dd7b9db9b-cs2tm                                   1/1     Running   0              178m
icodex                      nginx-6dd7b9db9b-w94d8                                   1/1     Running   0              178m
icodex                      php-fpm-5c5758b88-7tcqx                                  1/1     Running   0              178m
icodex                      php-fpm-5c5758b88-kw4pp                                  1/1     Running   0              178m
icodex                      php-fpm-5c5758b88-pgg7n                                  1/1     Running   0              178m
ingress-nginx               ingress-nginx-controller-5b7cf87848-dnbt8                1/1     Running   0              3h31m
ingress-nginx               svclb-ingress-nginx-controller-9fdqg                     2/2     Running   0              3h31m
ingress-nginx               svclb-ingress-nginx-controller-dglh6                     2/2     Running   0              3h31m
ingress-nginx               svclb-ingress-nginx-controller-szs9s                     2/2     Running   0              3h31m
kube-system                 coredns-7796b77cd4-b5gwb                                 1/1     Running   0              5h16m
kube-system                 kilo-5khs9                                               1/1     Running   0              5h5m
kube-system                 kilo-8574c                                               1/1     Running   0              5h3m
kube-system                 kilo-jqw5f                                               1/1     Running   0              5h12m
kube-system                 local-path-provisioner-84bb864455-85dtg                  1/1     Running   0              5h16m
kube-system                 metrics-server-ff9dbcb6c-jk5v2                           1/1     Running   0              5h16m
longhorn-system             csi-attacher-8b4cc9cf6-dj55n                             1/1     Running   0              3h8m
longhorn-system             csi-attacher-8b4cc9cf6-mj78z                             1/1     Running   0              3h8m
longhorn-system             csi-attacher-8b4cc9cf6-n8v7v                             1/1     Running   0              3h8m
longhorn-system             csi-provisioner-59b7b8b7b8-5skdn                         1/1     Running   0              3h8m
longhorn-system             csi-provisioner-59b7b8b7b8-tddz2                         1/1     Running   0              3h8m
longhorn-system             csi-provisioner-59b7b8b7b8-xqzjp                         1/1     Running   0              3h8m
longhorn-system             csi-resizer-68ccff94-gh9fx                               1/1     Running   0              3h8m
longhorn-system             csi-resizer-68ccff94-lxlst                               1/1     Running   0              3h8m
longhorn-system             csi-resizer-68ccff94-rkftz                               1/1     Running   0              3h8m
longhorn-system             csi-snapshotter-6d7d679c98-477s4                         1/1     Running   0              3h8m
longhorn-system             csi-snapshotter-6d7d679c98-bt9ww                         1/1     Running   0              3h8m
longhorn-system             csi-snapshotter-6d7d679c98-qkcff                         1/1     Running   0              3h8m
longhorn-system             engine-image-ei-d474e07c-2nk6r                           1/1     Running   0              3h8m
longhorn-system             engine-image-ei-d474e07c-jqsgl                           1/1     Running   0              3h8m
longhorn-system             engine-image-ei-d474e07c-vh48h                           1/1     Running   0              3h8m
longhorn-system             instance-manager-e-8b411f4a                              1/1     Running   0              3h8m
longhorn-system             instance-manager-e-da92c7e5                              1/1     Running   0              3h8m
longhorn-system             instance-manager-e-fb0588b7                              1/1     Running   0              3h8m
longhorn-system             instance-manager-r-5c615480                              1/1     Running   0              3h8m
longhorn-system             instance-manager-r-9e4dac9d                              1/1     Running   0              3h8m
longhorn-system             instance-manager-r-cfd922a1                              1/1     Running   0              3h8m
longhorn-system             longhorn-csi-plugin-fmc6b                                2/2     Running   0              3h8m
longhorn-system             longhorn-csi-plugin-g62hj                                2/2     Running   0              3h8m
longhorn-system             longhorn-csi-plugin-k7mlz                                2/2     Running   0              3h8m
longhorn-system             longhorn-driver-deployer-7ffd665594-2q8rm                1/1     Running   0              3h9m
longhorn-system             longhorn-manager-55hjs                                   1/1     Running   1 (3h8m ago)   3h9m
longhorn-system             longhorn-manager-mdtn2                                   1/1     Running   1 (3h8m ago)   3h9m
longhorn-system             longhorn-manager-twg2m                                   1/1     Running   0              3h9m
longhorn-system             longhorn-ui-556866b6bb-6wpb7                             1/1     Running   0              3h9m
longhorn-system             share-manager-pvc-7a347acd-b8e8-44df-a2c0-4b4ec54d84fc   1/1     Running   0              3h4m
velero                      restic-8qkjv                                             1/1     Running   0              156m
velero                      restic-b9nfn                                             1/1     Running   0              156m
velero                      restic-jmt9n                                             1/1     Running   0              156m
velero                      velero-79fd55b75d-q68lm                                  1/1     Running   0              156m

最后是完成后的一些图片,目前已经稳定运行半个月。

c40070d1cd165514

e028c6194a165625

6e9373d35b174945

后记:Arm架构的服务器在几个大厂的推动下,取得不错的成绩,在程序方面也有许多开发者做了这部分的兼容,使用起来是没有问题的。未来以arm为代表的精简指令集的soc必将在服务器领域取得不错的成绩的。

创作不易,转载请著名出处,谢谢!

相关推荐: 使用OpenLiteSpeed后如何开启HTTP/3的支持

本文为DirectAdmin面板如何使用OpenLiteSpeed系列的第三章:第一章:DirectAdmin面板如何使用OpenLiteSpeed替代默认的Apache第二章:如果OpenLiteSpeed使用了CloudFlare等CDN如何显示访客的真实…

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 共7条
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    没有评论内容