OpenStack Yoga版安装笔记(三)keystone安装

1、官方文档

OpenStack Installation Guideicon-default.png?t=N7T8https://docs.openstack.org/install-guide/index.html本次安装是在Ubuntu 22.04上进行,基本按照OpenStack Installation Guide顺序执行,主要内容包括:

  • 环境安装 (已完成)
  • OpenStack服务安装
  • 启动一个实例

现在进行OpenStack服务安装

2、服务最小化部署安装

OpenStack系统由多个核心服务组成,有计算服务、身份认证服务、网络服务、镜像服务、块存储服务、对象存储服务、监控服务、自动化编排服务以及数据库服务。OpenStack服务可以独立安装和配置,也可以根据特定的云需求进行组合和连接。例如,您可以仅安装和配置计算服务和网络服务以构建基本的虚拟化环境,或者安装所有服务以构建全功能的私有云解决方案。每个服务都有其特定的功能和用途,可以根据实际需求进行灵活选择和部署。

本次安装将进行OpenStack Yoga版最小化部署(Minimal deployment for Yoga),顺序安装必须的核心服务:

3、基于Ubuntu 22.04安装Keystone

OpenStack身份认证服务代码为keystone,为了提高可扩展性,OpenStack Keystone 可以配置使用 Fernet 令牌和 Apache HTTP 服务器来处理请求。Fernet 令牌提供了一个安全的方式来生成和验证令牌,它们是 OpenStack 认证系统中的关键部分。主要安装内容有:

4、Identity service overview

OpenStack身份认证服务提供了一个集成点,用于管理身份认证、授权和服务目录。

身份认证服务通常是用户首先接触的服务。一旦用户通过身份认证,他们就可以使用他们的身份访问其他OpenStack服务。同样,其他OpenStack服务也利用身份认证服务来确保用户身份的真实性,并发现OpenStack部署中其他服务的位置。身份认证服务还可以与一些外部用户管理系统(如LDAP)集成。

用户和服务可以通过使用身份认证服务管理的服务目录(Service Catalog)来查找其他服务。顾名思义,服务目录是OpenStack部署中可用服务的集合。每个服务可以有一个或多个端点(endpoint,可以理解为服务访问点),每个端点可以是三种类型之一:admin、internal或public。在生产环境中,不同类型的端点可能位于不同的网络上,暴露给不同类型的用户以提高安全性。例如,public API网络可能对互联网开放,以便客户可以管理他们的云;admin API网络可能仅限于管理云基础设施的组织内部的操作人员访问;internal API网络可能仅限于包含OpenStack服务的主机访问。

服务端点(endpoint,可以理解为服务访问点)实际上是指向服务的URL地址。通过为不同的用户或服务配置对某个服务不同端点的访问权限,可以有效地控制对服务的访问,从而保护服务的安全。

此外,OpenStack支持多个区域(Region)以实现可扩展性。

为简化起见,本次安装使用管理网络来处理所有端点类型,并使用默认的RegionOne区域。区域、服务和在身份认证服务中创建的端点共同构成了部署的服务目录。部署中的每个OpenStack服务都需要在身份认证服务中存储一个服务条目及其相应的端点。这一切可以在安装和配置身份认证服务后完成。

以下是建立和管理 OpenStack 服务目录的一般过程:

1、服务注册(Service Registration)

  • 当一个新的服务(例如 Nova、Glance、Cinder 等)在 OpenStack 环境中部署时,需要向 Keystone 注册。
  • 注册时,服务需要提供以下信息:
    • 服务名称(Name)
    • 服务类型(Type)
    • 服务描述(Description)
  • 注册命令示例:
openstack service create --name <service_name> --description "<service_description>" <service_type>

2、端点创建(Endpoint Creation)

  • 每个服务通常有多个端点(Endpoint),用于处理 API 请求。这些端点可以包括公共端点(public)、内部端点(internal)和管理端点(admin)。
  • 每个端点的 URL 需要在 Keystone 中注册。
  • 端点创建命令示例:
openstack endpoint create --region <region> <service_type> public http://<public_endpoint_url>
openstack endpoint create --region <region> <service_type> internal http://<internal_endpoint_url>
openstack endpoint create --region <region> <service_type> admin http://<admin_endpoint_url>

3、服务目录查询(Service Catalog Query)

  • 当用户或其他服务进行身份认证时,Keystone 会返回一个认证令牌(Token)和服务目录。
  • 服务目录包含所有可用服务及其端点信息。
  • 用户可以使用命令行或 API 查询服务目录:
openstack catalog list

4、身份认证和授权(Authentication and Authorization)

  • 用户或服务通过向 Keystone 提供凭据(如用户名和密码)进行认证。
  • Keystone 验证凭据并颁发令牌。
  • 令牌包含服务目录,用户可以使用该目录与其他 OpenStack 服务进行交互。
  • 如下图所示:

通过以上步骤,Keystone 服务能够建立和管理 OpenStack 的服务目录,使得各个组件之间的交互和服务发现更加简便和高效。

由于身份认证服务(代号keystone)在身份验证、授权以及管理服务目录及服务端点方面的重要作用,它是 OpenStack 部署过程中第一个安装的服务。

5、Install and configure

本节介绍如何在控制节点上安装和配置 OpenStack 身份服务(代号为 keystone)。为了实现可扩展性,此配置部署了 Fernet 令牌和 Apache HTTP 服务器来处理请求。

注意OpenStack Yoga keystone安装版本为21.0.1。

5.1 Prerequisites

1、进入数据库

root@controller:~# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 31
Server version: 10.6.18-MariaDB-0ubuntu0.22.04.1 Ubuntu 22.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

2、创建keystone数据库

MariaDB [(none)]> CREATE DATABASE keystone;
Query OK, 1 row affected (0.000 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| keystone           |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.001 sec)

3、授予对 keystone 数据库的适当访问权限:

MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' \
    -> IDENTIFIED BY 'openstack';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \
    -> IDENTIFIED BY 'openstack';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> 

这两条命令的作用是确保用户 keystone 能够从本地主机和远程主机都能访问并操作 keystone 数据库,并为其分配了所有权限。

4、退出DB

MariaDB [(none)]> quit
Bye
root@controller:~# 

5.2 Install and configure components

1、安装keystone软件包:

root@controller:~# apt install keystone

2、编辑 /etc/keystone/keystone.conf

。[database]

root@controller:~# vi /etc/keystone/keystone.conf 
...
[database]
# connection = sqlite:var/lib/keystone/keystone.db

connection = mysql+pymysql://keystone:openstack@controller/keystone
...

。[token]

...
[token]
...
provider = fernet
...

3、填充数据库:

root@controller:~# su -s /bin/sh -c "keystone-manage db_sync" keystone
root@controller:~# 

4、初始化Fernet密钥库

在OpenStack的身份认证服务Keystone中,Fernet密钥用于加密和解密令牌,确保令牌的安全性。

root@controller:~# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
root@controller:~# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
root@controller:~# 

5、启动或初始化OpenStack的身份服务(Keystone)

root@controller:~# keystone-manage bootstrap --bootstrap-password openstack \
>   --bootstrap-admin-url http://controller:5000/v3/ \
>   --bootstrap-internal-url http://controller:5000/v3/ \
>   --bootstrap-public-url http://controller:5000/v3/ \
>   --bootstrap-region-id RegionOne
root@controller:~# 

5.3 Configure the Apache HTTP server

1、编辑/etc/apache2/apache2.conf

root@controller:~# vi /etc/apache2/apache2.conf 

(可以在末尾添加)
...
ServerName controller
...

5.4 Finalize the installation

1、 Restart Apache service

root@controller:~# service apache2 restart
root@controller:~# 

查看版本:

root@controller:~# keystone-manage --version
21.0.1

root@controller:~# sudo dpkg -l | grep keystone
ii  keystone                               2:21.0.1-0ubuntu1                       all          OpenStack identity service - Daemons
ii  keystone-common                        2:21.0.1-0ubuntu1                       all          OpenStack identity service - Common files
ii  python3-keystone                       2:21.0.1-0ubuntu1                       all          OpenStack identity service - Python 3 library
ii  python3-keystoneauth1                  4.4.0-0ubuntu1                          all          authentication library for OpenStack Identity - Python 3.x
ii  python3-keystoneclient                 1:4.4.0-0ubuntu1                        all          client library for the OpenStack Keystone API - Python 3.x
ii  python3-keystonemiddleware             9.4.0-0ubuntu1.1                        all          Middleware for OpenStack Identity (Keystone) - Python 3.x

2、设置OpenStack客户端的环境变量

root@controller:~# export OS_USERNAME=admin
root@controller:~# export OS_PASSWORD=openstack
root@controller:~# export OS_PROJECT_NAME=admin
root@controller:~# export OS_USER_DOMAIN_NAME=Default
root@controller:~# export OS_PROJECT_DOMAIN_NAME=Default
root@controller:~# export OS_AUTH_URL=http://controller:5000/v3
root@controller:~# export OS_IDENTITY_API_VERSION=3

root@controller:~# openstack project list
+----------------------------------+-------+
| ID                               | Name  |
+----------------------------------+-------+
| ee65b6c3961747b988ab8bd1cc19fb93 | admin |
+----------------------------------+-------+
root@controller:~# openstack user list
+----------------------------------+-------+
| ID                               | Name  |
+----------------------------------+-------+
| 2947c213547147979dce3c8f8b85697f | admin |
+----------------------------------+-------+
root@controller:~# openstack service list
+----------------------------------+----------+----------+
| ID                               | Name     | Type     |
+----------------------------------+----------+----------+
| 75fe01049ec648b69e48d200971bf601 | keystone | identity |
+----------------------------------+----------+----------+
root@controller:~# 

这些命令通常在配置OpenStack客户端时执行,以便能够通过命令行工具(如openstack命令)与OpenStack服务进行交互。设置这些环境变量后,用户可以执行如创建、查询、更新或删除OpenStack资源的操作。

这里的OpenStackClient是安装在controller node上的。

3、设置OpenStack客户端的环境变量(在10.0.20.100节点上)

之前单独增加了一台虚机,安装了OpenStackClient,在上面设置环境变量后,也能进行操作。

ubcode@osclient:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:ff:20:81 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 10.0.20.100/24 brd 10.0.20.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feff:2081/64 scope link 
       valid_lft forever preferred_lft forever
ubcode@osclient:~$ 
ubcode@osclient:~$ export OS_USERNAME=admin
ubcode@osclient:~$ export OS_PASSWORD=openstack
ubcode@osclient:~$ export OS_PROJECT_NAME=admin
ubcode@osclient:~$ export OS_USER_DOMAIN_NAME=Default
ubcode@osclient:~$ export OS_PROJECT_DOMAIN_NAME=Default
ubcode@osclient:~$ export OS_AUTH_URL=http://controller:5000/v3
ubcode@osclient:~$ export OS_IDENTITY_API_VERSION=3
ubcode@osclient:~$ 
ubcode@osclient:~$ openstack project list
+----------------------------------+-------+
| ID                               | Name  |
+----------------------------------+-------+
| ee65b6c3961747b988ab8bd1cc19fb93 | admin |
+----------------------------------+-------+
ubcode@osclient:~$ openstack user list
+----------------------------------+-------+
| ID                               | Name  |
+----------------------------------+-------+
| 2947c213547147979dce3c8f8b85697f | admin |
+----------------------------------+-------+
ubcode@osclient:~$ openstack service list
+----------------------------------+----------+----------+
| ID                               | Name     | Type     |
+----------------------------------+----------+----------+
| 75fe01049ec648b69e48d200971bf601 | keystone | identity |
+----------------------------------+----------+----------+
ubcode@osclient:~$ 

4、后续可能任意选择这两个虚机上的OpenStackClient进行OpenStack命令行操作,不再单独说明。

6、Create a domain, projects, users, and roles

OpenStack的身份认证服务(Keystone)为每个OpenStack服务提供认证服务,通过domain、project、user、role相互结合使用来实现这种认证服务。

1、创建domain

ubcode@osclient:~$ openstack domain create --description "An Example Domain" example
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | An Example Domain                |
| enabled     | True                             |
| id          | f2a209f9e83040c9a619ca05c41e952b |
| name        | example                          |
| options     | {}                               |
| tags        | []                               |
+-------------+----------------------------------+
ubcode@osclient:~$ 

2、创建service project

ubcode@osclient:~$ openstack project create --domain default \
>   --description "Service Project" service
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Service Project                  |
| domain_id   | default                          |
| enabled     | True                             |
| id          | fe9220b4131041e4b551b42b64a8f9ca |
| is_domain   | False                            |
| name        | service                          |
| options     | {}                               |
| parent_id   | default                          |
| tags        | []                               |
+-------------+----------------------------------+
ubcode@osclient:~$ 

3、创建unprivileged project and user:

。创建myproject project

ubcode@osclient:~$ openstack project create --domain default \
>   --description "Demo Project" myproject
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Demo Project                     |
| domain_id   | default                          |
| enabled     | True                             |
| id          | f5e75a3f7cc347ad89d20dcfe70dae01 |
| is_domain   | False                            |
| name        | myproject                        |
| options     | {}                               |
| parent_id   | default                          |
| tags        | []                               |
+-------------+----------------------------------+
ubcode@osclient:~$ 

。创建myuser user

ubcode@osclient:~$ openstack user create --domain default \
>   --password-prompt myuser
User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | 9382b59561c04dd1abf0a4cb7a8252ec |
| name                | myuser                           |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+
ubcode@osclient:~$ 

。创建myrole role

ubcode@osclient:~$ openstack role create myrole
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | None                             |
| domain_id   | None                             |
| id          | 83144b48ff1b4c54bb21d1fcb15921b5 |
| name        | myrole                           |
| options     | {}                               |
+-------------+----------------------------------+
ubcode@osclient:~$

。Add the myrole role to the myproject project and myuser user:

ubcode@osclient:~$ openstack role add --project myproject --user myuser myrole
ubcode@osclient:~$ 

7、Verify operation

在安装其他OpenStack服务之前验证身份服务(Keystone)的运行情况是一个重要的步骤,以确保后续服务能够顺利集成和运行。

1、删除临时环境变量

ubcode@osclient:~$ unset OS_AUTH_URL OS_PASSWORD

2、admin user请求认证令牌

ubcode@osclient:~$ openstack --os-auth-url http://controller:5000/v3 \
>   --os-project-domain-name Default --os-user-domain-name Default \
>   --os-project-name admin --os-username admin token issue
Password: 
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                                                                                                                   |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires    | 2024-06-28T15:01:17+0000                                                                                                                                                                |
| id         | gAAAAABmfsItWBsns2wi8w5Rn9OcxyrRIIZg_bFQ81JACK-7k9EaPhRReSl1NlZJXEFBz_eKChVxcFUTwHrWuZfO4YoxKEk82ilcqeFqn5FwDxuPfePzqhuJ5_n74XkMqaaB_AeeMbyntCB9WOpDf_VdlntFpIWwf37fvmg-8I3xxHLMkykU6lY |
| project_id | ee65b6c3961747b988ab8bd1cc19fb93                                                                                                                                                        |
| user_id    | 2947c213547147979dce3c8f8b85697f                                                                                                                                                        |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
ubcode@osclient:~$ 

2、myuser user请求认证令牌

ubcode@osclient:~$ openstack --os-auth-url http://controller:5000/v3 \
>   --os-project-domain-name Default --os-user-domain-name Default \
>   --os-project-name myproject --os-username myuser token issue
Password: 
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                                                                                                                   |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires    | 2024-06-28T15:03:11+0000                                                                                                                                                                |
| id         | gAAAAABmfsKf5raLnqXivi0JZTAjCQPczzncgBzCwQ9yqiMy3dqkE6XZmVkV2g0swEGTrci8fdv6SjsR9ZdrigGfP18tpDlRkiVRBcH80PEX15-f_9oBDYyuuHFrj8GW6CzMSNnrIB3ZYRUXQdeRHfnATInZRJnB8IGw7fRgWjd0s8_d8_VwjVc |
| project_id | f5e75a3f7cc347ad89d20dcfe70dae01                                                                                                                                                        |
| user_id    | 9382b59561c04dd1abf0a4cb7a8252ec                                                                                                                                                        |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
ubcode@osclient:~$ 

8、Create OpenStack client environment scripts

OpenStack的OpenRC文件是一种方便的工具,它允许用户通过一个脚本文件设置OpenStack命令行客户端所需的所有环境变量。这可以提高客户端操作的效率,因为用户可以一次性配置所有必要的认证信息,之后在命令行中执行OpenStack命令时就不需要重复输入这些信息。OpenRC是"OpenStack RC (Resource Configuration)"的缩写。

8.1 Creating the scripts

1、创建admin-openrc文件:

ubcode@osclient:~$ vi admin-openrc
ubcode@osclient:~$ cat admin-openrc
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=openstack
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
export PS1='\u@\h \W(admin/amdin)\$ '   <--显示当前project/user信息
ubcode@osclient:~$ 

2、创建demo-openrc

ubcode@osclient:~$ vi demo-openrc
ubcode@osclient:~$ cat demo-openrc 
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=myproject
export OS_USERNAME=myuser
export OS_PASSWORD=openstack
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
export PS1='\u@\h \W(myproject/myuser)\$ '
ubcode@osclient:~$ 

8.2 Using the scripts

1. 运行admin-openrc

ubcode@osclient:~$ . admin-openrc 
ubcode@osclient ~(admin/amdin)$ openstack token issue
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                                                                                                                   |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires    | 2024-06-28T15:19:32+0000                                                                                                                                                                |
| id         | gAAAAABmfsZ0pNM6gG75A1x-3FRbiHRP3MxxaVHFyZ5C-JB7EtYZYdoUYJ3Y4XUfy5TF7aZjIsrgNeL4ipHsPGub8cf2Ze-6VtNgVhOa_2Jun0DBrkFpXdfS0EiUA5cbyavk95T6ff3FjX6yrm42HSirT4z0nmNKpWJXqoLaWUmsJuSpiNdB4qI |
| project_id | ee65b6c3961747b988ab8bd1cc19fb93                                                                                                                                                        |
| user_id    | 2947c213547147979dce3c8f8b85697f                                                                                                                                                        |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
ubcode@osclient ~(admin/amdin)$ openstack user list
+----------------------------------+--------+
| ID                               | Name   |
+----------------------------------+--------+
| 2947c213547147979dce3c8f8b85697f | admin  |
| 9382b59561c04dd1abf0a4cb7a8252ec | myuser |
+----------------------------------+--------+
ubcode@osclient ~(admin/amdin)$ openstack project list
+----------------------------------+-----------+
| ID                               | Name      |
+----------------------------------+-----------+
| ee65b6c3961747b988ab8bd1cc19fb93 | admin     |
| f5e75a3f7cc347ad89d20dcfe70dae01 | myproject |
| fe9220b4131041e4b551b42b64a8f9ca | service   |
+----------------------------------+-----------+
ubcode@osclient ~(admin/amdin)$ 

2、运行demo-openrc

ubcode@osclient:~$ . demo-openrc 
ubcode@osclient ~(myproject/myuser)$ 
ubcode@osclient ~(myproject/myuser)$ openstack token issue
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                                                                                                                   |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires    | 2024-06-28T15:20:54+0000                                                                                                                                                                |
| id         | gAAAAABmfsbGneXiF-yaM9awfKpfqRvxCbcMCkXF5_h2FKhBf2nwhosBVGRza0fA4vV1-HLsvtc9xBZtKHvLm7RMWIYBFo353I5X2bFrUkfyK0_QepY3DrgNZUgCzszXEXtu1UnBdty9fwOGMsGiDvXWeDCQ9ujAX5hs6WB4puPTMmBvboTD9tI |
| project_id | f5e75a3f7cc347ad89d20dcfe70dae01                                                                                                                                                        |
| user_id    | 9382b59561c04dd1abf0a4cb7a8252ec                                                                                                                                                        |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
ubcode@osclient ~(myproject/myuser)$ openstack user list
You are not authorized to perform the requested action: identity:list_users. (HTTP 403) (Request-ID: req-93d93c8d-6362-474c-8595-dffaa72ab181)
ubcode@osclient ~(myproject/myuser)$ openstack project list
+----------------------------------+-----------+
| ID                               | Name      |
+----------------------------------+-----------+
| f5e75a3f7cc347ad89d20dcfe70dae01 | myproject |
+----------------------------------+-----------+
ubcode@osclient ~(myproject/myuser)$ 

9、关闭虚机,拍摄快照

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值