基于Prometheus监控Kubernetes集群

一、Prometheus简介

Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB);Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本;2016年由Google发起Linux基金会旗下的原生云基金会(Cloud Native Computing Foundation), 将Prometheus纳入其下第二大开源项目;Prometheus和Heapster(Heapster是K8S的一个子项目,用于获取集群的性能数据),相比功能更完善、更全面;Prometheus性能也足够支撑上万台规模的集群  。

官网地址:Prometheus - Monitoring system & time series database

(一)Prometheus的基本原理

通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。

这样做非常适合做虚拟化环境监控系统,比如VM、Docker、Kubernetes等。输出被监控组件信息的HTTP接口被叫做exporter 。

目前互联网公司常用的组件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux系统信息(包括磁盘、内存、CPU、网络等等)。

目前官方最新版本为2-51.2版本。

(二)Prometheus优势

·多维度数据模型。

·灵活的查询语言。

·不依赖分布式存储,单个服务器节点是自主的。

·通过基于HTTP的pull方式采集时序数据。

·可以通过中间网关进行时序列数据推送。

·通过服务发现或者静态配置来发现目标服务对象。

·支持多种多样的图表和界面展示,比如Grafana等。

(三)Prometheus工作服务过程

1、Prometheus Daemon负责定时去目标上抓取metrics(指标)数据,每个抓取目标需要暴露一个http服务的接口给它定时抓取。Prometheus支持通过配置文件、文本文件、Zookeeper、Consul、DNS SRV Lookup服务注册与发现等方式指定抓取目标。Prometheus采用PULL的方式进行监控,即服务器可以直接通过目标PULL数据或者间接地通过中间网关来Push数据。

2、Prometheus在本地存储抓取的所有数据,并通过一定规则进行清理和整理数据,并把得到的结果存储到新的时间序列中。

3、Prometheus通过PromQL和其他API可视化地展示收集的数据。Prometheus支持很多方式的图表可视化,例如Grafana、自带的Promdash以及自身提供的模版引擎等等。Prometheus还提供HTTP API的查询方式,自定义所需要的输出。

4、PushGateway支持Client主动推送metrics到PushGateway,而Prometheus只是定时去Gateway上抓取数据。

5、Alertmanager是独立于Prometheus的一个组件,可以支持Prometheus的查询语句,提供十分灵活的报警方式。

(四)Prometheus核心组件

·Server 主要负责数据采集和存储,提供PromQL查询语言的支持

·Alertmanager 警告管理器,用来进行报警

·Push Gateway 主要是实现接收由Client push过来的指标数据,在指定的时间间隔,由主程序来抓取。

·node_exporter 用来监控服务器CPU、内存、磁盘、I/O等信息。

(五)Prometheus实践架构图

二、Grafana简介

Grafana是一个可视化面板(Dashboard),有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器。

支持Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB作为数据源。

Grafana特点

·Grafana是一个可视化面板(Dashboard),有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器。支持Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB作为数据源。

·Grafana支持许多不同的时间序列数据(数据源)存储后端。每个数据源都有一个特定查询编辑器。官方支持以下数据源:Graphite、infloxdb、opensdb、prometheus、elasticsearch、cloudwatch。每个数据源的查询语言和功能明显不同。你可以将来自多个数据源的数据组合到一个仪表板上,但每个面板都要绑定到属于特定组织的特定数据源。

·Grafana中的警报允许您将规则附加到仪表板面板上。保存仪表板时,Gravana会将警报规则提取到单独的警报规则存储中,并安排它们进行评估。报警消息还能通过钉钉、邮箱等推送至移动端。但目前grafana只支持graph面板的报警。

·Grafana使用来自不同数据源的丰富事件注释图表,将鼠标悬停在事件上会显示完整的事件元数据和标记;  

·Grafana使用Ad-hoc过滤器允许动态创建新的键/值过滤器,这些过滤器会自动应用于使用该数据源的所有查询

三、安装部署

(一)环境准备

IP地址

主机名

组件

192.168.100.131

k8s-master

kubeadm、kubelet、kubectl、docker-ce

192.168.100.132

k8s-node01

kubeadm、kubelet、kubectl、docker-ce

192.168.100.133

k8s-node02

kubeadm、kubelet、kubectl、docker-ce

注意:所有主机配置推荐CPU:2C+  Memory:2G+

项目拓扑

1主机初始化配置

所有主机配置禁用防火墙和selinux

[root@localhost ~]# setenforce 0

[root@localhost ~]# iptables -F

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]# systemctl disable firewalld

[root@localhost ~]# systemctl stop NetworkManager

[root@localhost ~]# systemctl disable NetworkManager

[root@localhost ~]# sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config

2、配置主机名并绑定hosts,不同主机名称不同

[root@localhost ~]# hostname k8s-master

[root@localhost ~]# bash

[root@k8s-master ~]# cat << EOF >> /etc/hosts

192.168.100.131 k8s-master

192.168.100.132 k8s-node01

192.168.100.133 k8s-node02

EOF

[root@localhost ~]# hostname k8s-node01

[root@k8s-node01 ~]# cat /etc/hosts

[root@localhost ~]# hostname k8s-node02

[root@k8s-node02 ~]#cat /etc/hosts

3、主机配置初始化

[root@k8s-master ~]# yum -y install vim wget net-tools lrzsz

[root@k8s-master ~]# swapoff -a

[root@k8s-master ~]# sed -i '/swap/s/^/#/' /etc/fstab

[root@k8s-master ~]# cat << EOF >> /etc/sysctl.conf

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

EOF

[root@k8s-master ~]# modprobe br_netfilter

[root@k8s-master ~]# sysctl -p

4、部署docker环境

1)三台主机上分别部署 Docker 环境,因为 Kubernetes 对容器的编排需要 Docker 的支持。

[root@k8s-master ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

[root@k8s-master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

2)使用 YUM 方式安装 Docker 时,推荐使用阿里的 YUM 源。

[root@k8s-master ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3)清除缓存

[root@k8s-master ~]# yum clean all && yum makecache fast

4)启动docker

[root@k8s-master ~]# yum -y install docker-ce

[root@k8s-master ~]# systemctl start docker

[root@k8s-master ~]# systemctl enable docker

5)镜像加速器(所有主机配置)

[root@k8s-master ~]# cat << END > /etc/docker/daemon.json

{     "registry-mirrors":[ "https://nyakyfun.mirror.aliyuncs.com" ]

}

END

6)重启docker

[root@k8s-master ~]# systemctl daemon-reload

[root@k8s-master ~]# systemctl restart docker

(二)部署kubernetes集群

1、组件介绍

三个节点都需要安装下面三个组件

kubeadm:安装工具,使所有的组件都会以容器的方式运行

kubectl:客户端连接K8S API工具

kubelet:运行在node节点,用来启动容器的工具

2、配置阿里云yum源

使用 YUM 方式安装 Kubernetes时,推荐使用阿里的 YUM 源。

[root@k8s-master ~]# ls /etc/yum.repos.d/

[root@k8s-master ~]# cat > /etc/yum.repos.d/kubernetes.repo

3、安装kubelet kubeadm kubectl

所有主机配置

[root@k8s-master ~]# yum install -y kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0

[root@k8s-master ~]# systemctl enable kubelet

[root@k8s-master ~]# kubectl version

kubelet 刚安装完成后,通过 systemctl start kubelet 方式是无法启动的,需要加入节点或初始化为 master 后才可启动成功。

4、配置init-config.yaml

Kubeadm 提供了很多配置项,Kubeadm 配置在 Kubernetes 集群中是存储在ConfigMap 中的,也可将这些配置写入配置文件,方便管理复杂的配置项。Kubeadm 配内容是通过 kubeadm config 命令写入配置文件的。

在master节点安装,master 定于为192.168.100.131,通过如下指令创建默认的init-config.yaml文件:

[root@k8s-master ~]# kubeadm config print init-defaults > init-config.yaml

init-config.yaml配置

[root@k8s-master ~]# cat init-config.yaml

apiVersion: kubeadm.k8s.io/v1beta2

bootstrapTokens:

- groups:

  - system:bootstrappers:kubeadm:default-node-token

  token: abcdef.0123456789abcdef

  ttl: 24h0m0s

  usages:

  - signing

  - authentication

kind: InitConfiguration

localAPIEndpoint:

  advertiseAddress: 192.168.100.131 //master节点IP地址

  bindPort: 6443

nodeRegistration:

  criSocket: /var/run/dockershim.sock

  name: k8s-master //如果使用域名保证可以解析,或直接使用 IP 地址

  taints:

  - effect: NoSchedule

    key: node-role.kubernetes.io/master

---

apiServer:

  timeoutForControlPlane: 4m0s

apiVersion: kubeadm.k8s.io/v1beta2

certificatesDir: /etc/kubernetes/pki

clusterName: kubernetes

controllerManager: {}

dns:

  type: CoreDNS

etcd:

  local:

    dataDir: /var/lib/etcd //etcd 容器挂载到本地的目录

imageRepository: registry.aliyuncs.com/google_containers //修改为国内地址

kind: ClusterConfiguration

kubernetesVersion: v1.19.0

networking:

  dnsDomain: cluster.local

  serviceSubnet: 10.96.0.0/12

  podSubnet: 10.244.0.0/16 //新增加 Pod 网段

scheduler: {}

5、安装master节点

1)拉取所需镜像

[root@k8s-master ~]# kubeadm config images list --config init-config.yaml

[root@k8s-master ~]# kubeadm config images pull --config init-config.yaml

2)安装matser节点

[root@k8s-master ~]# kubeadm init --config=init-config.yaml //初始化安装K8S

3)根据提示操作

kubectl 默认会在执行的用户家目录下面的.kube 目录下寻找config 文件。这里是将在初始化时[kubeconfig]步骤生成的admin.conf 拷贝到.kube/config

[root@k8s-master ~]# mkdir -p $HOME/.kube

[root@k8s-master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

[root@k8s-master ~]# chown $(id -u):$(id -g) $HOME/.kube/config

Kubeadm 通过初始化安装是不包括网络插件的,也就是说初始化之后是不具备相关网络功能的,比如 k8s-master 节点上查看节点信息都是“Not Ready”状态、Pod 的 CoreDNS无法提供服务等。

6、安装node节点

1)根据master安装时的提示信息

[root@k8s-node01 ~]# kubeadm join 192.168.100.131:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:78bdd0f01660f4e84355b70aa8807cf1d0d6325b0b28502b29c241563e93b4ae

[root@k8s-master ~]# kubectl get nodes

[root@k8s-node02 ~]# kubeadm join 192.168.100.131:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:78bdd0f01660f4e84355b70aa8807cf1d0d6325b0b28502b29c241563e93b4ae

Master操作:

[root@k8s-master ~]# kubectl get nodes

前面已经提到,在初始化 k8s-master 时并没有网络相关配置,所以无法跟 node 节点通信,因此状态都是“NotReady”。但是通过 kubeadm join 加入的 node 节点已经在k8s-master 上可以看到。

7、安装flannel

Master 节点NotReady 的原因就是因为没有使用任何的网络插件,此时Node 和Master的连接还不正常。目前最流行的Kubernetes 网络插件有Flannel、Calico、Canal、Weave 这里选择使用flannel。

所有主机:

master上传kube-flannel.yml,所有主机上传flannel_v0.12.0-amd64.tar,cni-plugins-linux-amd64-v0.8.6.tgz

[root@k8s-master ~]# docker load < flannel_v0.12.0-amd64.tar

上传插件:

[root@k8s-master ~]# tar xf cni-plugins-linux-amd64-v0.8.6.tgz

[root@k8s-master ~]# cp flannel /opt/cni/bin/

master上传kube-flannel.yml

master主机配置:

[root@k8s-master ~]# kubectl apply -f kube-flannel.yml

[root@k8s-master ~]# kubectl get nodes

[root@k8s-master ~]# kubectl get pods -n kube-system

已经是ready状态

8、部署测试应用

1)所有node主机导入测试镜像

[root@k8s-node01 ~]# docker pull  nginx

2)在Kubernetes集群中创建一个pod,验证是否正常运行。

[root@k8s-master ~]# mkdir demo

[root@k8s-master ~]# cd demo

[root@k8s-master demo]# vim nginx-deployment.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: nginx-deployment

  labels:

    app: nginx

spec:

  replicas: 3

  selector:

    matchLabels:

      app: nginx

  template:

    metadata:

      labels:

        app: nginx

    spec:

      containers:

      - name: nginx

        image: nginx:1.19.6

        ports:

        - containerPort: 80

创建完 Deployment 的资源清单之后,使用 create 执行资源清单来创建容器。通过 get pods 可以查看到 Pod 容器资源已经自动创建完成。

[root@k8s-master demo]# kubectl create -f nginx-deployment.yaml

[root@k8s-master demo]# kubectl get pods

[root@k8s-master demo]# kubectl get pods -o wide

3)创建Service资源清单

在创建的 nginx-service 资源清单中,定义名称为 nginx-service 的 Service、标签选择器为 app: nginx、type 为 NodePort 指明外部流量可以访问内部容器。在 ports 中定义暴露的端口库号列表,对外暴露访问的端口是 80,容器内部的端口也是 80。

[root@k8s-master demo]# vim nginx-service.yaml

kind: Service

apiVersion: v1

metadata:

  name: nginx-service

spec:

  selector:

    app: nginx

  type: NodePort

  ports:

  - protocol: TCP

    port: 80

targetPort: 80

[root@k8s-master1 demo]# kubectl create -f nginx-service.yaml

[root@k8s-master demo]# kubectl get svc

[root@k8s-master demo]# curl 10.101.253.90:80

通过浏览器访问nginx:http://192.168.100.131:31367 

(三)部署Prometheus监控平台

1、准备Prometheus相关YAML文件

在master节点/opt目录下新建pgmonitor目录

[root@k8s-master ~]# mkdir pgmonitor

[root@k8s-master ~]# cd pgmonitor/

将下载yaml包上传至/opt/pgmonitor目录并解压

[root@k8s-master ~]# unzip k8s-prometheus-grafana-master.zip

2、部署prometheus

1)部署守护进程

[root@k8s-master pgmonitor]# cd k8s-prometheus-grafana-master/

[root@k8s-master k8s-prometheus-grafana-master]# kubectl create -f node-exporter.yaml

2)部署其他yaml文件

进入/pgmonitor/k8s-prometheus-grafana-master/prometheus目录

[root@k8s-master k8s-prometheus-grafana-master]# cd prometheus

3)部署rbac

[root@k8s-master prometheus]# kubectl create -f rbac-setup.yaml

4)部署configmap.yaml

[root@k8s-master prometheus]# kubectl create -f configmap.yaml

5)部署prometheus.deploy.yml

[root@k8s-master prometheus]# kubectl create -f prometheus.deploy.yml

6)部署prometheus.svc.yml

[root@k8s-master prometheus]# kubectl create -f prometheus.svc.yml

7)查看prometheus状态

[root@k8s-master prometheus]# kubectl get pods -n kube-system

稍等一会,再次查看!

[root@k8s-master prometheus]# kubectl get pods -n kube-system

(四)部署Grafana服务

1、部署Grafana相关yaml文件

进入/opt/pgmonitor/k8s-prometheus-grafana-master/grafana目录

[root@k8s-master prometheus]# cd ../grafana/

1)部署grafana-deploy.yaml

[root@k8s-master grafana]# kubectl create -f grafana-deploy.yaml

2)部署grafana-svc.yaml

[root@k8s-master grafana]# kubectl create -f grafana-svc.yaml

3)部署grafana-ing.yaml

[root@k8s-master grafana]# kubectl create -f grafana-ing.yaml

4)查看Grafana状态

[root@k8s-master grafana]# kubectl get pods -n  kube-system

2、配置Grafana数据源

1)查看grafana的端口

[root@k8s-master grafana]# kubectl get svc -n  kube-system

2)通过浏览器访问

grafana,http://[masterIP]:[grafana端口]

例如:http://192.168.100.131:30503,默认的用户名和密码:admin/admin

3)设置DataSource

设置显示数据的模版

输入315并移除光标,等一会儿即可进入下一个页面

选择自己定义的数据源名称

至此已经利用Prometheus+Granfana监控了Kubernetes平台。

备注:

kubectl get pods -n kube-system

当出现prometheus和grafana的镜像下载失败

kubectl create -f prometheus.deploy.yml

kubectl create -f grafana-deploy.yaml

创建镜像不成功

解决方法:

1、本地上传镜像测试

docker  load  < prometheus-v2.0.0.tar  

docker load < grafana-4.2.0.tar

kubectl create -f prometheus.deploy.yml

kubectl create -f grafana-deploy.yaml

创建镜像不成功

2、docker  pull下载测试

docker pull prom/prometheus:v2.0.0

docker pull grafana/grafana:4.2.0

kubectl create -f prometheus.deploy.yml

kubectl create -f grafana-deploy.yaml

创建镜像不成功

3、创建私有仓库harbor方式

1、部署Harbor仓库

1)所有主机配置禁用防火墙和selinux

[root@localhost ~]# setenforce 0

[root@localhost ~]# iptables -F

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]# systemctl disable firewalld

[root@localhost ~]# systemctl stop NetworkManager

[root@localhost ~]# systemctl disable NetworkManager

[root@localhost ~]# sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config

2)配置主机名

[root@localhost ~]# hostname harbor

[root@localhost ~]# bash

[root@harbor ~]#

3)部署docker环境

Harbor 仓库需要 Docker 容器支持,所以 Docker 环境是必不可少的。

[root@k8s-master ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

[root@k8s-master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

使用 YUM 方式安装 Docker 时,推荐使用阿里的 YUM 源。

[root@k8s-master ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

清除缓存

[root@k8s-master ~]# yum clean all && yum makecache fast

启动docker

[root@k8s-master ~]# yum -y install docker-ce

[root@k8s-master ~]# systemctl start docker

[root@k8s-master ~]# systemctl enable docker

镜像加速器(所有主机配置)

[root@k8s-master ~]# cat << END > /etc/docker/daemon.json

{        "registry-mirrors":[ "https://nyakyfun.mirror.aliyuncs.com" ]

}

END

重启docker

[root@k8s-master ~]# systemctl daemon-reload

[root@k8s-master ~]# systemctl restart docker

部署docker-compose

[root@harbor ~]# mv docker-compose /usr/local/bin/

[root@harbor ~]# chmod +x /usr/local/bin/docker-compose

部署harbor

Harbor 私有仓库程序,采用 docker-compose 方式部署,不同的功能和应用处于不同的容器,这样带来了很好的兼容性,可在众多支持 Docker 的系统上运行 Harbor。

[root@harbor ~]# tar xf harbor-offline-installer-v2.0.0.tgz -C /usr/local/

Harbor 的配置文件是/usr/local/harbor/harbor.yml 文件,默认的 hostname 要修改为Harbor 虚拟机节点的 IP 地址。

[root@harbor ~]# vim /usr/local/harbor/harbor.yml

  5 hostname: 192.168.100.134

13 #https:   //https 相关配置都注释掉,包括 https、port、certificate 和 private_key

 14   # https port for harbor, default is 443

 15   #port: 443

 16   # The path of cert and key files for nginx

 17   #certificate: /your/certificate/path

 18   #private_key: /your/private/key/path

启动harbor

[root@harbor ~]# cd /usr/local/harbor/

[root@harbor harbor]# sh install.sh

[root@harbor harbor]# docker-compose ps

Harbor 启动完成后,浏览器访问 http://192.168.100.134,打开 Harbor Web 页面

创建项目pgm,公开

修改所有主机docker启动脚本

[root@harbor ~]# vim /usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.100.134

[root@harbor ~]# scp /usr/lib/systemd/system/docker.service 192.168.100.131:/usr/lib/systemd/system/

[root@harbor ~]# scp /usr/lib/systemd/system/docker.service 192.168.100.132:/usr/lib/systemd/system/

[root@harbor ~]# scp /usr/lib/systemd/system/docker.service 192.168.100.133:/usr/lib/systemd/system/

所有主机重启docker服务

[root@harbor ~]# systemctl daemon-reload

[root@harbor ~]# systemctl restart docker

2、重启harbor,导入EFK镜像,打标签,上传镜像

[root@harbor ~]# sh install.sh

[root@harbor ~]# docker login -u admin -p Harbor12345 http://192.168.100.134

[root@harbor ~]# mkdir  /root/pgm  &&  cd  pgm

[root@harbor ~]# ls

docker load < grafana-4.2.0.tar

docker load < prometheus-v2.0.0.tar

docker  images

docker tag  67141fa03496

192.168.100.134/pgm/prom/prometheus:v2.0.0

docker tag 8c4ef64b4ad1

192.168.100.134/pgm/grafana/grafana:4.2.0

docker push

192.168.100.134/pgm/prom/prometheus:v2.0.0

docker push

192.168.100.134/pgm/grafana/grafana:4.2.0

仓库查看

修改prometheus.deploy.yml文件

如下:

apiVersion: apps/V1

kind: Deployment
metadata:
  labels :
    name: prometheus-deployment

  name: prometheus

  namespace: kube-system

spec:
  replicas: 1
  selector:
    matchLabels:

      app: prometheus
  template:
    metadata:
      labels:
        app: prometheus
    spec:
        containers :
        - image: 192.168.100.134/pgm/prom/prometheus:v2.0.0

        name: prometheus

        command:

修改grafana-deploy.yaml文件

如下:

apiVersion: apps/V1

kind: Deployment
metadata:
  labels :
    name: prometheus-deployment

  name: prometheus

  namespace: kube-system

spec:
  replicas: 1
  selector:
    matchLabels:

      app: prometheus
  template:
    metadata:
      labels:
        app: prometheus
    spec:
        containers :
        - image: 192.168.100.134/pgm/prom/prometheus:v2.0.0

        name: prometheus

        command:

kubectl create -f prometheus.deploy.yml

kubectl create -f grafana-deploy.yaml

创建成功!

kubectl get pods,svc -n kube-system

访问测试

192.168.100.131:30003   prometheus访问成功

192.168.100.131:32513    grafana访问成功

账户:admin

密码:admin

3)设置DataSource

输入如下:

Name:k8s-pgm    type:Prometheus

URL:http://10.109.234.127:9090

设置显示数据的模版

输入315并移除光标,等一会儿即可进入下一个页面

选择自己定义的数据源名称

至此已经利用Prometheus+Granfana监控了Kubernetes平台。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值