KubeKey创建k8s集群、k8s监控、KubeSphere可视化安装mysql中间件并暴露服务,中间件扩容缩容

本文详细指导了如何使用KubeKey创建Kubernetes集群,并在KubeSphere界面安装MySQL,包括创建企业空间、项目,配置NFS文件系统挂载,以及设置MySQL工作负载、服务和访问。同时介绍了安装Metrics监控组件的可选步骤。

以下步骤如未说明,每个节点都要执行

一、前置条件

1、三台或者更多兼容的 Linux 主机(建议CentOS 7.9),每台机器 2 GB 或更多的 RAM,2 CPU 核或更多。
2、各个主机网络互通(公网和内网均可)。
3、 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。

注意:分别在三个主机执行以下三行命令

#各个机器设置自己的域名
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2

#查看主机名
hostname

二、使用KubeKey创建集群

1、下载KubeKey

export KKZONE=cn

curl -sfL https://get-kk.kubesphere.io | VERSION=v1.1.1 sh -

chmod +x kk

2、创建集群配置yaml文件

./kk create config --with-kubernetes v1.20.4 --with-kubesphere v3.1.1

在这里插入图片描述
执行完成会生成一个config-sample.yaml的配置文件,打开修改以下内容为自己的节点hostname、IP、用户名和密码:
在这里插入图片描述

3、创建集群

./kk create cluster -f config-sample.yaml

如果提示没有conntrack执行yum install -y conntrack
在这里插入图片描述

正常安装,输入yes继续在这里插入图片描述4、查看安装进度

kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f

在这里插入图片描述
安装完成访问
在这里插入图片描述

三、安装NFS文件系统

NFS就是Network File System的缩写,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。NFS服务器可以让主机将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,在使用上相当便利;利用这个特点我们可以保存有状态应用的一些数据或者配置,比如MySQL的数据文件或者配置文件。
1、安装nfs

# 在每个机器。
yum install -y nfs-utils


# 在master 执行以下全部命令 
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports


# 执行以下命令,启动 nfs 服务;创建共享目录
mkdir -p /nfs/data

systemctl enable rpcbind
systemctl enable nfs-server
systemctl start rpcbind
systemctl start nfs-server

# 使配置生效
exportfs -r

#检查配置是否生效
exportfs

在这里插入图片描述

2、配置默认存储,保存以下到storage.yaml中,注意修改中间的两个IP为自己master的IP

## 创建了一个存储类
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
parameters:
  archiveOnDelete: "true"  ## 删除pv的时候,pv的内容是否要备份

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/nfs-subdir-external-provisioner:v4.0.2
          # resources:
          #    limits:
          #      cpu: 10m
          #    requests:
          #      cpu: 10m
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: k8s-sigs.io/nfs-subdir-external-provisioner
            - name: NFS_SERVER
              value: 172.31.0.2 ## 指定自己nfs服务器地址
            - name: NFS_PATH  
              value: /nfs/data  ## nfs服务器共享的目录
      volumes:
        - name: nfs-client-root
          nfs:
            server: 172.31.0.2
            path: /nfs/data
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["nodes"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: default
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io
kubectl apply -f storage.yaml

四、KubeSphere可视化界面安装mysql

1、创建企业空间

登录KubeSphere点击企业空间
在这里插入图片描述
点击创建
在这里插入图片描述
输入企业空间名称
在这里插入图片描述

2、创建项目

点击左上角工作台退出来,点击企业空间,点击刚刚创建的企业空间test,点击项目管理,点击创建
在这里插入图片描述
输入项目名称,点击创建
在这里插入图片描述
创建完成点击项目名称

在这里插入图片描述

3、创建mysql工作负载

首先分析一下,k8s最小单元是pod,而pod是一组docker容器,所以安装mysql就是用docker安装mysql,参照第二节:Docker使用命令,第10小节:docker安装mysql,docker的安装命令是:

docker run -p 3306:3306 --name mysql-01 \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--restart=always \
-d mysql:5.7 

需要考虑:

  • 挂载配置文件到主机,在配置中心添加配置
  • 执行参数MYSQL_ROOT_PASSWORD来给mysql配置登录密码,添加环境变量
  • 挂载mysql数据到主机,添加PVC使用nfs来挂载

对应上面:

(1)、增加mysql配置

点击配置中心=>配置=>创建
在这里插入图片描述
输入名称,点击下一步
在这里插入图片描述
输入key,输入值,点击对号,点击创建

[client]
default-character-set=utf8mb4
 
[mysql]
default-character-set=utf8mb4
 
[mysqld]
init_connect='SET collation_connection = utf8mb4_unicode_ci'
init_connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake
skip-name-resolve

在这里插入图片描述

(2)、创建工作负载,配置mysql镜像,配置端口号

点击应用负载,选择有状态副本集,点击创建
在这里插入图片描述
输入名称,点击下一步
在这里插入图片描述
点击添加容器镜像
在这里插入图片描述
输入mysql:5.7,点击回车,等到搜索结果出来,点击使用默认端口
在这里插入图片描述

(3)、增加环境变量

勾选环境变量输入MYSQL_ROOT_PASSWORD,值为123456(此环境变量是给mysql设置登录密码);勾选时区,点击对号
在这里插入图片描述
点击下一步

在这里插入图片描述

(4)、添加存储卷模板,挂载mysql数据到nfs

点击添加存储卷模板
在这里插入图片描述
输入新建存储卷名称;存储类型选择nfs-storage(如果没有这个选项,参照第三节:安装nfs文件系统),访问模式选择单个节点读写;容量输入5;挂载路径选择读写,路径为/var/lib/mysql,点击对号

在这里插入图片描述
点击挂载配置文件或者秘钥
在这里插入图片描述
选择mysql-conf,选择只读,路径为:/etc/mysql/conf.d,点击对号,点击下一步,再点击下一步,点击创建
在这里插入图片描述
可以看到已经创建了一个部署mysql

在这里插入图片描述
点击容器组,点击mysql
在这里插入图片描述
点击事件,等待拉取镜像、容器创建并启动完成
在这里插入图片描述

4、创建服务,暴露mysql外网访问接口

点击服务,点击创建

在这里插入图片描述
选择指定工作负载
在这里插入图片描述
输入名称,点击下一步
在这里插入图片描述
点击指定工作负载,选择有状态副本集,选择mysql,点击确定
在这里插入图片描述
端口号输入mysql默认端口号3306,点击下一步
在这里插入图片描述
勾选外网访问,访问方式选择NodePort,点击创建
在这里插入图片描述
可以看到暴露的端口号
在这里插入图片描述

5、测试mysql链接

此时用任意节点的外网IP加上刚才端口号即可连接mysql
在这里插入图片描述
7、mysql扩容缩容
扩容缩容,点击上下即可实现
在这里插入图片描述
扩容完成
在这里插入图片描述

五、安装集群指标监控组件Metrics(选做)

Metrics Server是k8s内置的集群范围资源使用情况的数据聚合器,为集群提供Node、Pods资源利用率指标等功能。
保存以下配置到metrics.yaml中

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: metrics-server
    rbac.authorization.k8s.io/aggregate-to-admin: "true"
    rbac.authorization.k8s.io/aggregate-to-edit: "true"
    rbac.authorization.k8s.io/aggregate-to-view: "true"
  name: system:aggregated-metrics-reader
rules:
- apiGroups:
  - metrics.k8s.io
  resources:
  - pods
  - nodes
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: metrics-server
  name: system:metrics-server
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - nodes
  - nodes/stats
  - namespaces
  - configmaps
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server-auth-reader
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server:system:auth-delegator
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:auth-delegator
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: system:metrics-server
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:metrics-server
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  ports:
  - name: https
    port: 443
    protocol: TCP
    targetPort: https
  selector:
    k8s-app: metrics-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  selector:
    matchLabels:
      k8s-app: metrics-server
  strategy:
    rollingUpdate:
      maxUnavailable: 0
  template:
    metadata:
      labels:
        k8s-app: metrics-server
    spec:
      containers:
      - args:
        - --cert-dir=/tmp
        - --kubelet-insecure-tls
        - --secure-port=4443
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        image: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/metrics-server:v0.4.3
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /livez
            port: https
            scheme: HTTPS
          periodSeconds: 10
        name: metrics-server
        ports:
        - containerPort: 4443
          name: https
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /readyz
            port: https
            scheme: HTTPS
          periodSeconds: 10
        securityContext:
          readOnlyRootFilesystem: true
          runAsNonRoot: true
          runAsUser: 1000
        volumeMounts:
        - mountPath: /tmp
          name: tmp-dir
      nodeSelector:
        kubernetes.io/os: linux
      priorityClassName: system-cluster-critical
      serviceAccountName: metrics-server
      volumes:
      - emptyDir: {}
        name: tmp-dir
---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  labels:
    k8s-app: metrics-server
  name: v1beta1.metrics.k8s.io
spec:
  group: metrics.k8s.io
  groupPriorityMinimum: 100
  insecureSkipTLSVerify: true
  service:
    name: metrics-server
    namespace: kube-system
  version: v1beta1
  versionPriority: 100
kubectl apply -f metrics.yaml
<think>首先,用户的问题是:“我想查找关于线上OA办公系统在Kubernetes(k8s)集群中的具体配置参数请问线上OA系统Kubernetes集群配置参数设置”。这翻译成“IwanttofindspecificconfigurationparametersforanonlineOAofficesysteminaKubernetes(k8s)cluster.HowtoconfigureparametersforanonlineOAsysteminaKubernetescluster?”用户正在询问关于在Kubernetes集群中配置在线OA办公系统的具体参数。在线OA系统可能指的是办公自动化系统,比如处理文档、工作流程等的系统。现在,回顾系统级指令:-所有行内数学表达式必须使用$...$格式。-独立公式必须使用$$...$$格式单独成段。-LaTeX语法正确。-使用中文回答。-生成相关问题。-回答中引用的段落末尾自然地添加引用标识,例如[^1]。-回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。-参考站内引用:有四个引用[^1]到[^4],但它们是关于Kubernetes集群管理、部署、附件等的,而不是直接关于OA系统。引用[1]是Kubernetes集群Node管理,引用[2]是kubeadm部署,引用[3]是集群搭建教程,引用[4]是Add-ons。这些不是用户需求的直接相关,但可能间接相关,因为用户需要配置OA系统在K8s集群中。用户上一次的问题没有被提供,所以我只能基于当前查询。关键点:用户想要具体的配置参数。但配置参数取决于OA系统的具体实现。Kubernetes本身不指定应用的具体参数;它管理器。所以,我需要指导用户如何为他们的OA应用设置Kubernetes资源。OA系统可能是一个Web应用,可能需要部署Deployments、Services、Ingress等。参数可能包括资源限制、环境变量、卷挂载等。由于没有具体的OA系统细节,我应该提供一般指导。结构化回答:1.**理解需求**:解释OA系统在K8s中的配置涉及什么。2.**关键配置参数**:列出常见的Kubernetes配置元素,如Deployment、Service、ConfigMap等,给出示例。3.**步骤指南**:提供如何设置这些参数的逐步说明。4.**注意事项**:提到安全、性能等。5.**生成相关问题**:在末尾添加相关问题。使用中文回答。确保回答真实可靠:基于Kubernetes最佳实践。参考站内引用:自然地融入引用。例如,引用[^3]提到集群搭建,引用[^4]提到Add-ons如IngressController,可能相关。引用标识:[^1],[^2],[^3],[^4]是给定的。现在,规划内:-**介绍**:解释Kubernetes配置的基本概念。-**具体参数**:-Deployment:副本数、镜像、资源请求/限制、环境变量。-Service:类型、端口。-ConfigMap:用于配置参数。-PersistentVolume:用于数据存储。-Ingress:用于部访问。示例YAML片段。-**如何设置**:使用kubectl或YAML文件。-**引用融入**:例如,“在Kubernetes集群中,管理Node是基础[^1]”,或“使用Add-ons如IngressController提供部访问[^4]”。-**相关问题**:生成2-3个相关问题。最终,确保回答有帮助。</think>### 在线OA办公系统在Kubernetes集群中的配置参数指南 在线OA办公系统(如文档管理、工作流审批等)在KubernetesK8s集群中的配置,需要根据具体应用需求定制参数。Kubernetes本身不定义应用级参数,而是通过资源对象(如Deployment、Service、ConfigMap)管理器化应用。配置的核心目标是确保OA系统的高可用性、性能和安全性。以下我将基于Kubernetes最佳实践,逐步解释关键配置参数及其设置方法。内参考了Kubernetes官方文档和常见部署经验,确保真实可靠[^3][^4]。 #### 1. **理解OA系统在K8s中的配置需求** - OA系统通常包括Web服务器、数据库和中间件组件。在K8s中,每个组件对应一个或多个Pod。 - 关键配置参数涉及: - **资源分配**:CPU/内存限制,防止资源争用。 - **环境变量**:应用特定设置(如数据库连接)。 - **持久化存储**:确保用户数据不丢失。 - **网络访问**:部访问控制。 - Kubernetes集群的基础管理(如Node调度)是前提,确保集群稳定运行[^1]。 #### 2. **关键配置参数及示例** 以下是针对OA系统的常见Kubernetes资源参数。参数值需根据实际OA应用(如基于Spring Boot或Node.js的OA系统)调整。以下YAML示例使用独立公式格式,确保语法正确。 - **Deployment 参数(定义Pod副本和更新策略)**: - 核心参数:`replicas`(副本数,确保高可用)、`resources.requests/limits`(资源请求/限制)、`env`(环境变量)。 - 示例YAML: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: oa-web-deployment spec: replicas: 3 # 副本数,根据负载调整,确保高可用 selector: matchLabels: app: oa-web template: metadata: labels: app: oa-web spec: containers: - name: oa-web-container image: your-oa-image:latest # OA应用镜像 resources: requests: cpu: "500m" # CPU请求(0.5核) memory: "512Mi" # 内存请求 limits: cpu: "1000m" # CPU限制(1核) memory: "1024Mi" # 内存限制 env: - name: DB_HOST # 数据库连接环境变量 value: "mysql-service" - name: OA_SECRET_KEY valueFrom: secretKeyRef: name: oa-secrets key: api-key ``` - 解释:`replicas: 3` 确保有3个Pod副本;资源限制防止单Pod过度消耗资源;环境变量通过Secret管理敏感数据。 - **Service 参数(内部网络访问)**: - 核心参数:`type`(服务类型,如ClusterIP或NodePort)、`ports`(端口映射)。 - 示例YAML: ```yaml apiVersion: v1 kind: Service metadata: name: oa-web-service spec: selector: app: oa-web ports: - protocol: TCP port: 80 # Service端口 targetPort: 8080 # Pod端口 type: ClusterIP # 内部访问,或使用LoadBalancer/NodePort部访问 ``` - **ConfigMap 和 Secret 参数(应用配置管理)**: - ConfigMap用于非敏感配置(如OA系统超时设置),Secret用于敏感数据(如密码)。 - 示例创建ConfigMap: ```bash kubectl create configmap oa-config --from-literal=timeout=30 # 设置OA请求超时30秒 ``` - 在Deployment中引用: ```yaml env: - name: REQUEST_TIMEOUT valueFrom: configMapKeyRef: name: oa-config key: timeout ``` - **PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 参数(数据持久化)**: - OA系统常需存储用户文件。参数包括`storageClassName`(存储类型)、`accessModes`(访问模式)。 - 示例PVC: ```yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: oa-storage-pvc spec: accessModes: - ReadWriteOnce # 单节点读写 resources: requests: storage: 10Gi # 存储大小 storageClassName: standard # 根据集群存储类调整 ``` - 在Deployment中挂载: ```yaml volumes: - name: oa-storage persistentVolumeClaim: claimName: oa-storage-pvc containers: - volumeMounts: - mountPath: "/data" name: oa-storage ``` - **Ingress 参数(部访问控制)**: - 使用Add-ons如Ingress Controller提供部访问[^4]。核心参数:`host`(域名)、`path`(路由路径)。 - 示例YAML: ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: oa-ingress spec: rules: - host: oa.yourdomain.com # OA系统域名 http: paths: - path: / pathType: Prefix backend: service: name: oa-web-service port: number: 80 ``` #### 3. **设置参数的步骤** - **步骤1:准备集群**:确保Kubernetes集群已搭建(如使用kubeadm[^2]),验证Node状态(`kubectl get nodes`)[^1]。 - **步骤2:定义YAML文件**:编写上述资源文件(如`oa-deployment.yaml`),调整参数值。参考OA系统文档获取应用级参数(如数据库URL)。 - **步骤3:部署应用**: ```bash kubectl apply -f oa-deployment.yaml kubectl apply -f oa-service.yaml kubectl apply -f oa-ingress.yaml # 如果使用部访问 ``` - **步骤4:验证和监控**: - 检查Pod状态:`kubectl get pods` - 查看日志:`kubectl logs <pod-name>` - 使用Dashboard(Add-on)可视化监控[^4]。 - **最佳实践**: - **资源优化**:根据负载测试调整`resources.requests/limits`,避免OOM错误。 - **安全**:使用Secret管理密码,启用RBAC控制访问。 - **高可用**:设置`replicas >= 2`,结合集群自动扩(HPA)。 - **持久化**:选择可靠存储类(如云存储),防止数据丢失。 #### 4. **注意事项** - OA系统的具体参数(如会话超时或数据库连接池大小)取决于应用框架,需在环境变量或ConfigMap中定义。 - 如果OA系统包含多个微服务(如认证服务、文件服务),需为每个组件单独配置Deployment和Service。 - Kubernetes集群的规模影响性能:小型OA系统可在单Node集群运行,但生产环境建议多Node集群以提升错[^3]。 - 使用Add-ons(如Prometheus监控)增强功能,但非必需[^4]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值