如何使用GitLab和Rancher构建CI/CD流水线

介绍

GitLab核心是集成管理Git存储库的工具。比如你希望创建一个提供服务的平台,那么GitLab将提供强大的身份验证和授权机制、工作组、问题跟踪、wiki和片段,除此之外还有公有、内部和私有存储库。

GitLab强大之处在于,它包含强大的持续集成(CI)引擎和Docker容器镜像仓库,让使用者从开发到发布都使用相同的实用工具。它还有两个更强大的开源软件实用工具:Prometheus负责监控,Mattermost负责和团队沟通。该平台有着坚实的API并能和多个现有第三方系统集成,如:JIRA,Bugzilla,Pivotal,Slack,HipChat,Bamboo等。

这里就有这样一个疑问:为什么使用GitLab而不是直接使用SaaS 服务?答案只是个人品味而已。对大多数人来说,向SaaS提供商购买其提供的服务是一个很好的解决方案。你可以专注于搭建你的应用程序,让他们去操心维护这些工具。而如果你已拥有的基础设施有备用容量怎么办?如果你只想私有化存储库而不想为该权限付费时该怎么办?如果你想运用你的数学头脑由自己托管来省钱该怎么办?如果你只想拥有你自己的数据该怎么办?

由内部提供服务可以让你有更多的时间管理它们并让它们之间相互通信来消除风险,这就是GitLab的出众之处。仅需要一次点击和几分钟的配置,你就可以启动并运行一个完整的解决方案。

部署GitLab

Rancer的Catalog包含了安装最新版GitLab CE的条目。它假设你有一个主机,希望为HTTP/HTTPS直接打开80和443端口,并且打开一个端口映射到容器内的22端口。

Catalog条目会根据你提供的值设置环境变量GITLAB_OMNIBUS_CONFIG。然后GitLab在发布时将这些值并入配置。对于非常基本的GitLab部署,Catalog提供的选择是完全足够的,不过我仍希望向你展示更多的内容…

在本教程中,我们将部署GitLab CE,不过我们不会打开任何端口。主机端口非常昂贵,因此稍后我们会使用一个负载均衡器。我们将配置HTTPS和Docker Registry,并将其与Rancher配合使用。

  1. 创建一个名为gitlab的新应用
  2. 向gitlab应用添加一个服务 
    • Image: gitlab/gitlab-ce:latest
    • Volumes: 
      gitlab-etc:/etc/gitlab 
      gitlab-opt:/var/opt/gitlab 
      gitlab-log:/var/log/gitlab
    • Networking 
      Set a specific host name: git
    • Health Check 
      HTTP: Port 80 
      Path: GET /HTTP/1.0
  3. 向postfix服务中添加一个配对 
    • Image: tozd/postfix
    • Environment: 
      MY_NETWORKS:10.42.0.0/16, 127.0.0.0/8 
      ROOT_ALIAS: you@yourdomain.com
    • Volumes: 
      postfix-log:/var/log/postfix 
      postfix-spool:/var/spool/postfix
    • Health Check: 
      TCP: Port 25

运行之前,你还需完成几个选项来配置GitLab:

  1. 将所有的GitLab变量添加到GITLAB_OMNIBUS_CONFIG
  2. 稍后设置所有变量

对于首次使用的用户来说,我建议选择第二项。GitLab提供的gitlab.rb文件在默认设置下文档已经很丰富,如果你之前没有接触过GitLab,参考这份文件就可以得到大量功能的说明介绍。

接着,单击Launch键,Rancher将抓取镜像并呈现给你。

设置SSL卸载

Rancher在抓取镜像的时候,我们来用HTTPS添加一个负载均衡器。为此,我们首先要创建一个LetsEncrypt容器,然后将其添加到负载均衡器中,等待证书注册。注册完成后,将GitLab的配置添加到负载均衡器上。

在这个例子中,我将使用域名“example.com”,GitLab的主机名设置为“git”,Docker Registry的主机名设置为“regitstry”。在执行下一步前需确保你已经将相应的记录添加到DNS区域文件中,且这些记录均指向运行均衡器的主机。

部署LetsEncrypt

  1. 从Rancher社区Catalog中,选择LetsEncrypt服务。接受第一个下拉列表中的TOS,然后按以下设置准备HTTP验证: 
    • 你的Email地址: you@yourdomain.com
    • 证书名: gitlab
    • 域名:git.example.com,registry.example.com
    • 域验证方法: HTTP
  2. 单击Launch以发布容器。现在开始你有120秒来完成下一步。

部署负载均衡器

  1. 在gitlab栈中,单击“添加服务”旁边的下拉菜单,然后选择添加负载均衡器。给它取个名字,接着添加下面的服务选择器。另外,如果你已经有了一个负载均衡器的环境,编辑它,添加下面的服务。 
    • Public / HTTP
    • Port: 80
    • Path: /.well-known/acme-challenge
    • Target: letsencrypt
    • Port: 80
  2. 单击“编辑”保存你所做的变更。

监控LetsEncryt容器的日志,两分钟后,就可以获得它已经注册了两个域的证书的报告。如果你收到状态403或503的错误报告,那么需要检查负载均衡器配置,确认设置无误。LetsEncrypt容器将重新启动并继续尝试注册证书。注册成功后,你就可以在Rancher界面中的基础设施选项卡中找到该证书。

到这为止我们已经准备好通过负载均衡器向GitLab添加SSL支持:

  1. 编辑负载均衡器
  2. 添加以下服务规则: 
    • Public / HTTP 
      Host: git.example.com 
      Port: 80 
      Target: gitlab 
      Port: 80
    • Public / HTTPS 
      Host: git.example.com 
      Port: 443 
      Target: gitlab 
      Port: 80
    • Public / HTTPS 
      Host: registry.example.com 
      Port: 443 
      Target: gitlab 
      Port: 80
    • Public / TCP 
      Port: 2222 
      Target: gitlab 
      Port: 22
  3. 单击“编辑”保存你所做的更改。

配置GitLab

GitLab的配置保存在容器中的/etc/gitlab/gitlab.rb下。当我们启动服务时,我们创建了一个Docker卷用于持久化存储这些数据。在Rancher中,找到你的GitLab容器,使用Execute Shell登录。将存储地址改为/etc/gitlab,然后编辑gitlab.rb。

在gitlab.rb中有很多变量可以调整GitLab的行为。这里每一个部分都包含了一个指向GitLab文档的链接,文档描述了该服务的功能以及每个变量的调整。

在本教程中,需要找到以下变量,更改或者取消它们的注释:

external_url ‘https://git.example.com’
gitlab_rails['gitlab_ssh_host'] = 'git.example.com’
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = 'git@example.com'
gitlab_rails['gitlab_email_display_name'] = 'Gitlab'
gitlab_rails['gitlab_email_reply_to'] = 'noreply@example.com'
gitlab_rails['gravatar_plain_url'] = 'https://secure.gravatar.com/avatar/%{hash}?s=%{size}&d=identicon'
gitlab_rails['gravatar_ssl_url'] = 'https://secure.gravatar.com/avatar/%{hash}?s=%{size}&d=identicon'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = 'postfix'
gitlab_rails['smtp_port'] = 25
gitlab_rails['smtp_domain'] = 'yourdomain.com'
gitlab_rails['smtp_authentication'] = false
gitlab_rails['smtp_enable_starttls_auto'] = false
gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = '/var/opt/gitlab/backups'
gitlab_rails['backup_archive_permissions'] = 0644
gitlab_rails['backup_pg_schema'] = 'public'
gitlab_rails['backup_keep_time'] = 604800
registry_external_url 'https://registry.example.com’
gitlab_rails['registry_enabled'] = true
gitlab_rails['registry_host'] = 'registry.example.com'
gitlab_rails['registry_api_url'] = 'http://localhost:5000'
gitlab_rails['registry_key_path'] = '/var/opt/gitlab/gitlab-rails/certificate.key'
gitlab_rails['registry_path'] = '/var/opt/gitlab/gitlab-rails/shared/registry'
gitlab_rails['registry_issuer'] = 'omnibus-gitlab-issuer'
registry['enable'] = true
registry['token_realm'] = 'https://git.example.com'
nginx['listen_port'] = 80
nginx['listen_https'] = false
nginx['proxy_set_headers'] = {
 'Host' => '$http_host_with_default',
 'X-Real-IP' => '$remote_addr',
 'X-Forwarded-For' => '$proxy_add_x_forwarded_for',
 'X-Forwarded-Proto' => 'https',
 'X-Forwarded-Ssl' => 'on',
 'Upgrade' => '$http_upgrade',
 'Connection' => '$connection_upgrade'
}
registry_nginx['enable'] = true
registry_nginx['listen_port'] = 80
registry_nginx['listen_https'] = false
registry_nginx['proxy_set_headers'] = {
 'Host' => '$http_host',
 'X-Real-IP' => '$remote_addr',
 'X-Forwarded-For' => '$proxy_add_x_forwarded_for',
 'X-Forwarded-Proto' => 'https',
 'X-Forwarded-Ssl' => 'on'
}
registry_nginx['custom_gitlab_server_config'] = 'proxy_cache_convert_head off;'
 
 
  • 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

在这些变量变更之后,意味着以下工作你已经完成了:

  1. 为你的Git URLs设置主机名
  2. 配置GitLab将HTTP反向到HTTPS
  3. 启用HTTP和HTTPS两者的HTTPS gravatar URLs(在避免内容混合的错误时是必要的)
  4. 将报告的SSH端口设为2222
  5. 激活来自GitLab的邮件
  6. 通过Postfix助手启动邮件传递
  7. 激活一个星期保留期的夜间备份
  8. 启用容器registry
  9. 激活GitLab的配置和必需的标题,让GitLab知道它是在SSL负载均衡器之后

保存此文件,接着输入gitlab-ctl reconfigure,按Enter键重新配置GitLab。GitLab将重建它的配置,重启那些需要的服务。

登录

现在你已经准备好了!在你的浏览器中输入https://git.example.com,会出现一个要求你输入密码的界面。这里默认用户是root,如果你设置了密码,系统将要求你重新登录。

恭喜你!你有了一个正在运行的GitLab实例!

现在还有一些需要我们从GitLab内部做的工作来巩固它,请你接着读下去。

锁定它

我建议你去做以下变更操作:

更改root用户名

以root身份登录任何内容都是不安全的,因为该用户名是一个众所周知的目标。现在你是以唯一的用户身份登录进来的,那么第一件事就是更改你的用户名。

  1. 点击位于右上角、在搜索栏旁边的扳手图标
  2. 在中间列的底部选择管理员
  3. 选择右上角的编辑按钮
  4. 更改你的名字、用户名和邮箱地址
  5. 向下滚动并单击“保存更改”

管理员账户的旧邮箱地址是admin@example.com,更改此信息只是尝试向该账户发送电子邮件来通知这些更改。我敢相信example.com邮箱的人会吃惊于他们收到的电子邮件数。

  1. 返回Rancher,找到你的postfix容器和Execute Shell
  2. 输入mailq,按下Enter键。你应该看到延迟的邮件在队列中,注意ID
  3. 输入postsuper –d,按下Enter键,将从队列中删除该消息。

禁止公开注册

下一步的更改将使Internet不再接管你的新GitLab实例,也不能再将其用于恶意的目的。

  1. 再次点击扳手图像,返回到管理控制台
  2. 点击右上角齿轮图标的下拉菜单,选择设置
  3. 你可以根据需要调整其中任意一项,但你需要禁用在Sign-up Restrictions下的Sign-up enabled默认值

检查你的端口

在这个例子中,我们使用了80、443、2222端口。GitLab不需要主机上的其他端口,不过2222端口并不是通用端口。你需要确认你已经在防火墙中打开了它(2222端口)。

这会有一个很棒的GitLab安装过程。你可以立即为你的项目启动它。是的,在GitLab中还有很多事情要做!

添加你的SSH密钥

尽管你可以通过HTTPS使用GitLab,然而使用SSH指令执行则更为常见。在执行此操作之前,需要将你的SSH公钥添加到GitLab,这样它会识别你的身份。如果你没有SSH密钥,你可以用下列代码制作一个(Linux或Mac系统上):

ssh-keygen -b 2048
 
 
  • 1

尽可能使用密码口令确保安全——你的密钥有以特权用户身份登录的权限,如果笔记本电脑遭到入侵,你也不愿为攻击者提供访问级别。(如果你不想使用密码口令或处理SSH代理,请访问https://krypt.co上优秀的Kryptonite项目)

使用默认值(或选择新的密钥名称)保存,接着在GitLab中:

  1. 点击右上角的头像旁边的下拉菜单,选择设置,然后选择SSH密钥
  2. 将你的公钥(.pub文件中的内容)粘贴到打开页面的框中

很快我们将发布该系列的第二部分,其中将介绍如何使用GitLab CI Multi-Runner构建容器,以及如何使用GitLab容器registry配置项目。除此之外,我们还将涉及如何用GitLab CI建立容器并部署到Rancher上。

这是我们使用GitLab和Rancher构建CI/CD流水线系列教程的第二部分。第一部分的内容介绍了如何部署、配置和确保GitLab在Rancher的运行。这一部分中,我们将介绍如何使用GitLab CI Multi-Runner构建容器,以及如何使用GitLab容器registry配置项目。除此之外,我们还将涉及如何用GitLab CI建立容器并部署到Rancher上。

使用GitLab CI Multi-Runner构建容器

GitLab CI是用于持续集成和持续交付的强大工具。它需要和Rancher配合使用,这里我们将部署一个执行作业的runner。

运行Runner

部署runner有好几种方式,不过考虑到我们的目的是要从自己的存储库中建立容器,我们将运行一个可以直接访问/var/run/docker.sock的Docker容器,来构建和自身同步的镜像。

  1. 在Rancher中,向你的Gitlab栈添加一个服务。
  2. 使用以下配置进行设置: 
    • Name: runner01
    • Image: gitlab/gitlab-runner
    • Console: None
    • Volumes: 
      /var/run/docker.sock:/var/run/docker.sock 
      runner01-etc:/etc/gitlab-runner

容器运行时,它将在/etc/gitlab-runner中创建一个默认配置,该配置对应我们已经建立连接的卷。接下来,用你的Gitlab实例注册runner。

下面操作中,我设置的配置适用于基本的runner,它可以搭建任意作业。你还可以将runner限制在指定的存储库中或是使用其他的镜像。这里你可以阅读GitLab的文档来了解是最适合你的环境的选项。

配置Runner

  1. 在容器中执行shell
  2. 运行gitlab-ci-multi-runner register开始注册
  3. 按照提示信息输入,参考下列示例(答案是粗体字)

root@4bd974b1c799:/# gitlab-ci-multi-runner register 
Running in system-mode. 
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/): 
https://git.example.com 
Please enter the gitlab-ci token for this runner: 
DGQ-J7n0tR33LXB3z_ 
Please enter the gitlab-ci description for this runner: 
4bd974b1c799]: runner01 
Please enter the gitlab-ci tags for this runner (comma separated): 
< press enter> 
Whether to lock Runner to current project [true/false]: 
[false]: < press enter> 
Registering runner… succeeded runner=DGQ-J7dD 
Please enter the executor: docker, parallels, ssh, docker-ssh+machine, kubernetes, docker-ssh, shell, virtualbox, docker+machine: 
docker 
Please enter the default Docker image (e.g. ruby:2.1): 
docker:stable 
Runner registered successfully.

放手去执行它们吧,如果runner已经运行,那么配置会自动地就重新加载。这里要着重注意的是:

  • 输入你的Gitlab实例的URL
  • 输入runner令牌(在Admin / Runners中找到)
  • 给runner起一个可被识别的名字
  • 选择runner的docker类型
  • 选择docker:stable容器镜像

在初始的注册完成后,我们需要编辑/etc/gitlab-runner/config.tom并作出调整:

  • volumes = [“/var/run/docker.sock:/var/run/docker.sock”, “/cache”]

这样在容器中装载/var/run/docker.sock,使得构建的容器保存在主机本身的镜像存储中。这是一个比Docker更好的方法。

config.toml的修改是由Runner自动执行的,因此无需重新启动。

你可以在Admin/Runners下看到你的runner并与之交互。

使用容器镜像仓库配置项目

GitLab的容器镜像仓库直接和存储库绑定,因此无法将容器转移到任何其他位置。如果你在docker组中有一个名为demo-pho的存储库,那么镜像的路径就是registry.example.com/docker/demo-php ,其中的标签是根据你如何用GitLab CI创建容器而定义的。

在本教程的余下部分,我将使用一个存储库,该存储库的内容可以在github中找到。需要执行以下内容才能在你的GitLab环境中启动它:

  1. 在GitLab中创建一个项目。在本教程中,我给它命名为example/demo(工作组是example,项目是demo)
  2. 克隆并修改rancher-gitlab-demo存储库
$ git clone https://github.com/oskapt/rancher-gitlab-demo.git demo
$ cd demo
$ git remote set-url origin ssh://git@git.example.com:2222/example/demo.git
$ git push -u origin master
 
 
  • 1
  • 2
  • 3
  • 4

该文件如下所示:

variables:
 REGISTRY_HOST: registry.example.com
 TEST_IMAGE: $REGISTRY_HOST/$CI_PROJECT_PATH:$CI_BUILD_REF_NAME
 RELEASE_IMAGE: $REGISTRY_HOST/$CI_PROJECT_PATH:latest

stages:
 - build
 - release

before_script:
 - docker info
 - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $REGISTRY_HOST

build:
 stage: build
 script:
   - docker build --pull -t $TEST_IMAGE .
   - docker push $TEST_IMAGE

release:
 stage: release
 script:
   - docker pull $TEST_IMAGE
   - docker tag $TEST_IMAGE $RELEASE_IMAGE
   - docker push $RELEASE_IMAGE
 only:
   - master

push_to_docker_hub:
 # in order for this to work you will need to set
 # `HUB_USERNAME` and `HUB_PASSWORD` as CI variables
 # in the Gitlab project
 stage: release
 variables:
   DOCKER_IMAGE: $HUB_USERNAME/$CI_PROJECT_NAME:latest
 script:
   - docker login -u $HUB_USERNAME -p $HUB_PASSWORD
   - docker tag $RELEASE_IMAGE $DOCKER_IMAGE
   - docker push $DOCKER_IMAGE
 only:
   - master
 when: manual
 
 
  • 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

我设计的这个CI文件可以在多个基本的Docker项目中使用而无需任何修改。在将变量部分的项目设置为你想要的数值后,文件的其余部分就能适用于任何项目。

这里有两个阶段——构建和发布。GitLab有自己的token,可令自己登录到自己的镜像仓库,该操作在before_script部分执行。接下来它在构建阶段执行脚本命令,构建容器并使用TEST_IMAGE变量中指定的格式标记容器。这样获得一个有分支名称的容器,就像我们的develop分支这样:

registry.example.com/example/demo:develop
 
 
  • 1

接下来会推送容器信息进镜像仓库中。

如果是master分支,它会执行所有这些步骤,并且在发布阶段,它在加进镜像仓库前会继续使用latest标记镜像。这样你会得到一个同时标记了master和lastest的容器。其中lastest是默认的标签名,你可以在不指定标签名的情况下获取它。

最后,master分支有一个可供使用的手动选项,可将容器推送至Docker Hub。若要实现这一步,首先需要在GitLab项目中的Settings | CI/CD Pipelines | Secret Variables下设置HUB_USERNAME和HUB_PASSWORD。GitLab CI将根据DOCKER_IMAGE的值重新标记master镜像,接着将其推送至Docker Hub。因为我们已经指定了when下的manual,GitLab不会自动执行,那么就必须从GitLab手动执行此阶段。

通过GitLab CI搭建容器

在develop分支,你可以提交这些更改并将其推送到你的GitLab项目。如果一切都正常运行,你就可以在项目的pipelines标签下看到pipeline启动。你可以选择status图标来查看该阶段下的详细进度日志。

如果出现了任何错误,GitLab CI将报告pipeline失败,你可以查看日志了解原因。当解决了问题并推送新的提交时,GitLab CI将启动新的pipeline。如果错误是暂时的(如无法连接到Docker Hub),你可以再次运行该阶段的pipeline。

如果只想从现有的代码运行pipeline,你可以单击Run Pipeline并选择要构建的分支。

当一切都完成之后,管道会显示Passed,你可以在GitLab项目的Registry标签下看到你的容器。

创建部署用户

在使用镜像仓库之前,你需要将部署用户添加到Rancher。我建议你在你想要部署的项目上创建一个具有Reporter权限的deploy用户,而不要使用你的管理员账户。

  1. 单击右上角的扳手图标进入管理区域
  2. 单击中间列下端的New User按钮
  3. 创建一个名为deploy的用户
  4. 在Access下则说明该用户是External的。这将给用户提供GitLab中的限制访问。
  5. 单击Create User,进入汇总界面

GitLab默认会为用户发送登录电子邮件,因此我们需要编辑用户并设置密码。

  1. 在汇总界面上,单击右上角的Edit
  2. 为用户设置密码,接着单击Save Changes
  3. 在GitLab导航到你的项目,单击Settings后点击Members
  4. 在搜索栏键入deploy并选择deploy用户
  5. 给用户Reporter权限
  6. 点击Add to project保存更改

现在,deploy用户有权从你的项目的容器注册表访问容器。

部署容器到Rancher

我们到目前为止的所有步骤都是为了这一步——从你的私有镜像仓库中获取容器并将它部署到Rancher上。我们需要做的最后一件事是添加镜像仓库,然后做一个新的栈和服务。

  1. 在Rancher中,单击Infrastructure并选择Registries
  2. 单击Add Registry
  3. 选择Custom
  4. 输入你的注册表URl(例如example.com)
  5. 输入你的部署用户的用户名和密码
  6. 单机Create

把镜像仓库添加到Rancher之后,你已经可以从这些镜像中创建服务了。

  1. 创建一个名为demo的栈
  2. 添加一个服务,名字由你决定。让镜像使用你新的容器镜像中的develop标签 
    • example.com/example/demo:develop
  3. 点击Create

恭喜你!你刚刚已经用私有容器镜像仓库部署了项目的开发版本!

从这里开始可以做什么

这是一个漫长的教程,但当所有的重要步骤完成后,你可以使用已经安装好的工具开始工作了。从现在开始你可以做这些事情:

  • 为你其他的项目设置工作组。对于将要包含的项目,可以使用逻辑集合,像docker或者websites一样。
  • 将其他项目导入GitLab
  • 设置GitLab CI来构建容器
  • 修改master分支,融合develop分支,引入.gitlab-ci.yml,然后将其推送至GitLab。更新Rancher以获取lastest镜像标签。
  • 将HUB_USERNAME和HUB_PASSWORD添加到项目中,然后手动将你的镜像推送至Docker Hub

原文来源:Rancher Labs


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值