Docker持续集成与容器管理

1.DockerMaven插件

微服务部署有两种方法:

(1)手动部署

(1)手动部署
首先基于源码打包生成jar包(或war包),将jar包(或war包)上传至虚拟机并拷贝至JDK容器。
(2)通过Maven插件自动部署。
对于数量众多的微服务,手动部署无疑是非常麻烦的做法,并且容易出错。所以我们这里学习如何自动部署,这也是企业实际开发中经常使用的方法。

Maven插件自动部署步骤:

(1)修改宿主机的docker配置,让其可以远程访问

vi /lib/systemd/system/docker.service

其中ExecStart=后添加配置 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

修改后如下: 

原来的配置:

-H fd:// --containerd=/run/containerd/containerd.sock 

 改成以下:

-H tcp://0.0.0.0:1803 -H unix:///var/run/docker.sock

(2)刷新配置,重启服务 

// daemon-reload: 重新加载某个服务的配置文件,如果新安装了一个服务,归属于systemctl 管理,要是
// 新服务的服务程序配置文件生效,需重新加载
systemctl daemon‐reload
// 重启docker
systemctl restart docker
// docker重启后,私服停止,需要重启私服仓库
docker start registry

 (3)在工程pom.xml 增加docker plugin配置

<!--配置docker插件-->
    <build>
        <finalName>Benjamin-registry</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <!--docker的maven插件,官网 https://github.com/spotify/docker‐maven‐plugin-->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.13</version>

                <configuration>
                    <imageName>192.168.64.129:5000/${project.artifactId}:${project.version}</imageName>
                    <!--<imageName>192.168.64.129:5000/${project.build.finalName}:${project.version}</imageName>-->
                    <baseImage>openjdk:8</baseImage>
                    <entryPoint>["java", "-jar", "/java/jar/${project.build.finalName}.jar"]</entryPoint>
                    <resources>
                        <resource>
                            <!--读取资源到tartgetPath目录下面-->
                            <targetPath>/java/jar</targetPath>
                            <!--读取该目录下的所有文件-->
                            <directory>${project.build.directory}</directory>
                            <!--includes表示仅读取directory文件夹下includes中指定的文件或文件夹的内容-->
                            <include>${project.build.finalName}.jar</include>
                        </resource>

                    </resources>
                    <!--1803 docker端口 这个是自己配置的 /lib/systemd/system/docker.service-->
                    <dockerHost>http://192.168.64.129:1803</dockerHost>
                </configuration>
            </plugin>
        </plugins>
    </build>

配置好后在Terminal执行命令:

mvn docker:build -DpushImage

以上配置执行命令后会自动生成Dockerfile,注意pom配置的targetPath路径,同时会打成image上传到私服,私服需要启动,私服不启动报错上传不上去。

 用上传的image创建容器,进入容器查看

(4)进入宿主机,查看镜像 

输出如上内容,表示微服务已经做成镜像。

 浏览器访问私服地址:http://192.168.64.129:5000/v2/_catalog

(5)启动容器

 查看eureka是否启动成功

2.持续集成工具-Jenkins

2.1 什么是持续集成
持续集成 Continuous integration ,简称CI
  随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。尤其是近些年来,敏捷(Agile)在软件工程领域越来越红火,如何能再不断变化的需求中快速适应和保证软件的质量也显得尤其的重要。
  持续集成正是针对这一类问题的一种软件开发实践。它倡导团队开发成员必须经常集成他们的工作,甚至每天都可能发生多次集成。而每次的集成都是通过自动化的构建来验证,包括自动编译、发布和测试,从而尽快地发现集成错误,让团队能够更快的开发内聚的软件。
持续集成具有的特点:

  • 它是一个自动化的周期性的集成测试过程,从检出代码、编译构建、运行测试、结果记录、测试统计等都是自动完成的,无需人工干预;
  • 需要有专门的集成服务器来执行集成构建;
  • 需要有代码托管工具支持,我们下一小节将介绍Git以及可视化界面Gogs的使用持续集成的作用;
  • 保证团队开发人员提交代码的质量,减轻了软件发布时的压力;

 2.2 Jenkins简介

Jenkins,原名Hudson,2011年改为现在的名字,它是一个开源的实现持续集成的软件工具。
官方网站:

Jenkins官网icon-default.png?t=N7T8http://jenkins-ci.org/  Jenkins能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。

特点:

  • 易安装:仅仅一个 java -jar jenkins.war,从官网下载该文件后,直接运行,无需额外的安装,更无需安装数据库;
  • 易配置:提供友好的GUI配置界面;
  • 变更支持:Jenkins能从代码仓库(Subversion/CVS)中获取并产生代码更新列表并输出到编译输出信息中;
  • 支持永久链接:用户是通过web来访问Jenkins的,而这些web页面的链接地址都是永久链接地址,因此,你可以在各种文档中直接使用该链接;
  • 集成E-Mail/RSS/IM:当完成一次集成时,可通过这些工具实时告诉你集成结果(据我所知,构建一次集成需要花费一定时间,有了这个功能,你就可以在等待结果过程中,干别的事情);
  • JUnit/TestNG测试报告:也就是用以图表等形式提供详细的测试报表功能;
  • 支持分布式构建:Jenkins可以把集成构建等工作分发到多台计算机中完成;
  • 文件指纹信息:Jenkins会保存哪次集成构建产生了哪些jars文件,哪一次集成构建使用了哪个版本的jars文件等构建记录;
  • 支持第三方插件:使得 Jenkins 变得越来越强大

2.3 Jenkins安装
2.3.1 Jenkins安装与启动

(1)下载jenkins

wget https://pkg.jenkins.io/redhat/jenkins‐2.83‐1.1.noarch.rpm

或将jenkins-2.83-1.1.noarch.rpm上传至服务器
(2)安装jenkins

rpm -ivh jenkins-2.83-1.1.noarch.rpm

(3)配置jenkins

vi /etc/sysconfig/jenkins

可以修改用户和端口,我这里只修改端口,用户暂时不修改

 (4)启动服务

systemctl start jenkins

启动报错,jenkins版本jenkins-2.83-1.1.noarch,原因是没有安装适应的JDK版本或者是没有正确配置已安装的JDK路径,需要JDK8,centos是JDK11

访问页面报错错误如下:

java.lang.AssertionError: InstanceIdentity is missing its singleton 	at org.jenkinsci.main.modules.instance_identity.InstanceIdentity.get(InstanceIdentity.java:133) 	at org.jenkinsci.main.modules.instance_identity.InstanceIdentityRSAProvider.getKe

卸载jenkins安装更高版本的jenkins-2.389-1.1.noarch:
清华大学开源软件镜像站Index of /jenkins/redhat/ | 清华大学开源软件镜像站,致力于为国内和校内用户提供高质量的开源软件镜像、Linux 镜像源服务,帮助用户更方便地获取开源软件。本镜像站由清华大学 TUNA 协会负责运行维护。icon-default.png?t=N7T8https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/

修改jenkins配置文件

vi /etc/init.d/jenkins

 重新加载配置,并且启动

systemctl daemon-reload
systemctl start jenkins

jenkins-2.389-1.1.noarch版本使用服务方式启动不起来?为什么? 

[root@192 bin]# systemctl status jenkins.service
● jenkins.service - Jenkins Continuous Integration Server
   Loaded: loaded (/usr/lib/systemd/system/jenkins.service; disabled; vendor preset: disabled)
   Active: failed (Result: start-limit) since Sat 2024-01-27 00:10:38 CST; 13s ago
  Process: 89668 ExecStart=/usr/bin/jenkins (code=exited, status=1/FAILURE)
 Main PID: 89668 (code=exited, status=1/FAILURE)

Jan 27 00:10:38 192.168.64.129 systemd[1]: jenkins.service: main process exited, code=exited, status=1/FAILURE
Jan 27 00:10:38 192.168.64.129 systemd[1]: Failed to start Jenkins Continuous Integration Server.
Jan 27 00:10:38 192.168.64.129 systemd[1]: Unit jenkins.service entered failed state.
Jan 27 00:10:38 192.168.64.129 systemd[1]: jenkins.service failed.
Jan 27 00:10:38 192.168.64.129 systemd[1]: jenkins.service holdoff time over, scheduling restart.
Jan 27 00:10:38 192.168.64.129 systemd[1]: Stopped Jenkins Continuous Integration Server.
Jan 27 00:10:38 192.168.64.129 systemd[1]: start request repeated too quickly for jenkins.service
Jan 27 00:10:38 192.168.64.129 systemd[1]: Failed to start Jenkins Continuous Integration Server.
Jan 27 00:10:38 192.168.64.129 systemd[1]: Unit jenkins.service entered failed state.
Jan 27 00:10:38 192.168.64.129 systemd[1]: jenkins.service failed.

登录Jenkins:

 /var/lib/jenkins/secrets/initialAdminPassword里面的初始密码查出来

安装推荐插件:

插件安装完成后创建用户:

完成安装进入主页面:

卸载jenkins

第一种:

1、卸载yum方式安装的jenkins(默认安装主目录是在/var/lib/jenkins/)

service jenkins stop
yum -y remove jenkins

 第二种:

1、卸载rpm方式安装的jenkins

rpm -e jenkins

2、检查是否卸载成功

rpm -ql jenkins

 3、彻底删除残留文件

find / -iname jenkins | xargs -n 1000 rm -rf

2.4 Jenkins插件安装

系统管理

 插件管理

可选插件 

 直接安装

安装完成,在已安装插件,可以看到

2.5 全局工具配置

2.5.1 安装Maven与本地仓库

(1)将Maven下载的压缩包上传至服务器(虚拟机)
maven官网icon-default.png?t=N7T8https://maven.apache.org/download.cgi

(2)解压

tar -zxvf apache-maven-3.9.6-bin.tar.gz -C ./

(3)重命名

mv  apache-maven-3.9.6 maven

(4)创建仓库目录

mkdir repositry


(5)修改maven配置文件settings.xml,配置本地仓库的路径

<!--本地仓库路径-->
<localRepository>/usr/local/middleware/maven/repository</localRepository>

(6)将开发环境的本地仓库上传至服务器(虚拟机)并移动到/usr/local/repository

省略.....自己移动各自的本地仓库。

执行此步是为了以后在打包的时候不必重新下载,缩短打包的时间

2.5.2 全局工具配置

选择系统管理,全局工具配置

 (1)JDK配置

设置已有的JDK路径

(2)maven配置

配置已有的maven路径

(3)git配置

git安装blog

git安装icon-default.png?t=N7T8https://blog.csdn.net/m0_48983233/article/details/136751926?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22136751926%22%2C%22source%22%3A%22m0_48983233%22%7D2.6 代码上传至Git服务器

2.6.1 Gogs搭建与配置

Gogs 是一款极易搭建的自助 Git 服务。

Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 Go 语言支持的 所有平台,包括 Linux、Mac OS X、Windows 以及 ARM 平台。

gogs官网icon-default.png?t=N7T8https://gogs.io/(1)下载镜像

docker pull gogs/gogs

(2)创建容器

docker run ‐di ‐‐name=gogs ‐p 10022:22 ‐p 3000:3000 ‐v /var/gogsdata:/data gogs/gogs

(3)http://192.168.64.129:3000/登录gogs,配置数据库,我选择sqlite并且把localhost改成当前主机ip地址

(4)注册用户

我已经注册好啦,根据操作注册即可。

(5)登录

 (6)创建仓库

 2.6.2 提交代码

(1)在本地安装git(window版本)

git官网icon-default.png?t=N7T8https://git-scm.com/download/win(2)在idea setting中配置git

(2)创建一个本地仓库

 (3)右击找到git,从工作区添加到暂存区

(4)从暂存区提交到本地仓库

(5)从本地仓库推送到远程仓库

点击Define remote 输入远程仓库地址,然后点击Push即可。

2.7 任务的创建与执行

(1)点击新建

 输入任务名称,选择构建Maven项目

 配置git仓库,录入用户密码,这里配置git的时候就出现了问题,无法识别到git,就安装依赖包,重新编译安装,重新安装后就可以啦。

linux 安装giticon-default.png?t=N7T8https://blog.csdn.net/m0_48983233/article/details/136751926

配置编译相关的命令 

 看着配置好了,我就立马构建,结果还是出错了。

HK2 service reification failed for [org.glassfish.jersey.message.internal.DataSourceProvider] with an exception: MultiException stack 1 of 2 java.lang.NoClassDefFoundError: javax/activation/DataSourc
Get "https://registry-1.docker.io/v2/": EOF

// 因为我的jdk版本是jdk11才会出现这个问题,可能jdk8不会遇到这个问题,见招拆招
// 参考:https://blog.csdn.net/qq_44575789/article/details/120328090
<dependencies>
	<dependency>
		<groupId>javax.activation</groupId>
		<artifactId>activation</artifactId>
		<version>1.1.1</version>
	</dependency>
</dependencies>

 重新构建

 docker镜像里面也有:

总结:就是jenkins其实就是将远程仓库的代码进行构建形成镜像,推送到镜像私服,其实还是需要依靠pom文件里面设置的docker配置信息,否则jenkins和docker之间没有纽带。否则会报如下错误信息:

3 容器管理工具Rancher 

3.1 什么是Rancher

  Rancher是一个开源的企业级全栈化容器部署及管理平台。Rancher为容器提供一揽子基础架构服务:CNI兼容的网络服务、存储服务、主机管理、负载均衡、防护墙……Rancher让上述服务跨越公有云、私有云、虚拟机、物理机环境运行,真正实现一键式应用部署和管理。

3.2 Rancher安装

(1)下载Rancher 镜像

docker pull rancher/server

(2)创建Rancher容器

docker run -id --name=rancher -p 16666:8080 rancher/server:latest

(3)浏览器访问Rancher:http://192.168.64.129:16666

(4)切换简体中文

3.3 Rancher初始化 

3.3.1 添加环境

(1)选择“Default -->环境管理” 菜单

(2)填写名称,点击“创建”按钮

(3)添加dev、prod、test三个环境 

(4)切换环境

(5)删除环境

先停用环境

 再删除环境

 3.3.2 添加主机

(1)选择基础架构-->主机 菜单,点击添加主机,并且保存

(2)拷贝脚本

运行,这一步感觉是将主机Dokcer与Rancher建立连接 

 

3.3.3 添加应用(项目)

点击应用-->全部(或用户) ,点击“添加应用”按钮


 

3.4 应用部署

3.4.1 MySQL部署

拉取mysql镜像:

docker pull centos/mysql-57-centos7

上述操作相当于命令:

docker run ‐di ‐‐name mysql ‐p 3306:3306 ‐e MYSQL_ROOT_PASSWORD=123456 centos/mysql‐57‐centos7

3.4.2 RabbitMQ部署

docker中没有镜像,会自动拉取镜像。 

映射端口5671、5672、15671、25672、4369

重启报错:

Job for docker.service failed because the control process exited with error code

 解决办法清除docker缓存:

参考:

docker启动时出现Job for docker.service failed because the control process exited with error code错误-CSDN博客文章浏览阅读6.3w次,点赞9次,收藏43次。问题分析以太坊环境需要用到docker,然后很多时间虚拟机没有设置docker自启动,因此在重启docker的时候,常常出现:Job for docker.service failed because the control process exited with error code. See “systemctl status docker.service” and “journalctl..._job for docker.service failed because the control process exited with errorhttps://blog.csdn.net/qq_36651243/article/details/88639999

cd /var/lib/docker
// 全部删除
rm -fr *

查看容器: 

3.4.3 Redis部署

 进入应用,点击添加服务,名称redis ,镜像redis ,端口映射6379

创建后使用客户端测试链接

redis-cli -h <服务器IP或主机名> -p <端口> -a <密码>


测试成功连接。

3.4.4 微服务部署

(1)搭建私有仓库

启动私有仓库容器

docker run -id --name=registry -p 5000:5000 registry:latest

打开浏览器 输入地址http://192.168.64.129:5000/v2/_catalog看到 {"repositories":[]} 表示私有仓库搭建成功并且内容为空。

 修改daemon.json

vim /etc/docker/daemon.json

添加以下内容,保存退出。

"insecure-registries":["192.168.64.129:5000"]

{
"registry-mirrors": ["https://pee6w651.mirror.aliyuncs.com"],
"insecure-registries":["192.168.64.129:5000"],
"dns": ["8.8.8.8","8.8.4.4"]
}

(2)修改docker配置,允许远程访问

vim /lib/systemd/system/docker.service

 其中ExecStart=后添加配置 ‐H tcp://0.0.0.0:2375 ‐H unix:///var/run/docker.sock修改后刷新配置,刷新服务

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:1803 -H unix:///var/run/docker.sock

systemctl daemon‐reload
systemctl restart docker
docker start registry

(3)修改微服务工程,添加DockerMaven插件

<!--配置docker插件-->
<build>
	<finalName>git-test</finalName>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>

		<!--docker的maven插件,官网 https://github.com/spotify/docker‐maven‐plugin-->
		<plugin>
			<groupId>com.spotify</groupId>
			<artifactId>docker-maven-plugin</artifactId>
			<version>0.4.13</version>

			<configuration>
				<imageName>192.168.64.129:5000/${project.artifactId}:${project.version}</imageName>
				<!--<imageName>192.168.64.129:5000/${project.build.finalName}:${project.version}</imageName>-->
				<baseImage>openjdk:8</baseImage>
				<!--<baseImage>java-1.8.0-openjdk.x86_64</baseImage>-->
				<entryPoint>["java", "-jar", "/java/jar/${project.build.finalName}.jar"]</entryPoint>
				<resources>
					<resource>
						<!--读取资源到tartgetPath目录下面-->
						<targetPath>/java/jar</targetPath>
						<!--读取该目录下的所有文件-->
						<directory>${project.build.directory}</directory>
						<!--includes表示仅读取directory文件夹下includes中指定的文件或文件夹的内容-->
						<include>${project.build.finalName}.jar</include>
					</resource>

				</resources>
				<!--1803 docker端口 这个是自己配置的 /lib/systemd/system/docker.service-->
				<dockerHost>http://192.168.64.129:1803</dockerHost>
			</configuration>
		</plugin>
	</plugins>
</build>

(4)连接mysql数据库,执行建库脚本(有就建库没有忽略)

(5)添加git-test服务

测试服务是否启动成功,通过telnet测试的:

3.6 扩容与缩容

3.6.1 扩容

(1) 先删除刚刚创建的spirngboot服务容器

 (2)以git-test服务为例,重新构建容器,注意,不映射端口

(3)在选择菜单API -->WebHooks ,点击“添加接收器”按钮 

 

 复制链接post方式调用,每次调用都会增加一个容器

 点击容器可以看到有3个在运行,三个不同的ip地址的容器在运行。

3.6.2 缩容

操作选择缩容,进行创建

复制地址,进行post调用,每次调用容器就删除一个

3.6.3 负载均衡器

1.刚刚扩容的容器无法直接访问,我们可以通过服务注册到eureka中,通过服务名字进行负载均衡访问服务。

2.通过Rancher构建负载均衡器

添加端口,选择服务

 telnet测试的:

4 influxDB

4.1 什么是influxDB

influxDB是一个分布式时间序列数据库。cAdvisor仅仅显示实时信息,但是不存储监视数据。因此,我们需要提供时序数据库用于存储cAdvisor组件所提供的监控信息,以便显示除实时信息之外的时序数据。

4.2 influxDB安装

(1)下载镜像

docker search tutum/influxdb

(2)创建容器

docker run -id --name=influxsrv -p 8083:8083 -p 8086:8086 --expose 8090 --expose 8099 tutum/influxdb:latest

端口概述:

8083端口:web访问端口

8086:数据写入端口

访问:http://192.168.64.129:8083/

 4.3 influxDB常用操作

4.3.1 创建数据库

CREATE DATABASE "cadvisor"

通过快捷sql脚本创建库

查看数据库:

SHOW DATABASES

4.3.2 创建用户并授权

创建用户

CREATE USER "cadvisor" with PASSWORD "cadvisor" WITH ALL PRIVILEGES

查看用户:

show users

 用户授权:

grant all privileges on cadvisor to cadvisor

grant write on cadvisor to cadvisor

grant read on cadvisor to cadvisor

4.3.3 查看采集的数据

show measurements

现在我们还没有数据,如果想采集系统的数据,我们需要使用Cadvisor软件来实现。

5 cAdvisor

5.1 什么是cAdvisor

Google开源的用于监控基础设施应用的工具,它是一个强大的监控工具,不需要任何配置就可以通过运行在Docker主机上的容器来监控Docker容器,而且可以监控Docker主机。更多详细操作和配置选项可以查看Github上的cAdvisor项目文档

5.2 cAdvisor安装

(1)下载镜像

docker pull google/cadvisor

(2)创建容器

docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 --detach=true --link influxsrv:influxsrv --name=cadvisor google/cadvisor -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086

-storage_driver=influxdb:存储的驱动
-storage_driver_db=cadvisor:influxdb库名称
-storage_driver_host=influxsrv:8086:influxsrv是上面创建的influxdb的容器名称

cadvisor web界面:http://192.168.64.129:8080/containers/ ,打开后界面需要等一会才出来。

整体使用情况:

CPU使用情况:

内存使用情况:

 网络使用情况:

文件和容器使用情况:

 cadvisor将数据存储到influxdb里面

查看具体表数据:

6 Grafana

6.1 什么是Grafana

Grafana是一个可视化面板(Dashboard),有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器。支持Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB作为数据源。
Grafana主要特性:灵活丰富的图形化选项;可以混合多种风格;支持白天和夜间模式;多个数据源。

6.2 Grafana安装

(1)下载镜像

docker pull grafana/grafana

(2)创建容器

docker run -d -p 3001:3000 -e INFLUXDB_HOST=influxsrv -e INFLUXDB_PORT=8086 -e INFLUXDB_NAME=cadvisor -e INFLUXDB_USER=cadvisor -e INFLUXDB_PASS=cadvisor --link influxsrv:influxsrv --name grafana grafana/grafana

INFLUXDB_HOST=influxsrv :指定容器
INFLUXDB_PORT=8086:指定端口,influxdb8086端口用来写数据
INFLUXDB_NAME=cadvisor:指定库名称
INFLUXDB_USER=cadvisor:用户名 

(3)访问

访问:http://192.168.64.129:3001/login,默认登录用户密码 admin:admin

登录后修改默认密码

6.3 Grafana的使用

(1)点击设置,DataSource 

点击添加数据源,支持很多

 

选择influxDB分布式数据库,自己配置用户密码库名字

 6.3.2 添加仪表盘

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值