|
|
Openstack_安装基础使用8 G3 @* A# d8 ^2 b6 A
openstack 版本周期
3 q4 R8 G. L' w! |6 E7 K g, ]2 B: @% }1 v
https://releases.openstack.org/
$ P* E2 r7 i4 D5 O! @( V官方安装文档
1 e9 c+ r! O8 k4 t7 D' @) c8 n+ T0 D' r7 ]" g4 ~) x L3 {
https://docs.openstack.org/insta ... ackages-ubuntu.html3 ^; ~8 `5 e) w0 O; p* u
https://docs.openstack.org/install-guide/openstack-services.html
' _) J7 V% h" s" O+ t手动集群部署部署
3 [0 I( y4 Z. N0 U/ u架构 F6 T, B: _$ g/ i! a
主机名 外网IP VIP 内网IP 内存 CPU 磁盘 角色
7 r, R V* j9 I1 J% Gopenstack-controller1.stangj.local 192.168.139.31 无 172.16.1.31 4G 2 核心 80G 管理节点01' e" x& p9 E2 O4 T; E+ M' h! g
openstack-controller2.stangj.local 192.168.139.32 无 172.16.1.32 4G 2 核心 80G 管理节点02% ~3 ]& A5 \; V0 y- h% c- n! N
openstack-mysql.stangj.local 192.168.139.33 无 172.16.1.33 2G 2 核心 80G 数据库,memcacahe,RabbitMQ
4 Q4 L% v- [# `' B$ Q/ O' yopenstack-node1.stangj.local 192.168.139.34 无 172.16.1.34 3G 2 核心 80G 计算节点
- `- J" J1 I5 X5 mopenstack-node2.stangj.local 192.168.139.35 无 172.16.1.34 3G 2 核心 80G 计算节点! I) }, C8 ~* A. ]% l. f" R/ p; J. C/ _
openstack-haproxy.stangj.local 192.168.139.36 192.168.139.248 无 1G 1核心 80G haproxy,keepalived
/ m' C! F( Y- O( y ~$ B1)前期准备1 j+ Z" {% ]2 Q* |) t
1.1)所有节点安装
+ P5 S4 V/ M0 A8 v; a2 ]" o ~# apt install -y bridge-utils) ^: r, A+ u* L
~# modprobe br_netfilter
/ X5 Y8 V# u$ b3 f4 K6 O& G ~# echo 'br_netfilter' | sudo tee -a /etc/modules$ l/ ~' [7 g% H m+ I) u
~# swapoff -a
; m0 T4 Y3 c9 i+ j+ Z0 a ~# sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
( p( p" ~' z/ ?9 c( O0 p ~# apt install -y software-properties-common
) a5 P& _& c* A6 G1.2)时间同步
, N9 w8 g4 M, ?2 W; o "controller1作为时间同步服务器"
1 D, j# _5 d8 F4 ^9 r e- w root@openstack-controller1:~# apt install chrony -y" }/ I8 ~( ^7 _6 n/ i
root@openstack-controller1:~# cat /etc/chrony/chrony.conf | grep -vE "^#|^$"
6 \$ e7 ?3 d% t; w- ?; E7 y confdir /etc/chrony/conf.d
. g4 K3 c0 Y3 |6 l2 l, \& ] server ntp1.aliyun.com iburst5 N( @7 e% |( v- i$ M x4 q- T
server ntp2.aliyun.com iburst
' v; C* o% o5 t5 u. ?/ O server ntp3.aliyun.com iburst" m2 g, z# N7 I4 o
allow 192.168.139.0/240 w0 I! r; ]. d \' z" w
allow 172.16.1.0/243 o6 |# k& z5 j/ N: n* H
local stratum 10
# O. o; k8 ?: y6 D" O sourcedir /run/chrony-dhcp
, ]& X2 ?5 s! C& G! i# g7 t+ y sourcedir /etc/chrony/sources.d/ N! q: f, t+ E. \8 Z$ C: \
keyfile /etc/chrony/chrony.keys) v9 M$ o1 V0 G% @9 j# G
driftfile /var/lib/chrony/chrony.drift
0 }2 r0 O# c/ a, E# X4 H+ y ntsdumpdir /var/lib/chrony: I: M0 L( B, q, u% z( E: c, S
logdir /var/log/chrony; s, P$ Q2 _$ X; g5 Q& |9 u+ l' K
maxupdateskew 100.06 m, T/ p p4 K, b( h
rtcsync' e" s9 S8 `3 q
makestep 1 3
4 ?: ]! ?. c9 P U$ D
- s( _& M* e( `% g3 b! M E `启动服务`5 b/ a. `) g2 j1 w; \' S2 K0 @
root@openstack-controller1:~# systemctl enable chrony && systemctl restart chrony
2 U4 s* _" ]; q% \* C& O1 g
- R) @% e- q }2 }( B- U8 L `验证`
+ v- A' J/ {) D root@openstack-controller1:~# chronyc sources# a* X& f- B" A: n) V5 T H
210 Number of sources = 2" d$ Z+ y; T1 V
MS Name/IP address Stratum Poll Reach LastRx Last sample 4 j; j8 H* n2 e$ ?2 j9 p
===============================================================================4 d8 u" O& R/ S
^- 120.25.115.20 2 6 35 48 +866us[ +866us] +/- 22ms
* ~ u$ _0 Z# \- ?6 f6 m ^* 203.107.6.88 2 6 17 49 -4324us[-9570us] +/- 21ms
" z c$ Y3 s, o. R, P$ A
) R; P5 [, Y2 l2 J5 m2 a" W "其他节点配置(集群涉及到的节点都要配置--我演示一个)"+ E' @) f4 ]: L; L2 a3 j
root@openstack-mysql:~# apt install chrony -y) H4 A4 u# X7 m. \, g* W
root@openstack-mysql:~# vim /etc/chrony/chrony.conf ' E1 V5 j) ]" c* h
#server 0.centos.pool.ntp.org iburst6 F% d5 u8 x2 Q6 J4 [
#server 1.centos.pool.ntp.org iburst( P$ k! O d1 v, F; v
#server 2.centos.pool.ntp.org iburst h. l4 u+ @. S; n: v+ O
#server 3.centos.pool.ntp.org iburst
8 T# F+ z: t( {+ r server 192.168.139.31 iburst # 添加这条信息指向controller1' b: [2 _+ c- k1 p* ^
root@openstack-mysql:~# systemctl restart chrony &&systemctl enable --now chrony
1 C6 ?+ B5 @/ j4 W: i/ K root@openstack-mysql:~# chronyc sources
6 o" g* y9 b4 C0 _/ j; { 210 Number of sources = 1
( j9 s. Z! H! |1 g* S/ l MS Name/IP address Stratum Poll Reach LastRx Last sample # A8 J7 O: s2 _9 L9 i
===============================================================================. }- g: Z$ w7 u9 b( o/ v! T
^* 192.168.139.31 3 6 37 60 -2089ns[ -943us] +/- 16ms- b5 C$ l% h( d% {. v4 h
1.3)配置openstack官方源
! x& f: `9 g4 {' A x% X4 C `controller管理节点`" F% [! o! J/ R0 V5 u$ {: j- ~
root@openstack-controller1:~# add-apt-repository cloud-archive:caracal
+ f( O' k* C* c" I root@openstack-controller1:~# apt install -y python3-openstackclient libibverbs1 python3-pymysql python3-memcache ; ^9 P$ R0 v& p5 w$ o
' ]- i6 }7 a2 N6 r0 I. l. |9 K! J8 V$ f1 u `node计算节点`: E2 _, {& R6 v+ ^
root@openstack-controller1:~# add-apt-repository cloud-archive:caracal
( G. d7 B2 O% | root@openstack-controller1:~# apt install -y python3-openstackclient
" E& R* ]% B6 t3 h7 ~8 J0 q* I% m, s `数据库节点`
; E& B6 c' ^* n' e0 X6 V6 A root@openstack-controller1:~# add-apt-repository cloud-archive:caracal# `9 Q- e$ x5 `( S2 w
root@openstack-controller1:~# apt install -y python3-openstackclient T, J8 S {/ n8 w; w: D+ ~, B
1.4)数据库配置, a% \/ W! P( i, ^0 o% \1 {
root@openstack-mysql:~# apt install -y mariadb-server python3-pymysql! Y% U2 i9 _0 J' Q6 o [3 q3 t
root@openstack-mysql:~# cat > /etc/mysql/mariadb.conf.d/99-openstack.cnf <<EOF1 v, B& h& g4 a) {) R) ?7 I
[mysqld]
7 u0 x5 s \0 f( B6 ~/ S" ^ bind-address = 192.168.139.33
' r1 h. l6 K G0 r' v default-storage-engine = innodb
' N7 _! Y5 R) t) u9 l* ?' s innodb_file_per_table = on8 S7 D# V4 } M' ^
max_connections = 4096
: |: D+ Y: f0 `3 k collation-server = utf8_general_ci; ]+ s1 K- z8 Z* T( N- B
character-set-server = utf8
) P% _" \0 k; O' ~ EOF+ H2 L: H1 g: _! H2 I: o- l5 M6 f
root@openstack-mysql:~# systemctl enable --now mariadb && systemctl restart mariadb7 Z! F! k) B y# _
1.5)RabbitMQ配置" `0 V9 v. h, Z% f/ C! O0 Y
root@openstack-mysql:~# cat >> /etc/hosts << EOF
9 ~1 q, c1 X0 z! Y5 D" g 192.168.139.33 openstack-mysql.stangj.local openstack-mysql- T' T" _0 x* }% e
EOF! a0 W$ l. J' h' U8 Q2 J
root@openstack-mysql:~# apt install -y rabbitmq-server. j4 A Y: h$ @) y9 Y0 g
root@openstack-mysql:~# systemctl enable --now rabbitmq-server.service
1 o8 H- A( J. v! _6 A root@openstack-mysql:~# rabbitmqctl add_user openstack openstack123+ F- O* j7 e" g M5 L3 [! s# q
Adding user "openstack" ...
3 m+ S. t- `( J' ^ E' I Done. Don't forget to grant the user permissions to some virtual hosts! See 'rabbitmqctl help set_permissions' to learn more.
: u5 d0 \ ~, T* Q; r* N0 { root@openstack-mysql:~# rabbitmqctl set_permissions -p / openstack ".*" ".*" ".*" ; _: J- t# l* E' v J
Setting permissions for user "openstack" in vhost "/" ...# K3 R( g4 ^2 u/ A
`查询插件`6 {2 R6 x5 `/ `1 r6 @" i4 J
root@openstack-mysql:~# rabbitmq-plugins list/ f) T) Y8 Z8 ]9 u; b% c0 v) e
Listing plugins with pattern ".*" ...! u/ I" K `& G/ n' x" p
Configured: E = explicitly enabled; e = implicitly enabled
7 l, N2 @9 Y: x0 g) u& p+ {* ^0 O | Status: * = running on rabbit@openstack-mysql C+ W" f9 l! _! d! ~1 N: W
|/6 O/ W/ D8 F( `* C5 d
[ ] rabbitmq_amqp1_0 3.9.27
& A5 }# \ _5 P/ V- t1 | [ ] rabbitmq_auth_backend_cache 3.9.270 N! i q' r6 i; K
[ ] rabbitmq_auth_backend_http 3.9.278 U/ ?. m# w+ c1 X
[ ] rabbitmq_auth_backend_ldap 3.9.27
2 _; ]! c4 D2 `: S [ ] rabbitmq_auth_backend_oauth2 3.9.27
, k2 z' o2 b6 Z7 K7 s [ ] rabbitmq_auth_mechanism_ssl 3.9.27% r* X. I6 p/ O' m
[ ] rabbitmq_consistent_hash_exchange 3.9.27
5 [+ K: s. q3 M/ h [ ] rabbitmq_event_exchange 3.9.27
+ {7 a9 M- U2 a [ ] rabbitmq_federation 3.9.27
. f$ m" h% o( e# z1 t [ ] rabbitmq_federation_management 3.9.27, Q% ~* |2 P3 _: p5 P6 r: ^. f
[ ] rabbitmq_jms_topic_exchange 3.9.27+ g5 Y# J. f4 @! ~5 W( Y- X3 `
[ ] rabbitmq_management 3.9.27
$ G2 C& M( x4 K& f [ ] rabbitmq_management_agent 3.9.27
, S0 G+ I' H7 i) I1 W7 d [ ] rabbitmq_mqtt 3.9.27
( ^9 _2 p: s; N- w; ~9 }+ U% G [ ] rabbitmq_peer_discovery_aws 3.9.27# Z% e: c0 Y$ M) K% n' {- a
[ ] rabbitmq_peer_discovery_common 3.9.278 u) d4 C3 S) j P0 N
[ ] rabbitmq_peer_discovery_consul 3.9.27% {4 c8 I( N4 m- {; y
[ ] rabbitmq_peer_discovery_etcd 3.9.27
: c3 F, Q- q& v1 W [ ] rabbitmq_peer_discovery_k8s 3.9.27
0 @/ w- x) [& T( h8 q- N [ ] rabbitmq_prometheus 3.9.27, X: q; C2 r S5 t: M8 ~/ C
[ ] rabbitmq_random_exchange 3.9.27
; Y# c) s" z" Q; {4 L [ ] rabbitmq_recent_history_exchange 3.9.27
3 s; b1 o; n) u0 P/ j [ ] rabbitmq_sharding 3.9.27
2 V* L: x% v" u; o" ?- K9 h [ ] rabbitmq_shovel 3.9.275 b d+ q" c/ P5 k5 s& ~
[ ] rabbitmq_shovel_management 3.9.27
7 [ @/ ]; N- { [ ] rabbitmq_stomp 3.9.27
! W( T: G% B. {) }. X [ ] rabbitmq_stream 3.9.27
8 a: |# F1 g; [! T, k9 K [ ] rabbitmq_stream_management 3.9.27) u4 S' |( F6 U- @% {( t
[ ] rabbitmq_top 3.9.27" j2 f# R! W- j7 u J
[ ] rabbitmq_tracing 3.9.27) H$ L+ x- f) {2 D, h4 s) [
[ ] rabbitmq_trust_store 3.9.27" }/ z, i& m2 p' X1 \3 H4 g
[ ] rabbitmq_web_dispatch 3.9.27
2 d. L( @. T' I! C' ~! X9 D [ ] rabbitmq_web_mqtt 3.9.27' ?% z7 Z* A/ H5 s+ C3 X7 g
[ ] rabbitmq_web_mqtt_examples 3.9.27
" b N, k: N2 Y0 l# l [ ] rabbitmq_web_stomp 3.9.27
; N8 e3 ]5 a$ y4 K$ `# T4 |& J [ ] rabbitmq_web_stomp_examples 3.9.27& f( G( l+ `/ K3 E0 e7 A$ X* s$ `
`打开插件`: ?/ `' f, i* Z& w9 {
root@openstack-mysql:~# rabbitmq-plugins enable rabbitmq_management% s3 L4 D! A$ C$ U. A' G7 u
8 t& H2 x. d; ~ root@openstack-mysql:~# vim /etc/rabbitmq/rabbitmq.conf' P1 S! p( K. X3 _% j
loopback_users = none6 F- Y2 n' ?7 l& a& ~- j# O4 Z
root@openstack-mysql:~# systemctl restart rabbitmq-server.service 4 B: {9 G$ |# {. D# H
, T6 T( ^; [/ w- y/ a p$ a0 ?
访问 http://192.168.139.33:15672/* d9 \: M" n% B) ]4 u. f
+ B! |: o2 x- o, J+ n1 I5 y) V
$ ]) n/ R# @6 k0 d6 h$ K1 ~- q# i/ k6 X* f6 Z0 |
0 g2 m8 _9 }6 I4 x1.6)配置memcached
' R# U4 I! G# i" x/ D3 n4 X# ^6 _ root@openstack-mysql:~# apt install -y memcached python3-memcache
. V! h5 |" p9 e) p3 W root@openstack-controller1:~# apt install python3-memcache; B# O, q- d) y8 @/ s
, c- p# a1 _# i
root@openstack-mysql:~# vim /etc/memcached.conf
% C9 v4 f: [; e2 T5 X& V( v6 D3 U9 Q # Specify which IP address to listen on. The default is to listen on all IP addresses. D( c& H' v0 [# z- l' b
# This parameter is one of the only security measures that memcached has, so make sure
( v% ]8 z: n8 Y' v4 g # it's listening on a firewalled interface.; k9 U+ E/ U6 p) B6 O6 S
-l 192.168.139.33 # 这是为了让其他节点能够通过管理网络进行访问:
) h! e6 V1 Q0 D0 _$ J( z) } root@openstack-mysql:~# systemctl restart memcached.service && systemctl enable memcached.service
$ k5 ?4 c3 f1 }1 {. W+ M9 m1.7)配置haproxy* X0 j& q0 X. u6 m) F8 f
root@openstack-haproxy:~# apt install haproxy! g9 ?: v. s* }+ v" `9 H
root@openstack-haproxy:~# apt -y install keepalived
# D g; i& M. N8 T% [ `配置keepalived`! L0 E+ |7 ]. N
root@openstack-haproxy:~# vim /etc/keepalived/keepalived.conf ; F R0 z, |! `, v/ `4 [$ g' j
global_defs {( t( `( |, C& Q7 Z( p! Y
smtp_connect_timeout 30
$ S, e5 Y4 g: X" K$ } router_id LVS_DEVEL [ m- w, F! \" {+ Y1 _
vrrp_skip_check_adv_addr
( ?8 w2 |: b5 o# e vrrp_iptables
5 i& W6 k) i W/ ] vrrp_garp_interval 0' b; s: X- M7 N
vrrp_gna_interval 07 u M0 L4 y9 @+ V0 Y/ z
}+ n; y4 {$ i! m ]: `) ^
# v: M4 B( o k8 B0 c4 a5 V: L
vrrp_instance VI_1 {* u _6 K s' Y; d9 r$ M) }
state MASTER. B' a7 m% A) S8 A4 d
interface eth0; h" e, B, I! P( r( ?" t; E v: I& T2 q
virtual_router_id 510 m9 `* M4 s6 {/ ]& ~! Q j4 u
priority 100+ O% n) y n4 U! f* Y3 H$ h4 Z
advert_int 1
' ]3 n& P7 G' g# O, ` authentication {% N7 m/ L. S5 `$ I. A( l
auth_type PASS
/ U" ~ X$ }3 p7 ^3 l2 V& x auth_pass 1111# G' B1 E/ ?- H! H9 W1 z
}8 v: y# D: ?/ j4 H' V; y
virtual_ipaddress {
. t# B% x; ~: e- e/ f3 a! w 192.168.139.248 dev eth0 label eth0:0
& Y5 P: h. O) G/ k7 _ }6 E7 ~' K$ ^% ?3 H* Z( r# [
}; q6 @" q# U" S% K& x V
root@openstack-haproxy:~# systemctl enable --now keepalived.service ( f6 v4 W1 z5 A! P4 P
root@openstack-haproxy:~# systemctl restart keepalived.service 8 S4 W# b$ x6 x" ?
`配置haproxy`/ x9 A' x- i+ P6 x' n$ b8 r
root@openstack-haproxy:~# vim /etc/haproxy/haproxy.cfg
% _' J2 S: c. v$ A" A # 把后面的frontend和backend模块配置全部删除
5 e) R9 d" y# t: H # 最后一行添加4 [6 Z# O2 j# V' Q& H
listen openstack-mysql-3306
! r. u" K7 ^. Q" E& O1 z( ?( p bind 192.168.139.248:3306' g. q7 d4 r6 `( p5 l( l
mode tcp
8 w3 ? w5 q7 \ server 192.168.139.33 192.168.139.33:3306 check inter 3s fall 3 rise 5! S- @) `8 e) N, o$ r
* y- n$ v: W" J5 Z3 g, J
listen openstack-mq-5672' V4 D6 |6 z9 W6 U
bind 192.168.139.248:5672+ A$ W* z, A4 F6 F
mode tcp
( L, i. t* }+ d$ z, b server 192.168.139.33 192.168.139.33:5672 check inter 3s fall 3 rise 5
% c- W( o: Z! Q( p, T- D% k) l ' ~. X/ c( w# ^9 A
listen openstack-memcached-11211 i+ f* {1 e& O$ n! O0 r J
bind 192.168.139.248:11211
4 X! K' _" c7 M" E mode tcp) b5 l S! J8 u0 p/ P) {
server 192.168.139.33 192.168.139.33:11211 check inter 3s fall 3 rise 5
) l7 G: K: |( J' \& o- y- M& B
' s/ b' D+ P" d! A; z# _. Q root@openstack-haproxy:~# echo -e 'net.ipv4.ip_nonlocal_bind = 1\nnet.ipv4.ip_forward = 1' >> /etc/sysctl.conf
, B9 ]( R9 y/ z9 z7 X' t4 Q root@openstack-haproxy:~# sysctl -p" Y7 z9 ]0 t9 Y4 I
root@openstack-haproxy:~# systemctl enable --now haproxy.service
) D5 B, C- J4 A4 {8 l7 O$ E root@openstack-haproxy:~# systemctl restart haproxy.service 6 c; l; }! W" p& j# B2 |$ Q9 W
root@openstack-haproxy:~# ss -tnl4 ]3 u- a0 J$ l& A1 R
State Recv-Q Send-Q Local Address:Port Peer Address:Port3 J* C8 S1 E4 R, G7 a: ?# @& r
LISTEN 0 128 *:22 *:* 3 I$ `8 B# [# ]. q
LISTEN 0 100 127.0.0.1:25 *:*
- i. }, I: Y1 n7 `/ z+ H LISTEN 0 128 192.168.139.248:5672 *:* 9 I* V8 U) z# W2 q3 z* e9 I
LISTEN 0 128 192.168.139.248:3306 *:*
! o4 D7 y0 b4 @3 c LISTEN 0 128 192.168.139.248:11211 *:* ) P1 T! Y% h, m% G' R, @
LISTEN 0 128 [::]:22 [::]:* 2 n$ h; r, R2 Q3 l/ B: U) ]
LISTEN 0 100 [::1]:25 [::]:* ; P/ V0 L- z8 S2 Y! Q7 G
验证3 D3 k1 r( m5 u2 b) I
9 \% m1 T C5 g! t9 x root@openstack-controller1:~# telnet 192.168.139.248 3306: ]# m3 `, h+ b9 Q9 Q# z6 v
Trying 192.168.139.248...
3 }1 O" t2 {2 Q Connected to 192.168.139.248.& l* q+ B0 Z% Z' Z5 \# O
Escape character is '^]'.$ p0 T$ I' H+ O- i: i7 C+ g9 x" M
V$ T# U: I/ p/ e/ Q4 r" R9 V
root@openstack-controller1:~# telnet 192.168.139.248 5672
* ^1 h7 n3 }2 t8 v( K% o Trying 192.168.139.248...$ k; X- w# x3 \( G! D! l9 C, T8 |% D
Connected to 192.168.139.248.
8 s9 w( o5 A, k; }' U7 B% o3 ]# X W Escape character is '^]'.. t& T* }, S9 S. t: E
. i! M3 i- H/ ]1 A' D. O root@openstack-controller1:~# telnet 192.168.139.248 11211
. Y. ]+ @4 `9 V6 }# R! W h# ~- a Trying 192.168.139.248...0 j0 c" v- J" q8 U+ ~% W
Connected to 192.168.139.248.
& f, e2 B. N+ c6 I% O$ r0 D Escape character is '^]'.! N4 W# f9 d! x4 b* N0 {
2)安装keystone! J! G, w. Y1 X0 B9 u
2.1)创建keystone数据库
7 x5 Z& A8 L5 e) z2 R. T root@openstack-mysql:~# mysql2 r r. v: `* q* g
MariaDB [(none)]> CREATE DATABASE keystone;' P+ z9 ]. E& S9 Q. O$ U" |- D
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'keystone123';
2 J: z: i& L. ?. L/ R2 y/ i `controller节点验证`
' \+ {! |4 Z( q2 E root@openstack-controller1:~# apt install -y mariadb-server
( W) m; T* Y0 V7 I root@openstack-controller1:~# mysql -ukeystone -h192.168.139.33 -pkeystone123
. }7 M# R$ \' c! \' [ Welcome to the MariaDB monitor. Commands end with ; or \g.9 p; V+ g* p" E5 e2 d
Your MariaDB connection id is 35* o+ w8 S4 V) m
Server version: 10.6.18-MariaDB-0ubuntu0.22.04.1 Ubuntu 22.04& G' N4 O8 p% L$ Z `
2 B D& ?- J$ p, k4 o! k Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
( Q5 k7 E% O; l3 R. N+ ]6 e ; s% W% S& D* m5 ?0 }
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
, z( T1 R' w3 x / }; I$ H# j5 J* X, e4 ^
MariaDB [(none)]>4 Y9 K. M$ I( J' ]! U
root@openstack-controller1:~# mysql -ukeystone -h192.168.139.248 -pkeystone123
; m6 g$ e8 a0 w+ x! @ Welcome to the MariaDB monitor. Commands end with ; or \g.
9 @3 {& R. l& x* _3 E/ M Your MariaDB connection id is 36
1 D0 B+ G# O6 ~ Server version: 10.6.18-MariaDB-0ubuntu0.22.04.1 Ubuntu 22.04
l/ B k x7 `6 T# O
- q" e2 B T' }0 u6 g1 B! C2 X Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
* d" Q8 H* v- V1 h) i
& J* y1 Q. e; U! X) z; O1 k/ x Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.5 I4 M! B5 b, [( K/ V1 L# V, Q
! a! ?: p. L" I+ v, A! R. M1 m$ P MariaDB [(none)]>
5 m8 T! v8 s" Z0 ?8 I& b# e: Z, d u2.2)下载配置keystone
: u. ]; |- q. d2 n root@openstack-controller1:~# apt install -y keystone apache2 libapache2-mod-wsgi-py3
9 U. _9 N5 g1 Z9 S# e- C5 S- E `添加vip的域名解析`9 Y& M/ s) [3 J* X( |. D6 T. r b
root@openstack-controller1:~# echo '192.168.139.248 openstack-vip.stangj.local' >> /etc/hosts) }! a7 R: v) w7 L% b2 `7 m: D
`修改配置`! E+ V& F/ D4 _4 C
root@openstack-controller1:~# vim /etc/keystone/keystone.conf
, `" }9 f! [- M! |# B [database] # 在这个模块下面添加下面这一行信息
3 G) Q7 B$ |7 x Y connection = mysql+pymysql://keystone:keystone123@openstack-vip.stangj.local/keystone, w4 o4 c: ]! [$ T! a1 f/ x w
[token] # 在这个模块下面添加下面这一行信息4 S7 n1 f, s+ X) {5 b% ~
rovider = fernet2 R" ?' I* q2 k5 Y. z% z2 M7 D
2.3)初始化keystone数据库" O5 M- w7 O9 B" U
root@openstack-controller1:~# su -s /bin/sh -c "keystone-manage db_sync" keystone
) F# x- G; g. d2 u `验证是否初始化成功`2 o7 D, f' I R* w: y4 r8 ]
root@openstack-controller1:~# mysql -ukeystone -h192.168.139.248 -pkeystone123 -e "use keystone ; show tables"
) V2 l- ^2 y4 |& o* u6 a +------------------------------------+
* Z1 u; ^# @7 H" D, H( { | Tables_in_keystone |
; J" {2 C! s; |0 Q +------------------------------------+
8 S/ R+ u) L/ u | access_rule |
. y- o* E$ w- E0 _! ~3 P/ s5 d | access_token |
- e' a8 c. D7 e6 K$ x0 @ | application_credential |
0 O* n6 x' S# C6 t | application_credential_access_rule |
, I( @& X/ Y7 B# p }( k | application_credential_role |
# i g2 h! L( E0 q- c | assignment |
5 \: w$ }- B0 h | config_register |
/ ?. ~1 s3 O4 p( D7 ]# f ......................................
' {9 ~( m% a% |8 |' X- i. r ......................................7 V1 n `0 l2 ?. i
| user_group_membership |
: r0 r' f& ?, t E | user_option |8 {7 D/ }& U* k2 b* c
| whitelisted_config |
3 B# [" V f; T' L/ q3 V +------------------------------------+9 s9 g5 t7 c4 ^1 v
3 ^, Q! u) [' H; v% D7 A7 t/ u
2.4)初始化 Fernet 密钥存储库
* @3 U$ _; L5 \3 Y* J! }4 H/ ^ root@openstack-controller1:~# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone# e; a' G! A; T9 v
root@openstack-controller1:~# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
5 m& s- O4 m; Y( r7 N: J2.5)引导身份服务
8 A: V! ?# L7 c root@openstack-haproxy:~# vim /etc/haproxy/haproxy.cfg 5 m2 {0 e$ h v4 y$ _
# 在最后一行添加下面4行内容9 Z- C9 P) @4 ?( E+ C% ~
listen openstack-keystone-5000) x0 Y& t8 i% C0 ]0 @( P
bind 192.168.139.248:5000
& h! _4 n9 x0 X( O3 s mode tcp
- M) C% S W* R* m1 A/ [ M) W server 192.168.139.31 192.168.139.31:5000 check inter 3s fall 3 rise 5) x q0 D; v* {
root@openstack-haproxy:~# systemctl restart haproxy.service & X5 ]- }9 Z2 `9 ^$ [3 R
# 设置,密码为admin, ]5 S5 [- i$ B/ g! ?# B- R
root@openstack-controller1:~# keystone-manage bootstrap --bootstrap-password admin \
6 Z1 @) f% W# s8 _2 _2 k --bootstrap-admin-url http://openstack-vip.stangj.local:5000/v3/ \7 V7 C' L3 K2 U9 x
--bootstrap-internal-url http://openstack-vip.stangj.local:5000/v3/ \
3 ~' S, K; D2 [! X --bootstrap-public-url http://openstack-vip.stangj.local:5000/v3/ \2 K' | Z' c- o
--bootstrap-region-id RegionOne
E& K2 T" N& ?4 t6 K; K `验证`
$ ^, r/ m- m1 @0 V7 n5 y [root@openstack-controller1 ~]# mysql -ukeystone -h192.168.139.248 -pkeystone123 -e "select * from keystone.service"
6 t8 J$ s4 V i1 { P +----------------------------------+----------+---------+----------------------+' L; A, i: \& {* W6 e8 k! N5 E! Y
| id | type | enabled | extra |
4 ~6 B8 M4 |3 X- w$ H4 R: j/ N +----------------------------------+----------+---------+----------------------+
% C" _- C+ z) P3 \9 l | 5b32c1198b6d4a9da1659bc0a201d89e | identity | 1 | {"name": "keystone"} |
$ ~+ x3 n$ E1 `! W {0 Y6 |' t +----------------------------------+----------+---------+----------------------+
8 M4 J+ ?5 P) G) J [root@openstack-controller1 ~]# mysql -ukeystone -h192.168.139.248 -pkeystone123 -e "select * from keystone.endpoint "3 h7 e p$ A8 x+ c+ c6 I0 t
+----------------------------------+--------------------+-----------+----------------------------------+--------------------------------------------+-------+---------+-----------+
$ m' \4 _/ l/ C9 g8 V) B4 F | id | legacy_endpoint_id | interface | service_id | url | extra | enabled | region_id |
. Y- _' r2 c8 _4 q& ~: Y +----------------------------------+--------------------+-----------+----------------------------------+--------------------------------------------+-------+---------+-----------+
. P+ M# X- j+ e3 P, k$ x; P | 20caaef3b2ee4ff7898d1e7b7f1e41dc | NULL | admin | 5b32c1198b6d4a9da1659bc0a201d89e | http://openstack-vip.stangj.local:5000/v3/ | {} | 1 | RegionOne |
8 w( j' Q& Q, L* e3 n | ad54a4233c0e4a23ba56f86960ff97a9 | NULL | public | 5b32c1198b6d4a9da1659bc0a201d89e | http://openstack-vip.stangj.local:5000/v3/ | {} | 1 | RegionOne |+ j6 B* j/ t# \
| def9f3253353499fbc24a851445198c9 | NULL | internal | 5b32c1198b6d4a9da1659bc0a201d89e | http://openstack-vip.stangj.local:5000/v3/ | {} | 1 | RegionOne |4 G+ v' E- [, |+ N* P
+----------------------------------+--------------------+-----------+----------------------------------+--------------------------------------------+-------+---------+-----------+
0 T5 A3 k2 l1 I4 m# H& h9 K) g2.6)配置Apache HTTP 服务器
0 H& y3 L2 Z3 x- a% A V root@openstack-controller1:~# vim /etc/apache2/apache2.conf
; U5 p" p1 @$ n0 L( F( f& ?* F ... # 找空位置添加
; E2 ]+ A' {5 v- d2 w* G ServerName 192.168.139.31:80( t, M$ U! n% u, e
root@openstack-controller1:~# systemctl enable --now apache2 && service apache2 restart- g. i0 q8 @$ d: C J
`验证服务`- H3 O/ A6 F7 e
root@openstack-controller1:~# curl 192.168.139.31:5000$ \$ `' a! ]( Y
{"versions": {"values": [{"status": "stable", "updated": "2019-07-19T00:00:00Z", "media-types": [{"base": "application/json", "type": "application/vnd.openstack.identity-v3+json"}], "id": "v3.13", "links": [{"href": "http://192.168.139.31:5000/v3/", "rel": "self"}]}]}}* E+ J8 c. c/ T! `3 }, I$ o
root@openstack-controller1:~# curl 192.168.139.248:5000
& _5 p# O6 p# H* }1 Y {"versions": {"values": [{"status": "stable", "updated": "2019-07-19T00:00:00Z", "media-types": [{"base": "application/json", "type": "application/vnd.openstack.identity-v3+json"}], "id": "v3.13", "links": [{"href": "http://192.168.139.248:5000/v3/", "rel": "self"}]}]}}3 o; a5 `; Y: b$ o, n# x3 n
root@openstack-controller1:~# curl openstack-vip.stangj.local:5000
" o8 G1 s$ p; v3 |* a+ Y2 t {"versions": {"values": [{"status": "stable", "updated": "2019-07-19T00:00:00Z", "media-types": [{"base": "application/json", "type": "application/vnd.openstack.identity-v3+json"}], "id": "v3.13", "links": [{"href": "http://openstack-vip.stangj.local:5000/v3/", "rel": "self"}]}]}}
& P0 x; }& K1 b& f& T- A# k2.7)配置环境变量来配置管理帐户, {. {# r/ d X; G8 Z O- D. n
root@openstack-controller1:~# cat > admin.sh <<EOF
" ]: D" m: s7 z export OS_USERNAME=admin/ r2 A+ h' e, D* D: T6 M' A
export OS_PASSWORD=admin
- |6 v3 ]0 P' ^- F6 f export OS_PROJECT_NAME=admin% }( e j% D/ R0 Y6 F
export OS_PROJECT_NAME=admin
5 `& W: P2 B; A/ Y" d; h export OS_USER_DOMAIN_NAME=Default6 u7 V" h6 \: l5 l
export OS_PROJECT_DOMAIN_NAME=Default; L+ G9 I4 z9 ]( T) n6 u0 S
export OS_AUTH_URL=http://openstack-vip.stangj.local:5000/v3% y* P) P/ p* e& t! M
export OS_IDENTITY_API_VERSION=3; B6 f" b0 m5 Y8 |+ A; ^
EOF
% J6 H8 D6 d: i7 _ `生效配置`
2 D9 G2 r- h B8 I5 H0 S root@openstack-controller1:~# source admin.sh* e$ f$ h& G( ^6 j
`验证服务`8 X% s6 a8 s4 ~% \
root@openstack-controller1:~# openstack user list, ]$ K+ r" j, }; t3 ~6 ~' j* O
+----------------------------------+-------+
- \& @- O$ p8 l | ID | Name |3 N, M! X# H7 n+ t. ]/ M$ X7 w0 S
+----------------------------------+-------+
7 ]- h. |6 A% ~# _- L | 5c4b6243d95742799de0fc97ef119967 | admin |' q! V: {' c( B* O4 b% i' X$ m
+----------------------------------+-------+
2 q' l: [& Y7 v2.8)创建域、项目、用户和角色
5 T, @% H1 s ] `创建域`
0 }! {( }- Y; T; {3 w# J" \ root@openstack-controller1:~# openstack domain create --description "An Example Domain" example% T# {4 q! }3 J, b2 P( B
# [root@openstack-controller1 ~]# openstack domain list
" X4 {# ]9 M3 R( C5 `1 H +-------------+----------------------------------+
& y8 z3 N: Q3 M/ {4 f& `2 e | Field | Value | u" u" C2 Q6 W0 Y' H. F' `8 [ H
+-------------+----------------------------------+
! _, v3 F4 V9 b | description | An Example Domain |
5 ~- S1 N+ f' D- l2 W% T* ] | enabled | True |
* x8 t: R/ H9 M- E | id | 7233934db37f4e839da0bbc62bdebdf5 |
( _* F+ {, Q4 h) G6 ^+ z | name | example |: b6 b1 x. r2 [
| options | {} |
4 m, P ?& o, |" C- c4 e" @+ l/ l | tags | [] |
@4 z- G" C5 G1 @: o' y0 T +-------------+----------------------------------+6 \# ~& i9 F2 M+ W+ [4 O1 D; g
`创建项目`, T' s% B* a1 G' S' l1 |- i. a
root@openstack-controller1:~# openstack project create --domain default --description "Service Project" service- l8 C* l1 m3 ^: d8 q
# [root@openstack-controller1 ~]# openstack project list* |' |/ i _, z+ k Q3 l& I
+-------------+----------------------------------+7 t5 t O$ Q( Q: w
| Field | Value |
/ a8 [0 Z6 G J0 O5 q +-------------+----------------------------------+
# c. M8 ^- g' T | description | Service Project |
. E# r$ A! P; p# Y" I | domain_id | default |7 ?* J. [6 K, ^9 k
| enabled | True |
1 P7 M+ }* J- K, D | id | 024872cab1fb4329997f4bb552cc7439 |$ E& ?3 n% m) a" [
| is_domain | False |; b1 \( N7 h2 I& u+ V: P- l
| name | service |
`% |5 C2 K% X9 I | options | {} |
9 V3 q1 l7 e+ I7 Y | parent_id | default |
& y5 R7 p: u1 }# T1 g+ o, d | tags | [] |
7 N) V- s4 m# U +-------------+----------------------------------+
k- e0 ^- U2 s& R) O6 S% Q0 Q `在default域-创建项目:myproject`/ C2 Q1 p: G+ E- ?
root@openstack-controller1:~# openstack project create --domain default --description "Demo Project" myproject1 F+ n& U$ A2 g2 u2 K+ f0 e
+-------------+----------------------------------+ R# p0 s( g2 a2 o
| Field | Value |
) O- |0 r/ l Z# b7 I +-------------+----------------------------------+
5 n6 W) X# V, N9 p/ R | | description | Demo Project |
" i, @4 Q5 U" F9 V- Y | domain_id | default |
5 @4 P% G8 R! ^, h7 B | enabled | True |
; c: H* h' U( Q. n$ _. L6 X | id | 35e14efc4bb64fd18ab58ab793881459 |* X; u7 w' r7 O: b9 D
| is_domain | False |6 x; O3 i( @2 d+ q0 ~ b
| name | myproject |
v8 k5 R. U; H. { | options | {} |5 z/ z% g0 ~& ` ^6 c7 P
| parent_id | default |" D8 U3 d; r! S* U8 f
| tags | [] |
% f7 o5 ~5 f5 S [" s/ Y% V +-------------+----------------------------------+7 w- P3 a# [1 J' A0 t0 x( B
`创建用户:myuser`
J# f, K M, K2 |+ x5 z root@openstack-controller1:~# openstack user create --domain default --password-prompt myuser, s* T$ [% L2 f+ W9 S6 K: [/ b! p% M; L
User Password: # myuser. }! m/ @7 c; E( x/ s! V
Repeat User Password:# myuser
, i: E% E* S- X$ |. k8 d +---------------------+----------------------------------+: V3 {6 `: i/ I: y4 w) D) P
| Field | Value |
) }1 B# c5 k! @3 Y f# E, |8 Q6 w' r. H +---------------------+----------------------------------+
- k" s w% N5 _$ p, R9 {( R/ L | domain_id | default |
8 I2 n/ i1 \$ _! l | enabled | True |* y$ w5 d3 [0 Y4 B3 W. e+ R
| id | f40449a65bcf491aaf44cc4f8e09f3fa |/ t$ V5 i; h p0 B- l' E) v$ x
| name | myuser |
: r1 l8 j) Y' F/ o/ o( f | options | {} |, N1 m: _" K, e0 M
| password_expires_at | None | M7 v2 q& ?2 h. h
+---------------------+----------------------------------+
) e+ h8 L( c- A! a' L! Z `创建角色:myrole`
& X( f# _" k4 L* ?( e root@openstack-controller1:~# openstack role create myrole6 g2 }' G7 p+ A* x) c
+-------------+----------------------------------+- |* s2 J! s! J. Q! x4 s
| Field | Value |" m1 p1 Q' m8 G
+-------------+----------------------------------+* U+ ~2 X/ n+ _3 k) f: a! ?
| description | None |
/ l" B! k9 b) y- b$ b6 {6 \ | domain_id | None |
4 Z( [$ a7 B- V B T6 x | id | b1cf825f18194c858ba735c3a873e87b |9 X; ?) |& i/ L6 N$ J1 n H% M
| name | myrole |
. k4 U% W [, _. ^' ~ | options | {} |
w' R1 d8 u" H" T7 s5 Q' H5 v+ b +-------------+----------------------------------+
$ _9 e6 X; U H `将角色添加到项目和用户:myrole/myproject/myuser`. y h$ @" G3 t9 {+ A
root@openstack-controller1:~# openstack role add --project myproject --user myuser myrole
: R* x1 ?7 B" \( o! z) X0 q& A9 z2.9)验证操作: |! `- L. a' I
root@openstack-controller1:~# unset OS_AUTH_URL OS_PASSWORD2 w! G, p2 ~$ K2 K6 Q6 {
`获取admin的token信息`
# C7 y4 s# Q- N: V root@openstack-controller1:~# openstack --os-auth-url http://openstack-vip.stangj.local:5000/v3 --os-project-domain-name Default --os-user-domain-name Default --os-project-name admin --os-username admin token issue8 q" K7 L: r9 C' X
+ j/ _! x I5 ]9 q1 @. g+ x# @7 k
Password: # admin# @, l T5 T- j4 R; ^8 N: ~5 o
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ a/ o" O( W0 G9 N5 ?
| Field | Value |
. d5 I" J% L9 Q" M8 ?! B, ^8 o +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
3 q3 ]( I* }& F; i6 W' _ | expires | 2024-12-07T12:25:41+0000 |. A2 S' a W9 Z/ u2 l" t
| id | gAAAAABlev-an7oKiReVcaIQg31zanfyHEpBjozbYq_6ZH8mWKMyp0vxm0HEUlxkrY7_799ihK64p4Gq5zeaAUH4g4jBpB2I0Ij5xDojvfZ66qTIPUB9TakErlw9UoI1E9bpOwowYgoOOKlJlO28mBoxKWga7A8akmCgiDTzP4rUYL5B8Xs24rQ |" ~+ V" A) A. s$ B' Y, u
| project_id | 227934ef1b5b44cc942a8e4f1f5f7695 |5 d: ?- w2 r# a
| user_id | 5c4b6243d95742799de0fc97ef119967 |" w2 u* r1 P7 ]/ D
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+. [& c( |! U. Q( y$ M* o$ q
`获取myuser的token信息`- P! a% p1 l$ B+ b9 o
root@openstack-controller1:~# openstack --os-auth-url http://openstack-vip.stangj.local:5000/v3 --os-project-domain-name Default --os-user-domain-name Default --os-project-name myproject --os-username myuser token issue* t& z8 e, o: y9 ~7 h8 X' P
Password: # myuser
8 ^" E" b7 A5 ?- M, r4 H +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
, I" | p: @; h# Z. |" r | Field | Value |
% N+ k1 p5 ]& y" T +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+! R3 S/ s6 `, Y" \1 ` I
| expires | 2024-12-07T12:25:41+0000 |
4 ^- W8 R# @0 K1 j | id | gAAAAABlewBPx4yTCZIklPPqD-XnXsciBnECZYhDPKZkenFzYdE9GuTH-xRPuhh4Z9rrLiCb7X6e_rjqR2WdTk9Sz94HkrNi4KPjdun7HW-4wesLLOV7ijz4Vgvt999fnWNaDNTwKvqumfcQ1XinMLyszeSD1yvFB4FeQ610Ns18oUa0Tc_44jc |9 P5 r2 C- g1 l0 `+ H
| project_id | 35e14efc4bb64fd18ab58ab793881459 |
6 E5 X, G' O& X$ u0 R | user_id | f40449a65bcf491aaf44cc4f8e09f3fa |& T' H3 A- ~1 I4 Z- H1 D2 q
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
4 Z, j6 m0 K" P: i2.10)新增配置环境变量来配置管理帐户
* S, Q; y) ?5 g f root@openstack-controller1:~# cat > admin.sh <<EOF/ q* [/ Y; L5 F
export OS_PROJECT_DOMAIN_NAME=Default2 h1 w- k' X* @9 D4 j9 Q# D
export OS_USER_DOMAIN_NAME=Default; u# z. a, h9 N% z
export OS_PROJECT_NAME=admin
* d8 A: ~5 U5 L5 z+ A+ W/ l export OS_USERNAME=admin ?/ k# |7 Y3 W- {. s9 t" j3 y
export OS_PASSWORD=admin/ W& Z7 g8 x7 ^+ \- W; x& d
export OS_AUTH_URL=http://openstack-vip.stangj.local:5000/v3
3 p' _, Y- b. X* L! L/ } export OS_IDENTITY_API_VERSION=3
, \3 j, `8 l& m7 L, X7 B export OS_IMAGE_API_VERSION=2" _ k& F7 h+ S: \' w9 L$ h% e# }
EOF
y: X' b, a+ F0 N4 G root@openstack-controller1:~# source admin.sh 0 D! D2 I* V4 _& t3 t8 A
`验证`8 V7 y3 V, f5 R1 N0 W
root@openstack-controller1:~# openstack token issue
1 d3 L( A6 \9 @$ B$ a6 f g +------------+--------------------------------------------------------------------------------------------------------------+4 n( g# {) j- A3 U
| Field | Value |9 V' v/ u1 @# R" N4 {
+------------+--------------------------------------------------------------------------------------------------------------+
$ {& f( k" Z- T | expires | 2024-12-07T12:25:41+0000 |
3 [# W! f) w# T1 M( _1 a | id | gAAAAABnVDC1Tl8JCjuLSdCd0vL2FmuLpB7ftGCcll7NsqBgy0FhuomNTkLMXP_p86eyLKMA- |3 {2 n- j, M; y9 I- w) g0 F
| | IZnr9aW3VCfYfoaWyUAcr3fcd8l3BLjpinjEL04QMCRJYHW9d3WZ2jN44hcZ8xwwG0ZpJiyVAixWqOfMykBbzGY6vnwJC- |
$ a! S; x- c- r( _4 \; W | | qj3vDQYbVyFBbnIY |
" a9 k7 p0 m, L0 o& J3 J | project_id | 96bbc0e66a5246fdaf29843498ef49a1 |# T' a8 h q4 q" Q
| user_id | 3b1c56d85d9c4aefb5c6a6dde8c99a00 |6 e# I+ O0 s0 }: w
+------------+--------------------------------------------------------------------------------------------------------------
9 ?. H/ N8 t: a% H0 _+ N
: c' F. F5 C+ w; [ `创建普通变量环境`
: l# O6 r$ m4 `5 h4 i8 f# B7 e root@openstack-controller1:~# vim demo.sh
. l2 q0 w! t& z6 J; x export OS_PROJECT_DOMAIN_NAME=Default, Q+ v; Y+ a: q# Z2 V! w
export OS_USER_DOMAIN_NAME=Default2 j7 x7 R* n+ y7 k
export OS_PROJECT_NAME=myproject
( H. T3 t! [6 D R3 C export OS_USERNAME=myuser
% g( r, g; I9 G: m export OS_PASSWORD=myuser: f4 a8 D! A; x0 ^; [0 r
export OS_AUTH_URL=http://openstack-vip.stangj.local:5000/v3
; F: {6 A( W" I# A' S. d export OS_IDENTITY_API_VERSION=3
5 ?$ R5 d [% T' L. r8 h3 c) M export OS_IMAGE_API_VERSION=2
, |; o0 ^2 }0 g3 `2 o7 d- ` z; g; a root@openstack-controller1:~# source demo.sh
: Z }/ O! T; Y6 y0 ~$ S4 I `验证`
' X W/ I5 Y5 S/ K u7 \ root@openstack-controller1:~# openstack token issue5 ~# I7 V( R% t) Q* I2 V
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+0 h% u m" b8 K' v
| Field | Value |
2 B2 e* t! O |" m) R$ e +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+- p* f Y. z7 j* L. ], ^
| expires | 2023-12-14T14:26:22+0000 |
# w a6 |! ?* S8 {3 ^7 _5 d | id | gAAAAABlewJ-s4Aj73WgUyZemZ9eL9S7myndeVnxUOmiWM3IvXTwtw7pIzzIFyxlw3vTrC200w08X2iqTFVcY8Ih4jCzLDQMqi4VpS2emWmqG73uy7NI_tAR6KasEYPRoZSl--2Wa7HCdv9i6y6GnKDtgisVkCtG3Ew7CPBDq991w0cXBRpxL_Q |8 C4 p# K/ k6 T/ \6 \
| project_id | 35e14efc4bb64fd18ab58ab793881459 |( S2 U: {8 _- u; m) P5 G
| user_id | f40449a65bcf491aaf44cc4f8e09f3fa |
6 Q, g. a1 O# a +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+- i; k3 l8 X& @* v( H6 v0 c
3)安装glance
+ o0 I- I; g# C, p! ?" O6 t* V3.1)存储准备工作
9 {1 A1 ^$ u' o W+ b% V' t # 因为性能原因我就拿openstack-haproxy.stangj.local主机做nfs; W- r: j2 n- f3 w6 ^$ t }
root@openstack-haproxy:~# mkdir /data/glance -p
% O/ ?9 m' ^/ u& I root@openstack-haproxy:~# apt install nfs-common nfs-kernel-server -y
6 d; c5 H' X& \. F/ n5 d/ Y( z
& U, K, y5 K) W+ S) I7 | root@openstack-haproxy:~# echo '/data/glance *(rw,no_root_squash)' > /etc/exports
7 {: |4 X( a3 @, Z% L3 Z( @ root@openstack-haproxy:~# systemctl enable --now nfs-kernel-server
/ f1 g# j7 v4 c& K1 q root@openstack-haproxy:~# systemctl restart nfs-kernel-server% F; \- t. |- C
3.2)创建glance数据库/ Y# T+ d3 Z! H6 j4 p1 t. [6 I
root@openstack-mysql:~# mysql/ {( m7 Y" x) q% V/ R! A2 M( r
MariaDB [(none)]> CREATE DATABASE glance;
2 {0 y- w: Q, M MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'glance123';
5 h5 a1 {" a5 J: c6 p& E/ ~ [root@openstack-controller1 ~]# source admin.sh u1 b2 x" J1 Z7 I
`创建glance账号`( G( U' z/ u5 W5 ]
[root@openstack-controller1 ~]# openstack user create --domain default --password-prompt glance
3 z6 R; N" R: D+ F" o7 F User Password: # glance
8 |; D! [& Q: d. m9 }/ C Repeat User Password: # glance
" |5 ^6 G2 o. ]' M: A +---------------------+----------------------------------+
0 i! i# S+ T/ s+ ? | Field | Value |
9 m/ e$ A+ c0 i +---------------------+----------------------------------+
, d+ Y) _. v$ F3 c$ f+ q | domain_id | default |, y4 m- } N8 P# ]0 v5 c9 ~
| enabled | True |9 S& V, D) |: F7 G+ n2 v' f
| id | 34a900b8a67f40439804c830cd5957da |; o2 X5 z% Q- ?+ b& A- b' z
| name | glance |1 z5 a9 d1 E& L/ J! y% Q
| options | {} |
" c$ Q$ ?1 R6 W/ W | password_expires_at | None |% ]9 g) z# Z/ ?# v
+---------------------+----------------------------------+% i, M U' ~4 V* P3 m( b
`将角色添加到用户和项目:admin/glance/service`. p# n$ l8 [; ?1 X+ g0 X
# 让glance拥有service项目的admin权限
; Z4 r+ Q1 [: j; A+ a$ i root@openstack-controller1:~# openstack role add --project service --user glance admin
9 M4 X. ?# E8 F5 C* s$ ~* [8 k, L root@openstack-controller1:~# openstack service list
! D8 m- \7 C! P: Y+ E# a +----------------------------------+----------+----------+' t" u' S2 v; k" r- J/ v
| ID | Name | Type |; w; i% k+ D( n0 V! G0 T
+----------------------------------+----------+----------+
, b; [ n/ ~) |( q& ? | 5b32c1198b6d4a9da1659bc0a201d89e | keystone | identity |
, T/ n+ M# _0 i2 Z7 b +----------------------------------+----------+----------+; M3 a4 u. d4 y; @& d# |1 k
3.3)创建服务实体glance j; z6 Q, z/ x% F8 P
root@openstack-controller1:~# openstack service create --name glance --description "OpenStack Image" image( e- b A# H. j6 h
+-------------+----------------------------------+
) O6 w- W" Y9 S6 _& t | Field | Value |
( h3 ^) v' p0 h. x +-------------+----------------------------------+
2 e; n Y2 y5 O0 `- v) I* C1 J( S | description | OpenStack Image |
1 M, ]9 R+ T2 [ | enabled | True |
9 q4 E3 _, z8 ]& q' @) r | id | e53a2bd43aaf48f1840064e9cb594293 |
" f# |+ P; F6 `6 W" G# d | name | glance |, F+ r n: Y" C
| type | image |$ ^; z( B0 }/ k U/ i5 y
+-------------+----------------------------------+
* S( ~0 h+ r; e% @ N root@openstack-controller1:~# openstack service list
5 q* ]3 ?/ U- x: w +----------------------------------+----------+----------+
' r# H& x* M' J9 n7 Y2 g | ID | Name | Type |
: K) a" L' Z3 i0 @0 O# K: } +----------------------------------+----------+----------+9 H; f8 \, P e: w: u3 g2 e0 U
| 5b32c1198b6d4a9da1659bc0a201d89e | keystone | identity |% K& f/ k0 C: d7 ^3 N. w- j9 c: e
| e53a2bd43aaf48f1840064e9cb594293 | glance | image |
* `' X3 V- D+ D% A +----------------------------------+----------+----------+9 L3 y' o& h1 q
3.4)创建Image 服务 API 端点:
* r+ \' h9 b$ G root@openstack-controller1:~# openstack endpoint create --region RegionOne image public http://openstack-vip.stangj.local:9292
1 k+ I" K! h. d8 v$ m0 u9 ` +--------------+----------------------------------------+
3 G% }9 O' N0 e | Field | Value |) v9 d# {" x) y0 ^) W% ?
+--------------+----------------------------------------+
/ x2 ]- N* ?: z0 Q | enabled | True |9 s4 p( l, m0 l* q* \8 [4 C6 d
| id | 3fc61c0f302d41359da99b80ca32853f |
5 Q1 Q. ]9 E' D8 ^* g' c! X4 @ | interface | public |
/ y. {; Q* i1 o, i9 o1 V. v s* S | region | RegionOne |% V$ |( [/ f, N. M- f
| region_id | RegionOne |
$ n2 \0 J5 T5 ~3 T7 O' ]9 U | service_id | e53a2bd43aaf48f1840064e9cb594293 |
6 U, _; o+ a4 g! u- b3 P | service_name | glance |
! L+ p0 {- R. p3 ~% k# \: a | service_type | image |: N B6 j, k3 l. Q
| url | http://openstack-vip.stangj.local:9292 |
; D/ k, H( Y2 ]. i9 z +--------------+----------------------------------------+. q- i D3 b; }
root@openstack-controller1:~# openstack endpoint create --region RegionOne image internal http://openstack-vip.stangj.local:9292
, {$ V3 Y+ `5 Z. C$ n +--------------+----------------------------------------+" e; p/ ?# ~7 H7 U8 W8 |
| Field | Value |
( v$ [. l$ n9 z2 { +--------------+----------------------------------------+8 G; d( e B: s* G8 x* ?2 ~/ C, C- w6 z
| enabled | True |3 U: ^& q: ^ _0 Y0 _# l
| id | 671f3dd8ddd643d08b922df0f9c7f4d8 |
& i& G/ `- }6 D: A2 D# e& C7 u5 | | interface | internal |& B& {8 L! a: C, V3 G: |
| region | RegionOne |" j' ?+ a' H; R" D0 s' u! G/ c
| region_id | RegionOne |$ b9 S# j: E6 L4 L# U' g* z
| service_id | e53a2bd43aaf48f1840064e9cb594293 |: \+ L0 a3 v0 k1 o( I9 z( e6 [2 E
| service_name | glance |
/ i% S2 @9 ` k" i) T* |' X | service_type | image |
# p$ ~; E2 R3 P- O | url | http://openstack-vip.stangj.local:9292 |
7 o$ K! j4 O& S8 o9 n; \ +--------------+----------------------------------------++ L" Z1 p+ Y4 Y. N# C' ?/ Q
root@openstack-controller1:~# openstack endpoint create --region RegionOne image admin http://openstack-vip.stangj.local:9292/ s b# p8 N5 M6 m, b( X8 F
+--------------+----------------------------------------+. |- I; M/ y5 l, y$ B
| Field | Value |1 ]1 y+ @/ t0 Y9 J9 X9 |( d
+--------------+----------------------------------------+
. h& H3 m# d% }- D4 q9 J6 u | enabled | True |7 F% e0 e& \+ p/ q, R/ A" |/ L+ D
| id | afea7ab2f5914bcca88f088957f6144f | P* W k# T1 @& K
| interface | admin |4 |( d( Y- [9 |
| region | RegionOne |# \" |% f- o' ?( b7 p9 r% f
| region_id | RegionOne |" P1 l$ t6 E; o) W
| service_id | e53a2bd43aaf48f1840064e9cb594293 |
' Z% \# R0 I! u8 l( h: R$ M | service_name | glance |
( i0 |1 g: F$ w6 T0 [ | service_type | image |
; t* z; \: {; r6 k: T | url | http://openstack-vip.stangj.local:9292 |. {& r2 H+ P$ J* D# H+ D4 |6 G0 P
+--------------+----------------------------------------+1 |" B7 _- A( H4 l0 `
3.5)配置haporxy代理) \* D7 K# F1 F3 S3 t
root@openstack-haproxy:~# vim /etc/haproxy/haproxy.cfg
v, k( |7 a$ v1 I+ [ # 最后一行加入下面4行信息( q) `3 O) s; Z
listen openstack-glance-9292
4 Q. b% D$ o9 o; a bind 192.168.139.248:9292
6 X7 Y* U/ J1 h4 U! T+ C6 t: H mode tcp% U: B/ `3 z+ a) V7 [6 h
server 192.168.139.31 192.168.139.31:9292 check inter 3s fall 3 rise 5( X! u5 S1 g, V
root@openstack-haproxy:~# systemctl restart haproxy.service
( K o" q0 L2 v/ T) s6 ]% G0 s! ~ root@openstack-haproxy:~# ss -tnl | grep 9292( d* z1 f! P5 H; r( f% p* h+ b9 ~
LISTEN 0 128 192.168.139.248:9292 *:* ! a/ k. W7 O1 j% n8 s
3.6)部署glance服务3 f/ X0 ?8 e+ w6 Y0 O2 B- o
root@openstack-controller1:~# apt install -y glance
! d+ _; k/ k0 L9 ?$ y% y) o3.7)配置glance服务4 W* c1 n3 M; ] B6 B5 y
root@openstack-controller1:~# vim /etc/glance/glance-api.conf& R3 ]7 W6 j; ^+ |8 y& G/ A! H( U
[database] # 在这个模块下面添加下面这一行信息! X2 m, p( C$ q9 W
connection = mysql+pymysql://glance:glance123@openstack-vip.stangj.local/glance* U' D8 S4 i1 r: A/ |
& D2 l' k4 U& u% L9 m3 l
[keystone_authtoken] # 在这个模块下面添加下面这9行信息
! E; S' O$ L% M/ f, a0 k+ g www_authenticate_uri = http://openstack-vip.stangj.local:5000
9 V6 x* [) @: a& _% i* P( R auth_url = http://openstack-vip.stangj.local:5000
# ]( I( u4 C" D+ l' u+ B, E& @ memcached_servers = openstack-vip.stangj.local:11211% y% M$ c7 Q/ `; i3 j( i5 C. [
auth_type = password
" q7 U7 I& U# S project_domain_name = Default2 V6 j) F9 e- [+ M4 p6 b0 x% a
user_domain_name = Default
) N( Z! Z7 C `4 v2 t! m+ R project_name = service% s" `# n5 b! u1 ^0 X
username = glance
! D+ @2 ?: B& i& P- N& S password = glance8 D% f/ q* \0 m" y1 @ B
+ s9 G8 H( k$ g ~ [paste_deploy] # 在这个模块下面添加下面这一行信息
# K5 G" Z, M8 b+ A, h flavor = keystone
. f" y3 y2 g& S7 L; I7 A5 e0 K P5 K
0 y& ]. c, _9 R$ S [DEFAULT] # 在这个模块下面添加下面这一行信息$ Y& c1 G/ h, K) K
enabled_backends=fs:file
5 t" @$ Q1 s! q4 `- v# k# Y. W3 f 4 W: t, x( j8 Q
[glance_store] # 在这个模块下面添加下面这3行信息& M* A* {% U8 n* V9 K
default_backend = fs
8 \! m0 p; r, g# G [fs]
% ]' v+ Z9 |3 R filesystem_store_datadir = /var/lib/glance/images/
% }1 y3 _2 ~ ]3 [; L8 i
0 l- ^5 z% A( K. ^1 l# d4 Q
! I% Q/ X7 `5 k" h/ `5 E `确保 Glance 帐户具有对系统范围资源(如限制)的读取访问权限`
5 w; H- s! _& ?9 Y$ T root@openstack-controller1:~# openstack role add --user glance --user-domain Default --system all reader
3 T, n% v, |7 ]" n6 o. i5 B6 c0 R3.8)初始化glance数据库
5 j) }1 D9 z+ S% q! U Y+ X& K! S7 | root@openstack-controller1:~# su -s /bin/sh -c "glance-manage db_sync" glance
# D9 P; p2 d" W+ L `验证`: g2 v0 }. i! |% J$ P6 D; r; J( ]7 J
root@openstack-controller1:~# mysql -uglance -h192.168.139.248 -pglance123 -e "use glance ; show tables"3 B. M1 P k" ~6 P$ y) s' r$ j& S
+----------------------------------+5 d2 C" r1 M8 E; }
| Tables_in_glance |! e: @, @2 J: t6 I9 r( F' Z/ l6 v
+----------------------------------+
" a$ v& m) j9 v" l | alembic_version |
I# U6 m" j- t4 M% Y | image_locations |/ Z" ]6 ~' k4 g$ q3 B+ L9 `+ @
| image_members |
9 c0 X9 ~; C$ H, j | image_properties |% {. [* j# ~3 q( U% T/ d) ~4 Q
| image_tags |
; e! ]/ F' Y1 a- Q | images |
0 H) Z8 d, W# U6 x( d, z! ?( y | metadef_namespace_resource_types |. X' a! ?4 A/ f! g
| metadef_namespaces |
% L. L; O" }& R0 ] | metadef_objects |
m, i& _, p2 T+ k | metadef_properties | M1 G$ U6 d/ E1 i; n2 m
| metadef_resource_types |
' m! m# u! Y7 S) S# x | metadef_tags |
1 r4 D1 x: h: B5 q* v+ g | migrate_version |; `, q& n7 V" s( L$ G7 ~
| task_info |( K, i7 v9 W' p ~+ c
| tasks |
1 p" W3 L( h1 j( W+ j. h% X +----------------------------------+
" f* q" e/ h- k. x! C) d3 Q k2 J" s3.9)启动glance服务
' R3 R" j5 Z8 v. ?8 n( e root@openstack-controller1:~# systemctl enable --now glance-api % W/ e+ R* a4 k. @+ F, | m
root@openstack-controller1:~# systemctl restart --now glance-api( E, z2 G- [( {" u9 f
root@openstack-controller1:~# tail -f /var/log/glance/glance-api.log $ p8 `: V+ y: h: L- c
2024-12-07 19:43:42.571 11458 INFO eventlet.wsgi.server [-] (11458) wsgi starting up on http://0.0.0.0:92926 W5 }/ ?; S2 Y2 T9 x5 S
2024-12-07 20:06:40.764 11717 INFO glance.async_ [-] Threadpool model set to 'EventletThreadPoolModel'6 k* r2 s# ]0 @" f/ y% ~0 P
2024-12-07 20:06:41.281 11717 WARNING keystonemiddleware.auth_token [-] AuthToken middleware is set with keystone_authtoken.service_token_roles_required set to False. This is backwards compatible but deprecated behaviour. Please set this to True.
) J: l; K1 n" L Q5 |+ [# N 2024-12-07 20:06:41.377 11717 INFO glance_store._drivers.filesystem [-] Directory to write image files does not exist (/var/lib/glance/os_glance_staging_store). Creating.
( W+ [& _, z1 ^ 2024-12-07 20:06:41.378 11717 INFO glance_store._drivers.filesystem [-] Directory to write image files does not exist (/var/lib/glance/os_glance_tasks_store). Creating.. ^( v4 L' Y; S9 O
2024-12-07 20:06:41.379 11717 INFO glance.common.wsgi [-] Starting 2 workers% |$ O: X, _: N! w6 C6 B. _0 s3 @
2024-12-07 20:06:41.381 11717 INFO glance.common.wsgi [-] Started child 11724
! N$ D- a1 I1 ^$ r& } 2024-12-07 20:06:41.382 11724 INFO eventlet.wsgi.server [-] (11724) wsgi starting up on http://0.0.0.0:9292/ L1 f3 W( G; H1 Z% [
2024-12-07 20:06:41.383 11717 INFO glance.common.wsgi [-] Started child 11725
8 J4 K9 V0 z% P/ |5 Q 2024-12-07 20:06:41.386 11725 INFO eventlet.wsgi.server [-] (11725) wsgi starting up on http://0.0.0.0:9292
& W/ j `$ J4 f2 ^# j; S3.10)挂存储0 f# S2 `) d% R; B" o0 B/ D
root@openstack-controller1:~# systemctl stop glance-api 7 }) I+ B6 M. m+ v
root@openstack-controller1:~# showmount -e 192.168.139.36/ k# L( I9 W% Q4 q
Export list for 192.168.139.36:
1 W8 P7 p7 j) o6 Z* n /data/glance *
0 x6 [: P- q9 q1 w9 y& S! s' Z' P root@openstack-controller1:~# mount -t nfs 192.168.139.36:/data/glance /var/lib/glance/images6 }6 W& P* L! b1 u+ A- R
root@openstack-controller1:~# vim /etc/fstab
+ i1 |: I# ], o# }+ x% l5 N # 最后一行添加下面这一行内容0 W9 c: i9 j; _3 I: `, T
192.168.139.36:/data/glance /var/lib/glance/images nfs defaults,_netdev 0 0$ O$ z9 c4 j2 u' x% r8 ?
root@openstack-controller1:~# mount -a- P0 ]# m" X3 t) h8 L
root@openstack-controller1:~# id glance$ e( ~8 p' L- X
uid=64062(glance) gid=64062(glance) groups=64062(glance)
9 ~* q! I9 R5 }) N' ]1 U% ` root@openstack-controller1:~# chown -R 64062:64062 /var/lib/glance/images/
3 W0 q- D1 B" ]1 L# N root@openstack-controller1:~# ll -d /var/lib/glance/images/+ d2 X2 P' i2 `% Z
drwxr-xr-x 2 glance glance 6 Dec 14 21:31 /var/lib/glance/images/
* {! y: b, Q9 y) r root@openstack-haproxy:~# ll -d /data/glance/
# E" i; ]- W9 l7 N; A9 _2 W: ? drwxr-xr-x 2 161 161 6 Dec 14 21:31 /data/glance/
! f! W- _9 w& z: s5 x6 t8 S `启动服务`
* w% d; `' B3 P [root@openstack-controller1 ~]# systemctl start glance-api
; ^( ?# ~+ y5 m0 L' K$ Z# {3.11)验证操作
3 h% E+ u7 k- S [root@openstack-controller1 ~]# source admin.sh
) b# d8 x& r) n# _# L4 Q root@openstack-controller1:~# wget http://download.cirros-cloud.net ... 4.0-x86_64-disk.img- `- _. k7 Y6 W4 ]' b0 u
[root@openstack-controller1 ~]# glance image-create --name "cirros-0.4.0" \
0 T; V6 C6 t' o" z* z" ^ --file cirros-0.4.0-x86_64-disk.img \# \( }9 g# [& Y& f1 L9 x3 \1 c
--disk-format qcow2 --container-format bare \6 O. z; d3 ?6 T) [
--visibility public: [+ Z; D; H! l4 P& g. b. W
- b4 l9 c: U/ t. I) ]8 l +------------------+----------------------------------------------------------------------------------+
- o$ ]" H" K9 R5 c7 l | Property | Value |$ } G' x2 U$ b* i- ?* q
+------------------+----------------------------------------------------------------------------------+
' |2 Q8 b: L& s! O' j | checksum | 443b7623e27ecf03dc9e01ee93f67afe |! [3 P- v" h, j- K& [
| container_format | bare |
" |( _$ Z' d; U7 K8 C | created_at | 2024-12-07T13:12:19Z |( G1 s# `( d G& V1 S( N4 W- s& J& q
| disk_format | qcow2 |
3 H! a; c+ y9 ?( q _ | id | 68249b5f-9eac-4873-be74-cc11ac9af61e |
4 F* J& u: H0 R( L0 `3 v6 I | min_disk | 0 |! h: E X2 n0 [; M) [( B
| min_ram | 0 |
. C3 q: U! h7 f j | name | cirros-0.4.0 |
% @ K. I5 f8 Y3 G, E @6 T | os_hash_algo | sha512 |: ^9 |8 s) [/ m) U' k
| os_hash_value | 6513f21e44aa3da349f248188a44bc304a3653a04122d8fb4535423c8e1d14cd6a153f735bb0982e | c1 ?7 k3 S/ u% e
| | 2161b5b5186106570c17a9e58b64dd39390617cd5a350f78 |
% Q6 t/ r2 i$ u2 P | os_hidden | False |
7 B+ r) r/ }! i$ w: a | owner | 96bbc0e66a5246fdaf29843498ef49a1 |5 `5 @; ~* F: v* n
| protected | False |
$ e, r M7 n6 _$ Y! p% u0 Q8 I | size | 12716032 |4 _3 `4 R; f" Z: Y0 v
| status | active |3 i, L2 f% J0 X- B9 {
| stores | fs |
) {$ c" o& n) r) p* H | tags | [] |
) d* _5 K9 e3 E: G! S* r | updated_at | 2024-12-07T13:12:20Z |7 V9 r/ U q& H2 g# i- t9 |* N3 b
| virtual_size | 46137344 |
& l/ P/ s: [* h# M( b6 V2 ^! i | visibility | public |# O3 C) N: l% \4 }4 m! [2 D2 v7 \5 y
+------------------+----------------------------------------------------------------------------------+
. |5 v' C2 F% \+ o / m; X' @* w$ ^$ k/ \
`验证服务`
P1 i0 N! l$ }7 T9 i" e root@openstack-controller1:~# openstack image list; g* J* u4 }" E: K. s
+--------------------------------------+--------------+--------+
& B6 T) u1 a$ f | ID | Name | Status |8 h) t1 L; K* x& N' B
+--------------------------------------+--------------+--------+
6 H3 R" T3 ]; W8 H | 060a4a23-5aa8-4176-8f31-0ccd318ebf2a | cirros-0.4.0 | active |
" A) p$ ~0 {& A6 I4 H% y3 ` +--------------------------------------+--------------+--------+5 x4 @' Y. r' h2 \" n+ n$ G4 c
# 或者 [root@openstack-controller1 ~]# glance image-list
* G6 M2 b3 _ t) M O# z: P # 删除镜像 [root@openstack-controller1 ~]# glance image-delete fd47df49-7e2b-4e16-a4fe-fd8ca6ffb5f7
) m m7 r# _5 N9 ^. W% ~0 V8 G root@openstack-haproxy:~# ll /data/glance/
0 w; P/ j" {) J/ F total 12420( P1 C. ~" n4 h) U( M- g
-rw-r----- 1 161 161 12716032 Dec 14 23:34 060a4a23-5aa8-4176-8f31-0ccd318ebf2a
8 R: k& v3 ?5 r3 `# U f8 b4)安装Placement
3 d8 U6 g: \1 k4.1)创建Placement数据库- Y& F$ ?& ], i6 Y5 q
root@openstack-mysql:~# mysql
4 \2 ^, Y5 d6 }0 _. d! g- e& r MariaDB [(none)]> CREATE DATABASE placement;. E; w3 X; n" S" a2 l5 J! G9 X
MariaDB [(none)]> GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%' IDENTIFIED BY 'placement123';% N- I7 j! D: z( P1 j- K
`验证`
! Y0 Z, w/ c" m root@openstack-controller1:~# mysql -uplacement -h192.168.139.248 -pplacement123
* A; S, d8 G, j2 R3 r( F$ |, g) i0 k Welcome to the MariaDB monitor. Commands end with ; or \g.+ {/ _0 ?1 T7 ~; ^8 j* N/ P3 M
Your MariaDB connection id is 118' T. F/ `! `9 N. X! {
Server version: 10.6.18-MariaDB-0ubuntu0.22.04.1 Ubuntu 22.04
2 x% }1 g: q( F) E ! t# V% u1 ~6 l) d* Y
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.- C3 N. m+ Q* h, Y
5 j0 `8 A% g; |" D/ M
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.1 E D( }- `- q( Y9 h+ ~' {
3 F( Q* [. j. a' c$ z1 t MariaDB [(none)]>" B' f8 b$ t7 f. z& A1 z R
4.2)配置用户和端点
8 w7 M: O" W! E2 x root@openstack-controller1:~# source admin.sh 6 y) w8 N/ z& ~2 J. v, v2 D, Q3 n2 s
root@openstack-controller1:~# openstack user create --domain default --password-prompt placement
3 V; y6 G% b' G* b( O. P3 m User Password: # placement
: w4 d4 j# q' _& c* |/ e! e. R Repeat User Password: # placement0 q$ |% a0 v3 `6 T3 z5 q l9 W
+---------------------+----------------------------------+
6 @: H, p2 y6 i | Field | Value |1 q3 t" i4 |& I2 c
+---------------------+----------------------------------+& l) E H& J. V( |( ^0 U3 Q
| domain_id | default |
* |% y- N; t/ w& y | enabled | True |
" M/ b* n [( Z8 r5 \; {9 s | id | 804e53f0a44b4403af8278711a7274a5 |$ j! M8 w" g P. a# W) g
| name | placement |
n! \/ a) i6 ]3 Y, G5 ]* B | options | {} |
* _3 D# G }; w7 q* Q | password_expires_at | None |
' x1 U, E: m' l! c# ^ +---------------------+----------------------------------+: V9 |6 k: m6 l3 Z/ s: Q W
1 z9 s; n5 V( G `将 Placement 用户添加到具有 admin 角色的服务项目`
1 u$ D0 a$ p- h2 o: N% u! ^ # 让placement拥有service项目的admin权限`
' I7 O3 }' X! T* W7 n) P( w3 i9 K root@openstack-controller1:~# openstack role add --project service --user placement admin1 G% v- R0 } o$ f z! h2 M
( ]6 D( z8 B. p+ Q
`在服务目录中创建 Placement API 条目`
6 G3 g9 }' t, @8 J root@openstack-controller1:~# openstack service create --name placement --description "Placement API" placement; L# J/ |& |( U# w$ O2 ^
+-------------+----------------------------------+
$ Q! _: `- `, I0 r/ X | Field | Value |
" T% M4 \& x' ]2 s Z +-------------+----------------------------------+$ n" A( e( p1 s& Q$ H4 f3 h' H$ v
| description | Placement API |
" T8 t+ p. l2 `( _ | enabled | True |
: B: A) Z9 ~! p V& V, y | id | 9eaa1f08648c44c5a937759d7217016f |4 h" W7 T4 s5 G l( ~) u
| name | placement |
B( |4 E- f+ ?9 Q7 Q | type | placement |2 ~( v3 C: n& v+ o# C# n( Q) E
+-------------+----------------------------------+0 _4 \3 I7 Y' U( W8 d& {
4.3)创建 Placement API 服务端点:
5 J. Y8 i* F7 m3 H5 e root@openstack-controller1:~# openstack endpoint create --region RegionOne placement public http://openstack-vip.stangj.local:87786 P5 o* M: x R8 [" H$ v) `
+--------------+----------------------------------------+; O6 K4 g9 \" A/ W
| Field | Value |
9 @' Q1 ` ~+ h0 H +--------------+----------------------------------------+
1 a J' J4 Z5 A- w- O | enabled | True |: {4 z" c1 ~* c. r' R8 t' O
| id | 88aae422c80e4adabf613aef31fb0c3d |
2 k6 T* Q4 u4 j3 ~2 t+ ? | interface | public |6 e" j, a$ M- v
| region | RegionOne |
5 M0 l8 u1 \6 s8 k | region_id | RegionOne |
* x& H1 F/ p! ^1 C: f# h: V | service_id | 9eaa1f08648c44c5a937759d7217016f |0 M; Z* T `: [$ j( e- w
| service_name | placement |$ T; E. m5 v \. J) v; F( H
| service_type | placement |
7 @2 m( G* M, X3 T" D | url | http://openstack-vip.stangj.local:8778 |
" o0 H/ j _! I5 G; n +--------------+----------------------------------------+
) `- w+ o6 _* ]9 S% j
# s* B" g k2 g% o4 G. ~8 ~. x root@openstack-controller1:~# openstack endpoint create --region RegionOne placement internal http://openstack-vip.stangj.local:8778 h. j0 b2 A( Z4 C; X& @( _2 m: N
+--------------+----------------------------------------+! D" S" j6 q# l9 [4 q& G- G
| Field | Value |
V4 n7 J* x1 N3 W( ^5 n4 x +--------------+----------------------------------------+4 l- i5 C1 C/ B v3 i/ W$ v
| enabled | True |
7 b) a6 H* m% f/ y% G% I# X8 e | id | b706b4abdcdd44a588eacf5d1cb7f75c |
4 \/ A5 D# _# y! j7 N0 V0 n | interface | internal |! W- ~5 Q- s3 P3 l2 {0 E. S
| region | RegionOne |
9 v; e0 w3 }# s5 z& ^9 k B | region_id | RegionOne |
5 `+ z$ R; a0 |8 ^! e | service_id | 9eaa1f08648c44c5a937759d7217016f | l+ |% |+ N P* }$ [9 k9 ?9 P
| service_name | placement |
9 |* r9 [0 b! g. ] | service_type | placement |
7 ~- r3 ]$ U' H | url | http://openstack-vip.stangj.local:8778 |
6 T8 Y. o2 i$ V1 Y8 _+ W +--------------+----------------------------------------+; E/ L U% ^: i. W0 [: _
" v) x4 o6 K }
root@openstack-controller1:~# openstack endpoint create --region RegionOne placement admin http://openstack-vip.stangj.local:8778
( H7 q1 a5 [7 U+ K' q8 g- _ +--------------+----------------------------------------+
4 I2 _# Y0 t+ ` | Field | Value |" U1 _# h9 _8 R4 W# B2 B
+--------------+----------------------------------------+
5 E! ]/ f# O3 H0 r% f3 T( t7 s3 L | enabled | True |
& o% Y; g" R/ l( J5 k | id | f62a5305854e492ea9c76e77e13b10b4 |
0 a' N" x9 A3 n( }( ` | interface | admin |
' J8 e8 U, N T | region | RegionOne |
3 C9 k' G% c: i$ W0 Z( S2 ~ | region_id | RegionOne |" i3 o; d2 z& _5 b
| service_id | 9eaa1f08648c44c5a937759d7217016f |/ f" Y1 S9 Z6 I: i9 M
| service_name | placement |
: @8 L/ K# Z& ^* i | service_type | placement |" m/ f: r- T. C* x# ^
| url | http://openstack-vip.stangj.local:8778 |
9 v: {+ O" ~1 h# B9 w, n +--------------+----------------------------------------+
6 N; I& u f$ R* J* a0 _
k8 o/ E* s" u+ g8 ^" M `验证`# N7 r2 i4 K& G4 a% Y
root@openstack-controller1:~# openstack endpoint list
8 V: p; u) y+ l, e% y +----------------------------------+-----------+--------------+--------------+---------+-----------+--------------------------------------------+
- [! W [( A; M# p0 P1 E | ID | Region | Service Name | Service Type | Enabled | Interface | URL |7 d1 N# r# @+ M/ d2 I
+----------------------------------+-----------+--------------+--------------+---------+-----------+--------------------------------------------+, }* E. k+ Q7 i; K* s
| 1df308c037cc4cb195da67db34438c57 | RegionOne | glance | image | True | public | http://openstack-vip.stangj.local:9292 |
0 b/ y( G5 C$ b6 b& a2 c4 W | 20caaef3b2ee4ff7898d1e7b7f1e41dc | RegionOne | keystone | identity | True | admin | http://openstack-vip.stangj.local:5000/v3/ |( i: p. b6 K% D' ~- t
| 3fc61c0f302d41359da99b80ca32853f | RegionOne | glance | image | True | public | http://openstack-vip.stangj.local:9292 |+ B3 P( U* e8 a2 [9 L, O
| 671f3dd8ddd643d08b922df0f9c7f4d8 | RegionOne | glance | image | True | internal | http://openstack-vip.stangj.local:9292 |
1 m( n5 c) K) e0 k. ? | 78ae4d21b4424bb1b0c8029dc7959ca5 | RegionOne | placement | placement | True | public | http://openstack-vip.stangj.local:8778 |
) m0 n2 \8 u# d& i | 8005d074d03a4ead8c85d54e7ffd143a | RegionOne | glance | image | True | internal | http://openstack-vip.stangj.local:9292 |* U! h5 B; G% \& Z- B4 t
| ad54a4233c0e4a23ba56f86960ff97a9 | RegionOne | keystone | identity | True | public | http://openstack-vip.stangj.local:5000/v3/ |
/ Y+ i2 D$ z4 ^7 \: O9 s | afea7ab2f5914bcca88f088957f6144f | RegionOne | glance | image | True | admin | http://openstack-vip.stangj.local:9292 |+ V& g" u- T. x; Q
| dd7caa1565864e4baf5aeed582ad19f9 | RegionOne | placement | placement | True | internal | http://openstack-vip.stangj.local:8778 |
' T0 p0 E4 }' E( W | def9f3253353499fbc24a851445198c9 | RegionOne | keystone | identity | True | internal | http://openstack-vip.stangj.local:5000/v3/ |" G% b$ `% w H. d0 ~
| e7fcd33ba0994973a0b9bb2bc7b8c3cb | RegionOne | placement | placement | True | admin | http://openstack-vip.stangj.local:8778 |* E( G1 ?; O$ Y% z) G: r7 [. _5 O1 G; d
+----------------------------------+-----------+--------------+--------------+---------+-----------+--------------------------------------------++ Z; v2 ?. d( m$ o
4.4)配置haporxy代理
. g5 W! ~; f) F" b/ Z) o root@openstack-haproxy:~# vim /etc/haproxy/haproxy.cfg
/ r5 Q' b( ]4 k' j; c$ E1 [' \ # 在最后一行加入下面内容
' E! E4 B9 W0 ]' e Q" m; Q% _ listen openstack-placement-8778
1 S! A9 J1 o- j. Q4 s4 ^* { bind 192.168.139.248:8778
7 {6 g% [: n+ Y, Y mode tcp
0 ~$ L8 C& |! ` F# F1 ?- q1 T server 192.168.139.31 192.168.139.31:8778 check inter 3s fall 3 rise 5
; f, _7 m5 \. D$ w root@openstack-haproxy:~# systemctl restart haproxy.service ! O* u0 t4 n0 X. q" Z0 p
root@openstack-haproxy:~# ss -tnl | grep 87785 m# ?* O) f9 X+ E; N; Y
LISTEN 0 128 192.168.139.248:8778 *:* ; v$ y! @- a) G z ~' s
4.5)部署placement
( z k- u# k$ L$ `. [+ Z @ root@openstack-controller1:~# apt install -y placement-api
8 j6 C T/ U# [+ X2 y5 J4.7)配置placement服务: _0 \% i' u( u- ~* ]2 a/ s/ q
root@openstack-controller1:~# vim /etc/placement/placement.conf
6 ~+ Z( v; z6 T$ [) B [placement_database] # 在此模块下面添加下面一行信息8 b2 R) A. K% }
connection = mysql+pymysql://placement:placement123@openstack-vip.stangj.local/placement
# v5 z% P1 F8 k2 g, L: o. w, P+ \ # y+ F) ?1 S0 G$ n
[api] # 在此模块下面添加下面一行信息
`- {- G0 K* f$ h auth_strategy = keystone
. _8 Y6 h8 G5 e* ?8 N# ~ . ]1 w7 m& A1 M8 C6 [9 V) b
[keystone_authtoken] # 在此模块下面添加下面8行信息
- O2 L5 S/ e) F6 d8 \$ H$ o auth_url = http://openstack-vip.stangj.local:5000/v3
7 u# W- X' S. F. G0 Y memcached_servers = openstack-vip.stangj.local:11211' C& D1 U: z! O& j
auth_type = password
# u( a. W& z' _+ `& m project_domain_name = Default
. Y5 x+ Z5 c+ L5 l0 f N2 y- l# J$ } user_domain_name = Default9 {/ v+ [7 x* H& }6 o7 E) P
project_name = service
E/ M( l! h/ c! V8 z/ z: l username = placement4 J' F5 X" f0 |* E6 I
password = placement
5 D2 {; l ?! t4.8)初始化placement数据库
& q' s- K4 v0 {; L! Y* y root@openstack-controller1:~# su -s /bin/sh -c "placement-manage db sync" placement
/ B' ^: D c! K9 G; T: J4 W/ x , u+ b1 a7 L, z& O
`验证`
& A& L+ |1 G2 Q( D4 o. E6 z root@openstack-controller1:~# mysql -uplacement -h192.168.139.248 -pplacement123 -e "use placement ; show tables" [: `8 `: K5 b8 d. h# U
+------------------------------+7 v* b% l! w5 l3 m
| Tables_in_placement |! c$ q/ e5 R. S) u O
+------------------------------+
; w! a8 C: x2 ~. P* W | alembic_version |; q# X, ?4 Q4 A+ f' C1 n, P
| allocations |: R* P: v2 }8 c, A' S2 M
| consumers |
2 r# m5 ]" W8 I8 H$ `$ _+ ?2 @ | inventories |
' k6 j( X9 n' s/ d3 Y | placement_aggregates |5 }1 f8 h/ ^/ h7 P/ x. y" |: @
| projects |% ~. P! r+ D$ K0 Q; ~. D
| resource_classes |
* ?4 q: q8 D- @; F | resource_provider_aggregates |
7 }: m, C. e5 ^ B& O- a6 I | resource_provider_traits |
: e( m R4 M. | | resource_providers |% r: U% L& q& N$ E2 C7 v
| traits |, P( f: e3 C4 A& X
| users |2 J" A+ u# k S) E8 Q1 k
+------------------------------+
# T* c3 t9 l8 T3 ?$ u& r; o$ x4.9)解httpd带来的问题(以免后续会出现403)* `" \4 H; p! ~/ m" C( `
root@openstack-controller1:~# apache2 -v1 l/ W4 V$ T- k
Server version: Apache/2.4.52 (Ubuntu)' w8 m+ W: W# X0 i7 S( G9 F
Server built: 2024-07-17T18:57:26* m+ e% M' w, D
root@openstack-controller1:~# vim /etc/apache2/sites-enabled/placement-api.conf
, ]0 _2 Y% N$ C9 D1 r' f- D/ ~ <Directory /usr/bin>
f# ~1 P# s* [0 P <IfVersion >= 2.4>
5 m9 L) e8 i2 O9 U0 L2 b8 A Require all granted
) g! k+ K* L6 g1 k" y </IfVersion>
) F L }$ k# }2 a <IfVersion < 2.4>0 M- N7 C8 L% G/ x+ }8 j. A" S7 Z
Order allow,deny
+ C) G! }$ ~0 |4 B0 v& h Allow from all+ V: q; H, c: f7 Q6 g
</IfVersion>9 ?8 {% a3 K) R. O$ H! w, f( W
</Directory>* S+ P% B* j- C. m3 u8 `+ t
; D, [! T) t* d+ ] root@openstack-controller1:~# systemctl restart apache2.service 6 _7 y. U2 A: F+ `
root@openstack-controller1:~# systemctl enable apache2.service , J, ~1 W( P! V6 N+ e1 N) I6 s4 J
4.10)验证服务* F2 T0 S" T) v
[root@openstack-controller1 ~]# source admin.sh
3 O$ A* ~0 w: k f5 g; M2 H. e root@openstack-controller1:~# placement-status upgrade check
% \& g, N3 m7 W6 x +-------------------------------------------+% Q5 Q! U: R& l: i/ r
| Upgrade Check Results |# ~. L/ j* t2 D4 v! n
+-------------------------------------------+3 x/ `: H3 g2 j# v: Q
| Check: Missing Root Provider IDs |
1 [! w d7 p. f1 ? | Result: Success |
/ e6 E- z* ?9 z | Details: None |# `& g" g- D/ Z" I* _. b' w) q
+-------------------------------------------+6 O' v1 }- a g6 I. E! W
| Check: Incomplete Consumers |
; Z8 M, [, c- \ u" f | Result: Success |6 c4 @+ h7 Y+ a8 x
| Details: None |1 |" Y7 ~* l; ~0 k9 t a
+-------------------------------------------+
! Q7 B2 Y' w ?1 G: W9 J9 A, W: ] | Check: Policy File JSON to YAML Migration |6 H9 X3 y8 J; I% R
| Result: Success |; v x! \7 i8 c% r
| Details: None |; ]' i' _, e4 |. Z
+-------------------------------------------+
0 \. W3 x; A e; d1 _8 A* g4 K root@openstack-controller1:~# curl 192.168.139.31:8778
9 x$ J/ G& W9 {$ ]* f2 N9 y {"versions": [{"id": "v1.0", "max_version": "1.39", "min_version": "1.0", "status": "CURRENT", "links": [{"rel": "self", "href": ""}]}]}
) B1 W `8 t+ s. i root@openstack-controller1:~# curl 192.168.139.248:8778
" O9 Q7 q/ u* D! N {"versions": [{"id": "v1.0", "max_version": "1.39", "min_version": "1.0", "status": "CURRENT", "links": [{"rel": "self", "href": ""}]}]}
4 L: W2 ~* Q/ N0 F, t; k5)安装Nova1 V7 f8 y- W2 [8 M$ u2 M
5.1)配置nova控制节点
. Y" I; A8 F& ~5 n, M( n5.1.1)创建Nova数据库" q" ?- P3 V& W. w8 f
root@openstack-mysql:~# mysql
1 g( f$ P9 `+ x) B C+ ^) e MariaDB [(none)]> CREATE DATABASE nova_api;# [& P7 S$ B: z, f* z8 b
MariaDB [(none)]> CREATE DATABASE nova;5 c3 ^7 u8 X+ A( I, ~4 s/ \+ |
MariaDB [(none)]> CREATE DATABASE nova_cell0;8 N7 X+ H0 M! x* b' A5 f
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY 'nova123';
* C. q; x; [% ` MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'nova123';
5 B+ J# z2 W( r: L MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' IDENTIFIED BY 'nova123';+ \7 J! {8 h9 \5 z M
5.1.2)配置用户和端点+ ^4 {6 ^$ M) L3 W+ P5 d
root@openstack-controller1:~# source admin.sh ( |/ ?; V7 ?4 \& B, k4 H
root@openstack-controller1:~# openstack user create --domain default --password-prompt nova% n1 Y1 b* J. g" z+ H( \
User Password: # nova
! k& }, R/ G4 R; ~) X) s Repeat User Password: # nova
4 j+ p6 N3 U/ t0 o ? +---------------------+----------------------------------+
) {( W8 `: o& e* ^8 d | Field | Value |
: u- A4 ]3 }4 u E% H +---------------------+----------------------------------+
) B2 @4 X d6 u- D/ Z `5 X& x | domain_id | default |% Z. M, i4 F# ` V+ o' ]' H, j8 p
| enabled | True |6 j8 {: ?6 k0 O0 N- V: {$ H
| id | 223adc571a2b4a2fa32cd7bdff6e7c3b |) G/ @. X+ v1 D" ] C( h5 g
| name | nova |
# L6 @" p4 D# ^3 u | options | {} |
7 Z b h4 W" P" ~0 a9 U | password_expires_at | None |
% ?- L% X9 R8 x +---------------------+----------------------------------+; l" l. @) v! q3 w. J! ~ X
+ e/ [3 a3 l8 z `将 nova 用户添加到具有 admin 角色的服务项目`
$ b! n( U" f) h, R/ b # 让nova拥有service项目的admin权限`
# k* i0 R* K' \6 r" C! n% Y+ J root@openstack-controller1:~# openstack role add --project service --user nova admin# u8 m3 } _' d3 n- P0 r* q( ^* q
: Y, o( L6 r$ o1 d" S `创建service实体:nova`
# ?$ M/ y% g2 |6 p# u root@openstack-controller1:~# openstack service create --name nova --description "OpenStack Compute" compute
5 x; C& v$ E. s0 W/ s* \ +-------------+----------------------------------+* b U# T* ^0 z% y2 [
| Field | Value |
; P' {5 q& p% j6 ~ +-------------+----------------------------------+2 O, g/ B; Z# a1 Q
| description | OpenStack Compute |
# C9 z, N! D% K | enabled | True |
: j3 |/ \. I2 [. ^ | id | 63028385934a4290b66880dab62a4c4d |
6 N8 n2 t7 F( t" n/ \ | name | nova |
G+ b- D/ v' q | type | compute |5 h- g! e0 E' Q; C: {
+-------------+----------------------------------+! C* A4 h9 ?7 G3 C4 J8 T; E4 u
& d. P5 S. u$ B S/ e, B* i5 j1 P5.1.3)Create the Compute API service endpoints:1 \/ R8 ]1 d# o) m- O0 ~6 a
root@openstack-controller1:~# openstack endpoint create --region RegionOne compute public http://openstack-vip.stangj.local:8774/v2.1
|' K2 h; P7 H# I( ~' n7 H0 g* X +--------------+---------------------------------------------+
2 P2 t0 M/ S2 S* w; M5 D5 q$ a' S | Field | Value |( ~6 }% r; i5 g" p& M& k( N! g) {
+--------------+---------------------------------------------+& g1 ?" T9 o; [1 p5 @
| enabled | True |7 }# F% Q0 o$ O- y9 u
| id | d5564488f45d47009640dcea5e0083f8 |3 j5 p6 [2 A, _
| interface | public |
! e$ | n6 X+ T$ S/ j | region | RegionOne |
& p6 R2 @+ K7 d | region_id | RegionOne |* k& T* h0 Q( V+ V" i' Y
| service_id | ba27d9ae56314e208a3b9b7e1dead803 |
+ P$ d7 f- i2 Y! i+ f& g, i2 W | service_name | nova |
4 w* H! q/ a9 U3 `: ^7 V+ m+ e | service_type | compute |
; X* L; F" v, P* R | url | http://openstack-vip.stangj.local:8774/v2.1 |
. G: w0 x4 f! o; d! R$ L3 V +--------------+---------------------------------------------+
- d' K5 P% l1 s' z' Z5 e9 T root@openstack-controller1:~# openstack endpoint create --region RegionOne compute internal http://openstack-vip.stangj.local:8774/v2.1( H, |9 d" S* [9 S6 C8 b
+--------------+---------------------------------------------+1 _# s* p. R O8 c6 G1 l# ~
| Field | Value |. T- e D2 `8 j/ f- `
+--------------+---------------------------------------------+2 [2 W( \( q% G" d# a4 y d9 \
| enabled | True |& I0 d7 Z. ^ h! K& }4 J! F! s) [
| id | bce779f873ad48cdaf7aa65c9c310e0b |- y# l* Z* T8 ]% \( W G
| interface | internal |/ [9 o' \$ ?$ |6 h Y l3 L
| region | RegionOne |
2 R4 h: Z. ~9 Y& p | region_id | RegionOne |% I( ^3 Y( t3 ]1 Q% s K
| service_id | ba27d9ae56314e208a3b9b7e1dead803 |* h3 x3 W9 P: F' W9 c# }
| service_name | nova |
" p% n, }, B4 s0 ~# } | service_type | compute |* i9 ^2 W7 N# m. X
| url | http://openstack-vip.stangj.local:8774/v2.1 |3 M7 o" ~# {, C# N
+--------------+---------------------------------------------+# x! Y- h6 N: C ~+ i; S; b0 S
root@openstack-controller1:~# openstack endpoint create --region RegionOne compute admin http://openstack-vip.stangj.local:8774/v2.1
3 l' n( ~ Y! F6 H5 Y' Z) i +--------------+---------------------------------------------+
- x A: u% ]9 f: V9 t( y7 \1 \ {4 z | Field | Value |" E: T/ Z: B! t- w/ X1 @3 o
+--------------+---------------------------------------------+2 Q9 e& Z3 K& ~8 h' \) ?
| enabled | True |
- i* s- z; t' \+ d3 w | id | 229163f968084cef9cc0150d1c7b14d8 |9 f2 T! {5 @0 G
| interface | admin |
2 b- \' U# `5 Y' ]0 a* @: W | region | RegionOne |
. q K. `% H# y7 M. j1 c2 d | region_id | RegionOne |) K! W0 l1 {, Z. M5 z
| service_id | ba27d9ae56314e208a3b9b7e1dead803 |
) B' a4 h. C0 u% y7 [ | service_name | nova |
& g, Y# p0 b5 ~) T( x' E! v | service_type | compute |$ ?5 g: l0 C. A! y- t& U
| url | http://openstack-vip.stangj.local:8774/v2.1 |5 h4 U0 F4 q. D
+--------------+---------------------------------------------+( X) E1 V. M; G* ], z k
`验证`
" l Q8 J1 L' R# M: x [root@openstack-controller1 ~]# openstack endpoint list
# ^( k( k8 _8 H. L/ F +----------------------------------+-----------+--------------+--------------+---------+-----------+---------------------------------------------+9 I5 l& M- j& e1 t6 _. `
| ID | Region | Service Name | Service Type | Enabled | Interface | URL |; N: B1 G3 A0 G7 J
+----------------------------------+-----------+--------------+--------------+---------+-----------+---------------------------------------------+: `5 G5 j1 P% l9 `- T0 N; d
| 1df308c037cc4cb195da67db34438c57 | RegionOne | glance | image | True | public | http://openstack-vip.stangj.local:9292 |
5 \& r: @. f9 m | 20caaef3b2ee4ff7898d1e7b7f1e41dc | RegionOne | keystone | identity | True | admin | http://openstack-vip.stangj.local:5000/v3/ |
) Q1 j/ n! _. y) D8 T8 L6 @2 o | 229163f968084cef9cc0150d1c7b14d8 | RegionOne | nova | compute | True | admin | http://openstack-vip.stangj.local:8774/v2.1 |! z- b. n2 V! l' [" {' E4 j% j4 D
| 3fc61c0f302d41359da99b80ca32853f | RegionOne | glance | image | True | public | http://openstack-vip.stangj.local:9292 |
- z" Q! k; W, I# W/ r( s | 671f3dd8ddd643d08b922df0f9c7f4d8 | RegionOne | glance | image | True | internal | http://openstack-vip.stangj.local:9292 |2 d2 ]/ k% @6 }
| 78ae4d21b4424bb1b0c8029dc7959ca5 | RegionOne | placement | placement | True | public | http://openstack-vip.stangj.local:8778 |
; [) H/ @2 f9 b | 8005d074d03a4ead8c85d54e7ffd143a | RegionOne | glance | image | True | internal | http://openstack-vip.stangj.local:9292 |
1 h2 D2 e5 G2 u4 p/ _; @% I1 g& U! ` | ad54a4233c0e4a23ba56f86960ff97a9 | RegionOne | keystone | identity | True | public | http://openstack-vip.stangj.local:5000/v3/ |7 k* X: _' T) L6 T- Q7 ]/ u2 Z
| afea7ab2f5914bcca88f088957f6144f | RegionOne | glance | image | True | admin | http://openstack-vip.stangj.local:9292 |
/ T4 [* G# {( ?9 Y& j3 U | bce779f873ad48cdaf7aa65c9c310e0b | RegionOne | nova | compute | True | internal | http://openstack-vip.stangj.local:8774/v2.1 |
% |' \& Z! _; Y8 ]8 C% s' z) s | d5564488f45d47009640dcea5e0083f8 | RegionOne | nova | compute | True | public | http://openstack-vip.stangj.local:8774/v2.1 |/ E, E& `( u- `/ f
| dd7caa1565864e4baf5aeed582ad19f9 | RegionOne | placement | placement | True | internal | http://openstack-vip.stangj.local:8778 |
; S ^( o7 |+ ~) M: c | def9f3253353499fbc24a851445198c9 | RegionOne | keystone | identity | True | internal | http://openstack-vip.stangj.local:5000/v3/ |9 b- `" W3 y8 C" M& ~9 |
| e7fcd33ba0994973a0b9bb2bc7b8c3cb | RegionOne | placement | placement | True | admin | http://openstack-vip.stangj.local:8778 |
% d0 X0 ]/ j( S' _ +----------------------------------+-----------+--------------+--------------+---------+-----------+---------------------------------------------+ E! V. Q6 x q. g, v
5.1.4)配置haporxy代理
) u6 P7 y: ]) _- U+ s5 X root@openstack-haproxy:~# vim /etc/haproxy/haproxy.cfg
" D% [. ]9 V) E2 f0 ~2 f0 N# Y# f # 在最后一行加入下面内容5 V+ v" n9 d3 A8 U( ^+ A
listen openstack-nova-8774
( g! |$ l6 k) |& n% Q( d bind 192.168.139.248:8774
4 @9 I N8 c' m* c1 \" J0 M( T mode tcp
4 t2 [9 q* ^" A" ~ server 192.168.139.31 192.168.139.31:8774 check inter 3s fall 3 rise 59 T( @& O; p% K, {9 K. [
: c$ z' g8 `" m8 k) H: [ listen openstack-nova_api-87754 h; ]" G. D3 K! p/ g
bind 192.168.139.248:8775
/ G5 w0 f |# H mode tcp
/ j0 {$ A4 b; ?/ a3 D+ @4 e server 192.168.139.31 192.168.139.31:8775 check inter 3s fall 3 rise 5% R+ X8 i) E; f8 W8 b1 {
% j! _" Y# T$ V/ {/ G
root@openstack-haproxy:~# systemctl restart haproxy.service
# B% ~9 P6 g' b6 s root@openstack-haproxy:~# ss -tnl | grep 8774
2 E( M r) K8 C% I LISTEN 0 128 192.168.139.248:8774 *:*
8 o9 D+ w1 H5 i* p0 c; @5.1.5)部署nova-conductor
' X) x# A- K8 h1 O8 g1 b7 R root@openstack-controller1:~# apt install -y nova-api nova-conductor nova-novncproxy nova-scheduler
6 \: L/ @5 U. \( T$ A C& u5.1.6)配置nova-conductor5 ]3 e" E8 K; h. G, x( m
root@openstack-controller1:~# vim /etc/nova/nova.conf
0 @* D9 n$ k1 z5 [4 a [DEFAULT] # 在此模块下面添加下面4行信息
3 _0 Y! S8 J: _ y transport_url = rabbit://openstack:openstack123@openstack-vip.stangj.local:5672/
. n! H4 {: f4 A# b& h( d my_ip = 192.168.139.31
5 w/ n4 f9 i" a1 r. `& R
- s8 x$ w8 W6 b! W [api_database] # 在此模块下面添加下面一行信息- _. C5 a5 b' }) b6 ?
connection = mysql+pymysql://nova:nova123@openstack-vip.stangj.local/nova_api6 k. @# n4 F- `3 S4 H9 l1 w
( w4 O( l, i+ e# S9 V: q
[database] # 在此模块下面添加下面一行信息+ r2 k; \- k! P
connection = mysql+pymysql://nova:nova123@openstack-vip.stangj.local/nova
1 Y5 e6 W5 w8 h# [ : m* J9 y2 m, K
[api] # 在此模块下面添加下面一行信息* p9 S) q: D. | ?
auth_strategy = keystone
2 y+ m7 M9 G. c1 G5 x" P " M3 R# u) `% y" ~- M9 q8 Q) T8 k
[keystone_authtoken] # 在此模块下面添加下面9行信息
! B9 \, j! L' j1 d+ W www_authenticate_uri = http://openstack-vip.stangj.local:5000/- _: V) f0 S2 J) b- p! l
auth_url = http://openstack-vip.stangj.local:5000/* P3 R: `! u2 f6 N
memcached_servers = openstack-vip.stangj.local:11211 i6 ~5 i: _9 Z& i) ^1 B
auth_type = password
7 c' {6 ~- q) U1 F project_domain_name = Default% G5 p$ ], b7 q' h; o0 m
user_domain_name = Default3 b1 u$ o4 {' g" e) l- I D6 A8 j2 Z
project_name = service
# R4 L/ q0 I; H/ U8 T username = nova7 ]- k) T/ p$ T, h7 b
password = nova4 |' c0 t7 }) E/ q1 {, ~# k E
' a) R- \- N. p [vnc] # 在此模块下面添加下面3行信息: \1 o% d+ c% Y( e$ Z' ]
enabled = true
3 V6 y* @' R# f8 S- {+ } q, N* W server_listen = 192.168.139.31
4 D* g" D) X: ~* }3 u% f server_proxyclient_address = 192.168.139.31
9 e; e+ V8 n% J. g/ h
1 N/ P) H# Z! q3 W V5 ^* A4 Q% \8 f [glance] # 在此模块下面添加下面一行信息6 x3 ]! r/ Z6 w, A6 z
api_servers = http://openstack-vip.stangj.local:9292, l2 g! S6 n* W# M7 `8 Z7 D
( x9 T% L7 o: [6 i [oslo_concurrency] # 在此模块下面添加下面一行信息$ F! O# ~! z& s3 _2 P
lock_path = /var/lib/nova/tmp
, U% p7 }, C* I3 ?
, K) K2 o. U( O, [( V& |: V% T [placement] # 在此模块下面添加下面8行信息' P2 J8 {' y" U* v4 e; A
region_name = RegionOne4 v$ B% a" H; A; x9 R6 j, w
project_domain_name = Default
/ g/ Q: l8 k9 R, U7 A$ Z project_name = service
/ h$ O/ s4 t7 A0 I auth_type = password$ H/ z7 o3 ] W
user_domain_name = Default/ a- Y6 b; ?$ M
auth_url = http://openstack-vip.stangj.local:5000/v3
0 P8 p$ w8 h" m3 V2 U/ v username = placement
" B% L+ k! k1 d2 h2 ^ password = placement; o% t( x# d$ H' @, _- |2 j5 G1 T
- F# J4 q, v, A: F% ` [service_user] # 在此模块下面添加下面9行信息
& x1 _) r; W) A/ n5 v6 w send_service_user_token = true
1 T7 m) o* z! c. Y auth_url = http://openstack-vip.stangj.local:5000/v3
5 w9 } C" I9 g' }8 g x auth_strategy = keystone. n+ @, j1 C) T/ S3 P ?# j
auth_type = password7 ~0 N0 U# w/ O& s: f" }
project_domain_name = Default
# Z- c8 T4 @9 w2 {) i8 d project_name = service
) }# f1 v" r5 s+ C7 X: g k+ v4 s user_domain_name = Default
0 r/ C4 ?/ V4 m: p username = nova" N) I& i; y6 b: \
password = nova
+ }6 c1 I4 B' a' K5.1.7)初始化nova数据库
3 U2 P, R( K9 @0 h* ~ root@openstack-controller1:~# su -s /bin/sh -c "nova-manage api_db sync" nova# |" X# u9 B! A i' Z: Z5 A) r& `
root@openstack-controller1:~# mysql -unova -h192.168.139.248 -pnova123 -e "use nova_api ; show tables"
+ M8 N+ d" U3 D% S1 { +------------------------------+. i- Z) A+ t& L" T0 e
| Tables_in_nova_api |; f% Q' O/ s: T0 y
+------------------------------+
9 f2 S7 r0 [$ V8 Y, ? | aggregate_hosts |2 B$ k4 W1 p! [: F. h$ q
| aggregate_metadata |% j, Y6 ~# P* ~. }; S- F
| aggregates |6 ]3 d2 Q. I/ c k# B& @
| allocations |
* W9 a3 M# [9 W9 l2 V | build_requests |
2 d/ K% s8 o, ~0 H+ L0 G8 A ................................
5 n% M D* ~. } ................................2 U' {4 p: k' x/ L
| resource_providers |* W/ w1 g- R4 g. o3 Z! V6 M
| traits |
+ R0 o* E) |. O8 v* y | users |
$ z5 L/ j+ P9 D +------------------------------+9 E* [3 U; \1 q3 R2 ^" f0 ~3 a4 x7 E
root@openstack-controller1:~# su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova9 S# B' A# \' U3 M! ]; V/ o' t! Q
root@openstack-controller1:~# su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
" W" ]% k! m! c$ `3 l9 ~" a ....
( g! F) i8 X' p# Y3 z J4 U- M' ` c14b4cfb-a4f6-41a5-8418-a3d3ee04228f
) Z% x9 l& P o7 P: a % w8 v- t! N$ X2 P* x* n
root@openstack-controller1:~# su -s /bin/sh -c "nova-manage db sync" nova, r1 ?) ~; q, v$ ^' G
5.1.8)验证 nova cell0 和 cell1 是否正确注册:0 E6 z' M% V! L& @
root@openstack-controller1:~# su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova
, y( [: i+ I/ i$ u# s +-------+--------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+----------+
; a8 l$ B( F9 B( u( p. W | Name | UUID | Transport URL | Database Connection | Disabled |
5 \0 ~1 S% `; l' T9 o/ ?3 H +-------+--------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+----------+
`" R- Z! u% V! Y% A7 d | cell0 | 00000000-0000-0000-0000-000000000000 | none:/ | mysql+pymysql://nova:****@openstack-vip.stangj.local/nova_cell0 | False | Y* s( \0 M1 G# N" a
| cell1 | c14b4cfb-a4f6-41a5-8418-a3d3ee04228f | rabbit://openstack:****@openstack-vip.stangj.local:5672/ | mysql+pymysql://nova:****@openstack-vip.stangj.local/nova | False | W# O+ @7 I- X
+-------+--------------------------------------+----------------------------------------------------------+-----------------------------------------------------------------+----------+4 i. `! K! w0 R' M
! E h; w& V% a' ~3 q6 d& J* k1 r1 v+ [
5.1.9)启动服务
7 L' e1 [- ^- Y2 \$ k) I" V root@openstack-controller1:~# systemctl enable --now \
$ p/ \- r& r- D! v5 v/ t4 W nova-api \1 j/ ^$ C! ^' L' }
nova-scheduler \. C+ f, @+ A: d' ^
nova-conductor \4 s: c# B$ d" v( u0 q: b* g
nova-novncproxy5 ], }8 {9 o! f+ }! _1 j
root@openstack-controller1:~# systemctl restart nova-api nova-scheduler nova-conductor nova-novncproxy% X8 S& ]: E- A$ V( D
5.1.10)把novncporxy代理到haporxy
9 ]" W$ I: ~. o+ @/ r! Z' A l root@openstack-haproxy:~# vim /etc/haproxy/haproxy.cfg
7 Z' V. k8 `$ H& _6 t1 \& J2 ^ { # 在最后一行加入下面内容
n K- G$ l7 v8 `: M listen openstack-vnc-6080
/ B( V0 ]* V `; f( S8 b bind 192.168.139.248:6080
( s% e2 c. o% J9 M mode tcp4 Q% @4 z, O4 E/ V( g
server 192.168.139.31 192.168.139.31:6080 check inter 3s fall 3 rise 5: _; q7 c* K' v+ {' O3 e
root@openstack-haproxy:~# systemctl restart haproxy.service
9 f. A9 Z. q2 p' h8 a A root@openstack-haproxy:~# ss -tnl | grep 6080, p5 E5 @4 u# t3 R; `- k% w
LISTEN 0 128 192.168.139.248:6080 *:* 0 C2 P( u6 G! b' R( x5 w7 U, V
5.1.11)配置nova重启脚(为了方便后续实验)& \7 H/ W) h: h( O
[root@openstack-controller1 ~]# vim restart_nova.sh
& B; m' _; n" P% ]; O( V #!/bin/bash
: o7 W* n4 B4 I( l8 U systemctl restart nova-api \
; o1 Y9 b. x1 Y" C6 s Z1 L7 d nova-scheduler \
3 E) ? p I! U G. r2 ~3 ]0 V; P6 U nova-conductor \8 x& U3 E" u3 i5 Y1 k$ f
nova-novncproxy
9 E/ j0 R. B% D8 h/ @5.2)配置nova计算节点- O! }# A# Q; i6 }; l% Z& w
必须保证开虚拟化! Y" a e W+ Z5 o# R
! l3 w5 Q2 ?3 Iimage-20231215224936327
% y7 r7 `; c- U
2 Y) x% Q" ^! i5.2.1)部署nova-compute
) l' E8 ~5 [! ]) ^7 j* B1 X: x root@openstack-node1:~# apt install -y nova-compute
7 w" r0 ~# f/ X' I1 ~5.2.2)配置nova-compute
9 r$ p% U8 N ^3 z4 E1 s root@openstack-node1:~# vim /etc/nova/nova.conf/ B* J- @% }, N: f! M: v* ^* y
[DEFAULT] # 在此模块下面添加下面4行信息
# c! a0 N4 `( ^+ |# O. |6 d transport_url = rabbit://openstack:openstack123@openstack-vip.stangj.local:5672/4 ^: ^+ S$ Y* O) ^, u
my_ip = 192.168.139.34
( S2 Q3 Q. l) i! x9 X # state_path = /var/lib/nova3 E: G7 F8 E0 ]0 ]1 C
. C! D+ ~/ R# h& o$ W+ I+ Y
[api] # 在此模块下面添加下面一行信息8 r1 D4 i! Z; V) ?$ |+ }# q2 J
auth_strategy = keystone
, n- i$ k3 G" J2 I+ `
. A% j0 h/ l& Q2 E; I* K% W [keystone_authtoken] # 在此模块下面添加下面9行信息6 \! K# a: c( {! e$ Q. n/ X4 _
www_authenticate_uri = http://openstack-vip.stangj.local:5000/
& |3 K, l' B, S) t+ q8 k* z$ s auth_url = http://openstack-vip.stangj.local:5000/
1 E1 I' C/ Q8 o+ l7 `. { memcached_servers = openstack-vip.stangj.local:11211
$ b3 a1 f3 H6 U% a% f& B+ G auth_type = password S; [. ^5 K& n' z4 E! J0 O* V: s
project_domain_name = Default; A) l7 M7 w$ R9 \; a* n
user_domain_name = Default
) D" `# f6 I6 a2 ] project_name = service
, y" h( y0 D3 | username = nova
0 s8 t3 W% r$ V/ L, x password = nova
: R% n; R8 @$ e1 a( s* m$ T 7 A5 f# O1 D1 }, ]9 d$ K* Z, b- q
[vnc] # 在此模块下面添加下面4行信息# q1 ]+ Q; ]3 i0 g d
enabled = true ~- z' l) ]$ F! x- i- s0 X8 a3 E
server_listen = 0.0.0.0
% A) ~6 Z1 E G: J/ J3 b server_proxyclient_address = 192.168.139.34
; \5 K9 n: \; b5 C novncproxy_base_url = http://openstack-vip.stangj.local:6080/vnc_auto.html
. D; _1 z# N# H+ ]% T0 j/ h. w; w
5 ^! i: x# G1 e% P9 v% x6 W* i$ j# g [glance] # 在此模块下面添加下面一行信息4 a+ s0 X& r& r: a% \( k1 W0 C
api_servers = http://openstack-vip.stangj.local:9292
4 u9 H- t. n' c a b$ \) Q : O% j: K* {/ q- Y
[oslo_concurrency] # 在此模块下面添加下面一行信息
' {. {9 o4 F6 p ]" v* J4 \. A lock_path = /var/lib/nova/tmp( W9 X0 n; L: ^$ m
! x9 q8 R! R& K! p [placement] # 在此模块下面添加下面8行信息
z3 a. c$ l9 n C* y D region_name = RegionOne
6 z7 c$ \; M" w+ @ project_domain_name = Default; d4 b1 e, R! Z: ~2 u, U: q3 X
project_name = service. p5 c# Q( X' o
auth_type = password0 F! B2 ~9 ]0 E6 L1 M2 h
user_domain_name = Default" b* b# }. R9 k5 y
auth_url = http://openstack-vip.stangj.local:5000/v3
5 g/ W @* T/ d' H$ u username = placement
6 [3 k2 t% R4 V8 t password = placement9 l: {9 a) ^- V4 @9 `
" \+ J' P) R B
[service_user] # 在此模块下面添加下面9行信息, ]4 A/ L& p. d3 s& c8 w
send_service_user_token = true
$ s; }; q2 U5 k7 R D auth_url = http://openstack-vip.stangj.local:5000/v37 t$ H0 N! `) ]
auth_strategy = keystone
6 P4 Y$ ~# S7 Q# `* x auth_type = password
" @& N5 {7 g5 L, o* U8 ?0 A6 G project_domain_name = Default! }# l6 v9 ]- w: _
project_name = service
; y" C) } Y. I" b* v8 w user_domain_name = Default
; J0 t9 ?2 s2 _/ O# l/ o( A username = nova4 _! [ E; o) Y J
password = nova
. C" W5 L* J7 V+ ~& d, |& t' @7 @( R
& I' l7 U" b, p root@openstack-node1:~# vim /etc/nova/nova-compute.conf d5 D, M) u+ T8 Z5 K3 Y
# y' g5 v4 Z; S% |3 S
[libvirt] # 在此模块下面添加下面一行信息
$ J% V/ A7 _/ W0 ~7 U; S5 L3 ^ virt_type = qemu7 Z, Q$ z0 T9 ~! T6 V
: {2 r5 r# j0 T/ J `检测是否可以用虚拟化`
% ^' p4 e2 c7 _( A" k& X' D root@openstack-node1:~# egrep -c '(vmx|svm)' /proc/cpuinfo& f3 g2 G* p: u9 k8 F0 e# W
4
7 e- K2 U1 u( r$ h5.2.3)配置hosts解析
8 a2 |! E. L8 g7 z# d6 F/ i( l root@openstack-node1:~# echo '192.168.139.248 openstack-vip.stangj.local' >> /etc/hosts$ v. X, k9 F/ f$ f
5.2.4)启动服务
( ^+ J9 c$ n/ ?. m, B- \, A( R6 s root@openstack-node1:~# systemctl enable --now libvirtd.service nova-compute
# d" q* @7 D# d `编写重启nova-compute脚本`
9 A3 v) ]& q1 O/ ? root@openstack-node1:~# vim restart_nova.sh
# W, U g$ J w; \/ F* Y7 } #!/bin/bash* w# l. e5 v% U6 d
systemctl restart nova-compute5 v |) I1 `9 C" Z3 j: }- O
root@openstack-node1:~# bash restart_nova.sh
3 Y- S5 ^3 ~. H1 ^6 u" ~2 s 1 {8 f: B/ @$ n1 K3 ]" H8 |# D) E# u
5.2.5)验证服务2 p. y$ r, z% C+ y) J
root@openstack-controller1:~# source admin.sh 0 _' S" Z: A a5 c4 C4 A2 C3 H- L: f
root@openstack-controller1:~# openstack compute service list --service nova-compute
3 s: V# d# `) G' m/ U9 p6 P/ k +----+--------------+------------------------------+------+---------+-------+----------------------------+' \5 d; a, X/ N; {
| ID | Binary | Host | Zone | Status | State | Updated At |
8 Y2 c- r: I# o6 o9 _$ R$ T# h0 m +----+--------------+------------------------------+------+---------+-------+----------------------------+- I( Y: B% V( u
| 11 | nova-compute | openstack-node1.stangj.local | nova | enabled | up | 2024-12-07T14:12:03.000000 |7 u- P) H. [; f1 |, a( @7 c
+----+--------------+------------------------------+------+---------+-------+----------------------------+
, T; Q7 ]- K! G5.2.6)发现计算主机, g, L! g- e5 h" I) Z
如果加入新的node节点需要执行下面操作
h+ ?7 E0 ^' P3 N$ V! k, k2 l5 a8 G4 j+ \8 g
[root@openstack-controller1 ~]# su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova0 R" C: E$ [) [; S5 z& R
Found 2 cell mappings.
g; _# m( i9 N g+ E( n Skipping cell0 since it does not contain hosts.
& w; M5 o- i2 H/ p' u9 ~ Getting computes from cell 'cell1': c14b4cfb-a4f6-41a5-8418-a3d3ee04228f
4 E+ @' p0 G1 D9 I0 A9 v& f5 x Checking host mapping for compute host 'openstack-node1.stangj.local': 4165d6b8-ae97-41a3-b601-1a11148ef8e0
$ A* `9 {5 J! F4 t Creating host mapping for compute host 'openstack-node1.stangj.local': 4165d6b8-ae97-41a3-b601-1a11148ef8e0- ^: d9 b- s; P( _6 ~ @% }
Found 1 unmapped computes in cell: c14b4cfb-a4f6-41a5-8418-a3d3ee04228f6 g4 b' t) A7 T5 M: m" v
5.2.7)配置自动发现计算节点* i. U' E9 |9 r0 ~9 W8 n& l7 Q% D0 [
[root@openstack-controller1 ~]# vim /etc/nova/nova.conf
/ s! f" ^) C: m& { [scheduler] # 在此模块下面添加下面一行信息5 t9 m- G5 ^$ c& ]0 S3 i
discover_hosts_in_cells_interval = 300
& [* q! F+ H. r `重启nova-conductor服务`0 e1 v- }" Z/ ?5 O
[root@openstack-controller1 ~]# bash restart_nova.sh
+ _; t4 a P2 L v3 {5.2.8)验证操作
% ~/ v3 n0 P1 [$ H1 Q [root@openstack-controller1 ~]# source admin.sh
, Z0 ]8 g1 |& D! q [root@openstack-controller1 ~]# openstack compute service list
' O- L5 V8 ~$ g) d9 u: m/ y +----+----------------+------------------------------------+----------+---------+-------+----------------------------+
+ ]* e9 q9 F6 ]$ _; v | ID | Binary | Host | Zone | Status | State | Updated At |
2 X5 Q; t: Z. D1 U +----+----------------+------------------------------------+----------+---------+-------+----------------------------+! R- s9 v% Y( r {' L H
| 1 | nova-conductor | openstack-controller1.stangj.local | internal | enabled | up | 2024-12-07T14:15:42.000000 |
2 O6 E; M+ J6 Q! W | 7 | nova-scheduler | openstack-controller1.stangj.local | internal | enabled | up | 2024-12-07T14:15:42.000000 |
5 q; s2 s, L# ~0 \( `# G& t | 11 | nova-compute | openstack-node1.stangj.local | nova | enabled | up | 2024-12-07T14:15:42.000000 |& k! u: M' a X/ N8 O3 V1 I
+----+----------------+------------------------------------+----------+---------+-------+----------------------------+. Z1 Q* y7 |3 m5 f7 b" ]% o
root@openstack-controller1:~# openstack catalog list1 G. U# t& m. S% V* D* x _! N$ P
+-----------+-----------+---------------------------------------------------------+
+ M# }9 D+ e. a8 B | Name | Type | Endpoints |) N: D7 h; t4 w' w
+-----------+-----------+---------------------------------------------------------+ X' m, ?% o4 O
| nova | compute | RegionOne |8 d7 Y/ G }( ?4 R
| | | public: http://openstack-vip.stangj.local:8774/v2.1 |# K ^& L! f) ?4 V6 T7 ~) J" z
| | | RegionOne |. Y1 x! K/ H6 `% j
| | | admin: http://openstack-vip.stangj.local:8774/v2.1 |
% P! [/ M8 Q9 G: n% c | | | RegionOne |0 l0 `' i. y1 e. @) n% H: m
| | | internal: http://openstack-vip.stangj.local:8774/v2.1 |
- F1 j. \2 h/ Y4 N; b2 M | | | |0 w1 c* U v; y# X* ]1 I6 N( `+ c8 W
| glance | image | RegionOne |
: L$ o3 l: ~) a* u2 }. b# G | | | public: http://openstack-vip.stangj.local:9292 |
% e. z9 ?4 M1 r) t7 ?& a* B1 S | | | RegionOne |
0 O8 ` ^- e. y4 ?' i5 L | | | admin: http://openstack-vip.stangj.local:9292 |1 {9 c& Q% I* ~. w4 E
| | | RegionOne |* q( |( Y+ n3 q6 k5 y
| | | internal: http://openstack-vip.stangj.local:9292 |
; D( i# N+ R) [4 l3 E) G | | | |
. j; n" C7 E. t | placement | placement | RegionOne |
, I0 h# d( b* \2 _8 [4 n v0 p | | | public: http://openstack-vip.stangj.local:8778 |
, B+ y& P) q6 E# m! \( F0 K | | | RegionOne |
6 n/ Q- `6 s2 K9 o$ Q7 ]! ?, e | | | internal: http://openstack-vip.stangj.local:8778 |1 F( I% }: r7 Y6 q
| | | RegionOne |
. _8 h8 y: @: y i) B: M- m' B | | | admin: http://openstack-vip.stangj.local:8778 |6 x' }! x; D; }2 e
| | | |
: g. D* X4 G6 u! ]( y | keystone | identity | RegionOne |
6 E, t- D' y& |5 H D& K2 a | | | internal: http://openstack-vip.stangj.local:5000/v3/ |
& i3 C% M& o1 l. F2 `8 E | | | RegionOne |
- B- B; O z. \* @ H# S9 u6 A | | | admin: http://openstack-vip.stangj.local:5000/v3/ |' c* d7 k7 j" v1 P! I! @, x
| | | RegionOne |; B# ^0 I! v2 ~, d
| | | public: http://openstack-vip.stangj.local:5000/v3/ |- s6 X8 d g2 j# Z4 o
| | | |. ?$ _; U' Q( r3 x9 |1 U
+-----------+-----------+---------------------------------------------------------+
+ f C! h9 D/ w9 d( G: T 6 c q9 V# i- }) S+ i: ]' T
root@openstack-controller1:~# openstack image list
7 z# a* m/ n; e5 Z& p2 ] +--------------------------------------+--------------+--------+ j- E7 L: B, {7 `# F3 S
| ID | Name | Status |0 X8 D% Y. ?, z9 G7 t
+--------------------------------------+--------------+--------+
0 U2 }% ~- G0 s | 68249b5f-9eac-4873-be74-cc11ac9af61e | cirros-0.4.0 | active |! v, Z+ ^- q( D3 j5 V' M3 a4 V# g2 `
+--------------------------------------+--------------+--------+
% n$ X- {, w% e1 }: t. ? / {8 F Y, \' b! R* j9 g% m% ^
root@openstack-controller1:~# nova-status upgrade check
* @' A) V% z7 N +-------------------------------------------+
1 |+ M2 s! p* j# ] | Upgrade Check Results |! I0 D( V1 |, }" w6 j
+-------------------------------------------+
7 ?! P5 z! e- L | Check: Cells v2 |
, D! ]5 c& h* w/ b | Result: Success |1 s6 ]% j* @' F
| Details: None |
8 T& H* g% D$ ^8 t +-------------------------------------------+
/ r' o; y+ C1 W$ C& c/ _ | Check: Placement API |9 f$ Q$ s- e' x% u/ U7 y
| Result: Success | B. A% Z5 O6 j% L0 X, m# W
| Details: None |6 _% B- W% _1 n/ {( g
+-------------------------------------------+: q _" O _" y
| Check: Cinder API |: T! R% ~, u3 w2 z1 o0 M
| Result: Success |
8 l( a8 g- W: H1 j1 R7 i: G) O | Details: None |
6 o) Y5 w" |- t1 l +-------------------------------------------+$ q3 Q; y) ^9 u& [% Z( x
| Check: Policy File JSON to YAML Migration |$ N d9 ]& h! U Q
| Result: Success |
# H3 F5 _) S) e6 `& T2 \0 S | Details: None |
5 r7 s- I9 s6 F; C9 Q, s, \ +-------------------------------------------+$ D& g1 |/ T. M( K9 ~. f
| Check: Older than N-1 computes |
, J% s1 k! y7 M; K" g | Result: Success |
) S/ I- M# K8 U+ f | Details: None |% c: \# y# p& R/ u+ B+ s
+-------------------------------------------+9 h1 G2 n# |1 \
| Check: hw_machine_type unset |
6 z* }) D& \1 p | Result: Success |% m: Z; F( K/ w1 P; |, ^5 `; f1 M; u
| Details: None |3 E; H% k6 ~# i- b4 M
+-------------------------------------------+
4 B3 @. d+ X6 }( l | Check: Service User Token Configuration |# G+ a' ]6 D- X6 k8 C
| Result: Success |1 V( W* m1 [3 o
| Details: None |
4 y7 f$ f! H" @' x4 S; T% c +-------------------------------------------+
6 M6 G B" h5 z$ h6)安装neutron: ?5 W7 |! a0 ], f# T" k
6.1)安装neutron-controller节点- K. ?3 P- _7 d
6.1.1)创建Nova数据库
: j7 m4 B& `/ `! @ root@openstack-mysql:~# mysql7 V; V4 v0 _- v
MariaDB [(none)]> CREATE DATABASE neutron;
9 }1 A1 J! P: b. d+ y2 U MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' \
U# M7 |6 N' p3 p5 Y IDENTIFIED BY 'neutron123';' s C$ J% P* L3 _4 R
MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' \
8 i8 g9 r. g) M9 d0 J IDENTIFIED BY 'neutron123';
! t E7 ?4 t2 w9 X- J7 W6.1.2)配置用户和端点
8 I9 G9 G9 S2 t9 B5 s root@openstack-controller1:~# source admin.sh
/ Y4 }0 M+ H( n5 s [& I5 c root@openstack-controller1:~# openstack user create --domain default --password-prompt neutron3 c% T+ _4 @; q
User Password: # neutron
) `4 i+ p4 h0 |1 w) F2 | Repeat User Password: # neutron, ]: o% s9 W. B" Q) ]( T( a
+---------------------+----------------------------------+! N1 l4 e. S& V" e) c$ V$ \
| Field | Value |' S3 Y; q% Z/ k: _; Q) s; ~; x* J& T$ h
+---------------------+----------------------------------+& O- t1 H/ {, S& }% d4 a, i$ Y( { K
| domain_id | default |4 _% d0 ]5 L1 B# y
| enabled | True |
4 T" }4 c1 S) z) J | id | 282317cd0bb74396a7a12dcdd96aeed0 |
6 p9 o$ y" M) j9 P: S | name | neutron |
" `& J7 a9 l7 A/ r1 d6 Z | options | {} |
! \6 ]. s$ J0 G' u | password_expires_at | None |3 I0 S8 K, x3 F( @# I
+---------------------+----------------------------------+* J8 a4 o% h. C: ^) @- j) P7 m
4 X* g/ K. E/ ?: N% G5 | `将 neutron 用户添加到具有 admin 角色的服务项目`4 }2 B* K g2 V+ E0 x
# 让neutron拥有service项目的admin权限`
. v5 r. S) D) p4 A7 X0 v root@openstack-controller1:~# openstack role add --project service --user neutron admin
" w- I: q c4 y+ R4 t `创建service实体:neutron`
. k' t; \# p' d G' @& p) } root@openstack-controller1:~# openstack service create --name neutron --description "OpenStack Networking" network9 h7 I4 X; X; O6 f3 Z
+-------------+----------------------------------+
# Q, _, R- M" p+ \# [$ { | Field | Value |
( P" C) r/ R5 _- B +-------------+----------------------------------+
2 e- Q; f: R& p$ `: v/ K2 v/ d' A | description | OpenStack Networking |
+ I% B( ]/ H4 W& ?# c | enabled | True |- v' I; i7 \$ x( l/ ~, L1 ^5 X
| id | e4ff8c65882a401a83e2203ce49daeaf |
/ ~; |0 q: A4 V3 i) ]( x0 W3 L | name | neutron |
2 @( L/ O1 T& F | type | network |) v& ^" H( x# P" J; m/ A
+-------------+----------------------------------+
; o6 c. w+ Q5 }% P [root@openstack-controller1 ~]# & z% Q8 H- ^7 A4 r; K
6.1.3)Create the Networking service API endpoints:4 o' U; q8 T( p/ ?. V4 N
[root@openstack-controller1 ~]# openstack endpoint create --region RegionOne network public http://openstack-vip.stangj.local:9696
3 E( Z1 x( b5 a0 f0 P3 w% a1 E +--------------+----------------------------------------+3 |& O) U* ?9 u# w
| Field | Value |% Y0 c* Y2 X% Q G* l1 B, }- ~3 G
+--------------+----------------------------------------+
6 ?2 Z+ @ h x! e+ w4 A: } | enabled | True |4 q K9 `( ^ R( a
| id | 970ca60adf5746299d48f7659d500809 |9 q7 ^) h4 ~8 J8 x, c4 w Y
| interface | public |3 Q5 _0 B$ u1 c, ~8 e; t2 k
| region | RegionOne |
1 E2 [+ I! a) j# a3 k9 H | region_id | RegionOne |
. X( I6 x7 J/ {0 W) e6 B8 Y( O | service_id | e4ff8c65882a401a83e2203ce49daeaf |
7 i0 s% t4 g& ^( z | service_name | neutron |. H4 h# r% z/ J% m% q
| service_type | network |
* J6 ^3 X- j4 P3 Y v | url | http://openstack-vip.stangj.local:9696 |2 a0 C, y$ G2 l) B6 K# H% T4 Z
+--------------+----------------------------------------+
( j2 N+ H O! a: l4 k [root@openstack-controller1 ~]# openstack endpoint create --region RegionOne network internal http://openstack-vip.stangj.local:9696
\# b m2 o3 L+ C4 T! H$ [. f3 M +--------------+----------------------------------------+
/ {2 a+ R5 T) y& U( ^2 E | Field | Value |
# I7 P* c7 [+ r) z( k +--------------+----------------------------------------+$ ^( p3 z$ k0 l- W2 Q) z+ I5 h
| enabled | True |/ C+ c2 q/ M* }$ P5 s, A" d7 P
| id | 4c5f5ffbba4a4c668377a86cfd4a2320 |7 z6 a1 b' q+ P1 n2 F f( Q! X$ W
| interface | internal |# d: H- p6 D7 X' i
| region | RegionOne |
% Q2 I. b! y8 B8 n1 [# {& l) `3 p5 h | region_id | RegionOne |
# Y! W/ C+ r' E+ J, l6 u | service_id | e4ff8c65882a401a83e2203ce49daeaf |! U( o' c9 a- d
| service_name | neutron |
0 v% x$ L2 X0 ^( |6 f% F/ t | service_type | network | v1 y% _/ P) G. B0 h; U
| url | http://openstack-vip.stangj.local:9696 |
0 [+ N( t- K( e! W +--------------+----------------------------------------+5 I7 w' J1 V; Q( K0 y( q
. t1 N! K% T! P1 |- e [root@openstack-controller1 ~]# openstack endpoint create --region RegionOne network admin http://openstack-vip.stangj.local:9696
" Q+ p& C, {# x6 c* U3 D7 t +--------------+----------------------------------------+
1 n1 W; T/ y3 K; C5 A/ \3 ] | Field | Value |
' P% V8 j1 R' o" a6 V +--------------+----------------------------------------+
0 h7 m6 W( z3 T | enabled | True |
) u* s% R7 F# R# x5 k) J/ \) v9 @ | id | d8c4e83eab66486983680b69520ca92a |8 I: z$ p2 v% L6 e: l9 [
| interface | admin |2 a- Z& y4 a e4 U5 _; z
| region | RegionOne |
9 y1 [3 b0 c8 I1 e" N$ }) ? | region_id | RegionOne |
7 `5 R% i2 K# L/ l; @0 ~" w | service_id | e4ff8c65882a401a83e2203ce49daeaf |
' s" {8 m0 L! `. ^. q$ [ | service_name | neutron |
+ z* ]9 O5 I% J; ?( H | service_type | network |
4 F. k3 O1 Z( Y" I P7 H( Q! r5 f; h9 D | url | http://openstack-vip.stangj.local:9696 |
8 M3 g) z1 z" X +--------------+----------------------------------------+
8 s. M- L- A( L1 u6.1.4)配置haproxy1 }" Q; a7 b, M1 j+ x1 E
root@openstack-haproxy:~# vim /etc/haproxy/haproxy.cfg
, m/ |5 e V3 Q1 p, X # 在最后一行添加下面4行内容" J! s9 e+ G0 d4 l
listen openstack-neutron-96960 a; p6 U% l& ]' S" w$ @( t E$ K
bind 192.168.139.248:9696
$ T3 ]9 Y- ^7 i- v: H mode tcp1 P/ S' ]) u% x: H( u
server 192.168.139.31 192.168.139.31:9696 check inter 3s fall 3 rise 5
1 d# `& Z+ m( t4 t2 C+ o root@openstack-haproxy:~# systemctl restart haproxy.service
; n% \8 }$ `0 ]/ m root@openstack-haproxy:~# ss -tnl | grep 9696
' {3 B" V" ^) _2 i# I3 M1 { LISTEN 0 128 192.168.139.248:9696 *:*
H& G: S& r8 b: M6.1.5)部署neutron* g# A5 W2 W J: n8 e7 x
root@openstack-controller1:~# apt install -y neutron-server neutron-plugin-ml2 \
" a4 {9 H$ p/ C4 O/ t# D neutron-openvswitch-agent neutron-dhcp-agent \; f. {3 l7 h& X9 x, z0 l+ x2 j
neutron-metadata-agent* ~! h( t8 z; A2 T6 L) a0 k4 x
6.1.6)配置neutron主配置文件, G: k/ N+ d' J, A6 f; e
root@openstack-controller1:~# vim /etc/neutron/neutron.conf& [ {: C, r6 Q ]. @2 O
[database] # 在此模块下面添加下面这一行/ m" ~5 J1 u* C; X5 N/ n2 ]
connection = mysql+pymysql://neutron:neutron123@openstack-vip.stangj.local/neutron
7 L- n" x1 l8 Z6 u
. f9 y$ b5 j1 |. y) y7 k# F [DEFAULT] # 在此模块下面添加下面这4行
, G( |) W) v# l6 B0 s core_plugin = ml2
1 c- M6 Z: B6 ]! o+ B4 y service_plugins = 2 @1 f3 R7 ?# m& I* ^* t7 t
transport_url = rabbit://openstack:openstack123@openstack-vip.stangj.local) V- Q3 q8 U. E, b8 |( {' |
auth_strategy = keystone
% p- s+ {: d, `6 X5 k! S( D$ z) v notify_nova_on_port_status_changes = true& C9 r1 U, {, t( x0 P
notify_nova_on_port_data_changes = true
( y h9 t [2 s" o! k' z H : |7 G+ T; U, M# x1 `5 g* A
[keystone_authtoken] # 在此模块下面添加下面这9行9 Y+ P' v2 R/ F, j
www_authenticate_uri = http://openstack-vip.stangj.local:50007 m" [- F# E* A# M: G
auth_url = http://openstack-vip.stangj.local:5000
& _, p: x4 H N- b memcached_servers = openstack-vip.stangj.local:11211
* ~& T4 j0 t3 n auth_type = password
! o$ i$ _5 O3 G, ]9 E+ u1 B project_domain_name = default
( a L& l! d$ k user_domain_name = default
* K& R7 H" F L* Z2 \, t# E' a project_name = service, ^' T- l5 s9 `) W! }8 q
username = neutron3 w1 } F5 ~( T2 @* x! F* c" n( z5 f
password = neutron$ \+ X+ E2 c- c/ r. W j
: r+ q3 b4 U# v) o8 t8 H& I # 配置文件的最后添加下面9行+ M& c* d! y, M+ ]% b) W
[nova]
& f: S# T6 `" x7 m auth_url = http://openstack-vip.stangj.local:50006 T% z' ~. V6 y' z" L; Q
auth_type = password7 T+ i0 ~" [& \" D
project_domain_name = default5 w+ Y6 e" A) i# M1 f
user_domain_name = default# N$ \2 U. o S8 z2 m
region_name = RegionOne
, l S, j$ m+ E; ? project_name = service
9 }' |5 M' @6 i' u4 t username = nova
C' s8 Z8 d1 r! H& O password = nova
& n* P' u' V, y- g
: g( H3 f% S; P [oslo_concurrency] # 在此模块下面添加下面这一行9 }+ I3 ~0 K6 o
lock_path = /var/lib/neutron/tmp
9 b5 a5 d: L1 m' P( b d8 N( d8 x' O. G, K
7 H1 v7 I3 w7 t H4 O F) J
#service nova-api restart( n. V2 {; N# o5 \* ?" R( A( F
#service neutron-server restart
! f4 Q/ [, p7 w& V9 G3 u/ Z3 O8 }/ A #service neutron-linuxbridge-agent restart/ W- K0 t: I0 o$ |! Q3 ]
#service neutron-dhcp-agent restart$ f/ [! j9 ?" }) _" t( c6 p& c
#service neutron-metadata-agent restart
: R1 n: E7 N. |# A# h d6.1.7)Configure the Modular Layer 2 (ML2) plug-in
; L. F4 _) H ^ s1 X" N可以从网站上获取完整的ml2_conf.ini
$ a& J& T3 ~3 t4 F3 Y3 r0 k" R- K8 u$ Q9 S* r8 t2 B* w! ^
https://docs.openstack.org/newto ... s/ml2_conf.ini.html
' t# S2 E4 M4 W- t/ d5 m. C! m( W& U, r
root@openstack-controller1:~# vim /etc/neutron/plugins/ml2/ml2_conf.ini0 f2 q. j! J, E" d" @- U
[ml2] # 在此模块下面添加下面这4行
" H. z' d- B) o type_drivers = flat,vlan/ C) j6 `) I/ W6 Y* J' o
tenant_network_types =6 ~' Z+ A o' p2 y2 ?/ L2 D' h
mechanism_drivers = openvswitch9 r" q3 W6 Y0 c8 z
extension_drivers = port_security8 b, W1 y0 _; a4 @
3 s$ p6 `, U1 R$ F5 I
[ml2_type_flat] # 在此模块下面添加下面这一行
6 U; e' C- r/ q- P) _3 I4 @8 x flat_networks = provider
, e5 r! t1 W/ Z V/ U 4 Z% |, e, s7 P1 s) Y
/ R T/ c% i2 X; g5 f0 m `最终配置信息`
3 d: T3 ?; I2 j/ j root@openstack-controller2:~# grep '^[a-Z\[]' /etc/neutron/plugins/ml2/ml2_conf.ini
7 s! M4 J& i2 d6 V# T/ J: s [DEFAULT]& J9 y* V8 Y8 u% j
[ml2]
2 X. l7 r0 o: Z( h, j" y type_drivers = flat,vlan6 I/ l: @/ y I/ U* Q
tenant_network_types =8 y5 J& ~( e! o+ P7 C
mechanism_drivers = openvswitch' D& ?; b( r ^
extension_drivers = port_security0 G; T' z2 s9 j& [0 O8 j
[ml2_type_flat]
, l. ]& J) C) @& G flat_networks = provider
, ^5 E/ b, E+ o% _ [ml2_type_geneve]2 X* a6 R" X$ `3 x4 R0 [' Y6 K& m
[ml2_type_gre]
- h _3 L# m" K; I [ml2_type_vlan]3 o! D; d* D, n$ ?' p9 X/ L: N) Z9 e
[ml2_type_vxlan]
. i ~" j5 n) _5 | [ovn]+ w/ g0 B$ R: s3 F5 T* g2 H7 }
[ovn_nb_global]+ v! i9 E4 ~5 ?* K
[ovs]
8 F1 w7 [1 G2 `* r5 j' o8 E [ovs_driver]
: T% _: G0 R7 t: h [securitygroup]
* |, K0 @% T# `2 K$ G [sriov_driver]
' l/ L: m5 A6 r3 `) s* z6.1.8)Configure the Open vSwitch agent
& p0 z! s9 V& ?' R可以从网站上获取完整的openvswitch.ini
: D2 t3 J: l: ]& X( I, i" ]+ S( k, y% l* E' R8 k
https://docs.openstack.org/newto ... itch_agent.ini.html
! S9 U: k, H2 }, T! r, D
- c! q$ p$ k& K$ G root@openstack-controller1:~# vim /etc/neutron/plugins/ml2/openvswitch_agent.ini
; I! ~: G0 _6 {; p [ovs] # 在此模块下面添加下面这一行
6 I' n( |0 h+ k9 V, A0 H1 ~ bridge_mappings = provider:br0
# d$ H/ \# W: g/ l 2 A& ~, a' f8 @
[securitygroup] # 在此模块下面添加下面这2行9 ^8 K( l/ Z1 g
enable_security_group = true3 h" |8 j% [8 C& _
firewall_driver = openvswitch, t; G, O! @; n: G
2 @( @: O! z6 e
`因为使用openvswitch时 桥接的物理网卡不能有ip 所以将IP漂移到bro这个桥接网卡`
$ y% q6 c# w$ e+ N+ W root@openstack-controller1:~# ovs-vsctl add-br br0 && ovs-vsctl add-port br0 eth0 && ifconfig eth0 0.0.0.0 && ifconfig br0 192.168.139.31 && echo "nameserver 223.5.5.5" >> /etc/resolv.conf
9 `% @8 I Z) X6 Y! U开机加载网络配置
: g& J5 n5 i/ E1 }2 w6 i- a
; ?" A2 t& T/ G" J+ W0 b #!/bin/bash8 q8 D Q; _! N
ifconfig eth0 0.0.0.0 && ifconfig br0 192.168.139.31* X. T3 F1 m$ \# z4 O3 v
ip route add default via 192.168.139.2
3 H: H; R( y6 K$ O; D9 N echo "nameserver 223.5.5.5" >> /etc/resolv.conf
9 W/ @% }9 [5 t& m7 |5 r# I6 s6.1.9)修改内核参数$ e4 v' X/ ?; n
root@openstack-controller1:~# echo -e "net.bridge.bridge-nf-call-iptables = 1\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.ipv4.ip_forward = 1" >> /etc/sysctl.conf : N/ Z6 ^5 t6 E2 b8 B
root@openstack-controller1:~# tail -2 /etc/sysctl.conf1 I' j% P. t; n$ _, _
net.bridge.bridge-nf-call-iptables = 1
3 g3 A! N3 Q3 }! O9 r net.bridge.bridge-nf-call-ip6tables = 1
1 t4 m2 z) y4 L2 i) h; [' w5 s4 Z `加载模块并让内核配置生效`
( X5 g# y! a2 G. O" U9 Z, ~4 f root@openstack-controller1:~# modprobe br_netfilter
, p$ }4 n# ]- G2 I) e' ?! ~ root@openstack-controller1:~# sysctl -p0 ]) \" a7 Y8 p8 r
net.bridge.bridge-nf-call-iptables = 1
1 [( e: F) i) V) n0 {1 z2 c) f net.bridge.bridge-nf-call-ip6tables = 1
7 J- e2 K5 M, Q" m! [6.1.10)配置DHCP
1 A3 g, d* M8 R& X3 a. F5 ~% J" j root@openstack-controller1:~# vim /etc/neutron/dhcp_agent.ini
7 m' A( O9 C# d* {$ U S0 R) {" V: m [DEFAULT] # 在此模块下面添加下面这3行1 p, |2 l \4 g! R% v4 _! [4 W5 B
interface_driver = openvswitch
& s7 ~, g5 _* O O, Q' S3 [ dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq" ^; ]- l. H: X
enable_isolated_metadata = true
' b9 f( B, `& _ #enable_metadata_proxy=True
. c, [+ K5 K" l1 t5 C+ l& _ #metadata_proxy_shared_secret=openstack
# P3 t8 v0 Y, a$ i( s# ?) J6.1.11)Configure the metadata agent4 o4 {) x5 t2 b. {& ]( `
root@openstack-controller1:~# vim /etc/neutron/metadata_agent.ini
9 j* \6 |- ]; H% [ [DEFAULT] # 在此模块下面添加下面这2行( o& `; }% P2 o
nova_metadata_host = openstack-vip.stangj.local # 或者 192.168.139.31 这个 controller1 地址! |4 g1 I# u/ q9 z! R4 M
metadata_proxy_shared_secret = openstack
! R+ Y" E- P& m" A- {7 C6.1.12)Configure the Compute service to use the Networking service
* ^3 Y$ N+ [, j/ W8 G9 b root@openstack-controller1:~# vim /etc/nova/nova.conf: ^2 O1 B# ?/ Y. e
[neutron] # 在此模块下面添加下面这10行( n# M4 v( T. K: h' v/ v
auth_url = http://openstack-vip.stangj.local:5000
- ?/ U: @( A4 g" F7 Q6 k auth_type = password0 u% z6 ]5 f5 L1 L! z$ \- O( [
project_domain_name = default
/ {4 u) Q% V; u user_domain_name = default
! M5 Y5 j6 C% U/ A region_name = RegionOne4 I+ O1 d+ q& d. K
project_name = service% @2 Y& a0 C# n' l5 n
username = neutron
% }1 G2 N" q" X( |5 `* X+ I password = neutron" E/ I- w6 Y% {. G: G( G
service_metadata_proxy = true4 A3 Z6 l' ~) A/ R8 K
metadata_proxy_shared_secret = openstack
1 U- s1 J# S) j& s8 X6.1.13)初始化数据库
! L& n5 [5 j5 \& ~ root@openstack-controller1:~# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini
7 U- L3 }/ N. o root@openstack-controller1:~# su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron# l. |2 q: F+ l' O
`验证数据库`/ [1 U3 O' W9 {
root@openstack-controller1:~# mysql -uneutron -h192.168.139.248 -pneutron123 -e "use neutron;show tables"
0 |/ y! i ~. ` +-----------------------------------------+/ m# k; P, M, T/ n' x% _! _
| Tables_in_neutron |5 w6 Z& z6 d( ]3 W* H" F9 j+ v( J+ O& c
+-----------------------------------------+, Y( J. O# T9 b' L6 u1 {7 a
| address_scopes |
5 j8 `) p. x; H3 H7 J | agents |
; q- {5 ^# r0 p' e | alembic_version |5 x" ^, a4 r* X5 _
| allowedaddresspairs |
* n1 i/ H5 y* Z6 B* \ | arista_provisioned_nets |
1 V$ B+ l8 O! I1 k3 s ...........................................( o& B$ j# S9 M: ~0 q: e( D
...........................................
5 R; f' M/ y' }; _4 ]8 n7 f- V | vcns_router_bindings |) f3 c6 \1 x; s- T# ^$ M
| vips |
1 b. p. O2 M% O( z: n5 o( w( @5 j | vpnservices |
" L5 `# A3 E- m7 n# s* b# A +-----------------------------------------+; N8 K* D: R" ]+ R: [# }3 j
6 z( n% a$ }. Y8 w6.1.14)重新启动nova-api API 服务8 f* |* E$ W1 {+ B2 T
root@openstack-controller1:~# bash restart_nova.sh+ @/ f2 a6 g h5 [2 ~6 {( t
6.1.15)启动网络服务) J. w, Q( r9 J) j3 _ P
root@openstack-controller1:~# systemctl enable --now neutron-server \1 P) z3 Q2 u/ T4 y& B1 K9 T
neutron-openvswitch-agent neutron-dhcp-agent \
) J6 l6 [5 `8 n% n0 q( e$ R neutron-metadata-agent
8 W, q3 p6 D- U8 x Y6.1.16)编制neutron的重启脚本
1 `0 }4 [" ~% d, I [root@openstack-controller1:~# cat > restart_neutron.sh <<EOF: `" }$ b9 T* t3 h1 g
#!/bin/bash
7 L; v: f, S( S/ l- F) n! N service neutron-server restart
3 a; v. B8 q# t! E* w/ P service neutron-openvswitch-agent restart7 s) l& n' c/ N4 e& L7 p
service neutron-dhcp-agent restart7 H7 Y9 L H5 N
service neutron-metadata-agent restart
0 D, r/ {& D+ B [9 I" d EOF) z3 d, }% C, \/ G0 d6 o
[root@openstack-controller1:~# bash restart_neutron.sh
$ F, j' H, p! Q2 E- B6.2)安装neutron_compute节点; u* o x: U# L- I [) e [6 F5 S1 m3 y
6.2.1)安装相应服务
% N$ u9 T( o+ |+ }% X$ u, ^+ g | root@openstack-node1:~# apt install -y neutron-openvswitch-agent
$ \. K b. S A5 t& h2 \' ]1 J6.2.2)修改配置: k( H* m0 I& s8 X Z: M
root@openstack-node1:~# vim /etc/neutron/neutron.conf0 g; y% ?$ {; g( \0 |
[DEFAULT] # 在此模块下面添加下面这2行% O! S' U. S; L! L# W3 s/ U
transport_url = rabbit://openstack:openstack123@openstack-vip.stangj.local
( B' s6 d; w' Z1 h: z# K& [) X ) ]0 [6 {& A/ y+ S
[oslo_concurrency] # 在此模块下面添加下面这1行# z2 G, j( ~) z
lock_path = /var/lib/neutron/tmp, G1 ^) H* {9 q: I
6.2.3)Configure the Open vSwitch agent+ |8 {. q$ j/ H- l
可以从网站上获取完整的openvswitch_agent.ini! \1 X. ?1 }3 A- o4 p3 N
, @! I& o/ p" A+ i0 V; q U6 }
https://docs.openstack.org/newto ... envswitch_agent.ini
2 U, h: u/ M. Q! }+ O- w, t& p- Q' w2 |. e3 K6 i
root@openstack-node1:~# vim /etc/neutron/plugins/ml2/openvswitch_agent.ini
* U" s! w2 e6 E1 d8 I! b [ovs] # 在此模块下面添加下面这1行& L* E9 R( g& D" i, |2 I9 Z
bridge_mappings = provider:br0
3 c+ r6 ?: n1 N& H. N
0 \6 V! M7 H' @" j [securitygroup] # 在此模块下面添加下面这2行/ k& O* F- j% J2 Q& d) M' n5 p0 x
enable_security_group = true
/ x3 l9 Y; v! X- s( Z- l firewall_driver = openvswitch4 {3 N* R1 ~+ N6 G" B" o1 n8 ]
9 ^! _1 ^0 F; {. G- ?+ \3 o8 ~
`因为使用openvswitch时 桥接的物理网卡不能有ip 所以将IP漂移到bro这个桥接网卡`
/ S* N- E3 a2 \3 T4 z/ S+ v root@openstack-node1:~# ovs-vsctl add-br br0 && ovs-vsctl add-port br0 eth0 && ifconfig eth0 0.0.0.0 && ifconfig br0 192.168.139.34 && ip route add default via 192.168.139.2
6 H a8 d; Y& F4 z( D2 c' k3 P开机加载, F6 ~9 j. J# `0 ^* ]
* t, ~" b& A! Z4 u; q$ _ root@openstack-controller1:~# cat /etc/rc.local
8 L7 M% ~& V% R. b6 k, \ #!/bin/bash
! ]5 C% A4 G& y; f" o& V ifconfig eth0 0.0.0.0 && ifconfig br0 192.168.139.34
, U, B: L9 H @, G ip route add default via 192.168.139.2
& K( C" r. C* q& Q& Z! k' n4 _4 G echo "nameserver 223.5.5.5" >> /etc/resolv.conf
+ o/ }- \% E: h6 v5 k" g# }6.2.4)修改内核参数1 J) l& D1 w" o9 ?' f2 b3 q
root@openstack-node1:~# echo -e "net.bridge.bridge-nf-call-iptables = 1\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.ipv4.ip_forward = 1" >> /etc/sysctl.conf 4 g( X3 u! V3 \6 G, q7 y! N
4 B! _1 t5 h8 y' t4 E1 l
root@openstack-node1:~# tail -2 /etc/sysctl.conf
! d; X8 @2 |! q net.bridge.bridge-nf-call-iptables = 1
& q" C8 ?' Z, s+ ], r4 Q1 m2 y net.bridge.bridge-nf-call-ip6tables = 1
& m' |- }" d% W, E7 n `加载模块并让内核配置生效`
. n, m+ \8 Y/ ?" H root@openstack-node1:~# modprobe br_netfilter2 h/ n" V6 M- Z9 u1 A
root@openstack-node1:~# sysctl -p9 m2 ]' w7 N. V: V' \
net.bridge.bridge-nf-call-iptables = 17 X o* R: G& S
net.bridge.bridge-nf-call-ip6tables = 1
/ m. H# o* X" y4 o0 x+ ?' c6.2.5)Configure the Compute service to use the Networking service
* E2 m$ C9 L8 T$ T* ]$ R2 M: I$ [ root@openstack-node1:~# vim /etc/nova/nova.conf/ g+ ^1 ?( e, x
[neutron] # 在此模块下面添加下面这8行/ f! s5 n- ?% E4 o; C2 S1 O, S) T
auth_url = http://openstack-vip.stangj.local:5000
2 n3 } T& H! g4 Y# T' ?" M auth_type = password; H- N; y+ N. L- |( T b
project_domain_name = default
4 m0 S Q' p1 _ user_domain_name = default
$ E; D2 |0 M% d+ o region_name = RegionOne9 [2 [4 G% J) v
project_name = service$ Y3 \4 U. v0 W% U& p& g6 H) q W% B
username = neutron
. n) O' T9 _% O) X2 F- _( @; n( w password = neutron
7 S" e3 ^+ X. Y) F0 Q; N+ ^ service_metadata_proxy = true
8 U8 n' V8 b- ^2 T- r9 t' n5 L- ~ metadata_proxy_shared_secret = openstack
, L# Q& e/ [* L; Z4 s0 N% |" P+ \6.2.6)启动neutron_compute' F2 l4 S3 S! W5 {+ K
root@openstack-node1:~# systemctl restart nova-compute
; J0 g( y, C* U/ V. x. H) O1 j) C root@openstack-node1:~# systemctl enable --now neutron-openvswitch-agent && service neutron-openvswitch-agent restart4 z: b7 n) U" t3 Y" |
6.2.7)编写重启neutron_compute脚本
4 K5 u" n, v5 |! o5 N2 i. i* J root@openstack-node1:~# vim restart_neutron.sh
; Q4 K3 F) v' Z! J( W8 s1 P #!/bin/bash: U) u) M; s4 J; ^7 R0 |- r$ ]# _
systemctl restart neutron-openvswitch-agent
4 L3 [, E' u+ ^1 P0 H+ I( Y6.3)验证服务# I: T) r% f4 I* y
[root@openstack-controller1 ~]# openstack network agent list* C9 ], x8 ~1 e% K: O
+--------------------------------------+--------------------+------------------------------------+-------------------+-------+-------+---------------------------+
" q* t* l8 D/ l, X! I | ID | Agent Type | Host | Availability Zone | Alive | State | Binary |
5 O* _$ z6 T1 S" O" r +--------------------------------------+--------------------+------------------------------------+-------------------+-------+-------+---------------------------+
7 m( j; s& g. w) B' B | 6d7ace9c-061c-45ba-834b-52f24585c452 | Linux bridge agent | openstack-controller1.stangj.local | None | :-) | UP | neutron-linuxbridge-agent |
* Z3 z8 x* Z" w! t# E1 K | 7babc5ac-d07d-4fe4-90ab-62775b4ef90b | Linux bridge agent | openstack-node1.stangj.local | None | :-) | UP | neutron-linuxbridge-agent |
/ T4 g2 y7 a+ i& L7 a | 83ad2332-8716-4a8f-b050-1daa3b22c3bf | DHCP agent | openstack-controller1.stangj.local | nova | :-) | UP | neutron-dhcp-agent |2 F2 E4 p/ i6 M6 c" M
| afb7c427-89ba-4e91-bff2-604e97a5ca91 | Metadata agent | openstack-controller1.stangj.local | None | :-) | UP | neutron-metadata-agent |2 u% f$ I7 S* f0 V/ r1 q
+--------------------------------------+--------------------+------------------------------------+-------------------+-------+-------+---------------------------+
5 S# n c% `. i i% d [root@openstack-controller1 ~]# nova service-list$ D3 c( L- q: A& f: R, N
+--------------------------------------+----------------+------------------------------------+----------+---------+-------+----------------------------+-----------------+-------------+& c1 }% _5 L5 `/ l
| Id | Binary | Host | Zone | Status | State | Updated_at | Disabled Reason | Forced down |: d" c+ w* C" k4 F& s( ?. }
+--------------------------------------+----------------+------------------------------------+----------+---------+-------+----------------------------+-----------------+-------------+) q$ ?2 L/ @7 n. Z5 M1 o
| 518a8c83-c6d4-451c-8943-fa55c593948c | nova-conductor | openstack-controller1.stangj.local | internal | enabled | up | 2023-12-16T15:26:42.000000 | - | False |
( S' n0 q/ r; E* g7 J4 g6 j | 9d9d1228-2096-4ca3-97a9-8b85133db7fa | nova-scheduler | openstack-controller1.stangj.local | internal | enabled | up | 2023-12-16T15:26:41.000000 | - | False | t; F( `1 N2 C
| a45e7eeb-1907-4ecf-a836-7ca69b588edf | nova-compute | openstack-node1.stangj.local | nova | enabled | up | 2023-12-16T15:26:41.000000 | - | False |* p5 o9 x; [% t6 c F
+--------------------------------------+----------------+------------------------------------+----------+---------+-------+----------------------------+-----------------+-------------+
6 n- N% f/ x0 o$ X b
- t: t' @9 u. z2 C" E Q7)创建测试实例( H/ l6 Y1 e1 c/ s5 Z7 B6 k! t
7.1)创建一个provider网络/ }% b5 j$ V% k
root@openstack-controller1:~# source admin.sh ! g2 s/ C8 C: d: ]' ?: D
root@openstack-controller1:~# apt -y install bridge-utils
% f) t% Y0 e! S' s: R S" _/ K root@openstack-controller1:~# openstack network create --share --external \8 Q0 ~# E% k5 K" r- c' @" g
--provider-physical-network provider \
E9 L" H0 _7 V8 h2 ?' x' u --provider-network-type flat provider-net/ y* W( o, R$ @: m3 O5 J8 N
#####################第一个external表示创建一个共享网络并声明他是一个外部网络#######################4 q0 y/ T* E" e) D: P9 x
########第二个external表示创建连接的物理网络,因为我们上面neutron定义的物理网络名称为external########% j4 o6 E$ N8 S1 D: Z# [
############################第三个external-nat表示提供的桥接网络的名称############################
' Q1 c+ S6 ^: x! x7 ~: |+ \: I root@openstack-controller1:~# openstack network list' Q0 M' O* t: ]( O3 r8 s
+--------------------------------------+--------------+---------+
7 m) B6 z' f7 B' |: S | ID | Name | Subnets |
: z& t# n$ j+ |: J' Y9 T7 z +--------------------------------------+--------------+---------+5 T; Q+ k' q: `- N4 R, V
| c8efa244-7345-41bf-bedc-052e0cec751b | provider-net | |
6 R5 R' b8 m q* d. @+ v+ `3 O1 ^- |8 G +--------------------------------------+--------------+---------+
" p- l3 d- ^ `) _( W7.2)创建一个子网1 {! N/ T- _; i3 Z8 `3 ~5 u2 ?6 P
root@openstack-controller1:~# openstack subnet create --network provider-net \& c( B) e- X: P# E2 V
--allocation-pool start=192.168.139.100,end=192.168.139.200 \5 E& ?3 h1 v" H4 [' F5 c
--dns-nameserver 223.5.5.5 --gateway 192.168.139.2 \* X( ^5 Q+ I, y7 E, G
--subnet-range 192.168.139.0/24 provider-sub
- |# o4 T% A4 t: x! E9 o: j6 H ############################创建provider-net的子网provider-sub############################4 R, |) J9 C. ~- A$ k
`验证`" G& b0 ?: H8 K2 `7 P$ T/ z% T
[root@openstack-controller1 ~]# ovs-vsctl show
# ]) y8 d- K6 E4 z2 G: t 28a508de-e0a2-418a-b357-4a93f9f69127
0 f* g) w$ ~6 [# a Manager "ptcp:6640:127.0.0.1"5 w- j; F/ F0 @' O( R* y8 Q
is_connected: true, |! \& M6 j. C* t4 a& c- c
Bridge br-int; f* J+ b6 W: N6 K
Controller "tcp:127.0.0.1:6633"6 Y6 c& P9 W4 P9 H
is_connected: true
2 C' K: d7 d+ Q- ^5 p) \5 { fail_mode: secure- L! `' q3 l2 Q+ A8 A. e2 j
datapath_type: system
! {; j" }. {8 D3 A: q* h Port br-int* ]& j, }/ M/ V9 N& X4 n5 ]5 R
Interface br-int1 T+ ]$ q2 i, P! `; _
type: internal4 r5 L1 B7 G6 z$ d' S
Port int-br0
& h9 C8 I0 M0 ^. ^ Interface int-br0
6 ]6 X4 p* q) ^ s9 o5 }9 Q type: patch% o0 }, S, m- o: S1 q! G+ Q6 z0 T( Z# m
options: {peer=phy-br0}' i7 R0 l' }* ?" I0 i& Y# }
Bridge br0
7 _. B0 H+ ^! T/ g! S: T Controller "tcp:127.0.0.1:6633"8 r; U' C( @; W. p
is_connected: true
: O q% x& f$ `& r& l1 E2 _: z; e/ q fail_mode: secure
[( R, e* P; c- q datapath_type: system; E/ K0 K! Y( k8 ` c
Port phy-br02 o7 ]1 N. a- L+ H
Interface phy-br0: R! I" J$ L3 r& G( T
type: patch% I8 W/ U- k, E- q: A9 n) g8 K
options: {peer=int-br0}
7 [$ Y: I F- M' h6 L+ X" I) y Port eth06 }- \4 u: ]! v) {. W) I
Interface eth0
2 s7 ?2 M6 }0 i; F5 w5 d6 a, Q3 ^ Port br0
: o. F( }4 o2 U7 E6 c! { Interface br0' ?$ L8 R- S9 f/ t1 |# j: j9 [ G- c3 i
type: internal
5 [* ^& s% G8 G( H+ ^, u1 F ovs_version: "3.3.0"
' v1 U9 A' l0 p/ ~
5 d, K; h4 w, P u+ t [root@openstack-node1 ~]# ovs-vsctl show
2 [, O% n2 ~' P! u2 p% ^+ t ea324764-3f52-419d-94ff-784dadc75aa9' z$ ^2 v# c% j6 P' z/ V" t7 ^( v. S
Manager "ptcp:6640:127.0.0.1") L4 P! b1 m: C2 e
is_connected: true1 ^ I1 `: w: a: Y1 H$ O9 L
Bridge br-int
1 K% I0 d5 |: N! u3 j) Z" r Controller "tcp:127.0.0.1:6633"
8 K+ Y+ H# `0 \5 y is_connected: true
' ^9 ?/ }" c$ j7 Y0 W" n fail_mode: secure
/ x' `9 k& E: h) c* z datapath_type: system
7 L( u2 r2 _) e( O& e: w. C3 b Port int-br0
8 }( I1 a* q+ m0 F6 K" [& Y6 B Interface int-br0" q A7 q3 _9 |7 S% I5 O5 T
type: patch
! a0 X& f. |1 w/ B2 I0 z+ Y options: {peer=phy-br0}% O3 a& |# V* w' |8 }
Port br-int
2 l7 d# B7 x# u8 F2 n+ s+ Z6 H7 N- h Interface br-int
) c" N; ]& W' m5 H5 a& N6 n type: internal
4 d! B8 R) C8 f+ S5 q- ~4 w# | Bridge br0" e7 [1 I3 J' |' g# j
Controller "tcp:127.0.0.1:6633"
# x7 z* s+ }- x. x2 j% y3 h! V is_connected: true1 i: i4 `2 z4 S
fail_mode: secure
* X. l, P" N. u5 d) M: c; i datapath_type: system; e8 t6 I v6 J9 ?. U
Port br0
\/ A' v4 m: K1 t2 u5 J Interface br04 t# p/ K) ]7 e5 } X U2 J ^
type: internal( W+ j7 `/ T; v5 Q9 x1 p6 p
Port phy-br07 S1 H7 U' X) b+ W4 L, I: m8 ~# e2 J
Interface phy-br0% N0 t4 k x( ]" R( R' n, i
type: patch
3 q7 u# @: D/ b! p" c) G7 G options: {peer=int-br0}
5 W0 Z5 v7 w& v" b, M% r) z& v5 w Port eth0
* U/ J1 M& H4 k6 n Interface eth0
- [/ F A9 e7 N, I& B4 z ovs_version: "3.3.0"
9 e& Y( W& v; c+ g& b, t! P& ?0 _7.3)创建虚拟机类型
$ a6 C5 b8 h+ a" Z+ b" p' d [root@openstack-controller1 ~]# openstack flavor create --id 0 --vcpus 1 --ram 64 --disk 1 m1.nano+ r7 x/ c0 w3 Y3 m: i; h- G
+----------------------------+---------+
2 d! U. G7 U0 q2 i. T | Field | Value |
$ q" R" B$ u+ i, \5 D +----------------------------+---------+5 P* ?" y+ l9 Q/ Q3 L7 T5 t
| OS-FLV-DISABLED:disabled | False |
' |( ?. V0 {! u" w | OS-FLV-EXT-DATA:ephemeral | 0 |
6 h& T+ v& f0 i6 n7 w | disk | 1 |! S; c# |7 [7 }' w. [/ f3 j# i- L, ^
| id | 0 |3 N2 d& c* w- Y, K0 Q
| name | m1.nano |
4 @. i3 R+ W- T: a$ E' ~ | os-flavor-access:is_public | True |- x& O7 a$ K3 Z3 c3 T" j& F* s( w
| properties | |2 X; A5 R" j4 {- ~+ f
| ram | 64 |5 t7 g9 E' f4 v6 d5 m6 }8 q Y/ ?! }+ Z# z
| rxtx_factor | 1.0 |
, B$ u2 Y' f6 p$ G; ~ | swap | |5 n! }2 i" T4 ^# N0 V% U
| vcpus | 1 |$ p0 j( d( ^, Y, R) ]
+----------------------------+---------+
, o. J/ R6 _2 ~6 o3 D1 K7.4)生成密钥对
) n1 K4 B& O7 p b [root@openstack-controller1 ~]# source admin.sh 7 Z9 y1 x& {; z& }9 s2 C
[root@openstack-controller1 ~]# ssh-keygen -q -N ""
- x" e' x+ |4 o2 J, t [root@openstack-controller1 ~]# openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey
% V Q/ d0 [' @* ? +-------------+-------------------------------------------------+$ Z& b, u3 ~8 }( X/ m2 a% @+ M
| Field | Value |
4 B* o; X' R1 E +-------------+-------------------------------------------------+/ k) j$ t( P4 |; t D$ H
| fingerprint | ea:d2:d5:d2:6d:88:59:51:ee:75:77:ff:74:e2:44:eb |
# s6 F( q8 Z8 d# J | name | mykey |
. e4 U: J( v, \% f5 ? r+ J | user_id | 5c4b6243d95742799de0fc97ef119967 |
+ U2 X) V Z3 C +-------------+-------------------------------------------------+
& W- k' Z1 C6 t' W `验证`
0 F4 w; f" ^* O. A' J. P6 I [root@openstack-controller1 ~]# openstack keypair list& g3 i% S7 ~* T) z
+-------+-------------------------------------------------+
$ |& k- s2 K! E' U! \% @ | Name | Fingerprint |: L B( v C) \+ N6 Q) b# t
+-------+-------------------------------------------------+% B1 Z, l" v" f. q. w3 O6 T, l
| mykey | ea:d2:d5:d2:6d:88:59:51:ee:75:77:ff:74:e2:44:eb |! t; d, P3 e2 V+ O! I+ e
+-------+-------------------------------------------------+% c8 ^1 b+ Q( t& P
7.5)添加安全组规则0 B' Y R f+ }" G
root@openstack-controller1:~# openstack security group rule create --proto icmp default# [7 t0 g: V/ ]; J4 z- Z0 }
`开始ssh` _+ m7 F4 s& M" J2 P6 ^* M
root@openstack-controller1:~# openstack security group rule create --proto tcp --dst-port 22 default
) P( r: ]+ d0 ^. e
6 q; t" i4 K: ?- B2 O root@openstack-controller1:~# openstack security group rule list4 x3 w; [- \. b) O
+------------------------+-------------+-----------+-----------+------------+-----------+------------------------+----------------------+--------------------------+
* Z! t% @0 N5 W9 F. W+ z1 ? | ID | IP Protocol | Ethertype | IP Range | Port Range | Direction | Remote Security Group | Remote Address Group | Security Group |0 G n. z" h) _$ G
+------------------------+-------------+-----------+-----------+------------+-----------+------------------------+----------------------+--------------------------+7 W2 E* s. W: C
| 2e69571e-fa55-4db3- | tcp | IPv4 | 0.0.0.0/0 | 22:22 | ingress | None | None | 7d47c955-4683-4d9e-9535- |
! O B Q8 e( k | b894-ac8dda257a35 | | | | | | | | 690085d9cfc7 |2 N) {+ r$ G {8 F; i' e
| 42c37d05-e0b3-4a15- | None | IPv6 | ::/0 | | ingress | 7d47c955-4683-4d9e- | None | 7d47c955-4683-4d9e-9535- |8 Y! u1 ~8 g7 b# h. G/ p8 W" f2 E
7.6)在provider network启动实例2 t# P a' j, K) S' P" u
7.6.1)前期验证* R! q: l- Y7 @9 b- B
`验证有没有虚拟机类型`5 [- h$ E+ I$ _
root@openstack-controller1:~# openstack flavor list
) K: e' r7 m& N +----+---------+-----+------+-----------+-------+-----------+
4 I$ y5 D6 Z8 F2 P7 n3 S | ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public |
: v3 z$ [3 G9 ^$ P1 {! R +----+---------+-----+------+-----------+-------+-----------+, p5 n4 ?* A o7 R- ~, h
| 0 | m1.nano | 64 | 1 | 0 | 1 | True |3 t2 r, h' s2 B4 ~
+----+---------+-----+------+-----------+-------+-----------+
2 J9 Q- Q" t. S3 T# Z' b$ R+ k1 n: P ; |& z$ _* O6 B" h' v1 U
`验证有没有镜像`% ]# |& B3 y% o# v
root@openstack-controller1:~# openstack image list4 b o# }, V9 Q4 C7 t8 Q
+--------------------------------------+--------------+--------+; {' Y6 j+ D n7 Z* N
| ID | Name | Status |
- t/ p( U* z% s +--------------------------------------+--------------+--------+1 N" Q9 q, n" |5 I) p
| 6d99e1ad-dbf3-46ea-b520-ef903bbbe1c9 | cirros-0.5.1 | active |
. S7 M; X8 V0 u) k$ ? +--------------------------------------+--------------+--------+; t. B' j" E( P
. V R% V4 d' R* K `验证有没有网络`6 \ f, c! a3 S0 |
root@openstack-controller1:~# openstack network list4 u+ y+ n6 \$ q6 {0 s
+--------------------------------------+--------------+--------------------------------------+
6 `. V. K: B0 r) q( y | ID | Name | Subnets |6 G, t% y8 t/ Z, v8 r
+--------------------------------------+--------------+--------------------------------------+
7 L0 @0 L* W; w4 g; d5 [/ q5 e/ c | 3d66f257-6c40-49c2-bce7-9de75b49816f | provider-net | 1e7a53ba-89bd-4373-802c-149b16a30df5 |
/ D; F* S# G% ?3 p) e! \ +--------------------------------------+--------------+--------------------------------------+
! M$ ?' ]3 ^- u4 t! Z, p " T Q' Z/ E( [; \7 U* f
`验证有没有安全组`
7 t) z; }& C x4 ?4 B root@openstack-controller1:~# openstack security group list% F& L8 |/ q& A6 J, v( _$ g2 U
+--------------------------------------+---------+------------------------+----------------------------------+------+
7 h; p$ ] j3 F0 ]7 i: K! ^6 @" u5 G | ID | Name | Description | Project | Tags |3 _6 b, ^6 D2 f- Z
+--------------------------------------+---------+------------------------+----------------------------------+------+' J8 O4 x j/ d% D4 R7 r8 F' H
| f60b6c5c-9e96-4fae-8de9-bee58fe5272e | default | Default security group | 17deab832d8a4c929b91a3ce1d58abf7 | [] |- G5 |4 H' D R) w) b; Z& h
-+
% h5 C6 H |- |0 q+ s: S$ ~7.6.2)创建虚拟机
6 a$ m- d3 d, A1 ~ [root@openstack-controller1 ~]# openstack server create --flavor m1.nano --image cirros-0.4.0 \
" y0 O4 z/ m% S; S J --nic net-id=f37db04d-74db-4b26-8591-23fde582eade --security-group default \
, z5 [ H+ O* J --key-name mykey linux-stj-1& J j$ j4 h: @* u
#################################参数解释#######################################
; ]6 w0 v( r0 P G& O+ w ###m1.nano:为虚拟机类型;
- t5 A, l* ~( w9 y ###cirros-0.4.0:为镜像;
$ `% @) L( Z3 y. M8 ] ###net-id=[网络ID=openstack network list列出来的ID];
+ T1 Z# y) z# T$ X ###mykey:为ssh密钥对;
& t4 j: T" O6 i$ o8 G; X ###default为默认的安全组;" A* f4 U4 o" z! w4 d5 s
###linux-stj为虚拟机名称6 a0 s# L% `* A8 h g! d$ N+ {/ B
#############################################################################0 ?0 J; `9 m. `+ V) ~
openstack server create --flavor 1c-1g-10g --image centos7.9 \
$ k. W7 B$ s3 l- E: U --nic net-id=0da37e14-545f-4aa3-a6e3-ee8cd0ea3ae8 --security-group fb2dc60c-4f85-4b1e-b7f1-5b6d4e147799 \! R0 `0 [. J' g0 V" r+ G, G
--key-name mykey centos-stj-1' ^: M& B0 s/ v3 o4 J7 C {8 i
7.6.3)验证虚拟机状态
& h. S9 k6 s! o& I root@openstack-controller1:~# openstack server list: p9 [8 z1 D( p# {" T
+--------------------------------------+-------------+--------+------------------------------+--------------+---------+- T2 k* `- S2 \! |( j0 k
| ID | Name | Status | Networks | Image | Flavor |7 h% R- P \4 J8 r# Z9 h' _
+--------------------------------------+-------------+--------+------------------------------+--------------+---------+- o3 f8 m- H& d3 ]" l+ k. ]
| 96533d96-f01f-4463-8cfc-9c46ddee37b3 | linux-stj-2 | ACTIVE | external-net=192.168.139.180 | cirros-0.4.0 | m1.nano |. U, w/ q+ L* j0 s8 i0 O/ s
+--------------------------------------+-------------+--------+------------------------------+--------------+---------+* G! u0 A! W% N- q1 m
# 加一条默认路由
/ l9 r) C. j7 r4 X1 s$ R root@openstack-node1:~# ip route add default via 192.168.139.2* @5 u1 Q5 O% T4 P5 Q, b
root@openstack-controller1:~# ip route add default via 192.168.139.2+ k6 o/ G. E* V5 s( Q, M+ A
###一定要拿到IP地址 external-nat=*****
9 ?* Q& l3 n7 q; c; f [root@openstack-controller1 ~]# ping 192.168.139.140: W1 O; A4 l& l7 D# f
PING 192.168.139.140 (192.168.139.140) 56(84) bytes of data.' y: c9 k3 C8 i$ a5 t
64 bytes from 192.168.139.140: icmp_seq=1 ttl=64 time=11.3 ms
9 I/ m$ |1 D# B2 O- J/ |' i7.6.4)使用虚拟控制台访问实例/ b4 _ U7 l( N0 E6 F% M- l
[root@openstack-controller1 ~]# openstack console url show linux-stj-2
/ _# w' q6 x3 p+ |* q +-------+-----------------------------------------------------------------------------------------------------------+
5 u+ O- k$ [' W: R5 Y1 { | Field | Value |- U3 L6 x p Z9 b# s
+-------+-----------------------------------------------------------------------------------------------------------+
$ c2 V1 O/ x) C' N* Z4 ? | type | novnc |. a) C: d. z. f+ O
| url | http://openstack-vip.stangj.loca ... 8-aac3-52e5f58a51f7 |5 W: L6 e% [2 ^
+-------+-----------------------------------------------------------------------------------------------------------+4 Y; N/ [6 ]& j3 G$ m# \
image-20241208195008663
9 R. R" u8 ^0 _2 c' M* P1 q+ |' D' f
; p8 c9 P: J) p K ^# Jimage-202312171342499530 a# L Y; Z, r; T2 R) a) r) f9 [
& M! L/ q. k4 y a注意:如果你的访问出现下面这种情况
* v4 Y P1 v" x( I+ f' Y0 I6 f8 V P0 `, {* C3 F0 L
image-20231217135224898
) D7 {) H! Z% d* G$ I" k4 t* m. w: @- e3 I+ z6 y, [( x* v
解决办法:# g& z. j L; }
7 t d6 ~9 i R, l
[root@openstack-node1 ~]# virsh capabilities
+ E3 w. }0 i* ]+ X3 Y+ ]" v: Z [root@openstack-node1 ~]# vim /etc/nova/nova.conf
$ f9 G* o( J) @4 X7 h7 o# c # 搜索下面两个hw_machine_type/cpu_mode信息,并添加后面对应内容( E6 O. g2 @! Z7 a: p
hw_machine_type = x86_64=pc-i440fx-rhel7.2.0& u% V$ s3 ]/ c( c
cpu_mode = host-passthrough
y7 R) j5 e! k! J) [ `重启nova`0 c2 M2 Y7 n4 Q) D& m4 {2 x8 d* T& R
[root@openstack-node1 ~]# bash restart-nova.sh 3 q- Z0 V% O* F$ [; D' C+ f
######理论上还用重启openstack对应你要访问的虚拟机#######
/ s, K, W1 _: Y3 l如果没有出现上面的问题则不用修改nova配置文件操作8 \+ n) B3 v( `2 o. o. s1 `
. F+ u; M8 P( f* A
! I3 n* r! D: [1 I
8)安装-dashboard
' T7 o. j3 R; j% q8 e8.1)下载dashboard$ v( x9 W. C( C7 x
root@openstack-controller1:~# apt -y install openstack-dashboard
! w9 U7 k, `0 n, i+ m1 f' `8.2)修改配置文件-local_settings$ a* N S, j/ M9 G
root@openstack-controller1:~# vim /etc/openstack-dashboard/local_settings.py
* `$ s1 o* V1 B1 m! G$ @3 y6 w # 23行 添加0 P" o! |: x; Y$ C
WEBROOT='/horizon/'
& u0 t4 [3 K& A# i! c " O$ C6 j+ w7 C6 X
# 125行 修改 m% t; I! t" X( r- Y' ~/ N. u
OPENSTACK_HOST = "openstack-vip.stangj.local"
I: D. `! E8 e OPENSTACK_KEYSTONE_URL = "http://%s:5000/identity/v3" % OPENSTACK_HOST
6 n# M2 T7 q) D' ` " j) K( E! I, D7 u/ V
# 39行 修改- R7 j3 Y- Y5 Q. V6 ], o
ALLOWED_HOSTS = ['192.168.139.31', 'openstack-vip.stangj.local']" c% \! M* ?8 H4 g
) W; ^0 O5 H4 R! |/ y. M3 w& P2 w" m # 105行 添加. c$ Q( K) i* P% T' S; C! G) p9 A1 A
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'/ E- h. g" \+ f6 z* {9 m
CACHES = {
: y4 P7 T7 A0 w2 Q7 T$ j 'default': {, X9 T D) D, o$ J4 B
'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache'," ^/ n' g; C b4 n2 \: ?: x; u
'LOCATION': 'openstack-vip.stangj.local:11211',5 R; q6 I( `7 P
}
5 N7 J5 J5 r' o! f }
( o9 m7 K8 h3 z; A" v, @ : z1 j6 R$ E# ]7 T+ X, g
# 127行 添加5 M. _& H7 A/ A1 j) c
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
i$ z6 `+ h% @ 4 U8 i# ]( X; |: t, `% z# l$ P& z
# 128行 添加* M* ~( W7 K( z0 ~/ N
OPENSTACK_API_VERSIONS = {# n' A" h+ A2 d. P+ F, B9 g
"identity": 3,( Q. N4 P$ C1 q8 O2 u( J N
"image": 2,' E* R" t+ _% a* A! r5 j
"volume": 3,
- @. `) s0 m3 l4 U }
5 {4 L6 }7 p, s
: I1 F7 `& F8 M1 R! u # 133行 添加
$ v7 y( D! w+ W5 r4 L OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "Default"0 X/ ^: A' w7 }+ ~
! Q4 W! n# {1 i1 N* h& z
# 134行 添加
' U7 I0 B7 b9 r( Q4 ^ OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"4 W5 Y6 J! A) \$ M: n1 t$ g
% C+ l9 ?+ Y) p& M% u+ b # 138行 对照修改,把True全部改为False+ X# L o, {+ ~# H0 j! z. q
OPENSTACK_NEUTRON_NETWORK = {
) g# z2 T4 t0 y! \5 l6 F 'enable_auto_allocated_network': False," Y% J6 ~" ?3 D) K* m
'enable_distributed_router': False,
2 @4 h8 l* D) M+ M: k 'enable_fip_topology_check': False,
* [9 o: F1 R8 S0 C 'enable_ha_router': False,
1 |: P" i' [6 m$ y) i, I" F 'enable_ipv6': False,' F7 P5 q4 S4 W& [* r
'enable_quotas': False,
4 j/ i C& |9 A" M8 V 'enable_rbac_policy': False,' v+ j/ ~5 |6 F6 N# E
'enable_router': False,6 Z; L$ i! T- w) k! A
}
' w2 T* Z4 c& P$ s& b # 161行 修改
7 C% X6 o/ m6 v/ W" Y7 X% x8 o TIME_ZONE = "Asia/Shanghai"
+ G( t) j; y6 M$ O8.3)修改haproxy
. h% B. k% @2 Y# a* Y& E+ M [root@openstack-haproxy ~]# vim /etc/haproxy/haproxy.cfg T2 U" @4 p+ z
# 最后面添加下面内容% \: b0 W& C- N' I
listen openstack-dashboard-80
$ g- B+ `1 Y' A1 U9 _7 G* M bind 192.168.139.248:801 |: Q3 ~$ b2 n0 r, k* I1 U
mode tcp: w, S: K( g$ C: B3 ]$ L
server 192.168.139.31 192.168.139.31:80 check inter 3s fall 3 rise 5' Q k; k- o' u# A" M: o5 l9 G$ V- K
[root@openstack-haproxy ~]# systemctl restart haproxy.service 0 N G( z* a5 U7 H* _$ `
[root@openstack-haproxy ~]# ss -tnl | grep 80
& N7 Q! i+ u- h- ^% t, Y x LISTEN 0 128 192.168.139.248:6080 *:* . b% s9 E. v& D- V+ Y; ^ P
LISTEN 0 128 192.168.139.248:80 *:*
! A/ m1 C3 [: C3 D$ k% ~8.4)修改配置文件-openstack-dashboard.conf" H4 v& r3 t+ a$ l+ [3 R
root@openstack-controller1:~# vim /etc/httpd/conf.d/openstack-dashboard.conf
( D1 g" v+ e7 t R* c/ G, J # 4行 添加& S2 L/ ?6 r* C/ _+ _2 `+ s& M
WSGIApplicationGroup %{GLOBAL}/ N" G. w1 \$ v& U8 l
8.5)重启动httpd
R3 h9 N+ W8 r5 y0 @/ L root@openstack-controller1:~# systemctl restart apache2.service 5 x; u; [0 o$ m3 i+ Q3 P; y0 w! I
8.6)访问dashboard页面
2 W1 d2 Q9 L- i* B' S; Dhttp://openstack-vip.stangj.local/horizon/! l/ X' E1 k: y% Q. d% u& n/ f
9 |4 O1 E' t; p) u
|
|