2020/05/25 Prometheus监控k8s企业级应用 1

2.2 课程介绍及课程大纲

普罗米修斯的配置很难
在这里插入图片描述

2.3 Prometheus监控软件概述

prometheus是一名google的前员工写的,也是go语言写的,K8S是第一个托管的项目,prometheus是第二个
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这里就有一些很繁杂的表达式
在这里插入图片描述
普罗米修斯源码托管地址
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.4 Prometheus监控特点

监控特点:
最重要的是支持多维数据模型:(持久化监控数据,zabbix用的是MySQL,Prometheus内置的是一个时间序列数据库:TSDB(Time Series Database)类似mongodb和hbase,json格式的数据,没有二维表的行和列,可以大致类比成关系型数据库里的列很多,一维代表一个列,对存储的数据进行查询和索引。
多维数据模型,最重要的是通过不同的查询检索和过滤条件去查到想要监控的指标。

普罗米修斯最难理解的就是通过一系列查询条件过滤出来结果,并不是个数值而是一个函数,通过一系列条件,得到一个函数
在这里插入图片描述
关系型数据库在保证强一致性的时候,是没有任何数据库可以替代的。prometheus为什么要监控时间序列数据库,是做了精心选择的,因为监控里最常用的查询就是基于时间来查询,zabbix接的mysql是最不擅长查询的。
prometheus除了内置的TSDB还可以外接influxdb这样的。

类似sql,可以利用多维数据完成复杂查询,配置报警的时候一定要配置promql
在这里插入图片描述
采集方式和zabbix略有不同(agent和server的数据通信,主动和被动,agent主动像agent汇报数据,zabbix被动就是,server轮询去获取数据

普罗米修斯只能通过http或者https拉取的方式采集时间序列数据exporter。
prometheus的exporter鉴于只能提供http接口,但是有一些服务不带http接口,redis,mysql,就需要去官网下载这种软件指定的exporter,由exporter在内部和你要监控的软件进行通信,由你一个mysql exporter,配置一些连接串,用socket进行通信,由exporter帮你暴露http接口,就可以去抓信息了

exporter不是只有一种
在这里插入图片描述
exporter是拉,pushgateway是推,把数据推给普罗米修斯,如果监控目标是转瞬即逝的调用,拉数据有interview,可能根本拉不到,所以这时候就要用到组件pushgateway,能让你把job信息主动推送给普罗米修斯的server
在这里插入图片描述
两种方式发现目标,服务发现和静态配置

在这里插入图片描述
grafana的图形做的很好

在这里插入图片描述
这几个是重点

在这里插入图片描述

2.5 Prometheus架构介绍

在这里插入图片描述
pushgateway,暂时不做研究

中间是Prometheus的服务端,exporter也叫prometheus的targets,真正要监控哪些东西,是依赖于exporters,类比成zabbix的agent(zabbix的agent只需要安装一个,然后分发自定义脚本即可)。
exporter是需要装一批exporter,根据需求可以装几个,通过普罗米修斯去pull metrics拉,从exporter去拉数据

在这里插入图片描述
右边是altermanager报警,webUI,或者是当成数据源给grafana,API接口可以自己写
在这里插入图片描述
最令人发指,就是service discovery,有非常厉害的服务自动发现的功能,服务发现类型主要有两种,一种是基于kubernetes本身元数据的自动发现,管这种发现叫kubernetes_sd(sd代表service discovery)
把自动发现规则写到文件里就是基于文件进行服务自动发现,就是file_sd(恰好服务不在k8s里的,就需要我们提前写在文件里)

在这里插入图片描述
retrieval是数据收集中心,去收集自动发现规则,还要去收集exporter监控指标,然后传到TSDB时间序列数据库可以放在HDD/SSD上,prometheus-server还提供了http server,可以给alertmanager去 push alerts。或者通过promql给ui或者grafana,提供数据查询接口
在这里插入图片描述
、这里接的告警工具有很多,pagerduty,email

在这里插入图片描述
转瞬即逝的job才用push gateway
在这里插入图片描述

2.6 Prometheus和Zabbix对比

在这里插入图片描述
zabbix可以用ld自动发现,起来一个docker容器,有dokcername,

coredns有pod控制器

在这里插入图片描述
有个pod
在这里插入图片描述
在这里插入图片描述
干掉再起来就变了,如果是自动发现会认为是新的,老的不可达就会告警,但是这个本来就是更新,是可达的,这就是zabbix不能做容器监控的最重要的点,随意不得不用普罗米修斯
在这里插入图片描述

2.7 交付kube-state-metric

第一先去做exporter,第二做prometheus-server,第三做service discovery,第四做grafana,第5做alertmanager

在这里插入图片描述
prometheus有各种exporter,都可以从官网上下
在这里插入图片描述
每一种软件都有自己的exporter
在这里插入图片描述
这是要用到的第一个exporter,kube-state-metrics用来收集k8s状态信息的监控代理。
比如k8s里有几个节点,有几个deployment,有几个模板

在这里插入图片描述
第二个要用的就是node-exporter,专门收集k8s运算节点上基础设施信息的 ,你的运算节点还有多少内存,使用量,cpu,网络IO。
node-exporter要部署到所有k8s节点上

在这里插入图片描述
第三要部署的是CAdvisor,这个exporter,是很重要的,是用来监控容器内部使用资源的重要工具。
docker容器到底耗费多少资源,该如何监控。
CAdvisor是在外面探测容器到底消耗多少cpu,内存。
1.9以前CAdvisor和kubelet是集成在一起的。1.9以后拆开了。
看容器消耗的资源用CAdvisor

在这里插入图片描述
blackbox-exporter,重要的作用,用来帮你探明业务容器是否存活,
在这里插入图片描述
在这里插入图片描述
**kube-state-metrics其实跟dockerhub一个意思
**
在这里插入图片描述
版本一定要一样
在这里插入图片描述
在运维主机pull镜像,做docker,去编资源配置清单
在这里插入图片描述
在这里插入图片描述
push到harbor里
在这里插入图片描述在这里插入图片描述
创建service account服务账号,是在kube-system名称空间里
在这里插入图片描述
声明了一个clusterrole
在这里插入图片描述
kube-state-mertrics能获得以下资源
在这里插入图片描述
在这里插入图片描述
做了一个集群角色绑定
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
声明一个deployment的控制器
在这里插入图片描述

readinessprobe,就绪性探针,满足探针的时候,才认为容器是启动状态,才会调度流量
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
任选一个运算节点,先去创建rbac

在这里插入图片描述
再去创建dp
在这里插入图片描述
dp本身有8080端口,kube-state-metrics起来监听了一个8080端口,是一个http类型的接口
在这里插入图片描述
这个pod就起来了
在这里插入图片描述
查看logs是监听在8080

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
如何确定正常启动在这里插入图片描述

2.8 交付node-exporter

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
push到仓库
在这里插入图片描述
在这里插入图片描述
可以准备资源配置清单了
在这里插入图片描述
挂了两个目录,宿主机的proc目录和sys目录

在这里插入图片描述
用到两个path,把/proc挂载到了/host-proc,把/sys挂载到了/host_sys

在这里插入图片描述
traefik,用了宿主机的网络名称空间
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
直接应用
在这里插入图片描述
去看kube-system,pods,两个node_exporter都起来了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
真正取到数据的接口是metrics
在这里插入图片描述
就把宿主机的一些取出来了

在这里插入图片描述
kube-state-metrics
在这里插入图片描述
这里就i出现一些数据
在这里插入图片描述
若干标签是,监控度量的维度,通过namespace去过滤kube_service_labels,或者是通过service等于什么来过滤

在这里插入图片描述

2.9 交付cadvisor

Cadvisor其实是跟kubelet,要kubelet启动容器的消费资源,网络IO,磁盘IO,更新比较快,版本不要用太高,因为可能需要centos8
在这里插入图片描述
直接pull一个镜像
在这里插入图片描述
push进去

在这里插入图片描述
在这里插入图片描述
准备资源配置清单
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
和宿主机共享网络名称空间

在这里插入图片描述
**tolerations英文是容忍,就是用户本身可以手动人为影响K8S调度的一种重要方法。K8S能调度不同pod,就是靠的kube-scheduler,逻辑上是主控节点的组件,有预选策略和优选策略
**
在这里插入图片描述
但是有时候调度的结果不怎么如意,就需要人为影响,一个pod不能在哪些节点上运行。用污点、容忍度方法可以人为规定。
在这里插入图片描述
污点是运算节点node上的污点。
容忍度是pod是否能够容忍污点。
需要先给运算节点的污点

在这里插入图片描述
roles相当于给运算节点设置角色

在这里插入图片描述
tolerations容忍度是如果发现主控节点,影响effect就是不调度。
发现了污点,要匹配pod控制器上的策略,这里是发现master就不调度

在这里插入图片描述
这个role是label,之前是用kubectl label node,真正要给node打污点
在这里插入图片描述
打污点,最常用的就是disktype=ssd,在node上打污点告诉你,node用的是ssd硬盘,普通的pod不要往这里调度,必须是IO密集型的才往这里调度
在这里插入图片描述
key=xxx:动作
在这里插入图片描述
key=xxx:动作,taint就是已经被污染了
在这里插入图片描述
这样看不出来
在这里插入图片描述
现在有两个node,一个21,一个22
在这里插入图片描述
点击21,21是被污染的
在这里插入图片描述
这里有一个污点taints

在这里插入图片描述
污点叫node -role.kubernetes.io/master=master:NoSchedule
在这里插入图片描述
给cadvisor,定义daemonset,定义了一个tolerations,只要看到了污点的key,node.role.kubernetes.io/master.,然后effect就是不调度
在这里插入图片描述
这里是容忍了污点,effect改成NoExec
在这里插入图片描述
在这里插入图片描述
这里有NoExecute

在这里插入图片描述
不执行跟不调度还不是一码事

在这里插入图片描述
在修改运算节点的软连接

在这里插入图片描述
重新挂载一下

在这里插入图片描述
在这里插入图片描述
实际上软连接就换了

在这里插入图片描述
这个所有的运算节点都需要整,否则cadvicsor容器绝对起不来
在这里插入图片描述
在这里插入图片描述
只在22上,21上没有被调度,因为21上打了污点
在这里插入图片描述

想在在21上把污点删除,,在容器的po控制器里写的是noexec,但是污点打的是noscheduler
在这里插入图片描述
查看如何删除
在这里插入图片描述

需要加个减号-
在这里插入图片描述
现在就没了
在这里插入图片描述
现在cadvisor在21上也起来了

在这里插入图片描述
cadvisor改成noscheduler

在这里插入图片描述
在这里插入图片描述
这样cadvisor就起来了

在这里插入图片描述
这是人为影响调度的第一种方法,污点,容忍度方法

在这里插入图片描述
第二种是指定nodeName运行,让pod运行在指定的node上,通过标签选择器,让Pod运行在指定的一类node上
在这里插入图片描述
通过这三种可以组合成很多新奇的方法,比如用deployment去管理,但是想每个节点运行一份,多余的运行在某些指定的节点上

2.10 交付blackbox-exporter

在这里插入图片描述
在这里插入图片描述
先去拉取镜像
在这里插入图片描述
在这里插入图片描述
先准备一个configmap配置文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
deployment类型的pod控制器
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
需要去解析出来,用了ingress-controller,不用去管nginx配置,只需要ingress解析域名,流量就过来了
在这里插入图片描述
在这里插入图片描述
修改dns,记得前滚序列号
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改文件夹名
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这就ok了
在这里插入图片描述

2.11 污点容忍度调度补充1

kubectl create一个deployment nginx-dp --image,-n放到名称空间里 kube-public,用最简单的方式创建一个deployment

在这里插入图片描述
扩容至两份
在这里插入图片描述
这样21和22都起来了,尽可能负载均衡,但是现在如果就是不想调度在21上
在这里插入图片描述
启动的service,进行修改

在这里插入图片描述

dnspolicy还有一种default,走的是宿主机的results,不走coredns了,所以原则上扔到k8s里的pod都接受dns管理,这样才能服务发现

把多余的干掉,变成deployement比较简单的写法

在这里插入图片描述
给hdss-7-21加污点,然后观察nginx-dp是否还能调度,先缩成一份

在这里插入图片描述
现在只在22上有

在这里插入图片描述
加一个污点,key=quedian,value=buxijiao,方法NoScheduler
在这里插入图片描述
可以看到quedian是buxijiao在这里插入图片描述
再去扩容nginx-dp
在这里插入图片描述
就没往21上调度

在这里插入图片描述
扩成4份
在这里插入图片描述
都在22上
在这里插入图片描述
恢复成1个

在这里插入图片描述
现在去改一下deployment
在这里插入图片描述
在spec下,加一个toleration容忍度,yaml文件格式要严格对齐
在这里插入图片描述写错了,这个spec是pod控制器的

在这里插入图片描述
放到这里
在这里插入图片描述

在这里插入图片描述
再去看deployment去看一下yaml
在这里插入图片描述
这个yaml里就有加的tolerations,方法是noshcheduler
在这里插入图片描述
扩容2个

在这里插入图片描述
toleration的意思是容忍

在这里插入图片描述
尽管node有污点,toleration是受委屈也得忍,忍这个污点
在这里插入图片描述
先把缺点去掉
在这里插入图片描述
缩容为0

在这里插入图片描述
打上污点,不执行

在这里插入图片描述
修改dp

在这里插入图片描述
如果能容忍quedian=buxijiao,就能调度起来并执行

在这里插入图片描述
在这里插入图片描述
扩容两个
在这里插入图片描述
都在22上

在这里插入图片描述
再加一个
在这里插入图片描述
也是22上
在这里插入图片描述
如果没有任何节点调度了,可以调度到21上,但是起不来,给node打了污点,如果没有完全容忍污点动作,调度器会默认帮你调度到干净的节点上,实在没办法才去调度
生产中用的多的还是noscheduler,少的就是noexecute

普罗米修斯非常吃资源,一般就单独一个节点,就单独跑普罗米修斯,任何容器都跑不起来,普罗米修斯吃资源,所以就给这个节点打污点,只能普罗米修斯容忍

给运算节点打标签,机器,disk type是ssd,这一批是sas,这一批是sata。如果要调度IO密集型 的容器,就可以加node selector,去做标签选择,这样就把容器尽量的往SSD机器上去调度

污点和容忍度用的挺少,如果节点打了污点,等于要调度容器就必须加容忍度,永远调度不过来

2.12 污点容忍度调度补充2

kube-system,21和22上都有容器

在这里插入图片描述
在21上打污点,凡是在21上已经运行的容器,就会被驱逐
在这里插入图片描述
都到22了,还有一个可能是daemonset,等会就会被驱逐

在这里插入图片描述
在这里插入图片描述
把污点减去
在这里插入图片描述
daemonset就回来了
在这里插入图片描述
加个污点,把容器排干,这样就能进行维护,现在21的节点明显负载低l
在这里插入图片描述
还可以给node加多个污点
在这里插入图片描述
容忍不洗脚,可以容忍两个缺点
在这里插入图片描述
在这里插入图片描述
这样就被调度到21上了
在这里插入图片描述
缩容为0

在这里插入图片描述
现在只容忍一个污点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
21容器就排干了

在这里插入图片描述
有污点,就不会调度到21,只容忍不洗澡,没容忍不洗脚
在这里插入图片描述
缩容为0

在这里插入图片描述
22上不洗澡不洗脚,21上不洗脚i

在这里插入图片描述
、起不来,都不洗脚忍不了
在这里插入图片描述
缩容为0
在这里插入图片描述不洗澡删除
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
恢复1个,21上更闲
在这里插入图片描述
在这里插入图片描述
继续为0
在这里插入图片描述

2.13 安装部署prometheus-server

把deployment删除

在这里插入图片描述
把污点也删除
在这里插入图片描述
**cadvisor,k8s应该是分为主控节点和逻辑节点。如果用kubeadm去部署集群的话,部署出来的role等于matser节点,会给你加一个taint。
master节点只运行etcd,apiserver,scheduler,controller manager,kubeadm相当于k8s自身的组件,托管给k8s了,把自己托管给自己了。相当于把自己作为一个pod运行在kubelet,让kubelet弄在运行节点上。kubeadm弄出主控节点的时候,会给你加taint,同时加污点,保证你的业务容器不会调度到主控节点上
**
cadvisor加上一个容忍度,尽管是主控节点,仍然让cadvisor跑上去,去收集你的信息。
加了toleration,尽管是主控节点。在部署的时候只给主控节点加标签,kubeadn真正要做起来,就是加个标签,加个污点

有了这个toleration,就是无差别的让cadvisor起来,无论加了污点都会起来

在这里插入图片描述
在这里插入图片描述
可以用这个版本
在这里插入图片描述
Prometheus可以用新一点的版本,但是grafana不行
在这里插入图片描述
在这里插入图片描述
放到infra仓库
在这里插入图片描述
准备好镜像,就需要准备Prometheus的资源配置清单
在这里插入图片描述
在这里插入图片描述
还是三步,建一个service account,建一个cluster role,然后一个cluster role binding
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
**replicas只要1是因为普罗米修斯要持久化数据,用到nfs,ftp挂出来,只能起一份。
selector标签选择器,match labels
**

在这里插入图片描述
strategy其实可以删除,有默认值

在这里插入图片描述
容器里用/bin/prometheus起来
在这里插入图片描述

持久化72小时,暴露端口9090,/data/nfs-volume/prometheus挂载到了容器里的/data
在这里插入图片描述
resources是k8s里限制容器资源的方法,里面有两个配置项requests,limits,requests代表容器一起来就需要多大资源,memory:1.5g起来就需要1.5G内存,cpu:1000m是1000毫核,1000M就是1,就是1核
limits就是当你的容器资源达到了limits量的时候就把它杀死,不能因为一个容器把宿主机容器一起吃掉。
没有resoources就是无限制吃

在这里插入图片描述
jenkins已经吃了掉800M,普罗米修斯跟他错开,到21上
在这里插入图片描述
在spec下面加一个参数,nodeName,人为介入调度的很简单的方法

在这里插入图片描述
在这里插入图片描述
deployment下有spec,spec下有template,template下有spec,spec下有containers,container下有resources,resources下有request和limits,request和limits下有cpu和memory
在这里插入图片描述

手动的把普罗米修斯运行在hdss7-21里
在这里插入图片描述
在这里插入图片描述
制作svc

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
创建nfs目录/data/nfs-volume,还有prometheus下的两个目录/etc和/data
在这里插入图片描述
开始应用
在这里插入图片描述

在这里插入图片描述
先缩一下
在这里插入图片描述
准备prometheus的配置文件

在这里插入图片描述

创建目录
在这里插入图片描述
私钥是Prometheus要和api通信,帮你自动发现k8s的元数据

在这里插入图片描述
在这里插入图片描述
证书准备好i了,就去做普罗米修斯yml
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.14 启动prometheus-server、解释配置

key有了,yml有了。prom-db也有了
在这里插入图片描述
Prometheus变成1

在这里插入图片描述

一定调度到了21上,加了node name
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
alert是报警

在这里插入图片描述
先看configuration

在这里插入图片描述
就是之前的配置文件

在这里插入图片描述
查看targets
在这里插入图片描述
先折叠起来
在这里插入图片描述
可以先去看,这里有几个job name
在这里插入图片描述
先看etcd,在普罗米修斯配置里,只有etcd用的是static_config静态配置,其他都是自动发现,如果在生产要套用这个配置,只需要修改这一段etcd配置,静态就意味着写死,不是自动发现
在这里插入图片描述
要往etcd里存数据,才要证书

在这里插入图片描述
打开etcd,取etcd的检测信息,就是从这里取的。去endpoint拿数据

在这里插入图片描述
这个label是通过什么样的标签去过滤相关的监控指标

在这里插入图片描述
在这里插入图片描述
这里就是自动发现
在这里插入图片描述
这个jobname和target对上

在这里插入图片描述
采集的时间和超时时间
在这里插入图片描述
到底请求http的哪个url
在这里插入图片描述
service discovery的配置,定义job的时候就用的是自动发现
role :pod 定义pod之后,k8s会发现k8s集群里的所有pod

在这里插入图片描述
下面有一堆relabel_config,不能所有的pod都进到job里,只能去过滤一些符合要求的pod进到任务里
在这里插入图片描述
kube-state任务最后过滤出了3个pod,

在这里插入图片描述
relabel_config是Prometheus里最难的配置

在这里插入图片描述
relabel里有action

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
取的源标签是从k8s里取 的一些元数据,当你k8s里的pod,有一个标签,这个标签名字是grafanak8sapp的时候,就保留。
也就是没有这个标签就不保留

在这里插入图片描述
查看pod元数据

在这里插入图片描述
在这里插入图片描述
再看这一个

在这里插入图片描述
在这里插入图片描述
再去看kubestate
在这里插入图片描述
在这里插入图片描述
这里有是因部署为kube-state-metrics,准备了资源配置清单,资源清单里的deployment里,pod控制器里给了标签
在这里插入图片描述
node-exporter里也给了标签

在这里插入图片描述
在这里插入图片描述
通过pod控制器给pod打标签,普罗米修斯拿到标签做匹配
在这里插入图片描述
所有poddlabel,去匹配grafanak8sapp

在这里插入图片描述
正则表达式的值是true,动作就是keep,否则就是drop

在这里插入图片描述
服务发现,有一个grafanak8sapp就保留了

在这里插入图片描述
、address就变成了一个endpoint

在这里插入图片描述
下面也是有grafanak8sapp变成了endPoint

在这里插入图片描述
相当于加入了一个监控目标

在这里插入图片描述
这是一个nginx,一开始部署的是daemonset,没有grafanak8sapp标签,就drop掉

在这里插入图片描述
现在是要给任务匹配target

在这里插入图片描述
这9个都是job任务

在这里插入图片描述
任务里面的目标,就是通过配置文件的relabel匹配出来,相当于把一组target,名字叫job,现在把kube-state监控的目标,监控的目标就是这几个target,普罗米修斯就可以通过这三个APP连接里取到我要的监控数据
在这里插入图片描述
node_cpu是一个函数,里面有一堆标签
在这里插入图片描述

在这里插入图片描述
jon是kube-state
在这里插入图片描述
pod-name是node-exporter-mshlq,函数node-cpu找到这个标签,就可以返回值了
在这里插入图片描述
可以指定条件,每隔15秒取一次,扔到时间序列数据库里了

在这里插入图片描述
在这里插入图片描述
有若干数据维度,通过时间序列的值,就可以画图
在这里插入图片描述
node_cou是函数,相当于用一堆标签提供出来的就是函数
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值