云原生技术18-Istio太“重“?试试这个轻量级替代品,2分钟安装、零配置使用:Linkerd极简入门,从Istio迁移到Linkerd:我们省下了50%的资源

1、AI程序员系列文章

2、AI面试系列文章

3、AI编程系列文章


目录

开篇:当Istio让你怀疑人生

一、Linkerd是什么?

1.1 设计哲学

1.2 版本演进

二、Linkerd架构解剖

2.1 整体架构图

2.2 控制平面组件详解

2.2.1 Destination(服务发现)

2.2.2 Identity(证书管理)

2.2.3 Proxy Injector(自动注入)

2.3 数据平面:Linkerd2-proxy

三、核心功能详解

3.1 自动mTLS:零信任开箱即用

3.2 流量管理

3.2.1 流量分割(金丝雀发布)

3.2.2 重试与超时

3.3 可观测性

3.4 故障注入

四、Linkerd vs Istio:正面硬刚

4.1 资源占用对比

4.2 功能对比

4.3 适用场景

五、安装部署实战

5.1 CLI安装(<2分钟)

5.2 安装控制平面

5.3 自动注入Sidecar

5.4 Helm部署(生产推荐)

5.5 完整部署示例

六、生产实践指南

6.1 高可用配置

6.2 多集群部署

6.3 监控告警配置

6.4 性能调优

文末三件套

1. 【源码获取】

2. 【思考题】

3. 【系列预告】

总结


开篇:当Istio让你怀疑人生

你是否觉得Istio功能强大但太复杂、学习曲线陡峭、资源开销大?

就像你只是想买辆代步车,结果4S店给你推荐了一辆配备自动驾驶、车载冰箱、按摩座椅的豪华SUV——功能确实牛逼,但你只是想去个菜市场啊!

Linkerd 是CNCF毕业项目,主打轻量、简单、安全。它不像Istio那样"大而全",而是专注于做好服务网格的核心功能:安全通信、流量管理、可观测性。

本文将对比Istio和Linkerd,帮你做出明智的选择。

💡 效率技巧:如果你已经在用Istio且运行良好,没必要为了"轻量"而迁移。但如果是新项目选型,Linkerd值得认真考虑。


一、Linkerd是什么?

Linkerd是由Buoyant公司开源的服务网格项目,2017年成为CNCF第一个毕业的服务网格项目(比Istio还早)。

1.1 设计哲学

Linkerd的设计可以用三个词概括:

特性说明
轻量每个Sidecar仅占用约20MB内存,延迟<1ms
简单安装<2分钟,零配置即可使用核心功能
安全自动mTLS,零信任网络开箱即用

🎭 幽默时间:有人说Istio是"瑞士军刀",Linkerd是"手术刀"。瑞士军刀功能多但笨重,手术刀精准但专注——你要切牛排还是做手术,自己选。

1.2 版本演进

  • Linkerd 1.x:基于Scala,功能完整但资源占用高
  • Linkerd 2.x:2018年重写,用Rust编写数据平面,Go编写控制平面,性能和资源占用大幅优化

现在的Linkerd 2.x已经成为生产环境的主流选择。


二、Linkerd架构解剖

2.1 整体架构图

┌─────────────────────────────────────────────────────────────────┐
│                      Kubernetes Cluster                          │
│                                                                  │
│  ┌─────────────────────────────────────────────────────────┐    │
│  │              Control Plane (控制平面)                    │    │
│  │  ┌─────────────┐  ┌─────────────┐  ┌─────────────────┐  │    │
│  │  │ Destination │  │  Identity   │  │ Proxy Injector  │  │    │
│  │  │  (服务发现)  │  │ (证书管理)  │  │  (自动注入)      │  │    │
│  │  └─────────────┘  └─────────────┘  └─────────────────┘  │    │
│  │  ┌─────────────┐  ┌─────────────┐  ┌─────────────────┐  │    │
│  │  │ Heartbeat   │  │  Webhooks   │  │   Tap/Metrics   │  │    │
│  │  │  (心跳上报)  │  │  (准入控制)  │  │  (观测组件)      │  │    │
│  │  └─────────────┘  └─────────────┘  └─────────────────┘  │    │
│  └─────────────────────────────────────────────────────────┘    │
│                              │                                   │
│                              ▼                                   │
│  ┌─────────────────────────────────────────────────────────┐    │
│  │                Data Plane (数据平面)                     │    │
│  │                                                          │    │
│  │   ┌─────────────┐        ┌─────────────┐                │    │
│  │   │   App Pod   │◄──────►│ App Pod     │                │    │
│  │   │ ┌─────────┐ │        │ ┌─────────┐ │                │    │
│  │   │ │Your App │ │        │ │Your App │ │                │    │
│  │   │ └─────────┘ │        │ └─────────┘ │                │    │
│  │   │ ┌─────────┐ │        │ ┌─────────┐ │                │    │
│  │   │ │Linkerd2 │ │        │ │Linkerd2 │ │                │    │
│  │   │ │ -proxy  │◄────────►│ │ -proxy  │ │                │    │
│  │   │ └─────────┘ │  mTLS  │ └─────────┘ │                │    │
│  │   └─────────────┘        └─────────────┘                │    │
│  │                                                          │    │
│  └─────────────────────────────────────────────────────────┘    │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

2.2 控制平面组件详解

2.2.1 Destination(服务发现)
┌────────────────────────────────────────┐
│           Destination 组件              │
├────────────────────────────────────────┤
│  • 接收来自数据平面的服务发现请求        │
│  • 与Kubernetes API交互获取Endpoints    │
│  • 解析服务名称到Pod IP                  │
│  • 提供路由策略信息                      │
└────────────────────────────────────────┘
           │
           ▼
    ┌──────────────┐
    │  Kubernetes  │
    │    API       │
    │   Server     │
    └──────────────┘

工作原理:当Linkerd2-proxy需要连接某个服务时,会向Destination组件查询该服务的Endpoint列表,Destination从Kubernetes API获取实时信息并返回。

2.2.2 Identity(证书管理)
┌──────────────────────────────────────────┐
│            Identity 组件                  │
├──────────────────────────────────────────┤
│  • 作为CA签发mTLS证书                      │
│  • 为每个Pod分配唯一身份                    │
│  • 证书自动轮换(24小时)                   │
│  • 支持外部CA集成(如Vault)                │
└──────────────────────────────────────────┘
           │
           ▼
    ┌──────────────┐
    │   Pod 证书    │
    │  (SPIFFE ID) │
    │  24h自动轮换  │
    └──────────────┘

💡 效率技巧:Identity组件默认使用自签名CA,生产环境建议配置外部CA(如HashiCorp Vault)以增强安全性。

2.2.3 Proxy Injector(自动注入)
# 自动注入的工作原理
apiVersion: v1
kind: Namespace
metadata:
  name: my-app
  annotations:
    linkerd.io/inject: enabled  # ← 添加这个注解
---
# 当Pod创建时,Proxy Injector会自动:
# 1. 拦截Pod创建请求(通过MutatingWebhook)
# 2. 修改Pod Spec,添加linkerd2-proxy sidecar
# 3. 配置iptables规则,拦截所有流量
# 4. 注入证书和配置

注入后的Pod结构

┌─────────────────────────────────────┐
│             Pod                     │
│  ┌─────────────────────────────┐    │
│  │      Init Container         │    │
│  │   linkerd-init (iptables)   │    │
│  └─────────────────────────────┘    │
│  ┌─────────────────────────────┐    │
│  │      Main Container         │    │
│  │       Your Application      │    │
│  │       (localhost:8080)      │    │
│  └─────────────────────────────┘    │
│  ┌─────────────────────────────┐    │
│  │      Sidecar Container      │    │
│  │     linkerd2-proxy          │    │
│  │   (透明拦截所有流量)          │    │
│  └─────────────────────────────┘    │
└─────────────────────────────────────┘

2.3 数据平面:Linkerd2-proxy

Linkerd2-proxy是用Rust编写的高性能代理,这是Linkerd"轻量"的核心所在。

┌─────────────────────────────────────────────────────────┐
│                   Linkerd2-proxy                        │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐ │
│  │   HTTP/2    │    │   gRPC      │    │   TCP       │ │
│  │   协议处理   │    │   协议处理   │    │   透传      │ │
│  └─────────────┘    └─────────────┘    └─────────────┘ │
│                                                         │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐ │
│  │  负载均衡    │    │  自动mTLS   │    │  重试/超时   │ │
│  │ (EWMA/P2C)  │    │  (TLS 1.3)  │    │  故障注入    │ │
│  └─────────────┘    └─────────────┘    └─────────────┘ │
│                                                         │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐ │
│  │  Prometheus │    │   OpenCensus│    │    Tap      │ │
│  │  指标收集    │    │   分布式追踪 │    │  实时流量分析│ │
│  └─────────────┘    └─────────────┘    └─────────────┘ │
│                                                         │
└─────────────────────────────────────────────────────────┘

为什么选择Rust?

特性说明
零成本抽象高性能同时保持代码可读性
内存安全无GC,无内存泄漏风险
资源占用低相比Java/Go代理,内存占用显著降低
延迟极低请求处理延迟<1ms

🎭 幽默时间:有人说Rust的学习曲线像攀岩,但Linkerd团队已经帮你爬完了。你只管享受山顶的风景(低延迟、低资源占用)就好。


三、核心功能详解

3.1 自动mTLS:零信任开箱即用

┌─────────────┐                      ┌─────────────┐
│   Pod A     │◄────── mTLS ────────►│   Pod B     │
│ ┌─────────┐ │    ┌────────────┐    │ ┌─────────┐ │
│ │linkerd2 │◄────►│  TLS 1.3   │◄───►│linkerd2 │ │
│ │ -proxy  │ │    │  自动协商   │    │ │ -proxy  │ │
│ └─────────┘ │    └────────────┘    │ └─────────┘ │
│  证书: A    │                      │  证书: B    │
│  身份验证   │                      │  身份验证   │
└─────────────┘                      └─────────────┘

零配置实现mTLS

# 只需给Namespace添加注解,mTLS自动启用
kubectl annotate namespace default linkerd.io/inject=enabled

# 部署应用
kubectl apply -f my-app.yaml

# 验证mTLS状态
linkerd viz edges deployment
# 输出示例:
# SRC                  DST           SRC_NS    DST_NS    SECURED
# my-app-deployment    backend-svc   default   default   √ TLS

⚠️ 避坑警告:mTLS要求所有通信双方的Pod都注入Linkerd sidecar。如果只有一侧注入,通信会失败或回退到明文(取决于配置)。

3.2 流量管理

3.2.1 流量分割(金丝雀发布)
apiVersion: split.smi-spec.io/v1alpha4
kind: TrafficSplit
metadata:
  name: my-app-rollout
spec:
  service: my-app
  backends:
  - service: my-app-v1
    weight: 90    # 90%流量到旧版本
  - service: my-app-v2
    weight: 10    # 10%流量到新版本
                    ┌─────────────┐
                    │   Service   │
                    │   my-app    │
                    └──────┬──────┘
                           │
           ┌───────────────┼───────────────┐
           │ 90%           │               │ 10%
           ▼               │               ▼
    ┌─────────────┐        │        ┌─────────────┐
    │  my-app-v1  │        │        │  my-app-v2  │
    │  (stable)   │        │        │  (canary)   │
    └─────────────┘        │        └─────────────┘
3.2.2 重试与超时
apiVersion: policy.linkerd.io/v1beta1
kind: HTTPRoute
metadata:
  name: backend-route
spec:
  parentRefs:
    - name: backend-svc
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /api
      backendRefs:
        - name: backend-svc
          port: 8080
      timeouts:
        request: 5s      # 请求超时5秒
      retries:
        budget:
          minRetriesPerSecond: 10
          retryRatio: 0.2
        backoff:
          minBackoff: 100ms
          maxBackoff: 10s

💡 效率技巧:重试预算(Retry Budget)比重试次数更科学。它允许一定比例的请求被重试,避免重试风暴压垮服务。

3.3 可观测性

Linkerd内置了强大的可观测性能力,无需额外部署Prometheus和Grafana。

┌─────────────────────────────────────────────────────────────┐
│                    Linkerd Viz 组件                          │
├─────────────────────────────────────────────────────────────┤
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────────────┐  │
│  │ Prometheus  │  │   Grafana   │  │   Tap/Top/Stat      │  │
│  │  指标存储    │  │   可视化    │  │   CLI/Web工具        │  │
│  └─────────────┘  └─────────────┘  └─────────────────────┘  │
└─────────────────────────────────────────────────────────────┘

实时查看流量指标

# 查看服务统计
linkerd viz stat deployment

# 输出示例:
# NAME          MESHED   SUCCESS      RPS   LATENCY_P50   LATENCY_P95   LATENCY_P99
# backend          3/3   99.85%    45.2rps          2ms          15ms          45ms
# frontend         2/2   99.92%    23.1rps          5ms          25ms          78ms

# 实时流量TOP
linkerd viz top deployment

# 流量拓扑图
linkerd viz edges deployment

🎭 幽默时间:以前排查问题需要"ssh进去抓个包",现在用Linkerd的Tap功能,就像给微服务装了X光机——想看哪条请求的详细信息?点一下就行。

3.4 故障注入

apiVersion: policy.linkerd.io/v1alpha1
kind: FaultInjection
metadata:
  name: backend-fault
spec:
  targetRef:
    group: ""
    kind: Service
    name: backend-svc
  fault:
    delay:
      percentage: 50        # 50%的请求添加延迟
      duration: 5s          # 延迟5秒
    abort:
      percentage: 10        # 10%的请求直接返回错误
      httpStatus: 503       # 返回503错误

⚠️ 避坑警告:故障注入是混沌工程的重要工具,但不要在生产环境随意使用!建议在测试环境充分验证后再谨慎用于生产。


四、Linkerd vs Istio:正面硬刚

4.1 资源占用对比

┌─────────────────────────────────────────────────────────────┐
│                   资源占用对比(每实例)                       │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Linkerd2-proxy                    Istio Envoy              │
│  ┌─────────────────┐              ┌─────────────────┐       │
│  │   内存: ~20MB   │              │   内存: ~100MB  │       │
│  │   CPU: 低        │              │   CPU: 中等      │       │
│  │   延迟: <1ms    │              │   延迟: 1-3ms   │       │
│  └─────────────────┘              └─────────────────┘       │
│                                                             │
│  控制平面: ~500MB                  控制平面: ~2GB+          │
│                                                             │
└─────────────────────────────────────────────────────────────┘
指标LinkerdIstio对比
Sidecar内存~20MB~100MBLinkerd是Istio的1/5
Sidecar延迟<1ms1-3msLinkerd更低
控制平面内存~500MB~2GB+Linkerd更轻量
安装时间<2分钟10-30分钟Linkerd更快
配置复杂度Linkerd更简单

💡 效率技巧:如果你的集群有1000个Pod,使用Linkerd可以节省约80GB内存(相比Istio)。在云上,这意味着真金白银的成本节省。

4.2 功能对比

功能LinkerdIstio说明
自动mTLS两者都支持
流量管理Istio更丰富
可观测性Linkerd内置,Istio需额外配置
多集群Istio更成熟
VM支持Istio更完善
WASM扩展Istio独有
外部授权有限Istio更灵活
速率限制有限Istio更强大

4.3 适用场景

选择Linkerd,如果你:

  • 想要"开箱即用"的体验,不想折腾配置
  • 资源敏感(边缘计算、IoT、小规模集群)
  • 团队对服务网格经验有限
  • 主要需求是mTLS和基本流量管理
  • 想要内置的可观测性

选择Istio,如果你:

  • 需要高级流量管理(复杂的流量镜像、外部授权等)
  • 需要WASM扩展能力
  • 大规模多集群部署
  • 团队有服务网格运维经验
  • 需要与多种生态系统集成

🎭 幽默时间:选Linkerd就像买iPhone——开箱即用,省心;选Istio就像组装PC——你可以定制一切,但得自己折腾。没有绝对的好坏,只有适合不适合。


五、安装部署实战

5.1 CLI安装(<2分钟)

# 1. 安装Linkerd CLI(Mac/Linux)
curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install | sh

# Windows (PowerShell)
# 下载 https://github.com/linkerd/linkerd2/releases 的 Windows 版本

# 2. 添加到PATH
export PATH=$PATH:$HOME/.linkerd2/bin

# 3. 验证安装
linkerd version
# 输出:
# Client version: stable-2.14.0
# Server version: unavailable  # 还没安装控制平面

# 4. 验证集群兼容性
linkerd check --pre

💡 效率技巧linkerd check是你的好朋友。安装前用--pre检查先决条件,安装后用check验证状态,排查问题时用它诊断。

5.2 安装控制平面

# 安装控制平面
linkerd install | kubectl apply -f -

# 等待安装完成
linkerd check

# 输出示例:
# linkerd-api
# --------------
# √ control plane pods are ready
# √ control plane self-check
# √ [kubernetes] control plane can talk to Kubernetes

5.3 自动注入Sidecar

# 给Namespace添加注入注解
kubectl annotate namespace default linkerd.io/inject=enabled

# 重新部署应用(触发注入)
kubectl rollout restart deployment/my-app

# 验证注入成功
linkerd viz stat deployment

5.4 Helm部署(生产推荐)

# 添加Helm仓库
helm repo add linkerd https://helm.linkerd.io/stable
helm repo update

# 安装控制平面
helm install linkerd-control-plane linkerd/linkerd-control-plane \
  --namespace linkerd \
  --create-namespace \
  --set-file identityTrustAnchorsPEM=ca.crt \
  --set-file identity.issuer.tls.crtPEM=issuer.crt \
  --set-file identity.issuer.tls.keyPEM=issuer.key

# 安装Viz(可观测性组件)
helm install linkerd-viz linkerd/linkerd-viz \
  --namespace linkerd-viz \
  --create-namespace

⚠️ 避坑警告:生产环境务必配置自己的CA证书!默认的自签名CA只适合测试。证书泄露可能导致中间人攻击。

5.5 完整部署示例

# namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: production
  annotations:
    linkerd.io/inject: enabled
---
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
  namespace: production
spec:
  replicas: 3
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: backend
        image: myapp/backend:v1.0.0
        ports:
        - containerPort: 8080
---
# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: backend-svc
  namespace: production
spec:
  selector:
    app: backend
  ports:
  - port: 80
    targetPort: 8080
# 部署
kubectl apply -f namespace.yaml -f deployment.yaml -f service.yaml

# 验证
linkerd viz stat deployment -n production

六、生产实践指南

6.1 高可用配置

# values-ha.yaml - 高可用配置
enablePodAntiAffinity: true

# 控制平面组件多副本
controllerReplicas: 3
webhookFailurePolicy: Fail

# 资源限制
controllerResources:
  cpu:
    limit: 1000m
    request: 100m
  memory:
    limit: 512Mi
    request: 128Mi

# 身份组件高可用
identityResources:
  cpu:
    limit: 500m
    request: 100m
  memory:
    limit: 256Mi
    request: 64Mi
# 使用高可用配置安装
helm install linkerd-control-plane linkerd/linkerd-control-plane \
  --namespace linkerd \
  --create-namespace \
  -f values-ha.yaml

6.2 多集群部署

┌─────────────────────┐         ┌─────────────────────┐
│     Cluster A       │         │     Cluster B       │
│   (主集群/控制)      │◄───────►│   (从集群/工作负载)  │
│                     │   mTLS  │                     │
│  ┌───────────────┐  │  隧道   │  ┌───────────────┐  │
│  │  Linkerd      │  │         │  │  Linkerd      │  │
│  │  Gateway      │◄─┼────────►│  │  Gateway      │  │
│  └───────────────┘  │         │  └───────────────┘  │
│                     │         │                     │
│  ┌───────────────┐  │         │  ┌───────────────┐  │
│  │  Service A    │  │         │  │  Service B    │  │
│  │  (exported)   │  │         │  │  (mirrored)   │  │
│  └───────────────┘  │         │  └───────────────┘  │
└─────────────────────┘         └─────────────────────┘
# 在Cluster A(主集群)上
linkerd multicluster install | kubectl apply -f -
linkerd multicluster link --cluster-name cluster-b | kubectl apply -f -

# 导出服务到远程集群
kubectl annotate svc backend-svc \
  multicluster.linkerd.io/exported=true

# 在Cluster B上,服务会自动镜像
kubectl get svc -n linkerd-multicluster
# 输出:backend-svc-cluster-a  (自动创建的镜像服务)

6.3 监控告警配置

# prometheus-rules.yaml
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: linkerd-alerts
  namespace: linkerd-viz
spec:
  groups:
  - name: linkerd
    rules:
    # 高错误率告警
    - alert: LinkerdHighErrorRate
      expr: |
        sum(rate(response_total{status_code=~"5.."}[5m])) 
        / sum(rate(response_total[5m])) > 0.05
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "High error rate detected"
        description: "Error rate is above 5%"
    
    # 高延迟告警
    - alert: LinkerdHighLatency
      expr: |
        histogram_quantile(0.99, 
          sum(rate(response_latency_ms_bucket[5m])) by (le, deployment)
        ) > 1000
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "High latency detected"
        description: "P99 latency is above 1s"

6.4 性能调优

# 优化Sidecar资源
proxy:
  resources:
    cpu:
      limit: 500m
      request: 100m
    memory:
      limit: 128Mi
      request: 32Mi
  
  # 启用访问日志(调试时使用,生产关闭)
  accessLog: |
    {"access_log":{"path":"/dev/stdout"}}
  
  # 连接池配置
  config: |
    {"proxy":{"idleTimeout":"60s","connectTimeout":"10s"}}

⚠️ 避坑警告:访问日志会显著增加资源开销,生产环境建议关闭。需要调试时临时开启,调试完立即关闭。


文末三件套

1. 【源码获取】

关注此系列获取后续更新,后台回复’linkerd’获取完整示例代码和配置文件。

2. 【思考题】

你会选择Istio还是Linkerd?欢迎在评论区分享你的选择和理由:

  • 你的团队规模多大?
  • 你们目前使用什么服务网格(如果有的话)?
  • 最看重服务网格的哪个特性?

3. 【系列预告】

云原生技术栈系列文章持续更新中:

多集群网格 ──► 混合云 ──► 边缘计算 ──► CI/CD
    │            │           │          │
    ▼            ▼           ▼          ▼
  下一篇      服务治理      轻量级      GitOps
  敬请期待    统一方案      部署方案    实践

总结

Linkerd作为CNCF毕业的服务网格项目,以其轻量、简单、安全的设计理念,为微服务架构提供了优雅的解决方案。

核心优势回顾

特性数据
Sidecar延迟< 1ms
内存占用~20MB/实例(Istio的1/5)
安装时间< 2分钟
学习曲线平缓

适合人群

  • 想要快速落地服务网格的团队
  • 资源敏感的场景
  • 对运维复杂度有要求的组织

记住:没有最好的工具,只有最适合的工具。 希望本文能帮助你在Istio和Linkerd之间做出明智的选择。


标签: Linkerd, 轻量级服务网格, Istio对比, CNCF, 微服务, 零信任

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每日干货分享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值