Terraform AWS Kubernetes模块:自动化AWS Kubernetes集群部署

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本模块为“terraform-aws-kubernetes”,是一个为AWS环境设计的Terraform模块,用于自动化创建和管理Kubernetes集群。模块利用Terraform的声明性语言HCL来定义和管理云资源,如EC2实例和存储。它涵盖了从安全组规则的设置到Kubernetes控制平面组件的安装与配置。通过使用此模块,开发者和DevOps团队可以高效地在AWS上部署和管理Kubernetes集群,加快应用程序的构建和扩展。

1. Terraform概述及其在云资源管理中的作用

Terraform是一个由HashiCorp公司开发的开源基础设施即代码工具,它使得在不同云提供商上管理和部署云资源变得异常简单和高效。它通过声明性的配置文件来定义云资源的状态,从而实现资源的创建、更新和版本控制。

1.1 Terraform的基本原理

Terraform使用HCL(HashiCorp Configuration Language)编写配置文件,这使得云资源的管理更加直观和易于理解。它通过Terraform Provider与云服务提供商进行交互,这些Provider就像是Terraform与特定云平台之间的桥梁,负责解释Terraform的指令并将其转化为特定云平台的API调用。

1.2 Terraform在云资源管理中的优势

Terraform的主要优势在于它的声明式编程方式,这使得开发者可以专注于描述期望的最终状态,而不必关心如何达到这个状态的具体步骤。此外,Terraform支持状态文件的管理,这个状态文件记录了现实世界与配置文件的对应关系,使得资源的变更管理变得可行。它的可重用模块化设计,让复杂的多云环境管理变得更加可维护。

# 示例:一个简单的Terraform配置文件
provider "aws" {
  region = "us-west-2"
}

resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
}

以上代码定义了一个AWS实例的创建,通过简单的语法即可实现对云资源的定义和管理。随着章节的深入,我们将详细探讨Terraform的各个组成部分及其在自动化云资源管理中的实际应用。

2. Terraform模块在AWS上部署Kubernetes集群的自动化流程

在云资源管理中,自动化是提高效率、减少人为错误和加快部署速度的关键因素。Terraform是一个开源的基础设施即代码(Infrastructure as Code, IaC)工具,被广泛用于自动化部署和管理云资源。在AWS这样的云平台中,使用Terraform模块可以将复杂的部署过程简化为可重复和可维护的代码块。本章节将深入探讨如何使用Terraform模块自动化部署Kubernetes集群,并介绍其背后的策略和步骤。

2.1 Terraform模块化部署基础

2.1.1 云基础设施即代码的实践

在现代云计算环境中,基础设施即代码(IaC)已经成为了行业标准。通过定义和使用代码来描述和配置云基础设施,团队可以实现资源的版本控制、自动化部署、快速迭代和一致性管理。Terraform的模块化特性允许开发者将基础设施部署划分为可重用和可组合的单元。

要实现这一目标,Terraform引入了模块的概念,模块可以封装一组相关的资源定义,使得代码更加清晰和模块化。当使用模块时,可以通过简单地引用模块并传递参数来实现复杂的部署逻辑。下面是一个简单的Terraform模块的示例代码,展示了模块如何定义和使用:

# 定义一个模块
module "example" {
  source = "./modules/example"

  instance_type = "t2.micro"
  ami           = "ami-0c55b159cbfafe1f0"
}

# 在模块内部,定义资源
resource "aws_instance" "example" {
  ami           = var.ami
  instance_type = var.instance_type

  tags = {
    Name = "ExampleInstance"
  }
}

在这个例子中, module "example" 通过指定一个本地目录 "./modules/example" 作为 source 来引用一个模块。该模块封装了 aws_instance 资源的创建过程,并通过变量 instance_type ami 接受外部输入,使得模块的使用更加灵活。

2.1.2 Terraform模块与AWS资源的映射关系

Terraform模块是将基础架构抽象化的关键。模块可以与AWS资源建立映射关系,这意味着每个模块内部可以包含多个AWS资源的定义。Terraform通过其核心提供了一个资源映射层,允许开发者使用声明性语言定义基础设施,然后将其转换为AWS API调用。

在自动化部署Kubernetes集群的过程中,我们可以创建多个模块,每个模块专注于集群的不同组件。例如,一个模块负责创建和配置ETCD集群,另一个模块管理Kubernetes控制平面组件,再有模块负责节点池的创建和管理。

# 使用模块创建ETCD集群
module "etcd_cluster" {
  source           = "./modules/etcd"
  instance_type    = "t3.medium"
  desired_capacity = 3
}

# 使用模块管理Kubernetes控制平面
module "kubernetes_control_plane" {
  source                  = "./modules/kubernetes_control_plane"
  api_endpoint            = "***"
  api_cert_file           = "path/to/api/cert"
  # 其他需要的参数...
}

上面的代码中,我们定义了两个模块 etcd_cluster kubernetes_control_plane ,每个模块都对应于Kubernetes集群的一个核心组件。通过传递不同的参数,我们可以灵活地定制每个组件的部署方式。

通过Terraform模块化部署,我们可以构建出一个清晰、可维护和可扩展的基础设施代码库。下一节将深入探讨如何规划和设计Kubernetes集群自动化部署的策略与步骤。

2.2 Kubernetes集群自动化部署的策略与步骤

2.2.1 部署流程的设计与规划

在开始自动化部署之前,一个清晰的部署计划至关重要。这个计划应当详细说明部署过程中需要的基础设施资源、网络配置、安全设置以及故障恢复策略。对于Kubernetes集群的自动化部署,规划阶段通常涉及以下关键决策点:

  • 集群规模与容量规划 :确定集群需要支持的最大工作负载,根据这个需求来规划节点数量和类型。
  • 高可用性设计 :确保集群的高可用性,设计多个Master节点和合理的容错机制。
  • 网络和安全 :规划网络拓扑,包括私有和公共子网的划分,以及集群的访问控制策略。
  • 监控和日志管理 :设计如何监控集群状态和应用性能,以及日志收集和分析流程。

在设计阶段,我们还可以使用各种工具来验证我们的计划,比如Kubernetes的 kubeadm 工具可以帮助我们验证节点配置和集群初始化步骤。

接下来,我们将具体介绍如何实施这些策略,以及在部署过程中应该注意的最佳实践。

2.2.2 部署过程中的最佳实践和注意事项

自动化部署过程中,以下最佳实践和注意事项有助于确保部署的顺利和成功:

  • 版本控制 :所有的Terraform配置文件应存放在版本控制系统中,比如Git,便于跟踪更改和协作。
  • 持续集成/持续部署(CI/CD) :将Terraform部署步骤集成到CI/CD流程中,以实现自动化测试和部署。
  • 模块化和参数化 :使用参数化的方式配置模块,使得模块可以灵活地应用于不同的环境和场景。
  • 环境隔离 :确保不同环境(开发、测试、生产)之间的资源隔离,以防止潜在的配置冲突。
  • 权限和安全 :在自动化过程中,严格控制对敏感资源的访问,例如使用AWS IAM角色和策略管理权限。
  • 状态管理 :配置Terraform远程状态存储,确保状态文件的安全性和可访问性。

在实施自动化部署时,Terraform的 terraform apply 命令将根据Terraform配置文件中的声明创建或更新基础设施。这个命令的执行需要遵循代码中定义的逻辑和资源依赖关系,最终达到定义的期望状态。

在本章节中,我们首先介绍了Terraform模块化部署的基础知识,包括IaC实践和模块与AWS资源的映射关系。接着,我们详细探讨了Kubernetes集群自动化部署的策略与步骤,包括设计与规划阶段的关键考虑以及在部署过程中需要遵循的最佳实践和注意事项。

下一章,我们将深入Terraform HCL语言的细节,了解其核心概念及其在AWS Kubernetes部署中的应用。通过学习HCL语法结构与特性以及其与JSON的对比,我们将会更加得心应手地编写高效的Terraform配置代码。

3. Terraform HCL语言详解及应用

Terraform作为云基础设施即代码(Infrastructure as Code,IaC)的一个流行工具,它的核心是由HashiCorp开发的HCL(HashiCorp Configuration Language)。本章节将详细探讨Terraform HCL语言的核心概念,分析其语法结构与特性,并通过在AWS上部署Kubernetes集群的实例,展示HCL的具体应用。

3.1 Terraform HCL语言核心概念

3.1.1 HCL语法结构与特性

HCL是一种声明式语言,它被设计用于描述基础设施的结构,而非指示如何构建。这使得HCL专注于"想要什么",而不是"如何得到它"。HCL的主要特性包括:

  • 易于人类阅读和编写
  • 支持注释和变量,提高了可读性和复用性
  • 具备强大的表达能力,用于定义复杂的配置结构
  • 支持模块化,便于管理大规模的配置文件

下面是一个简单的Terraform HCL代码示例:

provider "aws" {
  region = "us-west-2"
}

resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
}

output "instance_id" {
  value = aws_instance.example.id
}

3.1.2 HCL与JSON的对比分析

HCL被设计为更易于人类阅读和编写,与JSON相比,它有以下几个优势:

  • 可读性 : HCL允许使用空格和缩进来增加可读性,而JSON格式要求严格的括号和引号。
  • 表达性 : HCL具有更丰富的表达式语言,支持变量、条件语句、循环等,而JSON只支持字典和列表结构。
  • 模块化 : HCL支持模块化结构,可以将代码分割为多个文件,便于管理。JSON则通常是以单个文件形式存在。

例如,上述的HCL代码,如果用JSON表示,可能会是这样的:

{
  "provider": {
    "aws": {
      "region": "us-west-2"
    }
  },
  "resource": {
    "aws_instance": {
      "example": {
        "ami": "ami-0c55b159cbfafe1f0",
        "instance_type": "t2.micro"
      }
    }
  },
  "output": {
    "instance_id": {
      "value": "${aws_instance.example.id}"
    }
  }
}

3.2 HCL在AWS Kubernetes部署中的应用实例

3.2.1 创建和配置AWS资源的HCL代码示例

在AWS上自动化部署Kubernetes集群的过程中,Terraform HCL用于定义所需的AWS资源及其配置。下面展示了一个创建EKS(Elastic Kubernetes Service)集群的HCL代码示例:

resource "aws_eks_cluster" "example" {
  name = "example-cluster"
  role_arn = aws_iam_role.example.arn
  vpc_config {
    subnet_ids = ["subnet-XXXXXXXX", "subnet-XXXXXXXX"]
  }

  kubernetes_network_config {
    ip_family = "ipv4"
  }
}

resource "aws_iam_role" "example" {
  name = "eks-role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17",
    Statement = [{
      Effect = "Allow",
      Principal = {
        Service = "***"
      },
      Action = "sts:AssumeRole"
    }]
  })
}

3.2.2 模块化代码的编写与管理

为了提高代码的可维护性和复用性,Terraform支持模块化编程。模块是包含多个资源定义的容器,可以在多个配置文件中共享使用。下面是一个使用模块创建EKS集群的示例:

module "eks_cluster" {
  source = "./eks-cluster-module"

  cluster_name = "example-cluster"
  subnet_ids = ["subnet-XXXXXXXX", "subnet-XXXXXXXX"]
}

module "eks-cluster-module" {
  source = "***/hashicorp/terraform-aws-eks//modules/cluster"

  cluster_name = var.cluster_name
  cluster_version = "1.17"
  subnets = var.subnet_ids
}

在这个示例中, eks-cluster-module 模块用于创建和配置EKS集群。模块通过Git仓库进行版本控制,可以实现集群配置的复用和更新。

通过本章节的介绍,我们可以深入理解Terraform HCL语言的核心概念,以及如何在AWS上部署Kubernetes集群的过程中应用这些知识。下一章,我们将进一步深入探讨Kubernetes集群在AWS上的具体部署细节,包括Master节点的创建、EC2实例的管理以及控制平面组件的安装与配置。

4. 深入理解Kubernetes集群的AWS部署细节

4.1 Kubernetes Master节点的创建与配置

Kubernetes Master节点是整个集群的大脑,负责调度和管理集群中的所有工作节点(Worker Nodes)。在AWS上部署Kubernetes集群时,Master节点的创建和配置至关重要,因为它们将直接影响集群的稳定性和可用性。接下来,我们将深入了解如何通过Terraform在AWS上创建和配置Kubernetes Master节点。

4.1.1 Master节点的AWS资源配置

首先,需要在AWS上创建一个或多个EC2实例作为Master节点。这里我们将会使用Terraform来声明性地定义所需的AWS资源。Terraform将帮助我们创建EC2实例,并安装Kubernetes Master组件,如kube-apiserver、kube-controller-manager、kube-scheduler等。

在Terraform配置中,我们会指定EC2实例的类型、安全组、网络配置等参数。安全组将决定哪些流量可以进入和离开Master节点。同时,实例类型的选择也很重要,考虑到Master节点将处理整个集群的控制任务,推荐选择计算能力强的实例类型,例如 m5.large 或更大。

resource "aws_instance" "k8s_master" {
  ami           = data.aws_ami亚马逊AMIID
  instance_type = "m5.large"
  key_name      = aws_key_pair.deployer.key_name
  subnet_id     = aws_subnet.private subnet_id
  vpc_security_group_ids = [aws_security_group.k8s_master.id]
  user_data = <<EOF
    #!/bin/bash
    # 用户数据脚本:安装和配置Kubernetes Master节点
    # 在这里可以编写安装和配置Master的脚本
    # 示例命令:安装kubelet, kubeadm, kubectl等
    EOF
}

在上述代码块中, ami 参数指定了Master节点将使用的Amazon Machine Image (AMI),通常会选择官方的Kubernetes AMI或者用户自定义的AMI。 user_data 字段用于在EC2实例启动时自动执行脚本,该脚本中包含安装和配置Master节点的命令。

4.1.2 高可用与负载均衡的实现

为了确保Kubernetes集群的高可用性,建议至少部署三个Master节点。Terraform的 aws_instance 资源可以复制,从而部署多个Master节点。为了进一步提高可用性和负载均衡,可以使用AWS的Elastic Load Balancer (ELB)将流量均衡地分发到各个Master节点。

resource "aws_elb" "k8s_master_elb" {
  name               = "k8s-master-elb"
  availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"]

  listener {
    instance_port     = 6443
    instance_protocol = "https"
    lb_port           = 6443
    lb_protocol       = "https"
  }

  instances = [
    aws_instance.k8s_master.0.id,
    aws_instance.k8s_master.1.id,
    aws_instance.k8s_master.2.id
  ]
}

在上面的代码中, aws_elb 资源创建了一个监听在6443端口(Kubernetes API服务器的默认端口)的负载均衡器,并指定了三个Master节点的实例ID作为目标。请注意,在真实的部署中,可能还需要处理TLS证书以确保安全的通信。

4.2 EC2实例的创建与管理

4.2.1 EC2实例类型的选择与优化

在AWS上部署Kubernetes工作节点(EC2实例)时,需要根据工作负载的特性选择合适的实例类型。这通常涉及到CPU、内存、存储和网络带宽的权衡。例如,如果应用是计算密集型的,那么应当优先考虑具有较多CPU核心的实例类型;而如果是存储密集型的,那么磁盘I/O性能较强的实例则更加合适。

此外,还需要考虑实例的网络性能和存储类型,因为这些因素都会影响到Kubernetes集群的整体性能。例如,使用SSD类型的EBS存储可以显著提升数据密集型应用的性能。

resource "aws_instance" "k8s_worker" {
  ami           = data.aws_ami亚马逊AMIID
  instance_type = "m5.large"
  key_name      = aws_key_pair.deployer.key_name
  subnet_id     = aws_subnet.private subnet_id
  vpc_security_group_ids = [aws_security_group.k8s_worker.id]
  user_data = <<EOF
    #!/bin/bash
    # 用户数据脚本:安装和配置Kubernetes Worker节点
    # 在这里可以编写安装和配置Worker的脚本
    # 示例命令:安装kubelet, kubeadm, kubectl等
    EOF
}

4.2.2 实例的扩展与网络配置

随着工作负载的增减,可能需要对集群中的EC2实例进行扩展,以适应流量的变化。Terraform的 aws_instance 资源可以结合 count 参数来动态地增加或减少实例数量。

网络配置是确保EC2实例能够正确通信的关键部分。在创建实例时,需要指定它属于哪个子网和安全组。子网决定了实例所在的私有IP地址范围,而安全组则定义了实例可以接收和发送的网络流量类型。

resource "aws_instance" "k8s_worker" {
  ami           = data.aws_ami亚马逊AMIID
  instance_type = "m5.large"
  count         = 5 # 可以根据需要动态改变实例数量
  key_name      = aws_key_pair.deployer.key_name
  subnet_id     = aws_subnet.private subnet_id
  vpc_security_group_ids = [aws_security_group.k8s_worker.id]
  user_data = <<EOF
    #!/bin/bash
    # 用户数据脚本:安装和配置Kubernetes Worker节点
    EOF
}

通过改变 count 参数的值,Terraform将根据新的实例数量重新配置基础设施。这种可伸缩性是云原生技术的一个关键优势,使得资源管理更加灵活高效。

4.3 Kubernetes控制平面组件安装与配置

4.3.1 安装etcd集群

etcd是一个轻量级、分布式的键值存储系统,它被用作Kubernetes集群的核心组件之一,用于存储所有的集群数据。在Terraform中,我们可以创建一系列EC2实例并安装etcd,形成一个高可用的etcd集群。

resource "aws_instance" "etcd_member" {
  ami           = data.aws_ami亚马逊AMIID
  instance_type = "t3.medium"
  count         = 3 # 一个奇数个数可以保证集群的法定人数
  key_name      = aws_key_pair.deployer.key_name
  subnet_id     = aws_subnet.private subnet_id
  vpc_security_group_ids = [aws_security_group.etcd.id]

  user_data = <<EOF
    #!/bin/bash
    # 用户数据脚本:安装etcd集群成员
    # 在这里可以编写安装和配置etcd的脚本
    # 示例命令:下载etcd二进制文件,启动etcd服务等
    EOF
}

在实际部署中,每个etcd成员都需要配置通信参数,确保各成员之间可以安全地通信。Terraform用户数据脚本中还需要包含如何将该EC2实例注册为etcd集群的成员的命令。

4.3.2 API服务器和调度器的配置

Kubernetes API服务器是整个集群的控制接口,负责处理集群的所有操作请求。而调度器则负责将Pods分配到集群中的正确节点上。在AWS上部署Kubernetes集群时,需要确保API服务器和调度器能够安全、高效地运行。

通过使用Terraform来配置EC2实例,并在实例上安装并配置kube-apiserver和kube-scheduler,可以实现这一目标。同时,需要考虑到集群的高可用配置,确保在任何Master节点发生故障时,集群仍能正常运行。

resource "aws_instance" "k8s_master" {
  ami           = data.aws_ami亚马逊AMIID
  instance_type = "m5.large"
  key_name      = aws_key_pair.deployer.key_name
  subnet_id     = aws_subnet.private subnet_id
  vpc_security_group_ids = [aws_security_group.k8s_master.id]
  user_data = <<EOF
    #!/bin/bash
    # 用户数据脚本:安装和配置Kubernetes Master节点
    # 在这里可以编写安装和配置kube-apiserver和kube-scheduler的脚本
    # 示例命令:使用kubeadm初始化Master节点,启动相关服务等
    EOF
}

以上实例中, user_data 字段的脚本将会在EC2实例上执行,负责安装必要的组件并配置API服务器和调度器。如需要设置高可用,还可以考虑使用外部的负载均衡器来分配到各个Master节点的API请求,以提高整体的鲁棒性。

至此,我们已经深入地探讨了如何在AWS上通过Terraform创建和配置Kubernetes Master节点、EC2实例和控制平面组件。下一章节我们将继续深入了解Kubernetes集群的安全性、IAM管理与状态管理,确保集群的稳定运行和团队协作的高效管理。

5. Kubernetes集群的安全性、IAM管理与状态管理

5.1 集群安全性与IAM权限管理

5.1.1 AWS IAM角色与策略的应用

在AWS上部署Kubernetes集群时,安全性是一个不可忽视的话题。AWS Identity and Access Management (IAM) 提供了一种细粒度的权限控制系统,以确保只有授权用户和程序才能访问和操作集群资源。

使用IAM策略,可以定义访问控制列表 (ACLs),明确哪些AWS资源被哪些用户或服务角色访问。例如,创建一个IAM角色为 KubernetesAdmin ,授予对EKS服务和其他必要资源的访问权限。创建此角色的策略通常如下:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "eks:*",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "ec2:*",
            "Resource": "*"
        }
    ]
}

代码块展示了如何通过JSON格式的策略来控制对AWS EKS(Elastic Kubernetes Service)和EC2资源的访问权限。IAM策略为集群提供安全保障,同时也为运维人员提供必要的管理能力。

5.1.2 Kubernetes角色基于策略的访问控制

Kubernetes本身也提供了基于角色的访问控制(RBAC),这与IAM不同,但可以与之协同工作。Kubernetes的RBAC可以限制谁可以查看或操作集群资源,例如,可以创建角色和角色绑定来限制访问特定的命名空间或资源。

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

上述YAML代码定义了一个角色 pod-reader ,它仅允许在 default 命名空间内对Pods执行 get watch list 操作。接着,可以通过角色绑定将这个角色关联给特定的用户或服务账户。

5.2 状态管理与协作一致性

5.2.1 Terraform远程状态管理的配置

Terraform的状态管理非常重要,尤其是在团队协作中。默认情况下,Terraform会将状态存储在本地文件中,这不便于团队协作。配置远程状态存储可以解决这个问题。远程状态存储可以通过不同的后端实现,如AWS S3、Consul、Artifactory等。

以 AWS S3 为例,配置 Terraform 远程状态需要一个配置文件,通常命名为 backend.tf

terraform {
  backend "s3" {
    bucket         = "my-tf-state-bucket"
    key            = "terraform.tfstate"
    region         = "us-west-2"
    dynamodb_table  = "terraform-state-lock"
    encrypt        = true
  }
}

该配置块指定了一个S3桶来存储状态文件,并设置了加密和锁定机制以防止并发写入问题。

5.2.2 团队协作中状态管理的挑战与解决策略

在团队协作过程中,状态管理面临诸多挑战,包括状态文件的并发更新、权限控制、审计和状态文件的备份。Terraform的远程状态管理解决了一部分问题,而其他的挑战则需要通过团队工作流程的优化来解决。

团队应该建立清晰的编码规范和版本控制流程,同时采用持续集成和持续部署(CI/CD)的方式,以自动化的方式对状态进行管理和部署。此外,可以定期对状态进行备份,确保在出现故障时能够快速恢复。

flowchart LR
    A[编码规范和版本控制] --> B[CI/CD流程自动化]
    B --> C[状态备份与恢复]
    C --> D[状态审计与监控]

如上所示的流程图概括了从规范团队行为到自动化部署和状态管理的过程。每个环节都紧密相扣,保障了状态管理的可靠性和安全性。在实际操作中,这些策略可以帮助团队有效解决协作中的状态管理挑战。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本模块为“terraform-aws-kubernetes”,是一个为AWS环境设计的Terraform模块,用于自动化创建和管理Kubernetes集群。模块利用Terraform的声明性语言HCL来定义和管理云资源,如EC2实例和存储。它涵盖了从安全组规则的设置到Kubernetes控制平面组件的安装与配置。通过使用此模块,开发者和DevOps团队可以高效地在AWS上部署和管理Kubernetes集群,加快应用程序的构建和扩展。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值