阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

ProxmoxVE V5.2使用外部ceph存储(luminous)详解

270次阅读
没有评论

共计 12170 个字符,预计需要花费 31 分钟才能阅读完成。

 继上篇《ProxmoxVE V5.2 集群安装图解 )》,本来想模拟生产环境实现 3 节点集群,并且使用 ceph 分布式存储实现虚拟机级别的 HA,但是在使用 pveceph 工具创建 ceph 环境的时候出错了,发现需要商业订阅才能使用。因此这篇博文想从另一个角度,先搭建外部 ceph 存储集群,供 pve 直接使用外部 ceph 存储。

    同样的,先准备 3 个节点的环境,先装上 proxmox5.2-1,然后在这个 3 个节点上使用 ceph-deploy 安装部署 ceph 集群。

一. 环境准备:

    创建 3 个虚拟机,3vcpu/12G 内存 / 4 块硬盘 / 2 块网卡,其中硬盘方面 1 块硬盘为系统盘 31G,2 块 30G 的 ceph 盘,1 块 32G 的 lvm 盘,网卡方面 1 块网卡同时给集群和虚拟机使用(192.168.1.0/24 网段),1 块网卡作为 ceph 存储网络(192.168.170.0/24 网段)使用。创建虚拟机如下:

    ProxmoxVE V5.2 使用外部 ceph 存储(luminous)详解

 

    剩下 2 台测试虚拟机,直接克隆,分别为 pve-2,pve-3 .

    接下来分别启动 pve-1,pve-2,pve-3 进行 proxmox VE 的安装,如下图:

 

ProxmoxVE V5.2 使用外部 ceph 存储(luminous)详解

安装步骤都很简单,傻瓜式的,其中选择硬盘会默认第一块硬盘安装系统,然后是设置 root 密码等等,网络配置步骤:

 

ProxmoxVE V5.2 使用外部 ceph 存储(luminous)详解

这里 hostname 要求写成 FQDN 格式,我试了直接使用 pve-2,不行,最后是使用 pve-2.ywb.com。

 

    3 台虚拟机同时安装,非常快,不到 10 分钟,居然就安装完了!感觉比装 vmware 的 ESXI 也更快啊。

ProxmoxVE V5.2 使用外部 ceph 存储(luminous)详解

点右下角的 Reboot 重启。

ProxmoxVE V5.2 使用外部 ceph 存储(luminous)详解

第一阶段搞定,后面就可以建集群,配网络,建存储之类的后续操作了。

    通过输入网址:

    https://192.168.1.51:8006

    https://192.168.1.52:8006

    https://192.168.1.53:8006

    分别可以管理这 3 台 pve。

debian 系统更新:

    接下来下来我们更新一下 proxomx 的软件,proxmox 的底层毕竟是个 debian 系统,刚安装还是要更新一下的,在 shell 中输入 aptupdate && apt dist-upgrade,回车,发现报错无法更新,查看官方文档发现需要更改一些设置,在 shell 输入

    rm -f /etc/apt/sources.list.d/pve-enterprise.list
添加新的
    echo "deb http://download.proxmox.com/debian/pve stretch pve-no-subscription" >/etc/apt/sources.list.d/pve-install-repo.list
下载秘钥
    wget http://download.proxmox.com/debian/proxmox-ve-release-5.x.gpg -O /etc/apt/trusted.gpg.d/proxmox-ve-release-5.x.gpg
再次输入 
    apt update && apt dist-upgrade

 

二.  ceph 集群安装

    ceph 集群我准备使用 192.168.1.0/24 这个网段作为 ceph 的集群管理网络,192.168.170.0/24 作为 ceph 数据网络。首先找到 ceph 官网的指导网页:

    http://docs.ceph.com/docs/master/start/quick-start-preflight/#ceph-deploy-setup

    根据上面这个操作手册,看 ProxmoxVE5.2- 1 使用的是 debian 9 操作系统。具体步骤如下:

环境预配置

    配置 /etc/hosts:

    以 pve- 1 为例:192.168.1.51 pve-1.ywb.com pve-1 pvelocalhost
    192.168.1.52 pve-2.ywb.com pve-2
    192.168.1.53 pve-3.ywb.com pve-3

   

    < style=”max-width: 100%; font-family: 宋体, SimSun; margin: 0px; -webkit-font-smoothing: antialiased; -ms-word-break: break-all; padding: 0px;”> 配置免登陆访问

    < style=”max-width: 100%; font-family: 宋体, SimSun; margin: 0px; -webkit-font-smoothing: antialiased; -ms-word-break: break-all; padding: 0px;”> 生成 ssh-key

 

    # ssh-keygen    ---pve 环境已经生成了,略过
    对需要访问的机器进行认证, 拷贝到所有节点
    # ssh-copy-id root@pve-1   
    # ssh-copy-id root@pve-2 
    # ssh-copy-id root@pve-3

 

    设置防火墙:

    查看了 iptables -L 以及 iptables -L -t nat,发现防火墙没有任何设置,如果在后续 pve 启用防火墙的过程中,需要特别注意 ceph 这一块相应的端口需要开放,主要有这些端口:

    OSD 使用的端口:6800-7300

    monitor 使用的端口:6789

    设置时钟同步:

    apt install ntp

   

    配置 ceph 软件源(使用 163 镜像)

  wget -q -O- 'https://download.ceph.com/keys/release.asc' |  apt-key add -
    echo deb http://mirrors.163.com/ceph/debian-luminous/ stretch main |  tee /etc/apt/sources.list.d/ceph.list
    #使用 163 基础镜像源,修改 sources.list 文件如下:root@pve-1# more /etc/apt/sources.list
    #deb http://ftp.debian.org/debian stretch main contrib
    deb http://mirrors.163.com/debian stretch main contrib
    
    #deb http://ftp.debian.org/debian stretch-updates main contrib
    deb http://mirrors.163.com/debian stretch-updates main contrib
    
    # security updates
    deb http://security.debian.org stretch/updates main contrib

   

 

安装 ceph-deploy 工具

    ceph-deploy 是 ceph 官方提供的部署工具,它通过 ssh 远程登录其它各个节点上执行命令完成部署过程,我们可以随意选择一台服务器安装此工具,为方便,这里我们选择 pve- 1 节点安装 ceph-deploy

    我们把 pve- 1 节点上的 /data/ceph/deploy 目录作为 ceph-deploy 部署目录,其部署过程中生成的配置文件,key 密钥,日志等都位于此目录下,因此下面部署应当始终在此目录下进行

    apt install ceph-deploy -y
    mkdir -p /data/ceph/deploy

    ceph-deploy 工具默认使用 root 用户 SSH 到各 Ceph 节点执行命令。为了方便,已经配置 ceph-deploy 免密码登陆各个节点。如果 ceph-deploy 以某个普通用户登陆,那么这个用户必须有无密码使用 sudo 的权限。

安装 ceph 集群

    ceph 软件包安装

    首先安装 ceph 软件包到三个节点上。上面我们已经配置好 ceph 源,因此这里使用 –no-adjust-repos 参数忽略设置 ceph 源

    # ceph-deploy install --no-adjust-repos pve-1 pve-2 pve-3

    创建 ceph 集群

    # ceph-deploy  new --cluster-network 192.168.1.0/24 --public-network 192.168.170.0/24 pve-1 pve-2 pve-3
    #上步会创建一个 ceph.conf 配置文件和一个监视器密钥环到各个节点的 /etc/ceph/ 目录,ceph.conf 中会有 `fsid`,`mon_initial_members`,`mon_host` 三个参数 
    #默认 ceph 使用集群名 ceph

    Ceph Monitors 之间默认使用 6789 端口通信,OSD 之间默认用 6800:7300 范围内的端口通信,多个集群应当保证端口不冲突

   

    配置文件

    修改 ceph-deploy 目录 /data/ceph/deploy 下的 ceph.conf

   

    #/data/ceph/deploy/ceph.conf 添加如下参数  
    osd_journal_size = 5120 
    osd_pool_default_size = 3
    osd_pool_default_min_size=1

   

    journal 默认 5G 建议 1TB 数据 5G,4T 盘设置 20G,这个影响性能的

    添加 mons

    我们这里创建三个 Monitor

   

    cd /data/ceph/deploy
    ceph-deploy mon create pve-1 pve-2 pve-3
    #上面命令效果如下
    #1.write cluster configuration to /etc/ceph/{cluster}.conf
    #2. 生成 /var/lib/ceph/mon/ceph-pve-1/keyring
    #3.systemctl enable ceph-mon@pve-1
    #4.systemctl start ceph-mon@pve-1

    在一主机上新增监视器时,如果它不是由 ceph-deploy new 命令所定义的,那就必须把 public network 加入 ceph.conf 配置文件

   

    key 管理

    为节点准备认证 key

    ceph-deploy gatherkeys pve-1 pve-2 pve-3

    #若有需要,可以删除管理主机上、本地目录中的密钥。可用下列命令:#ceph-deploy forgetkeys

    允许 3 台主机以管理员权限执行 Ceph 命令

    ceph-deploy admin pve-1 pve-2 pve-3

 

    创建 mgr

    cd /data/ceph/deploy
    ceph-deploy mgr create pve-1
    ceph-deploy mgr create pve-2
    ceph-deploy mgr create pve-3

    注意,原来版本 mgr 主要是为了 ceph 的文件系统服务使用的,但是现在的 luminous 版本发现即使不使用 ceph 文件系统服务,也需要安装这个服务,否则 ceph -s 或者 ceph -w 的 data 统计部分显示是 0,具体变化后面再参考一下官方文档。

   

osd 创建

    创建集群,安装 ceph 包,收集密钥之后,就可以创建 osd 了

    ceph-deploy osd create pve-1 --data /dev/sdc
    ceph-deploy osd create pve-1 --data /dev/sdd
    ceph-deploy osd create pve-2 --data /dev/sdc
    ceph-deploy osd create pve-2 --data /dev/sdd
    ceph-deploy osd create pve-3 --data /dev/sdc
    ceph-deploy osd create pve-3 --data /dev/sdd

   

    –journal 可以专门指定日志盘,这里不单独使用日志盘。

    这样创建出来的 vg 和 lv 名称是随机的。

    如果中间需要重新删除 osd,步骤:

    1. 停 osd 服务:systemctl stop ceph-osd\*.service ceph-osd.target
    2. 将 osd 提出集群:ceph osd out {osd-num}
    3. 删除 CRUSH Map 中的对应 OSD 条目:ceph osd crush remove {name},其中 name 可以通过命令 ceph osd crush dump 查看 , 比如 osd.0
    4. 删除 OSD 认证密钥:ceph auth del osd.{osd-num}
    5. 删除 OSD : ceph osd rm {osd-num}
    6. 如果需要擦出磁盘数据使用命令:ceph-deploy  disk zap HOST DEVICE,比如:ceph-deploy  disk zap pve-1 /dev/sdc

     

    需要注意,以上的 ceph-deploy 命令始终在同一个目录 /data/ceph/deploy 下执行,否则会出现配置文件不一致的问题。

     

创建 ceph 存储池 pool:

    ceph osd pool create ceph-external 64

最后查看集群状态:

  
root@pve-2:~# ceph -w
  cluster:
    id:     0320d45c-fe5b-4e3d-b515-e223ed5b5686
    health: HEALTH_WARN
            application not enabled on 1 pool(s)
 
  services:
    mon: 3 daemons, quorum pve-1,pve-2,pve-3
    mgr: pve-1(active)
    osd: 6 osds: 6 up, 6 in
 
  data:
    pools:   1 pools, 64 pgs
    objects: 5 objects, 133B
    usage:   6.03GiB used, 174GiB / 180GiB avail
    pgs:     64 active+clean
 
2018-09-25 15:17:26.938346 mon.pve-1 [WRN] Health check failed: application not enabled on 1 pool(s) (POOL_APP_NOT_ENABLED)
2018-09-25 16:00:00.000115 mon.pve-1 [WRN] overall HEALTH_WARN application not enabled on 1 pool(s)
    发现有“application not enabled on 1 pool(s) (POOL_APP_NOT_ENABLED)”错误,可以通过下面的命令消除掉:ceph osd pool application enable ceph-external rbd
    执行完之后 ceph - w 实时显示:2018-09-25 16:25:12.540558 mon.pve-1 [INF] Cluster is now healthy

 

 

三. Proxmox 创建集群

    ssh 登陆 pve- 1 使用命令 pvecm create 创建集群 cluster1:

    pvecm create cluster1

    ssh 登陆 pve- 2 和 pve- 3 使用命令 pvecm add 加入集群 cluster1:

    pvecm add 192.168.1.51

    执行完成之后可以在 3 个节点上使用 pvecm status 查看集群状态:

root@pve-2:/etc/ceph# pvecm status
    Quorum information
    ------------------
    Date:             Mon Sep 24 19:11:19 2018
    Quorum provider:  corosync_votequorum
    Nodes:            3
    Node ID:          0x00000002
    Ring ID:          1/12
    Quorate:          Yes
    
    Votequorum information
    ----------------------
    Expected votes:   3
    Highest expected: 3
    Total votes:      3
    Quorum:           2  
    Flags:            Quorate 
    
    Membership information
    ----------------------
        Nodeid      Votes Name
    0x00000001          1 192.168.1.51
    0x00000002          1 192.168.1.52 (local)
    0x00000003          1 192.168.1.53

    此时,随便登陆 3 个节点中的任何一台的 web 界面,都可以管理整个集群,如下图:

ProxmoxVE V5.2 使用外部 ceph 存储(luminous)详解

四. 集群使用 ceph 存储

 

    使用外部 ceph 集群里创建的存储池 ceph1,登陆 web 管理界面,如下图:

ProxmoxVE V5.2 使用外部 ceph 存储(luminous)详解

注意,ceph-external 这个 pool 就是上面创建的 ceph 池。

 

创建 ceph 认证文件:

在任意一个节点上运行:

mkdir /etc/pve/priv/ceph
cp /etc/ceph/ceph.client.admin.keyring /etc/pve/priv/ceph/ceph1.keyring

注意:ceph1.keyring 中的 ceph1 是指存储的 ID 号 ceph1

 由于建立了集群,使用了 proxmoxfs 集群文件系统,/etc/pve 目录属于集群资源,3 个节点共用,因此只需要在任何一个节点执行上面的命令即可。

接下来,上传 ISO 镜像,生成虚拟机,使用 ceph 存储,如下图:

ProxmoxVE V5.2 使用外部 ceph 存储(luminous)详解

生成虚拟机之后,启动虚拟机,启动失败,报这个错误:

< style=”font-size: 14px; font-family: ‘Open Sans’, Helvetica, Arial, sans-serif; color: #2c2c2c; background-color: #fafafa;”> “KVM virtualisation configured, but not available. Either disable in VM configuration or enable in BIOS”. 

应该是我的测试环境 ProxmoxVE 的问题,查了一下,应该是和虚拟化嵌套开启有关,参考了这篇文章:

https://www.linuxidc.com/Linux/2018-12/15576870.htm

具体就不多解释了,在 ProxmoxVE 物理机上(注意,不是上面 3 个 pve-1/pve-2/pve-3)执行下面的命令:

root@pve:~# modprobe -r kvm_intel
root@pve:~# modprobe kvm_intel nested=1
root@pve:~# cat /sys/module/kvm_intel/parameters/nested
Y
root@pve:~# echo "options kvm_intel nested=1" >> /etc/modprobe.d/modprobe.conf
root@pve:~# qm showcmd 111
/usr/bin/kvm -id 111 -name pve-1 -chardev 'socket,id=qmp,path=/var/run/qemu-server/111.qmp,server,nowait' -mon 'chardev=qmp,mode=control' -pidfile /var/run/qemu-server/111.pid -daemonize -smbios 'type=1,uuid=d9eb0729-f0ee-4176-836d-308b70d13754' -smp '3,sockets=1,cores=3,maxcpus=3' -nodefaults -boot 'menu=on,strict=on,reboot-timeout=1000,splash=/usr/share/qemu-server/bootsplash.jpg' -vga std -vnc unix:/var/run/qemu-server/111.vnc,x509,password -cpu kvm64,+lahf_lm,+sep,+kvm_pv_unhalt,+kvm_pv_eoi,enforce -m 12000 -device 'pci-bridge,id=pci.1,chassis_nr=1,bus=pci.0,addr=0x1e' -device 'pci-bridge,id=pci.2,chassis_nr=2,bus=pci.0,addr=0x1f' -device 'piix3-usb-uhci,id=uhci,bus=pci.0,addr=0x1.0x2' -device 'usb-tablet,id=tablet,bus=uhci.0,port=1' -device 'virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3' -iscsi 'initiator-name=iqn.1993-08.org.debian:01:b48afece2d1' -drive 'file=/var/lib/vz/template/iso/proxmox-ve_5.2-1.iso,if=none,id=drive-ide2,media=cdrom,aio=threads' -device 'ide-cd,bus=ide.1,unit=0,drive=drive-ide2,id=ide2,bootindex=200' -device 'virtio-scsi-pci,id=scsihw0,bus=pci.0,addr=0x5' -drive 'file=/dev/pvevg2/vm-111-disk-7,if=none,id=drive-scsi0,format=raw,cache=none,aio=native,detect-zeroes=on' -device 'scsi-hd,bus=scsihw0.0,channel=0,scsi-id=0,lun=0,drive=drive-scsi0,id=scsi0,bootindex=100' -drive 'file=/dev/pvevg2/vm-111-disk-2,if=none,id=drive-scsi1,format=raw,cache=none,aio=native,detect-zeroes=on' -device 'scsi-hd,bus=scsihw0.0,channel=0,scsi-id=0,lun=1,drive=drive-scsi1,id=scsi1' -drive 'file=/dev/pvevg2/vm-111-disk-3,if=none,id=drive-scsi2,format=raw,cache=none,aio=native,detect-zeroes=on' -device 'scsi-hd,bus=scsihw0.0,channel=0,scsi-id=0,lun=2,drive=drive-scsi2,id=scsi2' -drive 'file=/dev/pvevg2/vm-111-disk-6,if=none,id=drive-scsi3,format=raw,cache=none,aio=native,detect-zeroes=on' -device 'scsi-hd,bus=scsihw0.0,channel=0,scsi-id=0,lun=3,drive=drive-scsi3,id=scsi3' -netdev 'type=tap,id=net0,ifname=tap111i0,script=/var/lib/qemu-server/pve-bridge,downscript=/var/lib/qemu-server/pve-bridgedown,vhost=on' -device 'virtio-net-pci,mac=76:60:17:9D:6A:FF,netdev=net0,bus=pci.0,addr=0x12,id=net0,bootindex=300' -netdev 'type=tap,id=net1,ifname=tap111i1,script=/var/lib/qemu-server/pve-bridge,downscript=/var/lib/qemu-server/pve-bridgedown,vhost=on' -device 'virtio-net-pci,mac=6A:93:EB:0E:A8:84,netdev=net1,bus=pci.0,addr=0x13,id=net1,bootindex=301'
找到“-cpu kvm64,+lahf_lm,+sep,+kvm_pv_unhalt,+kvm_pv_eoi,enforce”这部分,在 enforce 前面加“+vmx,”参数如下:-cpu kvm64,+lahf_lm,+sep,+kvm_pv_unhalt,+kvm_pv_eoi,+vmx,enforce
然后执行:qm stop 111 停止虚拟机后,再执行上面修改后的命令。虚拟机启动后,ssh 进入,执行 grep vmx /proc/cpuinfo 查看是不是有输出,如下:root@pve-1:~# grep vmx /proc/cpuinfo 
flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc nopl xtopology cpuid pni vmx cx16 x2apic hypervisor lahf_lm cpuid_fault pti tpr_shadow vnmi flexpriority ept vpid
flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc nopl xtopology cpuid pni vmx cx16 x2apic hypervisor lahf_lm cpuid_fault pti tpr_shadow vnmi flexpriority ept vpid
flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc nopl xtopology cpuid pni vmx cx16 x2apic hypervisor lahf_lm cpuid_fault pti tpr_shadow vnmi flexpriority ept vpid
表示已经支持虚拟嵌套。

再重新启动上面创建的虚拟机,成功!

ProxmoxVE V5.2 使用外部 ceph 存储(luminous)详解

安装过程中观察 ceph -w 实时输出:

root@pve-1:~# ceph -w
  cluster:
    id:     0320d45c-fe5b-4e3d-b515-e223ed5b5686
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum pve-1,pve-2,pve-3
    mgr: pve-1(active), standbys: pve-2, pve-3
    osd: 6 osds: 6 up, 6 in
 
  data:
    pools:   1 pools, 64 pgs
    objects: 158 objects, 577MiB
    usage:   7.66GiB used, 172GiB / 180GiB avail
    pgs:     64 active+clean
 
  io:
    client:   19.2KiB/s rd, 1.83MiB/s wr, 2op/s rd, 111op/s wr
2018-09-25 20:00:00.000168 mon.pve-1 [INF] overall HEALTH_OK

其中,io  client:   19.2KiB/s rd, 1.83MiB/s wr, 2op/s rd, 111op/s wr 显示了 io 读取实时数据。

五. 高可用测试

 

    上面建了一个虚拟机 CentOS7- 1 使用的是 ceph 分布式存储,具备虚拟机热迁移的条件,首先实现一下虚拟机热迁移,然后再模拟虚拟机所在物理机故障的情况下,虚拟机自动迁移是否能够实现。

热迁移测试:

< style=”font-size: 14px; font-family: ‘Open Sans’, Helvetica, Arial, sans-serif; color: #2c2c2c; background-color: #fafafa;”>    如下图,虚拟机从 pve- 1 主机迁移到 pve- 2 主机:

< style=”font-size: 14px; font-family: ‘Open Sans’, Helvetica, Arial, sans-serif; color: #2c2c2c; background-color: #fafafa;”>ProxmoxVE V5.2 使用外部 ceph 存储(luminous)详解

 

经过大概 20 秒钟左右,迁移完成,如下图:

ProxmoxVE V5.2 使用外部 ceph 存储(luminous)详解

接下来将这个虚拟机加入 HA,如下图:

ProxmoxVE V5.2 使用外部 ceph 存储(luminous)详解

ProxmoxVE V5.2 使用外部 ceph 存储(luminous)详解

模拟物理机故障,将 pve- 2 强制 stop,如下图:

ProxmoxVE V5.2 使用外部 ceph 存储(luminous)详解

 

大概过了 4 分钟左右,加入 HA 的虚拟机在另一台主机 pve- 3 中自动启动了,如下图:

ProxmoxVE V5.2 使用外部 ceph 存储(luminous)详解

测试成功!

总结:

整体测试下来,难点在于 ceph 集群的搭建,对于 proxmoxVE 来说,只要有外部的 ceph 存储池,直接配置进来使用就行了,最多要再配置一下 ceph 的认证配置,使用了 ceph 存储池之后,结合 ProxmoxVE 的集群功能,就可以很开心的使用虚拟机在线热迁移,甚至实现虚拟机 HA,即虚拟机所在物理机故障,虚拟机可以自动迁移到其他正常物理机上。

有一点需要注意,其中如果物理机故障,虚拟机 HA 自动迁移需要耗费的时间是以分钟计算的。这也很好理解,因为集群需要经过一段时间才能决定物理机确实脱离集群,之后才会开始重新安排物理机恢复 HA 虚拟机,能够实现物理机故障的情况下自动迁移还是已经很不错了,因为一般情况下,如果物理机故障,上面的虚拟机恢复其实也是一件很头疼的事情,如果能够后台在几分钟之内帮忙正常恢复,其实也是解决了大问题。

接下来需要考虑的是,由于不是使用 ProxmoxVE 自带的 ceph 存储管理,因此需要单独维护 ceph 集群,后面需要考虑对 ceph 的 web 管理和监控,这就是独立的另外需要考虑的事情了。

不错,经过这次测试,说明不花钱购买订阅,使用外部 ceph 存储,还是能够实现高可用,超融合的虚拟化平台这个当初的设想!

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计12170字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中