kubernetes

第1章Kubernetes简介

1.1背景介绍

  • 传统部署方案:
    早期应用程序是部署在物理服务器上的,无法为物理服务器中的应用程定义资源边界,这会导致资源分配出现问题。例如物理服务器运行多个应用程序,其中一个应用程序占用大部分资源的情况,会导致其他应用程序型性能降低。 于是可以在不同的物理服务器上运行每个应用程序,但是由于资源利用不足无法扩展,并且组织维护许多物理服务器的成本很高。

  • 虚拟化部署方案:
    允许单个物理服务器上创建多个虚拟机,不同虚拟机在 VM之间隔离,提高安全性。但是虚拟机同时使用很多系统资源,同样造成浪费。

  • 容器部署方案:
    使用容器的方式部署应用,达到资源隔离的同时充分利用了系统资源。但是做容器集群时,由于服务器数量多,根据各服务器自己状态来安排部署,认为计算难以实现,所以提出使用Kubernetes的容器集群编排部署工具。

1.2Kubernetes概述

Kubernetes是google的开源的容器编排调度引擎,使用Go语言开发,最初源于google内部的Brog引擎。更新速度快,基本一个月已更新,目前已经到了2.0版本,但是国内大部分企业还在使用1.14和1.18的版本。它是第一个加入CNCF(云原生计算基金会)的应用。
Kubernetes是一个可移植、可扩展的开源Docker容器编排调度引擎,与docker容器结合一起,可以实现容器技术的分布式架构方案。主要用于自动化部署、扩展和管理容器类应用、提供资源调度、部署管理、服务发现、扩容缩容、监控等功能。它提供完善的管理工具,涵盖开发、部署测试、运维监控等各个环节。
它就提供了一个应用范围,用户可以描述集群架构,定义服务的最终状态,它会使系统达到并维持这个状态。对负载均衡、服务发现、高可用、滚动升级、自动伸缩等容器云平台功能的原生支持。
Kubernetes系统正是为云原生应用设计考虑。使得服务简单易用。通过使用Labels(标签)和Pods(荚)的概念,将应用按逻辑单元进行分组,方便管理和服务发现。

  • 官网:https://www.Kubernetes.io
  • 官方中文文档:https://Kubernetes.io/zh/docs/home/

1.3Kubernetes好处

  • 具备微服务架构:
    微服务架构核心是将一个巨大的单体应用分解为很多个小的相互连接的微服务,达到很好的解耦效果。每个微服务独立开发、升级、扩展,使得系统具备很高的稳定性和快速迭代进化能力。

  • 具备超强横向扩容能力
    可以从只有几个小Node集群平滑扩展到拥有成百上千node的大规模集群。

1.4Kubernetes服务功能

  • 数据卷:pod中容器想要共享数据,可以使用数据卷。
  • 应用程序监控检查:容器内进程可能阻塞无法处理请求,可以设置监控检查策略保证系统健康性。
  • 弹性伸缩:根据设定的指标(cpu利用率),自动缩放pod副本数。
  • 服务发现:使用环境变量或DNS服务插件保证程序发现pod入库访问地址。
  • 负载均衡:一组pod分配一个私有IP地址,负载均衡转发请求到后端容器。集群内其他pod可以通过这个cluster ip访问应用。
  • 滚动更新:更新服务不中断,一次更新一个pod,而不是同时删除整个服务。类似于灰度发布。
  • 服务编排:通过文件描述部署服务,使得应用程序部署变得更高效。
  • 资源监控:node节点集成Cadvisor资源收集工具,可以通过Heapster汇总整个集群节点资源数据,然后存储到Influxdb时序数据库,再由Granfana展示。
  • 提供认证和授权:支持角色访问控制。

1.5Kubernetes服务特点

  • 服务发现和负载均衡:可以使用DNS或自己IP公开容器,若容器流量很大,它可以负载均衡分配流量,保证服务部署的稳定性。
  • 存储编排:允许自动挂载选择的存储系统,比如本地存储、公共云服务商等。
  • 自动部署和回滚:可以描述已部署容器的所需状态,可以以受控速率将实际状态更改为所需状态。
  • 自动二进制打包:可以指定每个容器所需cpu和内存,容器进行资源请求时,可以做出更好的决策管理容器资源。
  • 自我修复:重启事变的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并在准备好服务之前不将其通告给客户端。
  • 密钥与配置管理:可以存储和管理敏感信息,例如密码、OAuth令牌、和ssh密钥,可以再不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

1.6Kubernetes应用场景

  • 快速部署应用
  • 快速扩展应用
  • 无缝对接新的应用功能
  • 节省资源,优化硬件资源的使用

1.7Kubernetes适应场景

  • 可移植:支持公有云、私有云、混合云、多重云
  • 可扩展:模块化、插件化、可挂载、可组合
  • 自动化:自动部署、自动重启、自动复制、自动伸缩/扩展

1.8Kubernetes架构

在这里插入图片描述
在这里插入图片描述
kuberctl (user commands)
master组件:

  • Kube-apiserver:暴露kubernetes API接口,任何资源请求,调用通过这个接口进行。
  • Scheduler:调度、分配pods位置
  • Controller Manager:控制管理器,包括replication controller等(保障用户状态)
  • etcd:非关系型数据库(默认存储)
    Controller Manager:
  • Node Controller:节点控制器,检查node节点
  • Replication Controller:维护正常数量的pod
  • Endpoints Controller:填充端点对象,(连接service和pods)
  • Service Account & Token Controller:创建默认账户和API访问令牌
    在这里插入图片描述
    Node组件:
  • kuberlet:响应APIserver下发任务
  • proxy:代理,负责通讯和负载均衡
  • Docker Engine:负责本机容器创建和管理

1.9注意事项

master节点可以在任意服务器部署,但是建议使用独立服务器,并且做好高可用(两种部署方式)。master对于硬件要求不高,因为只派发任务,node对硬件要求高,需要跑真实服务。Node宕机,上面的其他节点会被master转移到其他node节点上,node还支持动态添加。

1.10插件

  • DNS:域名解析
  • Dashboard:提供web界面(大多二次开发)

1.11资源对象

Kubernetes中包含多种资源对象:Pod、Replication Controller、Service、Deployment、Job、DaemonSet等。所有资源对象而可以通过kuberctl工具进行增删改查工作,并将其保存在Etcd中持久化存储。Kubernetes是个高度自动化的资源控制系统,通过跟踪对比Etcd存储里保存的资源期望状态与当前环境中的实际资源状态的差异,实现自动控制和自动纠错等高级功能。

  • Pod:(豆荚)是创建和部署最小和最基本的单位,一个pod代表正在运行1个进程。1个pod由一个或多个容器构成。每个pod中都要有一个根容器pause。
  • Label:(标签)是一个键值对,用于筛选。可以给各个功能打标签,更多是给pod打标签,一个标签可以给多个实例打,一个实例亦可以打多个标签。实际中多用于分组管理。
  • ReplicaSet:replication controller升级版,管控pod数量的。rc与rs唯一区别就是rs支持基于集合的标签。
  • Deployment:部署,像创建、删除、升级这样的部署操作。
  • Service:对已打标签的分组的pod的组对外暴露端口进行通信。(label更多给service准备的)
  • Job:一个业务
  • DaemonSet:守护程序集
  • Volume:数据卷,共享pod中容器使用的数据
  • Namespace:命名空间
  • StatefulSet:适合持久性应用程序,有唯一网络标识符。

1.12kubernetes集群

Kubernetes集群中,首先要保证Node节点有要运行的应用的镜像文件。通过Deployment配置文件描述应用名字、镜像名字、运行几个实例、需要多少内存资源、cpu资源。Deployment配置文件是一个yaml文件,可以使用模板定义。使用kubectl create -f xxx.yaml或kubectl apply -f xxx.yaml命令来进行部署。
运行流程 :

  • 管理员 --> kubectl --> deployment(nginx.yaml) --> label --> service --> pod --> container

第2章Kubernetes集群安装

2.1安装方式

  • minikube:一键安装,体验版
  • 二进制包:组件部署,证书安装都要自己搞(比较麻烦但是实用)
  • kubeadm:对比二进制包相当于yum安装的感觉(kubeadm init初始化master节点,kubeadm join 添加node节点)

2.2环境

操作系统 IP 主机名 组件
centos7 192.168.9.7 master kubeadm、kubectl、kubelet、docker-ce
centos7 192.168.9.8 node1 kubeadm、kubectl、kubelet、docker-ce
centos7 192.168.9.9 node2 kubeadm、kubectl、kubelet、docker-ce

2.3kubeadm安装具体操作

2.3.1安装步骤纯享版:

1)所有主机禁用防火墙和selinux
setenforce 0
iptables -F
systemctl stop firewalld
systemctl disable firewalld
systemctl stop NetworkManager
systemctl disable NetworkManager
sed -i ‘/^SELINUX=/s/enforcing/disabled/’ /etc/selinux/config
2)配置主机名并绑定hosts,不同主机名称不同
hostnamectl set-hostname k8s-master
bash
hostnamectl set-hostname k8s-node01
bash
hostnamectl set-hostname k8s-node02
bash
cat << EOF >> /etc/hosts
192.168.9.7 k8s-master
192.168.9.8 k8s-node01
192.168.9.9 k8s-node02
EOF
scp /etc/hosts 192.168.9.8:/etc/hosts
scp /etc/hosts 192.168.9.9:/etc/hosts
vim /etc/resolv.conf
223.5.5.5
scp /etc/resolv.conf 192.168.9.8://etc/resolve.conf
scp /etc/resolv.conf 192.168.9.9://etc/resolve.conf
3)主机配置初始化
yum -y install vim wget net-tools lrzsz
swapoff -a
sed -i ‘/swap/s^/#/’ /etc/fstab
cat << EOF >> /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
modprobe br_netfillter
sysctl -p
4)所有部署docker
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum -y install yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce-repo
yum clean all && yum makecache fast
yum -y install docker-ce
systemctl start docker
systemctl enable docker
cat << END > /etc/docker/daemon.json
{
“registry-mirrors”:[“https://nyakyfun.mirror.aliyuncs.com”]  
}
END
systemctl daemon-reload
systemctl restart docker
5)配置阿里kubenetesyum源
cat << EOF > /etc/yum.repos.d/kubenetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
ls /etc/yum.repos.d/
scp /etc/yum.repos.d/kubernetes.repo 192.168.9.8:/etc/yum.repos.d/
scp /etc/yum.repos.d/kubernetes.repo 192.168.9.9:/etc/yum.repos.d/
6)所有主机安装kubelet、kubectl、kubeadm
yum -y install kubelet kubectl kubeadm
systemctl enable kubelet
7)主机配置初始化文件
kubeadm config print init-defaults > init-config.yaml
vim init-config.yaml
advertiseAddress:1.2.3.4  改成master主机地址
name:k8s-master  改成主机名或IP
imageRepositry:修改为registry.aliyuncs.com/google_containers
在scheduler:{}上面新增一行 podSubnet:10.244.0.0/16
8)安装master节点
kubeadm config images list --config init-config.yaml
kubeadm config images pull --config=init-config.yaml
上传tar包后导入
ls | while read line;
do
docker load < $line
done
kubeadm init --config=init-config.yaml
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
node节点:(有效期24小时)
kubeadm join 192.168.9.7:6443 --token abcdef.0123456789abcdef 
--discovery-token-ca-cert-hash sha256:d62ef433a9cbc006655904ed46d557ad1cb6b299e01f7392c
主机:
kubectl get node
9)安装flannel网络组件

master主机上传kube-flannel.yml,所有主机上传flannel包
所有节点:

docker load < flannel_v0.12.0-amd64.tar 

master主机:

kubectl apply -f  kube-flannel.yml
kubectl get nodes

在这里插入图片描述

2.3.2准备基础环境

[root@master ~]# vim /etc/hosts
192.168.9.7		master
192.168.9.8		node1
192.168.9.9		node2
[root@master ~]# scp /etc/hosts 192.168.9.8:/etc/
[root@master ~]# scp /etc/hosts 192.168.9.9:/etc/

2.3.3三台主机安装docker-ce

[root@docker ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@docker ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@docker ~]# yum makecache fastyum makecache fast
[root@docker ~]# yum -y install wget
[root@docker ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[root@docker ~]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
[root@docker ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@docker ~]# yum -y install docker-ce
[root@docker ~]# service docker start

sudo mkdir -p /etc/docker  //一般都有,就不用创建了
tee /etc/docker/daemon.json <<-'EOF' 
{
 "registry-mirrors": ["https://naa7mog3.mirror.aliyuncs.com"] 
}
 EOF
systemctl daemon-reload 
systemctl restart docker

docker info 查看

2.3.4Kubernetes集群部署

配置阿里云yum源

[root@master ~]# vim /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=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
[root@master ~]# scp /etc/yum.repos.d/kubernetes.repo 192.168.9.8:/etc/yum.repos.d/
[root@master ~]# scp /etc/yum.repos.d/kubernetes.repo 192.168.9.9:/etc/yum.repos.d/
[root@master ~]# yum -y install kubectl kubelet kubeadm  //安不上的话加上--nogpgcheck
[root@master ~]# systemctl enable kubelet  //因为没有node节点,所以暂时开启不了

2.3.5master节点配置init-config.yaml

在master节点从定向输出初始化配置文件。

[root@master ~]# kubeadm config print init-defaults > init-config.yaml

此外kubeadm config常用功能:

  • kubeadm config view:查看当前集群中的配置值
  • kubeadm config print join-defaults:输出kubeadm join 默认参数文件的内容
  • kubeadm config images pull:拉取镜像到本地
  • kubeadm config upload from-flags:由配置参数生成ConfigMap
    查看init-cnofig.yaml配置
[root@master ~]# cat init-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 1.2.3.4
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: master
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.20.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
scheduler: {}
不全,需要修改
[root@master ~]# vim init-config.yaml

在这里插入图片描述
在这里插入图片描述

[root@master ~]# kubeadm config images list --config init-config.yaml    //列出所需镜像

在这里插入图片描述

[root@master ~]# kubeadm config images pull --config init-config.yaml  //拉取镜像不做也行初始化会拉
这里自己导入了下载好的tar包
[root@master master]# ls | while read line
> do
> docker load < $line
> done
[root@master master]# kubeadm init --config=init-config.yaml   //初始化安装k8s
解决报错 
[root@master ~]# swapoff -a
[root@master ~]# vim /etc/fstab 
注释掉swap那一行,关机重启。
[root@master ~]# echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
[root@master master]# kubeadm init --config=init-config.yaml

在这里插入图片描述
按照推荐步骤执行。

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

到此,master环境完成。
kubeadm init过程详解:

  • init:指定版本进行初始化操作
  • preflight:初始化前的检查和下载所需要的Docker镜像文件
  • kubelet-start:生成kubelet的配置文件“/var/lib/kubelet/config.yaml”,没有这个文件kubelet无法启动。
  • certificates:生成kubernetes使用的证书,存放在/etc/kubernetes/pki中
  • kubeconfig:生成kubeconfig配置文件,存放在/etc/kubernetes目录,组件通讯需要使用对应文件。
  • control-plan:使用/etc/kubernetes/manifest目录下的yaml文件,安装master组件
  • etcd:使用/etc/kubernetes/manifest/eycd.yaml安装etcd服务
  • wait-control-plan:等待control-plan部署master组件启动
  • apiclient:检查master组件服务状态
  • uploadconfig:更新配置
  • kubelet:使用ConfigMap配置Kunelet
  • patchnode:更新CNI信息到node上,通过注释的方法记录。
  • mark-control-plan:为当前节点打标签,打了角色master,和不可调度标签,这样就不会使用master节点部署pod
  • bootstrap-token:生成token记录下来,后面使用kubeadm join向集群添加节点会用到
  • addons:安装附加组件CoreDNS和kubeproxy
  • kubeadm通过初始化安装是不包括网络插件的,也就是初始化之后不具备网络功能,在master节点查看信息都是no-reday状态。pod的CoreDNS都是无法提供服务的。

2.3.6安装Node节点

[root@node2 ~]# systemctl enable kubelet

node节点执行刚刚master节点初始化后两行内容进行添加。
在这里插入图片描述

kubeadm join 192.168.9.7:6443 --token abcdef.0123456789abcdef 
    --discovery-token-ca-cert-hash sha256:d62ef433a9cbc006655904ed46d557ad1cb6b299e01f7392c

如果报错,执行初始化错误解决方案。
还有报错,说token失效了

master节点重新生成jion命令:
[root@master ~]# kubeadm token list
[root@master ~]# kubeadm token create --print-join-command 

再在node节点复制就好了。

swapoff -a
$ kubeadm reset
$ systemctl daemon-reload
$ systemctl restart kubelet
$ iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X 

2.4二进制安装具体操作

2.5增加node节点

初始化操作,安装docker,配置yum源,下载组件,安装flannel

2.6删除node节点

master:
kubelctl delete node 192.168.9.9
node:
docker rm -f $(docker ps -aq)
systemctl stop kubelet
rm -rf /etc/kubernetes/*
rm -rf /var/lib/kubelet/*

2.7安装Dashboard UI

master:
wget https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended.yaml
docker pull kunernetesui/dashboard:v2.0.0
docker pull kubernetesui/metrics-scraper:v1.0.4
vim /recommended.yaml
40 type:NodePort
44 nodeport:32443
164 name:cluster-admin
kubectl apply -f recommended.yaml
kubectl get pods -n kube-system
kubectl get pods -n kubernetes-dashboard
kubectl get pods -A -o wide
访问测试:https://192.168.9.7:32443  token登录
生成token
kubectl describe secret -n kubernetes-dashboard $(kuberctl get secret -n kubernetes-dashboard | grep kubernetes-dashboard-token | awk{print $1}) | grep token | awk{print $2}
node节点安装metrics-server:
docker pull bluersw/metrics-server-amd64:v0.3.6
docker tag bluersw/metrics-server-amd:v0.3.6 k8s.gcr.io/metrics-server-amd64:v0.3.6
master节点:
vim /etc/kubernetes/manifets/kube-apiserver.yaml
44 - --enable-aggregator-routing=true
wget https://github/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml
vim components.yaml

在这里插入图片描述

kubectl create -f components.yaml
kubectl top nodes

2.8应用部署测试

kubectl run net-test --image=alpine --replicas=2 sleep 36000
kubectl create -f nginx-deployment.yaml
kubectl get deployment
kubectl get pod
kubectl describe pod nginx-deployment-xxxxxxx
kubectl get pods -o wide

第3章Kubernetes简单使用

3.1查看k8s环境是否起来了

kubectl get pods -o wide
kubectl get pods -n kube-system -o wide 

3.2命令使用

命令格式:

kubectl [command] [type][anme][flags]
kubectl --help  //查看命令列表

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

3.3创建容器

命令行方式:

kubectl run nginx-deployment --image=nginx:1.14 --port=80 --replicas=3
kubectl get pods

3.4发布服务

创建service:
kubectl expose deployment nginx-deployment --port=80 --target-port=80 --name=nginx-service --type=NodePort
kubectl get svc
kubectl get endpoints
kubectl get pods -o wide

3.5版本更新

kubectl get pods
kubectl exec nginx-deployment-xxxxxxxx -- nginx -v   //查看版本
kubectl get deployment,pods 
kubectl set image deployment.apps/nginx-deployment nginx-deployment=nginx:1.19  
kubectl get pods -w   //持续监听

3.6回滚

kubectl rollout history deployment.apps/nginx-deployment  //查看历史版本
kubectl rollout undo deployment.apps/nginx-deployment   //回滚
kubectl get pods
kubectl exec id -- nginx -v  //查看版本

3.7删除资源

kubectl get deploy
kubectl delete deployment/nginx-deployment
kubectl get deploy
kubectl get pods
kubectl get svc
kubectl delete svc/nginx-service

3.8查看资源使用情况

kubectl run nginx --image=nginx:latest --port=80 --replicas=3
kubectl get pod
kubectl describe pod id
kubectl descrinbe deployment/nginx

3.9执行容器命令

kubectl get pod
kubectl exec -it id bash

3.10yaml方式创建

写yaml文件要指定api版本
kubectl api-versions //查看api版本
创建deployment资源清单时先创建demo目录,存放yaml文件。

3.11命令方式转换yaml文件

kubectl create deployment tomcat --image=tomcat:8 -o yaml --dry-run > tomcat-deployment.yaml  //创建yaml文件
kubectl create -f  tomcat-deployment.yaml
kubectl get pod
kubectl expose deployment tomcat --port=8080 --target-port=8080 --type=NodePort -o yaml --dry-run > tomcat_service.yaml
kubectl create -f tomcat_service.yaml
kubectl get svc
kubectl get pod
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值