29、在GCP上使用Kubernetes:负载均衡、持久磁盘与集群搭建指南

GCP上Kubernetes负载均衡、磁盘与集群搭建

在GCP上使用Kubernetes:负载均衡、持久磁盘与集群搭建指南

1. 负载均衡

GCP提供了以下几种类型的负载均衡器:
- Layer 4 TCP LoadBalancer
- Layer 4 UDP LoadBalancer
- Layer 7 HTTP(S) LoadBalancer

其中,Layer 4负载均衡器(TCP和UDP)类似于AWS Classic ELB,而Layer 7 HTTP(S)负载均衡器则具有基于内容的路由功能。例如,URL/image会转发到实例a,其他所有请求将转发到实例b,更像是应用层的负载均衡器。AWS也提供了类似的应用负载均衡器(ALB或ELBv2)。

要设置负载均衡器,需要提前配置一些项目,具体如下表所示:
| 配置项 | 目的 |
| — | — |
| 实例组 | 确定一组VM实例或VM模板(OS镜像) |
| 健康检查 | 设置健康阈值(间隔、超时等)以确定实例组的健康状态 |
| 后端服务 | 为实例组设置负载阈值(最大CPU或每秒请求数)和会话亲和性(粘性会话),并将其与健康检查关联 |
| url-maps(负载均衡器) | 代表L7负载均衡器的实际占位符,关联后端服务并指向HTTP(S)代理 |
| 目标HTTP(S)代理 | 建立前端转发规则与负载均衡器之间的关系 |
| 前端转发规则 | 将目标HTTP代理与IP地址(临时或静态)和端口号关联 |
| 外部IP(静态) | (可选)为负载均衡器分配静态外部IP地址 |

1.1 设置实例组

在这个例子中,需要创建三个实例组:一个用于私有托管的Tomcat实例(8080/tcp),另外两个用于每个区域的公共HTTP实例。执行以下命令:

# 创建HTTP实例和Tomcat实例的实例组
$ gcloud compute instance-groups unmanaged create http-ig-us-west --zone us-west1-a
$ gcloud compute instance-groups unmanaged create http-ig-us-east --zone us-east1-c
$ gcloud compute instance-groups unmanaged create tomcat-ig-us-west --zone us-west1-a
# 因为Tomcat使用8080/tcp,创建一个名为tomcat:8080的新命名端口
$ gcloud compute instance-groups unmanaged set-named-ports tomcat-ig-us-west --zone us-west1-a --named-ports tomcat:8080
# 将现有VM实例注册到相应的实例组
$ gcloud compute instance-groups unmanaged add-instances http-ig-us-west --instances public-on-subnet-a --zone us-west1-a
$ gcloud compute instance-groups unmanaged add-instances http-ig-us-east --instances public-on-subnet-b --zone us-east1-c
$ gcloud compute instance-groups unmanaged add-instances tomcat-ig-us-west --instances private-on-subnet-a --zone us-west1-a

1.2 健康检查

执行以下命令设置标准设置:

# 为HTTP(80/tcp)的"/"创建健康检查
$ gcloud compute health-checks create http my-http-health-check --check-interval 5 --healthy-threshold 2 --unhealthy-threshold 3 --timeout 5 --port 80 --request-path /
# 为Tomcat(8080/tcp)的"/examples/"创建健康检查
$ gcloud compute health-checks create http my-tomcat-health-check --check-interval 5 --healthy-threshold 2 --unhealthy-threshold 3 --timeout 5 --port 8080 --request-path /examples/

1.3 后端服务

首先,创建指定健康检查的后端服务,然后为每个实例组添加阈值:HTTP和Tomcat的CPU利用率最高为80%,最大容量设置为100%。

# 为HTTP(默认)和命名端口tomcat(8080/tcp)创建后端服务
$ gcloud compute backend-services create my-http-backend-service --health-checks my-http-health-check --protocol HTTP --global
$ gcloud compute backend-services create my-tomcat-backend-service --health-checks my-tomcat-health-check --protocol HTTP --port-name tomcat --global
# 将HTTP实例组(us-west1和us-east1)添加到HTTP后端服务
$ gcloud compute backend-services add-backend my-http-backend-service --instance-group http-ig-us-west --instance-group-zone us-west1-a --balancing-mode UTILIZATION --max-utilization 0.8 --capacity-scaler 1 --global
$ gcloud compute backend-services add-backend my-http-backend-service --instance-group http-ig-us-east --instance-group-zone us-east1-c --balancing-mode UTILIZATION --max-utilization 0.8 --capacity-scaler 1 --global
# 将Tomcat实例组添加到Tomcat后端服务
$ gcloud compute backend-services add-backend my-tomcat-backend-service --instance-group tomcat-ig-us-west --instance-group-zone us-west1-a --balancing-mode UTILIZATION --max-utilization 0.8 --capacity-scaler 1 --global

1.4 创建负载均衡器

负载均衡器需要绑定my-http-backend-service和my-tomcat-backend-service。在这个场景中,只有/examples和/examples/*的流量将转发到my-tomcat-backend-service,其他所有URI的流量将转发到my-http-backend-service。

# 创建负载均衡器(url-map),将my-http-backend-service作为默认服务
$ gcloud compute url-maps create my-loadbalancer --default-service my-http-backend-service
# 添加/examples和/examples/*映射到my-tomcat-backend-service
$ gcloud compute url-maps add-path-matcher my-loadbalancer --default-service my-http-backend-service --path-matcher-name tomcat-map --path-rules /examples=my-tomcat-backend-service,/examples/*=my-tomcat-backend-service
# 创建与负载均衡器(url-map)关联的目标HTTP代理
$ gcloud compute target-http-proxies create my-target-http-proxy --url-map=my-loadbalancer
# 分配静态全局IP地址并检查分配的地址
$ gcloud compute addresses create my-loadbalancer-ip --global
$ gcloud compute addresses describe my-loadbalancer-ip --global
address: 35.186.192.6
creationTimestamp: '2018-12-08T13:40:16.661-08:00'
...
...
# 创建将静态IP与目标HTTP代理关联的转发规则
$ gcloud compute forwarding-rules create my-frontend-rule --global --target-http-proxy my-target-http-proxy --address 35.186.192.6 --ports 80

如果不指定 --address 选项,将创建并分配临时外部IP地址。

1.5 防火墙规则

创建负载均衡器后,发现私有主机没有允许Tomcat流量(8080/tcp)的防火墙规则,导致my-tomcat-backend-service的健康状态一直为0。需要添加一条防火墙规则,允许负载均衡器连接到私有子网。

# 添加一条允许负载均衡器连接到Tomcat(8080/tcp)的防火墙规则
$ gcloud compute firewall-rules create private-tomcat --network=my-custom-network --source-ranges 35.191.0.0/16,130.211.0.0/22 --target-tags private --allow tcp:8080

几分钟后,my-tomcat-backend-service的健康状态将变为1,此时可以通过Web浏览器访问负载均衡器。

2. 持久磁盘

GCE提供了一种名为持久磁盘(PD)的存储服务,类似于AWS EBS。可以在每个区域分配所需大小和类型(标准或SSD)的磁盘,并随时将其附加/分离到VM实例。

2.1 创建并附加持久磁盘

在创建PD之前,需要检查VM实例的位置。选择us-west1-a区域,并将PD附加到public-on-subnet-a实例。

# 列出VM实例
$ gcloud compute instances list
NAME                                           ZONE           MACHINE_TYPE PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP      STATUS
public-on-subnet-b                             us-east1-c     f1-micro 172.16.1.2   35.196.228.40    RUNNING
private-on-subnet-a                            us-west1-a     g1-small 10.0.1.2     104.199.121.234  RUNNING
public-on-subnet-a                             us-west1-a     f1-micro 10.0.1.3     35.199.171.31    RUNNING
# 在us-west1-a区域创建20GB的标准类型PD
$ gcloud compute disks create my-disk-us-west1-a --zone us-west1-a --type pd-standard --size 20
# 检查磁盘状态
$ gcloud compute disks list
NAME                                           ZONE           SIZE_GB  TYPE STATUS
public-on-subnet-b                             us-east1-c     10       pd-standard  READY
my-disk-us-west1-a                             us-west1-a     20       pd-standard  READY
private-on-subnet-a                            us-west1-a     10       pd-standard  READY
public-on-subnet-a                             us-west1-a     10       pd-standard  READY
# 将PD(my-disk-us-west1-a)附加到VM实例(public-on-subnet-a)
$ gcloud compute instances attach-disk public-on-subnet-a --disk my-disk-us-west1-a --zone us-west1-a

登录到public-on-subnet-a实例查看状态:

# 登录到public-on-subnet-a
$ ssh 35.199.171.31
Linux public-on-subnet-a 4.9.0-3-amd64 #1 SMP Debian 4.9.30-2+deb9u3 (2017-08-06) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Aug 25 03:53:24 2017 from 107.196.102.199
saito@public-on-subnet-a:~$ sudo su
root@public-on-subnet-a:/home/saito# dmesg | tail
[ 7377.421190] systemd[1]: apt-daily-upgrade.timer: Adding 25min 4.773609s random time.
[ 7379.202172] systemd[1]: apt-daily-upgrade.timer: Adding 6min 37.770637s random time.
[243070.866384] scsi 0:0:2:0: Direct-Access     Google   PersistentDisk   1 PQ: 0 ANSI: 6
[243070.875665] sd 0:0:2:0: [sdb] 41943040 512-byte logical blocks: (21.5 GB/20.0 GiB)
[243070.883461] sd 0:0:2:0: [sdb] 4096-byte physical blocks
[243070.889914] sd 0:0:2:0: Attached scsi generic sg1 type 0
[243070.900603] sd 0:0:2:0: [sdb] Write Protect is off
[243070.905834] sd 0:0:2:0: [sdb] Mode Sense: 1f 00 00 08
[243070.905938] sd 0:0:2:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[243070.925713] sd 0:0:2:0: [sdb] Attached SCSI disk

可以看到PD已附加到/dev/sdb。与AWS EBS类似,需要对该磁盘进行格式化。

3. Google Kubernetes Engine(GKE)

GCP提供了托管的Kubernetes服务GKE,它使用了一些GCP组件,如VPC、VM实例、PD、防火墙规则和负载均衡器。可以使用kubectl命令来控制GKE上的Kubernetes集群。

3.1 安装kubectl命令

如果尚未在本地机器上安装kubectl命令,可以通过Cloud SDK进行安装:

# 安装kubectl命令
$ gcloud components install kubectl

3.2 设置第一个Kubernetes集群

使用gcloud命令在GKE上设置Kubernetes集群,需要指定一些参数来确定配置。以下是启动GKE集群所需的参数:
| 参数 | 描述 | 值 |
| — | — | — |
| –machine-type | Kubernetes节点的VM实例类型 | f1-micro |
| –num-nodes | Kubernetes节点的初始数量 | 3 |
| –network | 指定GCP VPC | my-custom-network |
| –subnetwork | 如果VPC是自定义模式,指定GCP子网 | subnet-c |
| –zone | 指定单个区域 | asia-northeast1-a |
| –tags | 分配给Kubernetes节点的网络标签 | private |

执行以下命令启动Kubernetes集群:

# 创建Kubernetes集群
$ gcloud container clusters create my-k8s-cluster --machine-type f1-micro --num-nodes 3 --network my-custom-network --subnetwork subnet-c --zone asia-northeast1-a --tags private
# 几分钟后,检查节点状态
$ kubectl get nodes
NAME                                            STATUS    ROLES     AGE  VERSION
gke-my-k8s-cluster-default-pool-bcae4a66-mlhw   Ready     <none>    2m v1.10.9-gke.5
gke-my-k8s-cluster-default-pool-bcae4a66-tn74   Ready     <none>    2m v1.10.9-gke.5
gke-my-k8s-cluster-default-pool-bcae4a66-w5l6   Ready     <none>    2m v1.10.9-gke.5

由于指定了 --tags private 选项,Kubernetes节点VM实例具有私有网络标签,因此无法从公共互联网进行SSH或HTTP访问,但可以从具有公共网络标签的其他VM实例进行ping和SSH操作。

3.3 节点池管理

GKE将Kubernetes节点作为节点池进行管理,可以管理一个或多个附加到Kubernetes集群的节点池。

3.3.1 调整节点数量

可以使用以下命令将Kubernetes节点数量从3调整为5:

# 调整节点数量
$ gcloud container clusters resize my-k8s-cluster --size 5 --zone asia-northeast1-a
# 几分钟后,查看节点状态
$ kubectl get nodes
NAME                                            STATUS    ROLES     AGE  VERSION
gke-my-k8s-cluster-default-pool-bcae4a66-j8zz   Ready     <none>    32s v1.10.9-gke.5
gke-my-k8s-cluster-default-pool-bcae4a66-jnnw   Ready     <none>    32s v1.10.9-gke.5
gke-my-k8s-cluster-default-pool-bcae4a66-mlhw   Ready     <none>    4m v1.10.9-gke.5
gke-my-k8s-cluster-default-pool-bcae4a66-tn74   Ready     <none>    4m v1.10.9-gke.5
gke-my-k8s-cluster-default-pool-bcae4a66-w5l6   Ready     <none>    4m v1.10.9-gke.5
3.3.2 添加新的节点池

如果需要扩展节点容量,可以添加具有不同硬件配置的节点池。例如,添加一个包含两个g1-small(1.7 GB内存)VM实例的节点池:

# 创建并添加名为"large-mem-pool"的节点池
$ gcloud container node-pools create large-mem-pool --cluster my-k8s-cluster --machine-type g1-small --num-nodes 2 --tags private --zone asia-northeast1-a
# 几分钟后,查看节点状态
$ kubectl get nodes
NAME                                              STATUS    ROLES     AGE  VERSION
gke-my-k8s-cluster-default-pool-bcae4a66-j8zz     Ready     <none>    5m v1.10.9-gke.5
gke-my-k8s-cluster-default-pool-bcae4a66-jnnw     Ready     <none>    5m v1.10.9-gke.5
gke-my-k8s-cluster-default-pool-bcae4a66-mlhw     Ready     <none>    9m v1.10.9-gke.5
gke-my-k8s-cluster-default-pool-bcae4a66-tn74     Ready     <none>    9m v1.10.9-gke.5
gke-my-k8s-cluster-default-pool-bcae4a66-w5l6     Ready     <none>    9m v1.10.9-gke.5
gke-my-k8s-cluster-large-mem-pool-66e3a44a-jtdn   Ready     <none>    46s v1.10.9-gke.5
gke-my-k8s-cluster-large-mem-pool-66e3a44a-qpbr   Ready     <none>    44s v1.10.9-gke.5

现在,集群中共有七个CPU核心和6.4 GB内存,具有更大的容量。

3.3.3 使用nodeSelector指定节点

为了区分不同类型的节点池,可以使用Kubernetes标签 beta.kubernetes.io/instance-type 来指定所需的节点。例如,以下 nodeSelector 参数将强制nginx应用使用f1-micro节点:

# 查看nginx-pod-selector.yml文件
$ cat nginx-pod-selector.yml
apiVersion: v1
kind: Pod
metadata:
 name: nginx
spec:
 containers:
 - name: nginx
   image: nginx
 nodeSelector:
  beta.kubernetes.io/instance-type: f1-micro
# 部署Pod
$ kubectl create -f nginx-pod-selector.yml
pod "nginx" created
# 查看Pod状态
NAME      READY     STATUS              RESTARTS   AGE       IP        NODE
nginx     0/1       ContainerCreating   0          10s       <none>    gke-my-k8s-cluster-default-pool-bcae4a66-jnnw
3.3.4 删除节点池

如果不再需要某个节点池,可以使用以下命令删除默认节点池(5个f1-micro实例):

# 列出节点池
$ gcloud container node-pools list --cluster my-k8s-cluster --zone asia-northeast1-a
NAME            MACHINE_TYPE  DISK_SIZE_GB  NODE_VERSION
default-pool    f1-micro      100           1.10.9-gke.5
large-mem-pool  g1-small      100           1.10.9-gke.5
# 删除默认节点池
$ gcloud container node-pools delete default-pool --cluster my-k8s-cluster --zone asia-northeast1-a
# 几分钟后,查看节点状态
$ kubectl get nodes
NAME                                              STATUS    ROLES     AGE  VERSION
gke-my-k8s-cluster-large-mem-pool-66e3a44a-jtdn   Ready     <none>    9m v1.10.9-gke.5
gke-my-k8s-cluster-large-mem-pool-66e3a44a-qpbr   Ready     <none>    9m v1.10.9-gke.5

由于上述操作都在单个区域(asia-northeast1-a)进行,如果该区域发生故障,集群将无法正常工作。为了避免区域故障,可以考虑设置多区域集群。

4. 多区域集群设置的必要性与考虑

单区域(如asia - northeast1 - a)部署的Kubernetes集群存在单点故障风险,一旦该区域出现故障,整个集群将无法正常工作。为了提高集群的可用性和容错能力,有必要设置多区域集群。

4.1 多区域集群的优势

  • 高可用性 :当一个区域出现故障时,其他区域的节点仍能正常工作,保证服务的持续运行。
  • 容错能力增强 :可以更好地应对自然灾害、网络故障等问题,减少服务中断的时间。

4.2 多区域集群设置的注意事项

  • 网络配置 :需要确保不同区域之间的网络连通性,合理配置VPC和子网。
  • 负载均衡 :要考虑如何在不同区域的节点之间进行有效的负载均衡,以充分利用资源。
  • 数据同步 :如果涉及数据存储,需要保证不同区域之间的数据同步和一致性。

5. 总结与实践建议

5.1 负载均衡总结

在GCP上设置负载均衡器需要按照一定的步骤进行,包括创建实例组、进行健康检查、配置后端服务、创建负载均衡器和设置防火墙规则等。以下是设置负载均衡器的流程图:

graph LR
    A[创建实例组] --> B[健康检查]
    B --> C[后端服务配置]
    C --> D[创建负载均衡器]
    D --> E[防火墙规则设置]

具体操作步骤总结如下:
1. 创建实例组

# 创建HTTP实例和Tomcat实例的实例组
$ gcloud compute instance-groups unmanaged create http-ig-us-west --zone us-west1-a
$ gcloud compute instance-groups unmanaged create http-ig-us-east --zone us-east1-c
$ gcloud compute instance-groups unmanaged create tomcat-ig-us-west --zone us-west1-a
# 因为Tomcat使用8080/tcp,创建一个名为tomcat:8080的新命名端口
$ gcloud compute instance-groups unmanaged set-named-ports tomcat-ig-us-west --zone us-west1-a --named-ports tomcat:8080
# 将现有VM实例注册到相应的实例组
$ gcloud compute instance-groups unmanaged add-instances http-ig-us-west --instances public-on-subnet-a --zone us-west1-a
$ gcloud compute instance-groups unmanaged add-instances http-ig-us-east --instances public-on-subnet-b --zone us-east1-c
$ gcloud compute instance-groups unmanaged add-instances tomcat-ig-us-west --instances private-on-subnet-a --zone us-west1-a
  1. 健康检查
# 为HTTP(80/tcp)的"/"创建健康检查
$ gcloud compute health-checks create http my-http-health-check --check-interval 5 --healthy-threshold 2 --unhealthy-threshold 3 --timeout 5 --port 80 --request-path /
# 为Tomcat(8080/tcp)的"/examples/"创建健康检查
$ gcloud compute health-checks create http my-tomcat-health-check --check-interval 5 --healthy-threshold 2 --unhealthy-threshold 3 --timeout 5 --port 8080 --request-path /examples/
  1. 后端服务配置
# 为HTTP(默认)和命名端口tomcat(8080/tcp)创建后端服务
$ gcloud compute backend-services create my-http-backend-service --health-checks my-http-health-check --protocol HTTP --global
$ gcloud compute backend-services create my-tomcat-backend-service --health-checks my-tomcat-health-check --protocol HTTP --port-name tomcat --global
# 将HTTP实例组(us-west1和us-east1)添加到HTTP后端服务
$ gcloud compute backend-services add-backend my-http-backend-service --instance-group http-ig-us-west --instance-group-zone us-west1-a --balancing-mode UTILIZATION --max-utilization 0.8 --capacity-scaler 1 --global
$ gcloud compute backend-services add-backend my-http-backend-service --instance-group http-ig-us-east --instance-group-zone us-east1-c --balancing-mode UTILIZATION --max-utilization 0.8 --capacity-scaler 1 --global
# 将Tomcat实例组添加到Tomcat后端服务
$ gcloud compute backend-services add-backend my-tomcat-backend-service --instance-group tomcat-ig-us-west --instance-group-zone us-west1-a --balancing-mode UTILIZATION --max-utilization 0.8 --capacity-scaler 1 --global
  1. 创建负载均衡器
# 创建负载均衡器(url-map),将my-http-backend-service作为默认服务
$ gcloud compute url-maps create my-loadbalancer --default-service my-http-backend-service
# 添加/examples和/examples/*映射到my-tomcat-backend-service
$ gcloud compute url-maps add-path-matcher my-loadbalancer --default-service my-http-backend-service --path-matcher-name tomcat-map --path-rules /examples=my-tomcat-backend-service,/examples/*=my-tomcat-backend-service
# 创建与负载均衡器(url-map)关联的目标HTTP代理
$ gcloud compute target-http-proxies create my-target-http-proxy --url-map=my-loadbalancer
# 分配静态全局IP地址并检查分配的地址
$ gcloud compute addresses create my-loadbalancer-ip --global
$ gcloud compute addresses describe my-loadbalancer-ip --global
address: 35.186.192.6
creationTimestamp: '2018-12-08T13:40:16.661-08:00'
...
...
# 创建将静态IP与目标HTTP代理关联的转发规则
$ gcloud compute forwarding-rules create my-frontend-rule --global --target-http-proxy my-target-http-proxy --address 35.186.192.6 --ports 80
  1. 防火墙规则设置
# 添加一条允许负载均衡器连接到Tomcat(8080/tcp)的防火墙规则
$ gcloud compute firewall-rules create private-tomcat --network=my-custom-network --source-ranges 35.191.0.0/16,130.211.0.0/22 --target-tags private --allow tcp:8080

5.2 持久磁盘总结

GCE的持久磁盘(PD)类似于AWS EBS,提供了灵活的存储解决方案。设置持久磁盘的步骤如下:
1. 检查VM实例位置

$ gcloud compute instances list
  1. 创建持久磁盘
$ gcloud compute disks create my-disk-us-west1-a --zone us-west1-a --type pd-standard --size 20
  1. 检查磁盘状态
$ gcloud compute disks list
  1. 附加持久磁盘到VM实例
$ gcloud compute instances attach-disk public-on-subnet-a --disk my-disk-us-west1-a --zone us-west1-a
  1. 登录实例查看状态
$ ssh 35.199.171.31
sudo su
dmesg | tail

5.3 GKE集群总结

使用GKE可以方便地在GCP上设置和管理Kubernetes集群。以下是设置GKE集群的参数总结:
| 参数 | 描述 | 值 |
| — | — | — |
| –machine-type | Kubernetes节点的VM实例类型 | f1 - micro |
| –num-nodes | Kubernetes节点的初始数量 | 3 |
| –network | 指定GCP VPC | my - custom - network |
| –subnetwork | 如果VPC是自定义模式,指定GCP子网 | subnet - c |
| –zone | 指定单个区域 | asia - northeast1 - a |
| –tags | 分配给Kubernetes节点的网络标签 | private |

创建GKE集群的命令如下:

$ gcloud container clusters create my-k8s-cluster --machine-type f1-micro --num-nodes 3 --network my-custom-network --subnetwork subnet-c --zone asia-northeast1-a --tags private

5.4 实践建议

  • 定期备份 :对持久磁盘和集群配置进行定期备份,以防止数据丢失。
  • 监控和调优 :使用GCP提供的监控工具,对负载均衡器、节点和集群进行实时监控,根据监控结果进行调优。
  • 持续学习 :Kubernetes和GCP的技术不断发展,要持续学习新的知识和技能,以优化集群的性能和安全性。

通过以上的操作和建议,可以在GCP上高效地设置和管理Kubernetes集群,提高服务的可用性和性能。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值