Kubernets 1.22 集群安装

从kubernetes 1.22开始,kubernetes正式不再支持docker作为其容器运行时,本篇文档,我们使用containerd作为其运行时,用kubeadm部署一个单master的kubernetes集群

整个安装过程分为如下几个步骤:

  • 环境说明
  • 集群部署
  • 安装add-ons
  • 集群维护
  • 附录

环境说明

  • 各组件部署示意图:

  • 相关部署环境
主机名内网ip地址节点类型系统版本
k8s01192.168.0.248master、etcdCentOS 7.6 64bit
k8s02192.168.0.93workerCentOS 7.6 64bit
k8s03192.168.0.120workerCentOS 7.6 64bit
  • 相关部署组件
组件版本说明
kubernetes1.22主程序
containerd1.4容器运行时
calico3.20网络插件
etcd3.5数据库
coredns1.8dns组件

集群部署

集群部署分为如下四个部分:

  • 环境准备
  • 部署master
  • 安装网络插件
  • 添加worker节点

环境准备

准备工作需要在所有节点上操作,包含的过程如下:

  • 配置主机名
  • 添加/etc/hosts
  • 清空防火墙
  • 关闭selinux
  • 配置时间同步
  • 配置内核参数
  • 加载ip_vs内核模块
  • 安装ipvs管理工具
  • 安装Docker
  • 安装kubelet、kubectl、kubeadm
  • 修改主机名:
# 以一个节点为例
# k8s01
hostnamectl set-hostname k8s01 --static
# k8s02
hostnamectl set-hostname k8s02 --static
# k8s03
hostnamectl set-hostname k8s03 --static
  • 添加/etc/hosts:
# k8s01
echo "192.168.0.180 k8s01" >> /etc/hosts
# k8s02
echo "192.168.0.41 k8s02" >> /etc/hosts
# k8s03
echo "192.168.0.241 k8s03" >> /etc/hosts
  • 清空防火墙规则和selinux:
iptables -F
setenforce 0 
sed -i 's/SELINUX=/SELINUX=disabled/g' /etc/selinux/config
  • 设置yum源:
wget -O /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-reg.repo
yum install -y epel-release
sed -i "s/#baseurl/baseurl/g" /etc/yum.repos.d/epel.repo
sed -i "s/metalink/#metalink/g" /etc/yum.repos.d/epel.repo
sed -i "s@https\?://download.fedoraproject.org/pub@https://repo.huaweicloud.com@g" /etc/yum.repos.d/epel.repo
  • 配置时间同步:
yum install -y chrony -y 
systemctl enable --now chronyd 
chronyc sources
  • 关闭swap:

默认情况下,kubernetes不允许其安装节点开启swap,如果已经开始了swap的节点,建议关闭掉swap
#临时禁用swap
**swapoff -a **
#修改/etc/fstab,将swap挂载注释掉,可确保节点重启后swap仍然禁用
#可通过如下指令验证swap是否禁用:
free -m # 可以看到swap的值为0
total used free shared buff/cache available
Mem: 7822 514 184 431 7123 6461
Swap: 0 0 0

  • 修改内核参数:

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
vm.swappiness = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
fs.may_detach_mounts = 1
EOF
sysctl -p /etc/sysctl.d/k8s.conf

如果出现sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No Such file or directory这样的错误,可以忽略

bridge-nf 使 netfilter 可以对 Linux 网桥上的 IPv4/ARP/IPv6 包过滤。比如,设置net.bridge.bridge-nf-call-iptables=1后,二层的网桥在转发包时也会被 iptables的 FORWARD 规则所过滤。常用的选项包括:

  • net.bridge.bridge-nf-call-arptables:是否在 arptables 的 FORWARD 中过滤网桥的 ARP 包
  • net.bridge.bridge-nf-call-ip6tables:是否在 ip6tables 链中过滤 IPv6 包
  • net.bridge.bridge-nf-call-iptables:是否在 iptables 链中过滤 IPv4 包
  • net.bridge.bridge-nf-filter-vlan-tagged:是否在 iptables/arptables 中过滤打了 vlan 标签的包。
  • fs.may_detach_mounts:centos7.4引入的新内核参数,用于在容器场景防止挂载点泄露

image.png

  • 加载内核模块:
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- br_netfilter
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules && \
bash /etc/sysconfig/modules/ipvs.modules && \
lsmod | grep -E "ip_vs|nf_conntrack_ipv4"

这些内核模块主要用于后续将kube-proxy的代理模式从iptables切换至ipvs

image.png

  • 安装ipvs管理工具

yum -y install -y ipset ipvsadm

  • 安装containerd:

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i ‘s+download.docker.com+mirrors.aliyun.com/docker-ce+’ /etc/yum.repos.d/docker-ce.repo
yum install -y containerd.io cri-tools
#生成containerd的配置文件
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
#修改vi /etc/containerd/config.toml配置文件以下内容:

[plugins]

[plugins.“io.containerd.grpc.v1.cri”]

#sandbox_image = “k8s.gcr.io/pause:3.2”
sandbox_image = “registry.aliyuncs.com/google_containers/pause:3.5”

[plugins.“io.containerd.grpc.v1.cri”.containerd.runtimes]

[plugins.“io.containerd.grpc.v1.cri”.containerd.runtimes.runc.options]**
SystemdCgroup = true #对于使用 systemd 作为 init system 的 Linux 的发行版,使用 systemd 作为容器的 cgroup driver 可以确保节点在资源紧张的情况更加稳定
[plugins.“io.containerd.grpc.v1.cri”.registry]
[plugins.“io.containerd.grpc.v1.cri”.registry.mirrors]
[plugins.“io.containerd.grpc.v1.cri”.registry.mirrors.“docker.io”]
endpoint = [“https://pqbap4ya.mirror.aliyuncs.com”]
[plugins.“io.containerd.grpc.v1.cri”.registry.mirrors.“k8s.gcr.io”]
endpoint = [“https://registry.aliyuncs.com/k8sxio”]

#重启containerd
systemctl enable containerd --now
systemctl restart containerd
#验证containerd
ctr version

  • 安装kubeadm、kubelet、kubectl:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

yum list kubeadm --showduplicates
yum install -y kubelet-1.22.0 kubeadm-1.22.0 kubectl-1.22.0
systemctl enable kubelet --now # # 注意: 在这里kubelet是无法正常启动的,只是确保其可以开机自启

部署master

部署master,只需要在master节点上配置,包含的过程如下

  • 生成kubeadm-config.yaml文件
  • 编辑kubeadm-config.yaml文件
  • 根据配置的kubeadm-config.yaml文件部署master
  • 通过如下指令创建默认的kubeadm.yaml文件:
kubeadm config print init-defaults --component-configs KubeletConfiguration --component-configs KubeProxyConfiguration  > kubeadm.yaml
  • 修改kubeadm.yaml文件如下-需要设置5处配置
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
 advertiseAddress: 192.168.0.180  # 设置master节点的ip地址
  bindPort: 6443
nodeRegistration:
 criSocket: /run/containerd/containerd.sock # 设置containerd的连接套接字
  imagePullPolicy: IfNotPresent
 name: k8s01 # 指定master的主机名
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers  # 指定下载master组件镜像的镜像仓库地址
kind: ClusterConfiguration
kubernetesVersion: 1.22.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
 podSubnet: 10.244.0.0/16  # 指定pod ip的网段
scheduler: {}
  • 拉取镜像:
kubeadm config images pull --config kubeadm.yaml

image.png

  • 安装master节点:
kubeadm init --config kubeadm.yaml
  • 此时如下看到类似如下输出即代表master安装完成:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
  export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
 https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.0.180:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:cad3fa778559b724dff47bb1ad427bd39d97dd76e934b9467507a2eb990a50c7

image.png

  • 配置访问集群:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -u) $HOME/.kube/config

配置网络

在master完成部署之后,发现两个问题:

  1. master节点一直notready
  2. coredns pod一直pending

其实这两个问题都是因为还没有安装网络插件导致的,kubernetes支持众多的网络插件,详情可参考这里: https://kubernetes.io/docs/concepts/cluster-administration/addons/

  • 我们这里使用calico网络插件,安装如下,安装网络插件,也只需要在master节点上操作即可
curl https://docs.projectcalico.org/manifests/calico.yaml -O
kubectl apply -f calico.yaml

参考:https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises#install-calico-with-kubernetes-api-datastore-50-nodes-or-less

image.png

  • 部署完成后,可以通过如下指令验证组件是否正常:
    • 检查master组件是否正常:
# kubectl get pods -n kube-system
# kubectl get pods -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-58497c65d5-f48xk   1/1     Running   0          94s
calico-node-nh4xb                          1/1     Running   0          94s
coredns-7f6cbbb7b8-7r558                   1/1     Running   0          4m45s
coredns-7f6cbbb7b8-vr58g                   1/1     Running   0          4m45s
etcd-k8s01                                 1/1     Running   0          4m54s
kube-apiserver-k8s01                       1/1     Running   0          4m54s
kube-controller-manager-k8s01              1/1     Running   0          5m
kube-proxy-wx49q                           1/1     Running   0          4m45s
kube-scheduler-k8s01                       1/1     Running   0          4m54s

image.png

添加worker节点

在master节点上,当master部署成功时,会返回类似如下信息:

kubeadm join 192.168.0.180:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:cad3fa778559b724dff47bb1ad427bd39d97dd76e934b9467507a2eb990a50c7

由于我们使用的是containerd作为其容器运行时,在使用以上指令在worker节点执行前,还需要再加个参数,如下:

kubeadm join 192.168.0.180:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:cad3fa778559b724dff47bb1ad427bd39d97dd76e934b9467507a2eb990a50c7 \
    --cri-socket /run/containerd/containerd.sock

即可完成节点的添加

需要说明的是,以上指令中的token有效期只有24小时,当token失效以后,可以使用kubeadm token create --print-join-command生成新的添加节点指令

image.png

集群维护

这里主要包含两部分内容:

  • 集群重置
  • 集群升级

集群重置

在安装过程中,我们会遇到一些问题,这个时候可以把集群重置,推倒重来。

# 重置集群
kubeadm reset
# 停止kubelet
systemctl stop kubelet
# 删除已经部署的容器
crictl  --runtime-endpoint unix:///run/containerd/containerd.sock ps -aq |xargs crictl --runtime-endpoint unix:///run/containerd/containerd.sock rm 
# 清理所有目录
rm -rf /etc/kubernetes /var/lib/kubelet /var/lib/etcd /var/lib/cni/

集群升级

注意事项

  1. 使用kubeadm升级集群,不支持跨版本升级
  2. swap必须关闭
  3. 注意数据备份。虽然kubeadm upgrade操作不会触碰你的工作负载,只会更新kubernetes的组件,但任何时候,备份都是最佳实践。
  4. 节点更新完成后,其上的所有容器都会被重启

操作升级

1. 升级master节点

  • 检查可用的kubeadm版本
# ubuntu
apt update 
apt-cache madison kubeadm
# centos
yum list --showduplicates kubeadm --disableexcludes=kubernetes
  • 更新kubeadm软件包
# ubuntu
apt update
apt upgrade -y  kubeadm=1.22.1-00
# centos
yum update -y kubeadm-1.22.1-0
  • 排干要更新的节点:
# 这里以master节点为例
kubectl drain 192.168.0.180 --ignore-daemonsets
  • 创建升级计划:
kubeadm upgrade plan
  • 按照提示执行升级:
kubeadm upgrade apply v1.22.1
  • 看到如下提示,即说明升级完成:
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.22.1". Enjoy!
[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.
  • 将节点重新设置为可调度:
kubectl uncordon k8s01
  • 如果有多个master节点,升级其他Master节点, 直接执行如下操作即可:
kubeadm upgrade node
  • 升级kubelet和kubectl
# ubuntu
apt update
apt upgrade -y kubelet=1.22.1-00 kubectl=1.22.1-00
# centos
yum update -y kubelet-1.22.1-0 kubectl-1.22.1-0
  • 重启kubelet
systemctl daemon-reload
systemctl restart kubelet

2. 升级worker

# 在woker节点上升级kubeadm
yum upgrade kubeadm-1.22.1-0 -y
# 在master节点上排干要升级的worker节点
kubectl drain k8s02
# 在worker节点上执行升级操作
kubectl upgrade node 
# 在worker节点上更新kubelet和kubectl
yum upgrade kubelet-1.22.1-0 kubectl-1.22.1-0
# 重启worker节点上的kubelet
systemctl daemon_reload
systemctl restart kubelet
# 在master节点上取消worker节点的不可调度设置
kubectl uncordon k8s02

参考: https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/

附录

用于记录在操作过程中所出现的一些问题。

1. calico-node在master上无法启动问题

pod状态:

calico-node-hhl5j                          0/1     Running   0          3h54m

报错如下:

Events:
  Type     Reason     Age                       From     Message
  ----     ------     ----                      ----     -------
  Warning  Unhealthy  4m38s (x1371 over 3h52m)  kubelet  (combined from similar events): Readiness probe failed: 2021-08-07 09:43:25.755 [INFO][1038] confd/health.go 180: Number of node(s) with BGP peering established = 0
calico/node is not ready: BIRD is not ready: BGP not established with 192.168.0.41,192.168.0.241

解决方法:
调整calicao的网络插件的网卡发现机制,修改IP_AUTODETECTION_METHOD对应的value值。
默认情况下,官方提供的yaml文件中,ip识别策略(IPDETECTMETHOD)没有配置,即默认为first-found,这会导致一个网络异常的ip作为nodeIP被注册,从而影响node之间的网络连接。可以修改成can-reach或者interface的策略,尝试连接某一个Ready的node的IP,以此选择出正确的IP。
打开calico.yaml,找到CLUSTER_TYPE,配置项,在其下添加一个变量配置,示例如下:

# Cluster type to identify the deployment type
- name: CLUSTER_TYPE
  value: "k8s,bgp"
# 要添加的配置项
- name: IP_AUTODETECTION_METHOD
  value: "interface=eth0"

然后重新apply calico.yaml即可:

kubectl apply -f calico.yaml

2. podip网段问题

在kubernetes安装完成之后,我们检查coredns的ip地址,操作如下:

kubectl get pods -o wide -n kube-system |grep coredns

可能会看到coredns pod的地址为10.88.xx.xx网段, 但我们配置的podSubnet为10.244.0.0/16。这是因为containerd自带了一个cni配置: 10-containerd-net.conflist;同时可以看到宿主机上还有一个cni0的网桥。使用了这个网络配置的pod是无法跨主机通信的。所以我们需要执行如下操作删除该网络配置并删除该网桥:

mv /etc/cni/net.d/10-containerd-net.conflist /etc/cni/net.d/10-containerd-net.conflist.bak
ifconfig cni0 down && ip link delete cni0
systemctl daemon-reload
systemctl restart containerd kubelet

然后重建coredns即可:

kubectl get pods -n kube-system |grep coredns | awk '{print $1}'|xargs kubectl delete po -n kube-system
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要安装 Kubernetes 的 roles,可以使用 kubeadm 工具来完成。kubeadm 是一个 Kubernetes 集群的自动化部署工具,它能够轻松地在不同的环境中安装和配置 Kubernetes 集群。以下是使用 kubeadm 安装 Kubernetes roles 的一般步骤: 1. 准备环境 在开始安装前,需要先准备好必要的环境,例如: - 确认每个节点上的操作系统版本是否支持 Kubernetes - 安装 Docker 或其他容器运行时 - 确保网络正常工作,并配置好 DNS 2. 初始化主节点 使用 kubeadm init 命令初始化主节点,并指定所需的参数。例如: ``` sudo kubeadm init --pod-network-cidr=10.244.0.0/16 ``` 此命令将初始化主节点,并使用 Flannel CNI 插件指定网络地址空间。 3. 加入工作节点 在主节点初始化后,可以使用 kubeadm join 命令将工作节点加入到集群中。例如: ``` sudo kubeadm join <主节点IP地址>:6443 --token <token值> --discovery-token-ca-cert-hash sha256:<证书哈希值> ``` 此命令将工作节点加入到集群中,并使用指定的 token 值和证书哈希值进行身份验证。 4. 部署网络插件 安装 Kubernetes roles 后,需要部署网络插件以便容器之间可以通信。可以使用 kubectl apply 命令来安装所需的网络插件。例如: ``` kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml ``` 此命令将安装 Flannel CNI 插件。 5. 部署 Kubernetes roles 现在已经可以在 Kubernetes 集群中部署角色。可以使用 kubectl apply 命令来部署 YAML 文件,该文件描述了要部署的 Kubernetes roles。例如: ``` kubectl apply -f deployment.yaml ``` 此命令将使用 deployment.yaml 文件中的配置信息部署 Kubernetes roles。 以上就是使用 kubeadm 安装 Kubernetes roles 的一般步骤。请注意,这只是一个概述,具体的步骤可能因环境而异。 ### 回答2: 在使用kubeadm安装Kubernetes时,可以使用以下roles来配置kubernetes集群: 1. master节点:该角色负责管理整个集群的控制平面。在安装kubeadm之后,可以通过运行"kubeadm init"命令将当前节点初始化为master节点。这个命令将会自动配置一个静态Pod,用于部署kube-apiserver、kube-controller-manager和kube-scheduler等组件。 2. worker节点:该角色负责运行容器和处理集群的工作负载。可以使用"kubeadm join"命令将worker节点加入到已初始化的master节点。这个命令会在worker节点上配置kubeletkube-proxy等组件,并将其连接到集群。 3. etcd节点:etcd是Kubernetes集群的分布式键值存储。在kubeadm安装过程中,etcd会被自动配置和部署在master节点上。如果需要单独配置etcd节点,可以使用"kubeadm init"命令的"--config"选项提供自定义的etcd配置文件。 此外,还可以使用其他的roles来实现特定的需求,例如: 4. ingress节点:该角色负责处理集群中的HTTP和HTTPS流量路由。可以通过部署Ingress Controller来实现该角色,常用的Ingress Controller有Nginx Ingress Controller和Traefik等。 5. storage节点:该角色负责提供分布式存储服务,以支持持久化卷的使用。可以通过部署分布式存储系统,如Ceph或GlusterFS来实现该角色。 以上是kubeadm安装Kubernetes时常见的角色配置,可以根据需要选择适合的角色。根据不同的场景和需求,还可以组合多个角色来构建一个弹性、高可用和可扩展的Kubernetes集群。 ### 回答3: kubeadm是用于在Kubernetes中部署和管理集群的一个工具。在安装Kubernetes时,可以使用kubeadm的配置文件来指定各种角色和组件的安装方式。 kubeadm的配置文件使用YAML格式编写,其中可以定义各个节点的角色。 首先,需要创建一个kubeadm的配置文件,例如"kubeadm-config.yaml"。 在配置文件中,我们可以指定master节点和worker节点的角色。通常,集群中需要一个master节点和多个worker节点。 对于master节点,可以使用以下配置: ``` apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration kubernetesVersion: 1.22.2 controlPlaneEndpoint: "MASTER_IP:6443" apiServer: certSANs: - "MASTER_IP" extraArgs: advertise-address: "MASTER_IP" runtime-config: "api/all=true" controllerManager: {} scheduler: {} etcd: local: imageRepository: "k8s.gcr.io" dataDir: "/var/lib/etcd" imageTag: "v3.5.0" ``` 其中,"MASTER_IP"需要替换为你的master节点的IP地址,在这里指定了该节点的角色为master。 对于worker节点,可以使用以下配置: ``` apiVersion: kubeadm.k8s.io/v1beta2 kind: JoinConfiguration discovery: bootstrapToken: apiServerEndpoint: "MASTER_IP:6443" token: "abcdef.1234567890" caCertHashes: - "sha256:ABCDEF1234567890" ``` 其中,"MASTER_IP"需要替换为你的master节点的IP地址,在这里指定了该节点的角色为worker。 根据实际情况,可以按照需求指定集群中的master节点和worker节点的数量和角色。配置文件中还可以设置其它参数,如Kubernetes的版本、网络配置、认证方式等。 保存好配置文件后,可以使用kubeadm init命令初始化master节点,然后使用kubeadm join命令将worker节点加入集群。 总之,kubeadm的配置文件中可以通过定义不同的配置来指定不同节点的角色,从而完成Kubernetes安装和部署。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

班婕妤

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

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

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

打赏作者

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

抵扣说明:

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

余额充值