k8s配置文件模板

一、deployment
Deployment为Pod和Replica Set下一代Replication Controller)提供声明式更新1、配置示例

apiVersion: apps/v1        # 1.9.0 之前的版本使用 apps/v1beta2,可通过命令 kubectl api-versions 查看
kind: Deployment           #指定创建资源的角色/类型
metadata:                  #资源的元数据/属性
  name: nginx-deployment       #资源的名字,在同一个namespace中必须唯一
  namespace:  xxxx             #命名空间
  labels: 
    app: demo                  #标签
spec:
  replicas: 3         #副本数量3
  strategy:
    rollingUpdate:   ##由于replicas为3,则整个升级,pod个数在2-4个之间
      maxSurge: 1      #滚动升级时会先启动1个pod
      maxUnavailable: 1 #滚动升级时允许的最大Unavailable的pod个数
  selector:             #定义标签选择器,部署需要管理的pod(带有该标签的的会被管理)需在pod 模板中定义
    matchLabels:
      app: web-server
  template:      #这里Pod的定义
    metadata:
      labels:    #Pod的label
        app: web-server
    spec:        # 模板的规范  
      containers:  
      - name: nginx      #容器的名字  
        image: nginx:1.12.1  #容器的镜像地址 
        command: [ "/bin/sh","-c","cat /etc/config/path/to/special-key" ]    #启动命令   
        args:                                                                #启动参数
            - '-storage.local.retention=$(STORAGE_RETENTION)'
            - '-storage.local.memory-chunks=$(STORAGE_MEMORY_CHUNKS)'
            - '-config.file=/etc/prometheus/prometheus.yml'
            - '-alertmanager.url=http://alertmanager:9093/alertmanager'
            - '-web.external-url=$(EXTERNAL_URL)'
    #如果command和args均没有写,那么用Docker默认的配置。
    #如果command写了,但args没有写,那么Docker默认的配置会被忽略而且仅仅执行.yaml文件的command(不带任何参数的)。
    #如果command没写,但args写了,那么Docker默认配置的ENTRYPOINT的命令行会被执行,但是调用的参数是.yaml中的args。
    #如果如果command和args都写了,那么Docker默认的配置被忽略,使用.yaml的配置。
        imagePullPolicy: IfNotPresent  
        # IfNotPresent :默认值,本地有则使用本地镜像,不拉取,如果不存在则拉取
        # Always:  总是拉取
        # Never:  只使用本地镜像,从不拉取
          livenessProbe:       
#表示container是否处于live状态。如果LivenessProbe失败,LivenessProbe将会通知kubelet对应的container不健康了。随后kubelet将kill掉container,并根据RestarPolicy进行进一步的操作。默认情况下LivenessProbe在第一次检测之前初始化值为Success,如果container没有提供LivenessProbe,则也认为是Success;
            httpGet:
              path: /health #如果没有心跳检测接口就为/
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 60 ##启动后延时多久开始运行检测
            timeoutSeconds: 5
            successThreshold: 1
            failureThreshold: 5
            readinessProbe:
          readinessProbe:
            httpGet:
              path: /health #如果没有心跳检测接口就为/
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 30 ##启动后延时多久开始运行检测
            timeoutSeconds: 5
            successThreshold: 1
            failureThreshold: 5
          resources:              ##CPU内存限制
            requests:
              cpu: 2
              memory: 2048Mi
            limits:
              cpu: 2
              memory: 2048Mi
          env:                    ##通过环境变量的方式,直接传递pod=自定义Linux OS环境变量
            - name: LOCAL_KEY     #本地Key
              value: value
            - name: CONFIG_MAP_KEY  #局策略可使用configMap的配置Key,
              valueFrom:
                configMapKeyRef:
                  name: special-config   #configmap中找到name为special-config
                  key: special.type      #找到name为special-config里data下的key
          ports:
            - name: http
              containerPort: 8080 #对service暴露端口
          volumeMounts:     #挂载volumes中定义的磁盘
          - name: log-cache
            mount: /tmp/log
          - name: sdb       #普通用法,该卷跟随容器销毁,挂载一个目录
            mountPath: /data/media    
          - name: nfs-client-root    #直接挂载硬盘方法,如挂载下面的nfs目录到/mnt/nfs
            mountPath: /mnt/nfs
          - name: example-volume-config  #高级用法第1种,将ConfigMap的log-script,backup-script分别挂载到/etc/config目录下的一个相对路径path/to/...下,如果存在同名文件,直接覆盖。
            mountPath: /etc/config       
          - name: rbd-pvc                #高级用法第2中,挂载PVC(PresistentVolumeClaim)

#使用volume将ConfigMap作为文件或目录直接挂载,其中每一个key-value键值对都会生成一个文件,key为文件名,value为内容,
  volumes:  # 定义磁盘给上面volumeMounts挂载
  - name: log-cache
    emptyDir: {}
  - name: sdb  #挂载宿主机上面的目录
    hostPath:
      path: /any/path/it/will/be/replaced
  - name: example-volume-config  # 供ConfigMap文件内容到指定路径使用
    configMap:
      name: example-volume-config  #ConfigMap中名称
      items:
      - key: log-script           #ConfigMap中的Key
        path: path/to/log-script  #指定目录下的一个相对路径path/to/log-script
      - key: backup-script        #ConfigMap中的Key
        path: path/to/backup-script  #指定目录下的一个相对路径path/to/backup-script
  - name: nfs-client-root         #供挂载NFS存储类型
    nfs:
      server: 10.42.0.55          #NFS服务器地址
      path: /opt/public           #showmount -e 看一下路径
  - name: rbd-pvc                 #挂载PVC磁盘
    persistentVolumeClaim:
      claimName: rbd-pvc1         #挂载已经申请的pvc磁盘


2、相关使用
一个典型的用例如下:
使用Deployment来创建ReplicaSet。ReplicaSet在后台创建pod。检查启动状态,看它是成功还是失败。
然后,通过更新Deployment的PodTemplateSpec字段来声明Pod的新状态。这会创建一个新的ReplicaSet,Deployment会按照控制的速率将pod从旧的ReplicaSet移动到新的ReplicaSet中。
如果当前状态不稳定,回滚到之前的Deployment revision。每次回滚都会更新Deployment的revision。
扩容Deployment以满足更高的负载。
暂停Deployment来应用PodTemplateSpec的多个修复,然后恢复上线。
根据Deployment 的状态判断上线是否hang住了。
清除旧的不必要的ReplicaSet

创建deployment

kubectl create -f  nginx-deployment.yaml --record       ##--record 为True  在annotation中记录当前命令创建或者升级了该资源,如查看在每个Deployment revision中执行了哪些命令
kubectl get deployments 
kubectl get rs                      #Replica Set的名字总是<Deployment的名字>-<pod template的hash值>
kubectl get pods  -n xxxx           #命名空间
kubectl get pods --show-labels      #查看标签

更新deployment
注意: Deployment的rollout当且仅当Deployment的pod template(例如.spec.template)中的label更新或者镜像更改时被触发。其他更新,例如扩容Deployment不会触发rollout.

kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1   #更新镜像

或使用edit命令来编辑Deployment,修改 .spec.template.spec.containers[0].image ,将nginx:1.7.9 改写成 nginx:1.9.1
kubectl edit deployment/nginx-deployment

kubectl rollout status deployment/nginx-deployment    #rollout状态

回退deployment

kubectl describe deployment  #查看状态
kubectl rollout history deployment/nginx-deployment  #检查升级记录
kubectl rollout history deployment/nginx-deployment --revision=2   #查看version信息

暂停和恢复

kubectl get deploy
kubectl rollout pause deployment/nginx-deployment
kubectl set image deploy/nginx nginx=nginx:1.9.1
kubectl rollout history deploy/nginx

二、SERVICE
service 的作用
防止Pod失去联系(服务发现)
定义一组Pod的访问策略(负载均衡)
支持ClusterIP,NodePort以及LoadBalancer三种类型
Service的底层实现主要有iptables和ipvs两种网络模式

pod 与service的关系
通过lable-selector相关联
通过Service实现Pod的负载均衡(TCP/UDP 4层)

1、配置文件
[root@k8s-master-128 dome]# cat deploy-nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:   # 这里是定义Deployment的标签
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx # 选择关联Deployment标签
  template:
    metadata:
      labels:  # 给Pod定义一个标签,方便其他服务关联这个Pod
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:   # Service 的selector 指定标签 app:nginx 来进行对Pod进行关联 ;(这里的app:nginx就是上面Deployment配置里labels定义的标签 )
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: NodePort


2、Service的三种类型
发布的服务类型有三种:ClusterIP、NodePort和LoadBalancer
官网地址:https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types

ClusterIP
分配一个内部集群IP地址,只能在集群内部访问(同Namespaces内的Pod),不对外提供访问服务!默认ServiceTpye
kubectl get svc 暴露的集群ip和集群端口,只能在k8s集群内部访问
Node节点上能查看到创建的iptables规则

Nodeport
分配一个内网集群IP地址,并在内个节点上启用一个端口来暴露服务,可以在集群外部访问

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 80 # 需要暴露的集群端口(service暴露的)
    targetPort: 9376  # 容器的端口(后端容器提供服务的端口)
    nodePort: 30000
  type: NodePort


映射到物理机的端口范围为:The range of valid ports is 30000-32767

kubectl get svc -o wide 暴露的端口在node 节点上由kube-proxy来启动并监听的,可通过NodeIP+端口的方式直接进行访问,因为kube-proxy进行了代理。
kube-proxy是如何代理访问到容器的呢?因为kube-proxy在启动的时候通过–proxy-mode=ipvs可以指定底层内核代理模式,默认是iptables进行代理转发,kube-proxy通过这两种模式来代理直接对外提供服务

参考的写法

apiVersion: v1
kind: Pod
metadata:
  name: eureka
  labels: 
    ccb: eureka
spec:
  containers:
    - name: test-container
      image: eureka
      ports: 
        - name: eureka
          containerPort: 8082
          protocol: TCP
      imagePullPolicy: Never
      volumeMounts:
      - name: appconfig
        mountPath: /jar/application.yml
        subPath: application.yml
  volumes:
    - name: appconfig
      configMap:
        name: insight-application
        items: 
          - key: registry-application.yml
            path: application.yml
  restartPolicy: Never
---
apiVersion: v1  
kind: Service 
metadata:  
  name: eureka
  labels:  
    ccb: eureka 
spec:  
  ports: 
  - port: 8082
    targetPort: 8082 
    protocol: TCP
    nodePort: 30000
  type: NodePort
  selector:  
    ccb: eureka


LoadBalancer
分配一个内部集群IP地址,并在每个节点上启用一个端口来暴露服务。
除此之外,Kubernetes会请求底层云平台上的负载均衡器,将每个Node([NodeIP]:[NodePort])作为后端添加进去。

LoadBalancer只适用于云平台,AWS默认就支持,阿里云社区开发也支持

3、Service代理模式
service有三组代理模式:userspace、iptables和ipvs

常用命令

kubectl get svc -o widekubectl describe pod nginx-deployment-6dd86d77d-kxkmt   #注意命名空间

来源:https://nicksors.cc/2019/06/21/kubernetes系列之《Service》.html

三、定义pod

apiVersion: v1
kind: Podmetadata: 
    name: eureka  
     labels:    
     ccb: eurekaspec:
    containers:    - name: test-container      image: eureka      ports:         - name: eureka          containerPort: 8082          protocol: TCP     
 imagePullPolicy: Never  #使用本地镜像     
 volumeMounts:     
 - name: appconfig      
  mountPath: /jar/application.yml      
  subPath: application.yml  
volumes:    - name: appconfig  
    configMap:        name: insight-application       
 items:           - key: registry-application.yml        
    path: application.yml 
 restartPolicy: Never
---apiVersion: v1  
kind: Service metadata: 
   name: eureka  
labels:      ccb: eureka
 spec: 
   ports:   - port: 8082  #集群开放的的端口  
  targetPort: 8082  #后端容器开放的端口   
 protocol: TCP   
 nodePort: 30000   #宿主机开放的端口,范围大于30000  
type: NodePort      #指定service类型为暴露物理节点的端口,必须 
 selector:      ccb: eureka       #service 管理的pod


1、创建pod流程

用户通过kubectl命令创建一个Pod的流程:
客户端提交创建请求,可以通过API Server的Restful API,也可以使用kubectl工具,支持json和yaml格式;
Api Server处理用户请求,存储Pod信息数据到etcd集群中;
Scheduler调度器通过API Server查看未绑定的Pod,尝试为Pod进行分配主机,通过调度算法选择主机后,绑定到这台机器上并且把调度信息写入etcd集群;
kubelet根据调度结果执行Pod创建操作,成功后将信息通过Api Server更新到etcd集群中;

整个Pod创建过程完成,每个组件都在于Api Server进行交互,Api Server就是k8s集群的中间者,组件之间的协同者,是一个集群访问入口

2、Pod的多种控制器
ReplicaSet: 代用户创建指定数量的pod副本数量,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能。
ReplicaSet主要三个组件组成:
用户期望的pod副本数量
标签选择器,判断哪个pod归自己管理
当现存的pod数量不足,会根据pod资源模板进行新建帮助用户管理无状态的pod资源,精确反应用户定义的目标数量,但是RelicaSet不是直接使用的控制器,而是使用Deployment。

Deployment:工作在ReplicaSet之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回滚功能,还提供声明式配置。 参考文章:https://blog.csdn.net/bbwangj/article/details/82011573

DaemonSet:用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现系统级后台任务,比如ingress,elk.服务是无状态的,服务必须是守护进程。参考文章:https://www.cnblogs.com/xzkzzz/p/9553321.html

Job:只要任务或程序运行完成就立即退出,不需要重启或重建。 参考文章:https://blog.csdn.net/bbwangj/article/details/82011610

Cronjob:周期性任务控制,执行后就退出, 不需要持续后台运行, 参考文章:https://blog.csdn.net/bbwangj/article/details/82867830

StatefulSet:管理有状态应用,比如redis,mysql

3、POD管理
# 创建Pod资源$ kubectl create -f pod.yaml#

查看pods$ kubectl get pods nginx-pod#

查看pod描述$ kubectl describe pod/nginx-pod#

更新资源$ kubectl apply -f pod.yaml#

删除资源$kubectl delete -f pod.yamlor$kubectl delete pods nginx-pod

4、资源限制

apiVersion: v1
kind: Podmetadata:  
name: nginx-pod  
labels:   
 app: nginxspec: 
 containers:  - name: nginx    image: nginx    
resources: # 资源限制标签      
requests:        
 memory: "64Mi"        
cpu: "250m"      
limits:       
 memory: "128Mi"       
 cpu: "500m"

requests和limits都是做资源限制的,他们的区别在于:
requests # pod在创建时向k8s请求的资源大小;
limits # 限制了这个Pod运行的最大资源空间;

5、调度约束
Pod.spec.nodeName # 强制约束Pod调度到指定Node节点上
Pod.spec.nodeSelector # 通过lable-selector机制选择节点

apiVersion: v1
kind: Podmetadata:  
name: nginx-pod  
labels:    app: nginxspec:  # nodeName:node01  
nodeSelector:    env_role: dev  
containers:  - name: nginx    image: nignx


通过label给Node主机设置标签:
kubectl label nodes k8s-node-129 env_role=dev

通过–show-labels查看Node的标签:
$ kubectl get node --show-labels

6、重启策略
Always: 当容器停止,总是重建容器,默认策略。
OnFailure: 当容器异常退出(退出状态码非0)时,才重启容器。
Never:当容器终止退出,从不重启容器。

apiVersion: v1kind: Podmetadata:  name: nginx-pod  labels:    app: nginxspec:  containers:  - name: nginx    image: nginx  restartPolicy: OnFailure

7、镜像拉取策略
IfNotPresent:默认值,镜像不存在宿主机上时才拉取
Always:每次创建Pod时都会重新拉取一次镜像
Never:Pod永远不会主动拉取这个镜像

apiVersion: v1kind: Podmetadata:  name: nginx-pod  labels:    app: nginxspec:  containers:  - name: nginx    image: nginx    imagePullPolicy: IfNotPresent

8、健康检查
提供Probe机制,有以下两种类型:

livenessProbe如果检查失败,将容器杀死,根据Pod的restartPolicy来操作。readinessProbe如果检查失败,Kubeneres会把Pod从service endpoints中剔除。

robe支持以下三种检查方法:
httpGet
发送HTTP请求,返回200-400范围状态码为成功。
exec
执行Shell命令返回状态码是0为成功。
tcpSocket
发起TCP Socket建立成功。

9、问题定位
kubectl describe type/namekubectl logs type/name [-c container]kubectl exec --namespace=xxx  -it pod  -C  容器名称   --   bash
1
来源:https://nicksors.cc/2019/06/18/kubernetes系列之《Pod》.html

10、快速生成YAML文件
1、命令生成

$ kubectl run --image=nginx my-deploy -o yaml --dry-run >my-deploy.yaml$ kubectl create -f deploy-nginx.yaml -o yaml --dry-run >my-deploy.yaml$ kubectl create -f deploy-nginx.yaml -o json --dry-run >my-deploy.json  # 指定输出json格式– image # 指定模板镜像my-deploy # 运行标签名称–dry-run # 只测试运行,不会实际运行pod-o yaml # 指定输出格式

2、get导出
kubectl get deploy/my-deploy -o=yaml --export > my-deploy.yaml

3、查询Pod容器的字段资源内部文档
使用kubectl explain –help 查询pod字段内部说明

$ kubectl explain pods  # 每一个层级的指令都会有字段信息$ kubectl explain pods.spec$ kubectl explain pods.spec.containers
1
四、故障排查-k8s
查看Pod的状态
kubectl get pods
kubectl describe pods my-pod

监控Pod状态的变化
kubectl get pod -w

可以看到⼀个 namespace 中所有的 pod 的 phase 变化

查看 Pod 的⽇志
kubectl logs my-pod
kubectl logs my-pod -c my-container
kubectl logs -f my-pod
kubectl logs -f my-pod -c my-container

-f 参数可以 follow ⽇志输出

交互式 debug
kubectl exec my-pod -it /bin/bash
kubectl top pod POD_NAME --containers
————————————————
版权声明:本文为CSDN博主「梦想俱乐部」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_49724150/article/details/118249542

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Kubernetesk8s)是一个开源的容器编排平台,可以帮助用户自动化部署、扩展和管理容器化应用程序。Deployment是Kubernetes中的一种资源对象,用于定义应用程序的部署方式和更新策略。Deployment文件是一个YAML格式的文件,用于描述Deployment的配置信息。 Deployment文件中包含以下信息: 1. metadata:定义Deployment的名称、命名空间和标签等元数据信息。 2. spec:定义Deployment的规格,包括副本数、容器镜像、容器端口、环境变量、卷挂载等信息。 3. selector:定义Deployment管理的Pod的标签选择器。 4. strategy:定义Deployment的更新策略,包括滚动更新和重建更新两种方式。 5. template:定义Pod的模板,包括容器镜像、容器端口、环境变量、卷挂载等信息。 通过编写Deployment文件,可以方便地部署和管理容器化应用程序。同时,Deployment还支持滚动更新和回滚操作,可以保证应用程序的高可用性和稳定性。 ### 回答2: K8sKubernetes)是一款自动化容器部署、扩展和管理工具。在K8s中,部署文件非常重要,它描述了容器、服务和其他软件资源的相关信息。因此,学习K8s deployment文件非常必要。在这份文章中,我们将详细讨论K8s deployment文件的所有内容。 Deployment文件的结构 一个Deployment文件包含以下几个方面: - API版本:deployment文件使用的API版本,通常为“ apps / v1”。 - 种类:Deployment文件的种类为“ Deployment”。 - Metadata:Deployment文件的metadata部分,包括名称和标签等信息。 - Spec:deployment的spec部分,它描述了所需容器的相关信息。 - Selector:用于匹配Deployment的Label Selector,以便与Pod匹配,默认为与Deployment的labels相同。 Deployment文件常用的字段 - replicas:指定所需的副本数。 - strategy:指定更新策略,即RollingUpdate和Recreate。 - template:包含必须部署的Pod的origin templateK8s deployment的常用命令 - kubectl create -f deployment.yaml:创建名为“ deployment.yaml”的部署文件。 - kubectl get deployments:获取所有的deployment列表。 - kubectl describe deployment <deployment-name>:获取指定deployment的详细信息。 - kubectl rollout status deployment/<deployment-name>:查看指定deployment的滚动更新进度。 - kubectl apply -f deployment.yaml:更新容器或修改其他的Deployment属性。 总结 Deployment文件是Kubernetes管理容器的关键部分之一。它描述了所需的容器、服务和其他资源信息,可以在多个节点上实现自动化部署和扩展容器的能力。在实践中,我们可以通过运行常用的Kubernetes命令,如kubectl命令,轻松创建、管理和更新Deployment文件。掌握K8s deployment文件的知识,对于容器化应用程序的管理和部署至关重要。 ### 回答3: K8sKubernetes)是一个开源的自动化容器编排系统,可以管理容器化应用程序的部署、维护和扩展。在K8s中,Deployment是一种资源类型,用于管理Pod的创建和更新。Deployment文件中定义了需要创建的Pod副本数、镜像、容器端口、存储卷等信息。本文将详细介绍K8s Deployment文件的各个部分。 1. kind kind定义了Deployment文件中资源类型,用于告诉K8s这是一个Deployment资源。在文件中,kind应该始终是“Deployment”。 2. apiVersion apiVersion指定K8s API的版本,用于指定Deployment资源对象的API版本。在文件中,应将其设置为“apps/v1”。 3. metadata metadata用于定义Deployment对象的名称、标签、注释和命名空间等元数据。其中,name是必须的,用于标识一个Deployment对象。labels是可选的,用于让容器可以选择某个Deployment对象。namespace是可选的,可以将Deployment对象放在指定的命名空间中。 4. spec spec是Deployment的主要部分,用于描述部署的策略和要创建的Pod模板spec包括以下几个部分: - replicas:定义需要创建的Pod的副本数量。 - selector:用于标识Deployment可以控制的Pod的标签。 - template:定义要创建的Pod的模板,包括容器使用的镜像、容器端口和环境变量等信息。 5. strategy strategy定义了Deployment的更新策略。可以选择RollingUpdate和Recreate两种策略。RollingUpdate逐步替换Pod,使应用程序在更新过程中保持可用。Recreate先删除所有旧的Pod然后再创建新的Pod。 6. template template定义了将创建的Pod的容器和存储等详细信息。Pod的模板定义包括以下几个部分: - metadata:定义Pod的名称、标签和注释等元数据。 - spec:定义Pod所包含的所有容器的详细信息,包括容器的镜像、命令、容器端口和存储等信息。 在K8s中,Deployment文件是非常重要的一部分。使用定义良好的Deployment文件可以使部署和更新应用程序变得快速和容易,并减少因配置错误而导致的故障。以上是K8s Deployment文件的详细介绍,希望能帮助读者更好地理解K8s Deployment的使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值