找回密码
 注册
查看: 6579|回复: 1

最新Ceph 版与openstack Pike对接

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2018-10-13 11:09:26 | 显示全部楼层 |阅读模式
一、在所有服务器上操作

2 @$ a' d  P0 y, Z6 N
#使用阿里源

2 M; w  x- I+ p  D( U
yum install wget -y

" X' c8 x, y% x0 z; @+ H1 P3 M* B# H
rm -f /etc/yum.repos.d/*
5 v: @6 \1 ^! F4 f
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
) {  I) M3 N4 C! s6 Y' }
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

* Y6 ^# v5 O9 r: N7 _. V. D" m
sed -i '/aliyuncs.com/d' /etc/yum.repos.d/*.repo #删除阿里内网地址
0 ^7 t; t. r) U. O+ }
#创建ceph源

" t4 i. F: ?! B0 J5 ]; o
echo '#阿里ceph源
% n! [( r% Y: X3 o2 i% s* [8 }" s
[ceph]

" H6 V$ \* m& S
name=ceph

; q" b1 J; }6 m' j
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/x86_64/
! d, G* t" n6 [* e7 K" J
gpgcheck=0
8 `, w! c9 R# W0 }' K8 B
[ceph-noarch]

. x) l3 x8 {3 w9 ~5 W& o
name=cephnoarch
; ^+ U/ g6 G) Y6 E$ q
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/noarch/
8 e% o; a" ]0 p9 k6 F7 `& U
gpgcheck=0
9 \- O( F" R6 |- U1 }
[ceph-source]

, m) \! ?2 u/ }0 w1 C" a9 c* v
name=ceph-source

! G8 Z0 W5 G" D0 _
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/SRPMS/

& L/ A9 k. E0 y& [) M+ r
gpgcheck=0
; u# ?. [* G% I( `. M: w+ H8 M
#'>/etc/yum.repos.d/ceph.repo

+ r4 r8 S% h) c4 S
yum clean all && yum makecache #生成缓存
) U1 O" b6 k6 v6 z8 ~/ @
#关闭selinux、防火墙
2 Q& c  J( s# C( x
systemctl stop firewalld.service
% |% m3 y( G& ~5 \& ^* m
systemctl disable firewalld.service
. S6 N3 Q) Y$ X/ t/ o/ [
firewall-cmd --state

3 [- b. o+ K. D" M3 `8 ?
sed -i '/^SELINUX=.*/c SELINUX=disabled' /etc/selinux/config

$ ]+ t2 j2 |% P3 N! `0 Z% Y: F
sed -i 's/^SELINUXTYPE=.*/SELINUXTYPE=disabled/g' /etc/selinux/config

) Y) t2 |0 L% _5 e7 Y5 l$ p
grep --color=auto '^SELINUX' /etc/selinux/config
, d" M# Q% k8 t
setenforce 0

4 ?6 _8 A$ V# [
' E: w; }) Z2 H
二、只在node1上操作
! y7 l" |* z' W0 s) C
三台服务器分别为node1 node2 node3   其中我们在node1上面安装ceph官方的自动化部署工具,也就是说我们只需要操作node1即可完成部署
1 {1 ^5 c" o# z) b9 K

) ^/ E' o+ F- p: I  A" _' F4 A2 K
#添加服务器主机名
: {- ?8 J- ?) `7 J3 ~
echo '
* ^6 k) F  }9 _! e2 J. Z. H* m
10.0.0.11    node1

# a9 e5 L9 |: m( x6 T1 H; j1 l
10.0.0.22    node2

! t+ Q0 C. ~/ N; `! F7 D. N
10.0.0.33    node3
; n, h/ W7 l, o3 R  u
10.0.0.44    node4
: j. [! y% m! _  Y2 c( ?
10.0.0.55    node5

2 K4 z6 P  M3 v$ u# r: t( M
10.0.0.66    node6

1 ^, l2 l- F- j" k; l
'>>/etc/hosts
1 P( q& ]7 b& S: S. h  L8 X
  c7 L- g: n6 }5 M/ k% o0 ]
#创建秘钥
3 Y$ Y4 e( l$ F7 v) M7 h
ssh-keygen

, _6 P+ L6 h# w+ N2 _7 t: u4 N
ssh-copy node2
' v) [" M; A7 d& n- V
ssh-copy node3

! G3 D, C2 \% l/ _! s
% a+ s& k& [/ Y7 u6 s9 @& G" D" \
#将node1的hosts文件发送到其他服务器上面

/ ^  G% R' m! R6 C; y2 k
scp /etc/hosts node2:/etc

- a; b9 [1 w5 c/ ~/ }! C
scp /etc/hosts node3:/etc
- T# J2 q) ?+ ~  `

% \$ ^1 f; o: W$ }% l: Y
三、开始在node1上安装ceph

) [. F$ v2 W8 q, h; l+ p" \- B& N
#安装ceph-deploy配置工具

7 C* S' `4 F9 `5 G& y5 p# s/ ^
yum install -y ceph-deploy
& y0 d" L2 b) q. Q- k: C
yum install python-setuptools

$ Y6 Q5 k5 s( |; a& D
- z( e  i# O3 W4 b; |# I
#创建配置目录
% Y+ P! r4 |( ?; B1 g! w
mkdir /etc/ceph

2 N* G  F7 Y, Z7 U
cd /etc/ceph/

' r2 H& X. D- u0 M) M+ `& x9 M
) z  z0 `" b8 ]
#初始化Mon配置

0 q" w9 ~6 X: |2 e
ceph-deploy new node1
  _7 c* X1 U( |, B

  |6 }1 R9 @* A5 a! Y
# #修改冗余份数为2,日志大小2G

* b2 T6 R4 }, E! X( C. |
# #配置网络,单网卡忽略

$ b$ U$ a( ^  C5 q
echo '

- Z' D  \2 @, U
public network = 10.0.0.0/24
+ D% \/ W$ `5 F+ J& z, x  V3 }; w
cluster network = 10.0.0.0/24

+ W6 l" X- z/ p7 q* A: Q9 ^1 J9 V' L) f; x* Y4 v4 j% W( ?1 w6 R
mon_clock_drift_allowed = 2   
% s# ~' U0 Z- [$ L
osd_journal_size = 4086
# W9 S* y4 B& v' ?
osd_pool_default_pg_num = 128

6 n( ^4 X1 q! B
osd_pool_default_pgp_num = 128

- {, A1 s( \9 U
osd pool default size = 2

3 Y0 W' G- R& M; `
osd pool default min size = 1

# V: f  P+ S3 U9 b
rbd_default_features = 1

, k! @0 g' p3 S) y: g( w/ P
client_quota = true

: P6 O7 C5 ?* R+ W1 e+ A: a
'>>./ceph.conf

! @" s/ H9 @+ X0 \, ]" r$ t% Q- C  m, w; S7 k  R
#安装Ceph
$ N- i9 \/ Y& x
ceph-deploy install node1 node2 node3

* }4 j! J( u$ q$ Q
#yum install -y ceph ceph-radosgw #实际上是安装这2个rpm
# M' M  M3 L' D/ K

4 h4 w' e6 X' Q" X8 B
#初始化monitor和key
1 x% [* a) W9 K) A
cd /etc/ceph/

0 X; l. t1 r. z2 k
ceph-deploy --overwrite-conf mon create-initial
2 L4 Q$ ~& G) e  h8 R0 B+ ?
8 F+ {+ N% `, O) D8 J! U$ _4 h) A' O. ^
#创建osd
$ w# I* S  M0 ^4 c8 M5 z
ceph-deploy osd create --data /dev/sdb node1

8 i" E7 M3 a! g
ceph-deploy osd create --data /dev/sdc node1

. J+ z- y" R0 Q/ |* n8 j+ |
ceph-deploy osd create --data /dev/sdd node1
3 `4 T% E4 {. L" f( o
ceph-deploy osd create --data /dev/sdb node2

! K, r* d3 w, U8 }
ceph-deploy osd create --data /dev/sdc node2
- e8 q2 i& l$ f" N( t
ceph-deploy osd create --data /dev/sdd node2
4 \! w! p* _0 E+ j& H
ceph-deploy osd create --data /dev/sdb node3
; P6 N0 F) _1 I, r( y; a
ceph-deploy osd create --data /dev/sdc node3
" D' Z6 P2 i. W) t3 W
ceph-deploy osd create --data /dev/sdd node3
) I. a, z% h' O7 s, n0 x
3 C5 t6 }; a( |7 k  T
#拷贝配置及密钥
# C: k" u) O6 ?. w7 }8 G' |5 h: F
ceph-deploy admin node1 node2 node3

3 s' z% [1 K# ^
chmod 644 /etc/ceph/ceph.client.admin.keyring
" e) K/ S" j7 x

# ?; x5 W+ [& K) Z+ n* u7 @2 w1 r5 v
#创建mon

( C1 s" g5 u; ^/ h2 V& Y
ceph-deploy --overwrite-conf mon create node1

# Z" o6 a$ {. m+ T+ Q$ e. k
ceph-deploy --overwrite-conf admin node1
! L8 G# ^" I$ M8 J

7 [: d; _# w' ?( w. Z" o
#添加mgr

% r6 `$ Y- f% Z  H
#ceph 12开始,monitor必须添加mgr

1 a+ h( r* ^) |/ g# z4 h+ M) ^
ceph-deploy mgr create node1:mon_mgr
5 h3 W% {% s( @( [# H
/ y  J" J! u  c3 j
#启用dashboard (在node1节点)
# ?  o( M3 }  U$ E- W
ceph mgr module enable dashboard

7 d" v; Q0 k+ M0 r; I: d2 }$ n$ l4 P6 ?/ q# M
web访问http://10.0.0.11:7000   即可看到ceph的运行情况

. `3 [3 w& S5 H9 I* Y9 t) A
0 e1 d/ j8 m& \! Q5 d9 |0 M7 M" B8 U
#查看相关命令
. O2 V% b1 `+ e: `) t9 N9 C7 j
ceph health
! ^. M3 T9 t) d3 ~: g- T
ceph -s

8 ]$ o6 i4 B7 R  h
ceph osd tree

" H7 q$ m9 Y5 c  n6 ~/ n6 w
& p1 u- F- C8 [; y, b$ u( v: u
ceph df

& c- ~4 k/ W/ R8 G6 U1 G
ceph mon stat

$ o9 w4 a2 L, L. z8 W
ceph osd stat
9 d) Y7 k; ^, {
ceph pg stat

  h' W# ]0 J7 p* p
* x( `# q1 A2 `; S6 f" E+ ~( l. w
ceph osd lspools

& W1 D$ H( g; [
ceph auth list

1 a3 k( ?6 Z- c2 Z! B: p( V4 H  D9 k7 ^/ [/ y
Ceph L版与openstack Pike对接

; I8 E( S* Z9 P0 F- x+ u. j9 H, D, R3 l( }
环境opestack Pike的controller、computer、cinder三个节点已经安装完毕,并且能够正常的使用
1 [% g6 h' x; m/ T. b) ]8 _* \: L9 s1 ^

( t3 f$ K0 `, }; D+ A' J
node4为controller
1 ]' I# G) Y; F, d3 O. x
node5为computer和cinder
- }4 w! f6 b4 a" o9 }1 H% @
6 b" }; m- d1 e/ r1 b
一、环境准备,所有openstack主机都要操作
$ C2 g9 I- S" }# s4 ~0 L
#所有openstack节点都添加主机名

' Z7 w' ~7 i" D( G4 `- s5 y. ~3 t5 F
#添加服务器主机名
, g+ W* {/ y2 s7 i; F" n- b
echo '
  L% e* v$ b( L
10.0.0.11    node1
2 v' }" b  D4 u% s8 P. M/ A: P- o
10.0.0.22    node2
; {4 e5 h* X$ n1 k# L
10.0.0.33    node3

* k' N5 @) J5 k& R
10.0.0.44    node4
# I' M8 L' ]) h/ Q% G$ F2 x  l
10.0.0.55    node5

- n4 ^* J5 n* I" G# |& w$ G
10.0.0.66    node6
$ e5 i# O/ b8 `5 a2 Z+ c- ]
'>>/etc/hosts

6 }  m7 n1 l$ G+ J) T: ~+ s8 e1 s8 {# [- h, t$ D
#创建ceph源

9 }7 t! j7 H) Z9 Z7 @5 M) f
echo '#阿里ceph源
% \( }3 I6 |( e9 V  N8 R
[ceph]
) e% q8 Q. V8 M' y* s& {
name=ceph
/ l1 d! k+ Z( l# _
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/x86_64/
, v) ?; N3 L: \) |6 j9 E
gpgcheck=0
6 W) o: p  {! {7 x6 S
[ceph-noarch]
: N) ~/ E/ i, _& S( T; _
name=cephnoarch

% \5 {  J: E# u+ {) z6 N- _& ?  t# O
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/noarch/

- T& I+ D" v: O: u) @! X; g3 t
gpgcheck=0

. D' C, ]+ }2 [6 z2 t& V! f
[ceph-source]
8 B( E$ k; C, ^5 E5 `/ |" d
name=ceph-source
& r5 d" T! m9 t5 @. W1 R
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/SRPMS/

) ~; k  e1 A" _
gpgcheck=0
, q% J. `9 O' L% @
#'>/etc/yum.repos.d/ceph.repo

* q9 f) C+ q  }' s
yum clean all && yum makecache #生成缓存

2 L$ m- t+ M7 L
#关闭selinux、防火墙

) ~/ K( f  t+ \3 m
systemctl stop firewalld.service
6 J& D3 }& G, _; }# j
systemctl disable firewalld.service
) A; N& v# x; S; z3 a
firewall-cmd --state
* B9 Y3 g- O! e. H6 z5 i, [3 U
sed -i '/^SELINUX=.*/c SELINUX=disabled' /etc/selinux/config
9 y, s& w! v2 k( L0 L. y
sed -i 's/^SELINUXTYPE=.*/SELINUXTYPE=disabled/g' /etc/selinux/config

% W8 Y/ B5 ^5 Q
grep --color=auto '^SELINUX' /etc/selinux/config

/ s& X3 Q  }# ^* y3 m
setenforce 0

' j2 U. b; K' _7 m8 `( J% W1 C
9 x6 d$ L- V% H1 s; q2 b5 m
#将glance组件的节点安装ceph客户端
. Q& h" {9 v4 \: o4 K4 h2 ^4 M% L
yum install python-rbd

; ^: M, U& v6 }5 j, p% k1 v5 x, S) w) e( s$ w
#将nova和cinder组件的节点安装ceph客户端

0 ]6 ~2 d7 k* G
yum install ceph-common

1 d: b1 I$ _' P6 f) _9 F4 h
9 Y- ^, l$ j- f8 d
#创建POOL
$ w9 m3 X" }9 `- o1 P: C. a  s$ d
ceph osd pool create volumes 128
$ M8 }- F  M5 A" o: L: }
ceph osd pool create images 128

; Z6 L; p+ h5 {2 S" x: E2 f
ceph osd pool create vms 128

# f8 \! ?  \0 W( @7 l/ t: H) J9 c0 B. \3 |0 m& Q
#初始化POOL

& F% g' r0 l- w, ^, `2 G1 ]
rbd pool init volumes

/ X( K' l" x! L7 l
rbd pool init images
) q# _" F  @* g7 v6 C  {8 p# ~
rbd pool init vms
+ ^3 S) X5 s9 A9 l! z$ T

' ]: X6 z* L9 o. I0 n9 M3 x! U
#将ceph的配置文件导入到各个openstack节点上

$ _2 O1 c  U  t+ K
ssh node4 tee /etc/ceph/ceph.conf </etc/ceph/ceph.conf
! x, S/ F# r7 ]) l% d3 ~
ssh node5 tee /etc/ceph/ceph.conf </etc/ceph/ceph.conf

0 D% t7 n1 _6 a% K2 e
; r5 W( v6 J3 U$ Q2 s% g
#创建ceph用户和密钥
8 \' ^4 r4 }6 ]
ceph auth get-or-create client.glance mon 'profile rbd' osd 'profile rbd pool=images'
; \0 @/ ~& E8 P! m* Q
ceph auth get-or-create client.cinder mon 'profile rbd' osd 'profile rbd pool=volumes, profile rbd pool=vms, profile rbd-read-only pool=images'

& e: R) D0 H. F$ _/ L; J4 R
ceph auth get-or-create client.cinder-backup mon 'profile rbd' osd 'profile rbd pool=backups'
4 m% M# U" `) |# e, ?1 ?

( w9 W+ D. T0 E! T2 E" A; t
#查询用户,写入文件
  o# N# G6 S$ W' G
ceph auth get-or-create client.glance | ssh node4  tee /etc/ceph/ceph.client.glance.keyring
8 i- L$ t8 V# R$ v1 ~( f" K, e0 `4 ]
ssh node4 chown glance:glance /etc/ceph/ceph.client.glance.keyring

) D3 K$ r& }5 T" W2 @
ceph auth get-or-create client.cinder | ssh node5  tee /etc/ceph/ceph.client.cinder.keyring
. w& Q4 e5 X; `. M( K
ssh node5  chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring
: H* I6 T8 _: Y" W' Q' V
ceph auth get-or-create client.cinder-backup | ssh node5  tee /etc/ceph/ceph.client.cinder-backup.keyring

7 Z# z7 n/ m6 m4 m1 B
ssh node5  chown cinder:cinder /etc/ceph/ceph.client.cinder-backup.keyring

2 t8 U+ t) t/ E: O
ceph auth get-key client.cinder | ssh node5 tee client.cinder.key

$ i2 j2 ]) i" H8 K  M, Z4 _. l: I0 d9 e3 d& ~2 X! u
ceph与glance对接

; w! h* c5 ]) P* q8 m
#更改glance默认存储为ceph
* T; q4 X% y3 e/ V
#修改/etc/glance/glance-api.conf文件,添加一下内容

6 }% x" W5 b* n( q
[DEFAULT]

! g2 \( e# X% [/ w3 m8 P( C* P
default_store = rbd

9 O' l2 K* _1 \3 W& q3 ]- C6 k
show_image_direct_url = True

% ^' t9 _# Z( r; _' U
2 R' K2 k# M' }" b3 k3 N
[glance_store]
3 x& _' i$ y1 d. _; R# ^% |  w" P# J
#stores = file,http
0 L5 A3 y$ N2 E% x
#default_store = file

! B9 J( C! D* `8 B3 t
#filesystem_store_datadir = /var/lib/glance/images/
2 Z) D9 U7 h) O& j- ]
stores = rbd
0 B4 e, w) @. _! ?& c# O0 Z
default_store = rbd
- ]/ u3 C  B1 ?: e2 d  E& `8 D
rbd_store_pool = images
# E+ a! E4 l) }# s9 @7 G  D( A& z7 h
rbd_store_user = glance

$ q) ?) i  V" F( N" M) F" B8 [
rbd_store_ceph_conf = /etc/ceph/ceph.conf

  Z1 T4 Q8 Y9 T8 a4 Z3 \5 h: ^) h
rbd_store_chunk_size = 8
" q5 N8 v: I4 ?( i3 R4 T2 X5 l

3 J0 ]/ T  S" Q0 T1 D6 d
#重启服务
3 ^" H4 E) L' L4 U+ H) M" ~3 O
systemctl restart openstack-glance-api openstack-glance-registry

2 |" n; E' j' I* L! [, _5 w7 N! f+ Z* Q) i3 c5 f! ~: n
注意:在glance节点你需要查看/etc/ceph目录下是否有glance秘钥

/ `3 M3 t# J; T- C4 t( E; b; `
) Z5 W, I$ O% X0 |& \' v& r
ceph与nova对接,在computer节点上操作
' Q  J3 y4 k: l+ u
#密钥加进libvirt
, }( I# b9 T6 P
uuidgen

  ^2 u( N& I. i1 t/ X" \& n
cat > secret.xml <<EOF
2 _: Q5 z: s3 Y+ x; T) Y) U, S5 F* u
<secret ephemeral='no' private='no'>

% F: ^( Y+ Y0 W$ r
  <uuid>ff2e1190-30f5-4849-9c1c-886b1e1ee181</uuid>
* Q7 V" x; S+ {' c
  <usage type='ceph'>

: m) K$ P4 x4 s7 r% {
    <name>client.cinder secret</name>
$ d/ U: M2 x1 u2 ?
  </usage>
0 [& Z0 I" S+ i1 L( h
</secret>
# E- a- g5 C! r0 i2 h: }, F8 [% ]
EOF

; Y3 }+ j  r. V( \" m& S; H0 [
virsh secret-define --file secret.xml

& A/ K4 `: d1 w0 b5 A' u& J1 G% i% E9 y8 R
virsh secret-set-value --secret ff2e1190-30f5-4849-9c1c-886b1e1ee181 --base64 $(cat client.cinder.key) && rm client.cinder.key secret.xml
3 q9 V, }7 c: M+ N! o0 t
+ S% m1 p' \" p+ B, P7 j
virsh secret-list
! J7 S4 |& C" l1 U# p1 N/ J
UUID                                  用量

/ V4 z6 E7 V$ j6 \* P& Q. n
--------------------------------------------------------------------------------
# i" Z9 ?& t  N' ]2 [" w% _4 h2 N
ff2e1190-30f5-4849-9c1c-886b1e1ee181  ceph client.cinder secret
. f7 j8 r2 t7 \) C6 b# Z: V7 O) `% {

, ?3 g5 o; ^& ~8 s1 p' L9 c
在computer节点的ceph配置文件里添加一下内容
8 }$ G- n4 m8 M# q
ls -l /etc/ceph/

7 L% ^$ C& g( r+ W$ S
#ceph
- _, ]2 P; t! H/ f
echo '
. ]4 ^6 y9 O. z; U* v7 |, T0 r; H
[client]

0 W' G3 }, g0 o8 r  R
rbd cache = true
3 V& n2 {0 ?) h7 N$ l4 g
rbd cache writethrough until flush = true

8 N- H) J- {4 \+ A
admin socket = /var/run/ceph/guests/$cluster-$type.$id.$pid.$cctid.asok

( W9 X* v9 X2 ]6 x2 S
log file = /var/log/qemu/qemu-guest-$pid.log
# G% Q8 W7 O' X$ H* t
rbd concurrent management ops = 20
% U: b: N3 ~& M6 I' B: p  u) v( ^
[client.cinder]
! G7 D  L, e7 b8 ^4 k$ g( g- O- f
keyring = /etc/ceph/ceph.client.cinder.keyring

6 u) u& {3 Y1 [6 _# L  y
'>>/etc/ceph/ceph.conf

+ Z. E9 N, [% I2 ^
! L8 {% |# B' j" o! N2 t* H
mkdir -p /var/run/ceph/guests/ /var/log/qemu/

; S; e5 D/ L' B9 b/ q3 Q0 N
chown qemu:libvirt /var/run/ceph/guests /var/log/qemu/

4 s) z9 t0 s8 i0 w8 v  U+ s9 E0 [' m+ M  {
#使用ceph存储,在/etc/nova/nova.conf添加以下内容
2 O) Q  {/ `* |' ^1 o5 M) C7 o
[libvirt]

8 \2 R0 Y/ k1 U1 y
virt_type = qemu

2 B! ~  f! m' ?' T
images_type = rbd

2 G, ~, ]/ G! K! r. \- B! M3 i+ h
images_rbd_pool = vms
( P( d% f7 c$ b  c
images_rbd_ceph_conf = /etc/ceph/ceph.conf

) n0 H* O( B' O" u
rbd_user = cinder

! b4 m. Y- b! w( I1 l
rbd_secret_uuid = 'ff2e1190-30f5-4849-9c1c-886b1e1ee181'
" C  k: {) p; C; u9 W% x8 M
disk_cachemodes="network=writeback"
8 x0 V  f; I2 Z& h7 n: b" F
live_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST,VIR_MIGRATE_TUNNELLED"
+ z0 x% K5 i% J% L* e: e
libvirt_inject_password = false
  i$ x$ z: Q0 k1 t1 U. j' o
libvirt_inject_key = false

$ R: L5 D+ ^' V1 u
libvirt_inject_partition = -2

/ x9 v0 ~1 K7 o1 g3 F
$ T6 V0 x5 |: e
#重启服务
" i! X! {* o/ ~# N
systemctl restart libvirtd.service openstack-nova-compute.service
" L2 }' g$ B5 Q5 y/ T

  [( h. F# k  c& S. p  T9 M" s( M5 L  y+ i, i3 \; Y  a
ceph与cinder对接

; y( X% X9 D! @1 }! P* J1 f& d
7 o/ \# c, p8 n4 F
#修改/etc/cinder/cinder.conf配置文件,注意:将之前的lvm的配置都删掉

) x% A3 a- Q' @! D. G
[DEFAULT]

; m8 V! ?; f' R& Y. h) L
#enabled_backends = lvm

5 H1 B. ~6 G: G# A; d: H
enabled_backends = ceph

  y4 {) }: b+ d0 P& f/ P- }5 w3 t( q0 o" o
[ceph]
; @/ T# \) ~) V
volume_driver = cinder.volume.drivers.rbd.RBDDriver
5 n- r& N* r( m/ Z/ U
rbd_pool = volumes

+ c) [6 g1 x3 p4 {4 P! ~
rbd_ceph_conf = /etc/ceph/ceph.conf
8 ?* }% q# T) p; X' G( V# ~
rbd_flatten_volume_from_snapshot = false

6 w/ I8 `$ u2 h$ j
rbd_max_clone_depth = 5

8 l0 i5 J$ J  J
rbd_store_chunk_size = 4

! j1 r$ `: ~2 ~  z) P4 D3 j. d
rados_connect_timeout = -1

) i- {  g0 ^# R& ]& r
glance_api_version = 2
$ e' c  m: _* O7 ~' ]  y
rbd_user = cinder

" W9 z4 C4 }/ G/ ]( U. C( U6 ?& a
rbd_secret_uuid = ff2e1190-30f5-4849-9c1c-886b1e1ee181
/ G, q( K  ^2 n6 \

: a! Z; C, Z3 K" w, s) u, d. P  G3 v- K! D) R
#重启服务   
  I. P9 r$ U+ X' \# Y
systemctl restart openstack-cinder-volume.service
, h9 f: X+ _- w1 |4 o

8 X! K9 e1 C( Y3 J# S$ P2 j$ `- ^  `0 m1 g+ C- h! y

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2018-10-13 11:12:23 | 显示全部楼层
1、创建一个POOL
* [# A6 }, Q. g! B% {Ceph的块设备默认使用“rdb” pool,但建议为Cinder和Glance创建专用的pool。- l1 D0 E, d, `) H
ceph osd pool create volumes 128( J# P4 @  f/ H5 Y
ceph osd pool create images 128
3 c: h+ Q, B5 k2 m: P+ W) C7 l: i: X2 D! Iceph osd pool create backups 128
2 D( m% q. ~0 Fceph osd pool create vms 1282 V- P7 {: b+ I0 w  W. w
3 X5 V  r$ ~- `0 @- ]/ V% U
2、配置OPENSTACK CEPH CLIENTS& u! m6 ]. H6 N9 D3 M5 ~, e: j5 M
环境的准备,需要事先在ceph管理节点到openstack各服务节点间建立起免密钥登录的关系,且需有使用sudo的权限。
( r9 T: K. h3 f
$ f& I& H" ]6 ]9 R- T) `2 ^4 Y安装ceph客户端软件包:
5 m) c, g& {5 a# k% [" D4 K/ p在glance-api节点:sudo yum install python-rbd& J3 O5 l( R' i. x! z
在nova-compute, cinder-backup and on the cinder-volume节点:sudo yum install  ceph (both the Python bindings and the client command line tools)4 ?9 ~& m6 ]# s8 U9 q2 Z& o+ m4 X, _

& ^8 f# t) }6 q  F+ n在OpenStack中运行glance-api, cinder-volume, nova-compute ,cinder-backup服务的主机节点,都属于Ceph的客户端。需要配置ceph.conf.
# l8 W% W# K% v. o  |使用以下命令把ceph.conf复制到每个ceph客户端节点:
$ B* S8 ^% P4 w* v& _/ P, Zssh {your-openstack-server} sudo tee /etc/ceph/ceph.conf </etc/ceph/ceph.conf
; T  m- `) I+ q' {: p/ s9 ~% z5 P! A: k2 x, U9 d3 ?
3、设置Ceph Client Authentication
4 w% u1 O/ U& o/ ?如果启用了cephx认证,那么就需要为Nova/Cinder创建一个新用户:
5 d! \  o& S+ `( L$ceph auth get-or-create client.cinder mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=volumes, allow rwx pool=vms, allow rx pool=images'4 @* r, r" e- `* v, p+ V
$ ceph auth get-or-create client.glance mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=images'
8 N7 q. ~6 w2 N& Z1 J4 k& Y$ ceph auth get-or-create client.cinder-backup mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=backups'4 S+ J* j) ]/ @  o# Z$ g3 y" b3 l
3 C- A, J- C. ?/ k4 G2 F
将密钥(client.cinder, client.glance, and client.cinder-backup)分发至对应的主机节点,并调整属主权限:
9 a' `# D9 [; z4 }% mceph auth get-or-create client.glance | ssh {your-glance-api-server} sudo tee /etc/ceph/ceph.client.glance.keyring
& B7 z( p, n, fssh {your-glance-api-server} sudo chown glance:glance /etc/ceph/ceph.client.glance.keyring
* i5 Z" ^* F  oceph auth get-or-create client.cinder | ssh {your-volume-server} sudo tee /etc/ceph/ceph.client.cinder.keyring
5 u( Y6 h/ a% P" [; l5 b2 Jssh {your-cinder-volume-server} sudo chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring' z3 g: ]" V; @# ]
ceph auth get-or-create client.cinder-backup | ssh {your-cinder-backup-server} sudo tee /etc/ceph/ceph.client.cinder-backup.keyring
0 ]6 E& e/ L3 Q' Essh {your-cinder-backup-server} sudo chown cinder:cinder /etc/ceph/ceph.client.cinder-backup.keyring
3 Q* p9 h# k* f  v0 `% x
1 n2 X! R) M! T# X) Y* U+ c' |! ?# u运行nova-compute的节点需要使用cinder密钥:9 v8 }* j( X/ M% @
ceph auth get-or-create client.cinder | ssh {your-nova-compute-server} sudo tee /etc/ceph/ceph.client.cinder.keyring
1 I; o: _4 k$ H, A2 w4 i" ^1 Y7 {! N' X6 e: @# g
libvirt同样也要使用client.cinder密钥:
: V! L$ h) P5 M" L. D5 VLibvirt进程在从Cinder挂载一个块设备时,需要使用该密钥访问Ceph存储集群。+ M& S$ h. o% ?, f0 p
先要在运行nova-compute的节点上创建一个密钥的临时拷贝:
2 N' m* C. f' g" S/ ~3 ?ceph auth get-key client.cinder | ssh {your-compute-node} tee client.cinder.key% @3 A8 f$ q' t) ^) k0 b9 L3 r  U

8 I4 J9 ~0 m% n) v  @1 i% w* A# n: b然后登录到compute节点上,将密钥增加到libvirt配置文件中并删除上面的临时文件:
+ r1 P: Y; `- [( n6 \$ uuidgen' f  ?% A" T8 O$ R
22003ebb-0f32-400e-9584-fa90b6efd874
- p. Y5 K% X$ X 5 \" D2 g5 `! F6 o7 n
cat > secret.xml <<EOF$ i7 D0 w$ E3 m
<secret ephemeral='no' private='no'>5 U' r, ^$ e8 R9 h
<uuid>22003ebb-0f32-400e-9584-fa90b6efd874</uuid>! G+ G- ]3 L/ H) F2 M4 P
<usage type='ceph'>+ [0 R# f4 B- N& b' n
<name>client.cinder secret</name>
& Q: f3 ~% ?5 Y% v</usage>
6 l  ^& d. Y2 C( U/ [/ f</secret>
+ E4 h/ R3 }! W) ^3 {, T8 dEOF7 s: s' [' q% \6 S( I
# virsh secret-define --file secret.xml* A  N$ `+ n! x, S
#Secret 22003ebb-0f32-400e-9584-fa90b6efd874 created) j9 K6 r, H! H  ?: w' I& M6 ^
# virsh secret-set-value --secret 22003ebb-0f32-400e-9584-fa90b6efd874 --base64 $(cat client.cinder.key) && rm client.cinder.key secret.xml" e5 R8 r; \, J% L( e' W: U4 X
Secret value set# `* l+ G$ @1 k/ x7 o

0 `, M3 _2 {' u5 a! S- O: C为了便于管理,建议在有多个计算节点时,在上在的操作中使用相同的UUID。3 l0 S* C2 N* Q) j9 V" H8 E
5 C; a8 K- |8 @2 k) q

5 G- ]5 S& L9 P4、设置Glance集成Ceph- U1 E; R9 D: t( j% ]* d! Y
JUNO,编辑/etc/glance/glance-api.conf:
; Z) W0 ?- u6 M& c. \[DEFAULT]( g( D4 r, G: \( b) w2 z
...
" M3 Z# }) b( c0 qdefault_store = rbd+ G+ a( e/ a/ n6 A; z
...
# e7 P. o2 N+ ], o- R[glance_store]
6 |0 c7 y/ \, e6 W% vstores = rbd
6 M5 g5 g/ p- x3 \rbd_store_pool = images! n3 c9 e3 G- ^7 m! i- m9 k: v
rbd_store_user = glance
! W4 \1 }4 \" N+ M" n. g( M7 Prbd_store_ceph_conf = /etc/ceph/ceph.conf: R8 l7 @; o) F1 A- e
rbd_store_chunk_size = 8$ a' Y* C% k- ]& e  g) O, k
& [# r; r' r1 b
启用copy-on-write功能:
# u: y/ Z" ^& J( X* z; G1 ?: R在[DEFAULT]中增加以下参数,+ f% N5 z: n& M, M, n0 c! S
show_image_direct_url = True' L& q2 g; v$ |1 W
: M  F* a% U) Q) ~
怎样关闭Glance的镜像缓存:
" j* R5 x3 `+ D2 [修改以下参数如以下所示,
6 ~0 O8 `% i% \+ _[paste_deploy]flavor = keystone
% C0 l& M9 B2 Q+ G9 v4 K( P/ J' H# [8 Y  ^! x1 b
其它建议设置的Glance参数:6 z4 ^9 S, ^5 o$ \2 D# U
- hw_scsi_model=virtio-scsi: add the virtio-scsi controller and get better performance and support for discard operation9 D/ ]$ v" A$ J4 x- l
- hw_disk_bus=scsi: connect every cinder block devices to that controller
/ u/ f, [  W+ \4 D/ V* Y, n- K2 G- hw_qemu_guest_agent=yes: enable the QEMU guest agent0 c7 t; K" H2 z
- os_require_quiesce=yes: send fs-freeze/thaw calls through the QEMU guest agent
1 T4 k7 |: h! ~  L, U" I
6 @: i* a4 w/ J/ O. w# GOpenStack官网配置参考:1 w# p% N4 Z( k6 j
http://docs.openstack.org/libert ... -image-service.html
; q. s+ ?/ ?# a, W5 h( U. W& N+ O
: t# S6 ^+ n3 E/ e0 ]: ~% E2 k. Z; e5、设置Cinder集成Ceph
' B4 g2 F1 a+ Q, ^编辑/etc/cinder/cinder.conf:
6 j7 k) ^  [! m! Z/ Y" @: _[DEFAULT]! h- }6 o, ]: A
...
' `; b$ Z( C% [. x# Eenabled_backends = ceph  \# L$ B1 `3 q# _3 K, a3 [
...& \# ~* S+ s' j# }4 F
[ceph]/ j. m8 C6 O0 {1 T8 d  Q- g
volume_driver = cinder.volume.drivers.rbd.RBDDriver
& x; `/ [" D) p1 m- p8 X. Zrbd_pool = volumes9 G  K! |  M% \1 Q5 X
rbd_ceph_conf = /etc/ceph/ceph.conf( G/ ^* n' K* i, y0 b
rbd_flatten_volume_from_snapshot = false, I) d; V7 }! g, s4 I% P: h, s
rbd_max_clone_depth = 5
4 Y/ }# e% \* L& L( M) Orbd_store_chunk_size = 4
6 J7 Y2 i3 ~1 m3 `rados_connect_timeout = -1
$ u6 \; p. Y1 {* o' ~glance_api_version = 2
& E) C% O8 J7 ^: t3 U% x$ z7 m# P* T: L1 u6 y4 H, Z) @! q# ^
在启用了cephx认证时,还需要配置认证信息:
7 F  a; k8 P, Z[ceph]3 N- W$ F  c0 E- L0 f
...
- N. x3 X! c) Y0 Xrbd_user = cinder- ]" d: z: r3 ]  d
rbd_secret_uuid = 22003ebb-0f32-400e-9584-fa90b6efd874: T0 S- F( Q( d- G5 y
) p' \! {5 D% E8 H. R; V. ?
注:如果你需要配置多个cinder back ends,一定要在 [DEFAULT] 部分设置glance_api_version = 2 。+ Z3 x4 g6 T( D( }
1 g" c$ V+ y6 E# g. n7 J6 A: C1 G7 |
下表来自OpenStack官网Liberty的配置文档:
2 V' h* c5 {" m( E; u; }7 {% O. N  hhttp://docs.openstack.org/libert ... ent/ceph-rados.html4 B' N  m; y( T4 y, {, N
Description of Ceph storage configuration options7 B) l* i1 m# c, s; F# x3 l" ]% x
Configuration option = Default value        Description' i7 O- E. e/ \2 B/ N0 O% ]% V
[DEFAULT]& E1 M5 `* O% [
rados_connect_timeout = -1        (IntOpt) Timeout value (in seconds) used when connecting to ceph cluster. If value < 0, no timeout is set and default librados value is used.6 F6 t/ o( Q+ h5 |- s! l' M5 B
rados_connection_interval = 5        (IntOpt) Interval value (in seconds) between connection retries to ceph cluster.
+ d2 C  Y, C" V5 T8 `) b5 s( arados_connection_retries = 3        (IntOpt) Number of retries if connection to ceph cluster failed./ D# b, p# e# T0 Q% Z
rbd_ceph_conf =        (StrOpt) Path to the ceph configuration file
! `4 H- ^9 v% x) crbd_cluster_name = ceph        (StrOpt) The name of ceph cluster
* `: X* v) A, d( h& Vrbd_flatten_volume_from_snapshot = False        (BoolOpt) Flatten volumes created from snapshots to remove dependency from volume to snapshot9 B, n) x$ e  Y+ ?/ S
rbd_max_clone_depth = 5        (IntOpt) Maximum number of nested volume clones that are taken before a flatten occurs. Set to 0 to disable cloning.; N, G6 Z1 }, r3 v+ [7 g
rbd_pool = rbd        (StrOpt) The RADOS pool where rbd volumes are stored
  `6 R3 W4 Y0 H% v4 Z* g7 T4 Yrbd_secret_uuid = None        (StrOpt) The libvirt uuid of the secret for the rbd_user volumes
& q$ y5 j9 e) b& \/ }rbd_store_chunk_size = 4        (IntOpt) Volumes will be chunked into objects of this size (in megabytes).: U( _- f# r3 S7 g' v! y
rbd_user = None        (StrOpt) The RADOS client name for accessing rbd volumes - only set when using cephx authentication6 M+ o, _" a1 t% [$ _' h0 R4 }
volume_tmp_dir = None        (StrOpt) Directory where temporary image files are stored when the volume driver does not write them directly to the volume. Warning: this option is now deprecated, please use image_conversion_dir instead.& ~; T! z% |) b5 ~4 X, S5 S
$ k* e3 M+ o5 T1 g% L6 _; a
- z% \2 i! @; y5 j: X( H0 b5 X

7 C# k& P5 f" F: W8 v: _+ q) T6、设置Cinder Backup集成Ceph; [" I2 o% R0 I- O* W6 y/ s' N# e- b2 B
OpenStack Cinder Backup需要一个专门的进程。在你的Cinder Backup节点上,编辑/etc/cinder/cinder.conf:9 i' L+ L: I8 }6 P" t4 I/ M7 S
backup_driver = cinder.backup.drivers.ceph0 t5 O; W% k$ P, B2 I# A9 U
backup_ceph_conf = /etc/ceph/ceph.conf
( [8 O8 b2 _0 c2 |' nbackup_ceph_user = cinder-backup* Y4 K5 g. G: g" d" m
backup_ceph_chunk_size = 134217728# K+ k" U3 |. I, ?- s9 S
backup_ceph_pool = backups. J; e4 F# i5 Y3 g! a$ H
backup_ceph_stripe_unit = 0
9 Q& E) |0 m, j3 W; Ubackup_ceph_stripe_count = 0
* J/ \/ s6 p+ K7 X  ^restore_discard_excess_bytes = true* J( r3 n+ F% \( A/ H# c
* U% }8 y$ e: u& n
以下是来自OpenStack官网对Cinder Backup集成Ceph的配置说明:- \9 w) d: G7 K" `: [
To enable the Ceph backup driver, include the following option in the cinder.conf file:  Y( Z9 S  k! K! V* N5 C$ q3 ~4 S
7 k2 j  T1 v, [8 ^0 J2 z
backup_driver = cinder.backup.drivers.ceph
+ Y! l2 a; X# B) X1 }1 i7 V* i$ wThe following configuration options are available for the Ceph backup driver.
/ i' U* p) @5 }" w" M( D$ M0 ?# m
Table 2.52. Description of Ceph backup driver configuration options
% Y/ I* U$ p& `: \3 h" k' D. }Configuration option = Default value        Description1 z2 Y" a6 h" ?, Y$ j$ J7 U" Y
[DEFAULT]7 X8 d, G% V. Q( V$ J4 i# H' z
backup_ceph_chunk_size = 134217728        (IntOpt) The chunk size, in bytes, that a backup is broken into before transfer to the Ceph object store.
9 D; \9 v6 W- @5 B- vbackup_ceph_conf = /etc/ceph/ceph.conf        (StrOpt) Ceph configuration file to use.) p+ y/ u/ s$ I: H8 ^' l
backup_ceph_pool = backups        (StrOpt) The Ceph pool where volume backups are stored.7 ]# V$ V, B" Q9 t8 v+ ^
backup_ceph_stripe_count = 0        (IntOpt) RBD stripe count to use when creating a backup image.
1 K: [" V" r; |backup_ceph_stripe_unit = 0        (IntOpt) RBD stripe unit to use when creating a backup image.
) s, y" @/ S7 ~/ |2 E3 r: T3 u$ nbackup_ceph_user = cinder        (StrOpt) The Ceph user to connect with. Default here is to use the same user as for Cinder volumes. If not using cephx this should be set to None.
4 z( v( l9 O! crestore_discard_excess_bytes = True        (BoolOpt) If True, always discard excess bytes when restoring volumes i.e. pad with zeroes.
  N3 s3 y8 a0 @# P# l! @4 N5 Z2 o3 bThis example shows the default options for the Ceph backup driver.
1 w  `" L) u; ^* F7 N/ L6 e$ P
! [- O! q7 O2 b6 Dbackup_ceph_conf=/etc/ceph/ceph.conf! a: G/ _) g5 ?' ]" {
backup_ceph_user = cinder
; [- S$ ~7 T$ {; x" A7 ?; Bbackup_ceph_chunk_size = 134217728
/ x7 t. P: E6 P$ ^; [6 Ibackup_ceph_pool = backups+ r' S" l3 J4 Y
backup_ceph_stripe_unit = 0
+ T4 b' b/ [: c2 B+ D0 N8 ibackup_ceph_stripe_count = 0. T! @3 h1 P) z5 r, z' c
: h9 |! A) g% `
7、设置NOVA集成Ceph3 S' O# G9 K% m6 F+ y1 ~8 h
为了直接基于Ceph存储启动虚机,还需要为Nova配置一个临时的存储后端。同时,建议使用RBD缓存,启用admin socket。  ^5 a$ d/ Q! N  H4 t) D
admin socket可以通过以下方法访问:
( y% E! w$ ^9 M* Z3 g3 {. g     ceph daemon /var/run/ceph/ceph-client.cinder.19195.32310016.asok help
. r8 ~# m3 ^" f1 J# b6 y, w4 H. d$ I5 w* Q4 `, H- C0 d9 X
在你的每个compute节点上,编辑Ceph配置文件:
( X, C; |+ j6 T+ y. e' F0 n[client]6 u. C, X; Y; n; r! q! R
rbd cache = true. v7 K- y! O+ Z
rbd cache writethrough until flush = true
! j9 C7 n$ U$ T7 S! q0 badmin socket = /var/run/ceph/guests/$cluster-$type.$id.$pid.$cctid.asok
( A8 y. w+ {8 W1 C2 Y  a2 Blog file = /var/log/qemu/qemu-guest-$pid.log
* J. v0 {$ Y& X9 t/ F2 ^rbd concurrent management ops = 20
0 v- S- v3 e! P- S2 g+ Y- o  S
7 W' D3 ~+ ]3 X' Q调整权限:
# N( C% ]  k1 ]; _6 j0 s  Cmkdir -p /var/run/ceph/guests/ /var/log/qemu/
1 g1 d6 l- Z8 dchown qemu:libvirt /var/run/ceph/guests /var/log/qemu/  U0 k: _/ D) p( x5 P. I. F) a
7 z8 b& M) s. i+ \% R
注:以上的qemu用户和libvirt组是基于RedHat相关系统的。
; z! |1 f) N0 i4 @! T" M4 i" g7 W
2 u4 H+ r8 o) V以配置好后,如果虚机已经在运行,则可以重启使上面的配置生效。; P8 W1 J" V' f
' y+ f" S1 P0 s: O0 M
JUNO
: @3 f% W! M$ d4 b4 v* v在每个compute节点上编辑/etc/nova/nova.conf文件:
! r! Y; K& v( d3 J[libvirt]
( e8 ~# ]! o; G/ K- o2 A1 |images_type = rbd
  C0 ^1 i) l4 |( O! _( A$ yimages_rbd_pool = vms
7 ~( ]3 _5 B: S# a; limages_rbd_ceph_conf = /etc/ceph/ceph.conf9 Y6 L; H1 e4 ?7 Y
rbd_user = cinder
# P3 V  W, e, a5 jrbd_secret_uuid = 22003ebb-0f32-400e-9584-fa90b6efd874" [% v7 Y* h- Q- k% P4 V( N6 P
disk_cachemodes="network=writeback"  i7 }9 z2 z. O0 f

4 O8 q+ u2 c/ o% p. E& z5 ^' N$ q建议关闭nova的密钥注入功能,而是使用基于metadata服务、cloud-init实现类似功能:
1 C  Z" k6 \! p& l" A在每个计算节点上,编辑/etc/nova/nova.conf:& z. l+ ]& ]; A+ \9 i
inject_password = false
% |  H) ~$ X- Q! Oinject_key = false5 a& U" z, x4 h# G. {+ B+ |4 ^
inject_partition = -2  r8 M2 Z$ A8 G( L, ]

, a6 w2 D6 _5 {1 C. }+ n) N启动热迁移支持:
! N9 M, x' Q# u# y4 g( w在[libvirt]部分增加:
; {5 S0 ~/ n# o: R$ E/ I0 hlive_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST,VIR_MIGRATE_TUNNELLED") `) r# i9 r0 v9 z8 T  G

0 X# T2 o: b0 T% ~8 v8、重启OpenStack服务
6 R% L& j; \/ d: M0 Jsudo service openstack-glance-api restart. F8 G8 I7 F+ Y6 d" y) k2 A
sudo service openstack-nova-compute restart9 f. R+ u& r4 H6 b
sudo service openstack-cinder-volume restart
! Q2 p/ F" O; s, P( _0 i- j, s% ^sudo service openstack-cinder-backup restart# E8 N' w+ a5 \$ }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 00:02 , Processed in 0.019214 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表