1、练习场景说明
在OpenStack Yoga版安装笔记(九)中,placement已经在controller node虚拟机上安装完成,并且已经成功拍摄了快照。
此时,controller node虚机已经安装了keystone、keystone DB、glance、glance DB、OpenStackClient、memcache、placement、placement DB等组件:
(上图中,由于本次练习不涉及glance,所以未画出)
将controller node虚机转到此快照然后开机,在后面将在这台虚机上执行以下命令:
openstack --os-placement-api-version 1.2 resource class list --sort-column name
观察OpenStack组件之间完整交互过程。
2、查看OpenStack服务相关进程和TCP连接情况
2.1 查看相关进程
root@controller:~# ps -aux | grep -E 'keystone|placement|glance|rabbitmq|memcache|apache2|mysql'
memcache 811 0.0 0.0 411376 4152 ? Ssl Jul31 0:01 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 10.0.20.11 -P /var/run/memcached/memcached.pid
rabbitmq 814 0.1 1.5 2634844 123880 ? Ssl Jul31 0:28 /usr/lib/erlang/erts-12.2.1/bin/beam.smp -W w -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1048576 -t 5000000 -stbt db -zdbbl 128000 -sbwt none -sbwtdcpu none -sbwtdio none -- -root /usr/lib/erlang -progname erl -- -home /var/lib/rabbitmq -- -pa -noshell -noinput -s rabbit boot -boot start_sasl -syslog logger [] -syslog syslog_error_logger false
root 869 0.0 0.0 14052 6820 ? Ss Jul31 0:00 /usr/sbin/apache2 -k start
mysql 966 0.0 1.1 1337780 92048 ? Ssl Jul31 0:01 /usr/sbin/mariadbd
rabbitmq 1003 0.0 0.0 2780 1432 ? Ss Jul31 0:00 erl_child_setup 65536
rabbitmq 1339 0.0 0.0 3740 1276 ? Ss Jul31 0:00 inet_gethost 4
rabbitmq 1340 0.0 0.0 3740 108 ? S Jul31 0:00 inet_gethost 4
glance 1358 0.9 1.4 168668 120948 ? Ss Jul31 2:37 /usr/bin/python3 /usr/bin/glance-api --config-file=/etc/glance/glance-api.conf --config-dir=/etc/glance/ --log-file=/var/log/glance/glance-api.log
glance 1370 0.0 1.2 168668 105164 ? S Jul31 0:00 /usr/bin/python3 /usr/bin/glance-api --config-file=/etc/glance/glance-api.conf --config-dir=/etc/glance/ --log-file=/var/log/glance/glance-api.log
glance 1371 0.0 1.2 168668 105168 ? S Jul31 0:00 /usr/bin/python3 /usr/bin/glance-api --config-file=/etc/glance/glance-api.conf --config-dir=/etc/glance/ --log-file=/var/log/glance/glance-api.log
glance 1372 0.0 1.2 168668 105168 ? S Jul31 0:00 /usr/bin/python3 /usr/bin/glance-api --config-file=/etc/glance/glance-api.conf --config-dir=/etc/glance/ --log-file=/var/log/glance/glance-api.log
glance 1373 0.0 1.2 168668 105168 ? S Jul31 0:00 /usr/bin/python3 /usr/bin/glance-api --config-file=/etc/glance/glance-api.conf --config-dir=/etc/glance/ --log-file=/var/log/glance/glance-api.log
keystone 6449 0.0 0.1 108884 11456 ? Sl 00:00 0:00 (wsgi:keystone-pu -k start
keystone 6450 0.0 0.1 108884 11456 ? Sl 00:00 0:00 (wsgi:keystone-pu -k start
keystone 6451 0.0 0.1 108884 11456 ? Sl 00:00 0:00 (wsgi:keystone-pu -k start
keystone 6452 0.0 0.1 108892 11456 ? Sl 00:00 0:00 (wsgi:keystone-pu -k start
keystone 6453 0.0 0.1 108884 11460 ? Sl 00:00 0:00 (wsgi:keystone-pu -k start
placeme+ 6454 0.0 0.1 108884 11460 ? Sl 00:00 0:00 (wsgi:placement-a -k start
placeme+ 6455 0.0 0.1 108884 11460 ? Sl 00:00 0:00 (wsgi:placement-a -k start
placeme+ 6456 0.0 0.1 108884 11460 ? Sl 00:00 0:00 (wsgi:placement-a -k start
placeme+ 6457 0.0 0.1 108884 11460 ? Sl 00:00 0:00 (wsgi:placement-a -k start
placeme+ 6458 0.0 0.1 108892 11460 ? Sl 00:00 0:00 (wsgi:placement-a -k start
www-data 6459 0.0 0.1 2009808 12280 ? Sl 00:00 0:00 /usr/sbin/apache2 -k start
www-data 6460 0.0 0.1 1944272 12280 ? Sl 00:00 0:00 /usr/sbin/apache2 -k start
root 15673 0.0 0.0 4180 2428 pts/3 S+ 02:53 0:00 grep --color=auto -E keystone|placement|glance|rabbitmq|memcache|apache2|mysql
root@controller:~#
ps -aux | grep -E 'keystone|placement|glance|rabbitmq|memcache|apache2|mysql'命令解释:
ps -aux
来列出所有运行中的进程,并通过管道|
将输出传递给grep
命令。grep -E
表示使用扩展正则表达式,'keystone|placement|glance|rabbitmq|memcache|apache2|mysql'
是一个正则表达式,用于匹配包含keystone
、placement
、glance
、rabbitmq、memcache
、apache2
、mysql中任意关键词的行。这里是命令的详细解释:
ps -aux
: 显示系统上所有运行的进程的详细信息。grep -E
: 使用扩展正则表达式来搜索文本。'keystone|placement|glance|rabbitmq|memcache|apache2|mysql'
: 这是一个正则表达式,|
是逻辑或运算符,表示匹配列表中的任意一个字符串。这个命令的输出将包括所有包含上述关键词之一的进程。OpenStack 的 Keystone 认证服务、Glance 镜像服务、Placement 服务、RabbitMQ 消息队列、Memcached 缓存服务、 Apache WEB服务、MySQL 数据库服务相关的进程都会被列出。
2.2 查看相关TCP监听端口
1、查看所以监听端口信息:root@controller:~# ss -lnp | grep -E "memcached|beam\.smp|apache2|mariadbd|glance\-api"
u_str LISTEN 0 869 /run/mysqld/mysqld.sock 34903 * 0 users:(("mariadbd",pid=966,fd=97))
u_str LISTEN 0 100 /var/run/apache2/wsgi.869.2.1.sock 48420 * 0 users:(("apache2",pid=6453,fd=17),("apache2",pid=6452,fd=17),("apache2",pid=6451,fd=17),("apache2",pid=6450,fd=17),("apache2",pid=6449,fd=17),("apache2",pid=869,fd=17))
u_str LISTEN 0 100 /var/run/apache2/wsgi.869.2.2.sock 48421 * 0 users:(("apache2",pid=6458,fd=19),("apache2",pid=6457,fd=19),("apache2",pid=6456,fd=19),("apache2",pid=6455,fd=19),("apache2",pid=6454,fd=19),("apache2",pid=869,fd=19))
u_dgr UNCONN 0 0 * 28652 * 0 users:(("beam.smp",pid=814,fd=17))
tcp LISTEN 0 1024 10.0.20.11:11211 0.0.0.0:* users:(("memcached",pid=811,fd=22))
tcp LISTEN 0 4096 0.0.0.0:9292 0.0.0.0:* users:(("glance-api",pid=1373,fd=4),("glance-api",pid=1372,fd=4),("glance-api",pid=1371,fd=4),("glance-api",pid=1370,fd=4),("glance-api",pid=1358,fd=4))
tcp LISTEN 0 128 0.0.0.0:25672 0.0.0.0:* users:(("beam.smp",pid=814,fd=18))
tcp LISTEN 0 869 10.0.20.11:3306 0.0.0.0:* users:(("mariadbd",pid=966,fd=96))
tcp LISTEN 0 128 *:5672 *:* users:(("beam.smp",pid=814,fd=33))
tcp LISTEN 0 511 *:8778 *:* users:(("apache2",pid=6460,fd=8),("apache2",pid=6459,fd=8),("apache2",pid=869,fd=8))
tcp LISTEN 0 511 *:5000 *:* users:(("apache2",pid=6460,fd=6),("apache2",pid=6459,fd=6),("apache2",pid=869,fd=6))
tcp LISTEN 0 511 *:80 *:* users:(("apache2",pid=6460,fd=4),("apache2",pid=6459,fd=4),("apache2",pid=869,fd=4))
root@controller:~# 2、只看tcp相关的监听端口信息:root@controller:~# ss -tlnp | grep -E "memcached|beam\.smp|apache2|mariadbd|glance\-api"
LISTEN 0 1024 10.0.20.11:11211 0.0.0.0:* users:(("memcached",pid=811,fd=22))
LISTEN 0 4096 0.0.0.0:9292 0.0.0.0:* users:(("glance-api",pid=1373,fd=4),("glance-api",pid=1372,fd=4),("glance-api",pid=1371,fd=4),("glance-api",pid=1370,fd=4),("glance-api",pid=1358,fd=4))
LISTEN 0 128 0.0.0.0:25672 0.0.0.0:* users:(("beam.smp",pid=814,fd=18))
LISTEN 0 869 10.0.20.11:3306 0.0.0.0:* users:(("mariadbd",pid=966,fd=96))
LISTEN 0 128 *:5672 *:* users:(("beam.smp",pid=814,fd=33))
LISTEN 0 511 *:8778 *:* users:(("apache2",pid=6460,fd=8),("apache2",pid=6459,fd=8),("apache2",pid=869,fd=8))
LISTEN 0 511 *:5000 *:* users:(("apache2",pid=6460,fd=6),("apache2",pid=6459,fd=6),("apache2",pid=869,fd=6))
LISTEN 0 511 *:80 *:* users:(("apache2",pid=6460,fd=4),("apache2",pid=6459,fd=4),("apache2",pid=869,fd=4))
ss -lnp | grep -E "memcached|beam\.smp|apache2|mariadbd|glance\-api"命令解释:
使用
ss -lnp
命令过滤特定服务(memcached, beam.smp, apache2, mariadbd, glance-api)后的结果。这里是对输出中每部分的解释:
Unix 域套接字监听状态 (
u_str LISTEN
):
/run/mysqld/mysqld.sock
: MariaDB 或 MySQL 服务的 Unix 域套接字,正在监听连接。/var/run/apache2/wsgi.869.2.1.sock
和/var/run/apache2/wsgi.869.2.2.sock
: Apache2 用于 WSGI 应用程序的 Unix 域套接字。UDP 未连接状态 (
u_dgr UNCONN
):
- 显示了一个与
beam.smp
进程(Erlang 虚拟机)相关的 UDP 套接字,但因为状态是UNCONN
,它还没有连接。TCP 监听状态 (
tcp LISTEN
):
10.0.20.11:11211
: memcached 服务监听在特定的 IP 地址和端口上。0.0.0.0:9292
: Glance API 服务监听在所有 IPv4 地址的 9292 端口上。0.0.0.0:25672
: 另一个beam.smp
进程监听在所有 IPv4 地址的 25672 端口上,可能用于 RabbitMQ 消息队列或其他 Erlang 应用。10.0.20.11:3306
: MariaDB 或 MySQL 服务监听在特定的 IP 地址和端口上,通常用于数据库服务。*:5672
: 通常用于 RabbitMQ 服务的 AMQP 协议,监听在所有地址的 5672 端口上。*:8778
和*:5000
: 这些端口上的监听服务与 Apache2 相关,分别用于 placement 服务和keystone服务。*:80
: Apache2 Web 服务器监听在所有地址的 80 端口上,这是 HTTP 的默认端口。
users
部分列出了使用这些套接字的进程信息,包括进程名称、PID(进程ID)和文件描述符(fd)。例如,
users:(("apache2",pid=6453,fd=17))
表示 PID 为 6453 的 Apache2 进程使用了文件描述符 17。这些输出行提供了系统上关键服务的网络监听状态的快照,包括它们监听的协议、地址、端口和关联的进程信息。
2.3 查看已建立的相关TCP连接
root@controller:~# ss -tp | grep -E "memcached|beam\.smp|apache2|mariadbd|glance\-api"
ESTAB 0 0 127.0.0.1:54684 127.0.0.1:epmd users:(("beam.smp",pid=814,fd=19))
抓包过程中,将执行此命令,观察TCP建立情况。
3、Wireshark抓包
3.1 抓包目的
通过执行openstack --os-placement-api-version 1.2 resource class list --sort-column name查看OpenStack各组件之间的完整交互情况。
3.2 抓包方式
1、建议在Windows 11(10.0.20.1)上使用MobaXterm软件,登录到10.0.20.11,运行Wireshark,并捕获“Loopback: lo”端口的流量。
2、执行openstack命令
在win11(10.0.20.1)上使用SecureCRT软件打开一个新窗口,通过ssh连接到10.0.20.11,在osclient上执行相应操作:
root@controller:~# . admin-openrc
root@controller ~(admin/amdin)# openstack --os-placement-api-version 1.2 resource class list --sort-column name
3、同时,在win11(10.0.20.1)上使用SecureCRT软件通过SSH登录到10.0.20.11,以监控TCP连接的建立情况。
root@controller:~# ss -tp | grep -E "memcached|beam\.smp|apache2|mariadbd|glance\-api|openstack"
4、停止捕获数据包,然后开始分析。
3.3 抓包分析
3.3.1 TCP连接建立信息
在执行上述openstack命令的同时,记录下的TCP连接信息:
root@controller:~# ss -tp | grep -E "memcached|beam\.smp|apache2|mariadbd|glance\-api|openstack"
ESTAB 0 0 10.0.20.11:mysql 10.0.20.11:43428 users:(("mariadbd",pid=966,fd=148))
ESTAB 0 0 10.0.20.11:11211 10.0.20.11:59030 users:(("memcached",pid=811,fd=23))
CLOSE-WAIT 1 0 10.0.20.11:41884 10.0.20.11:5000 users:(("openstack",pid=22082,fd=3))
ESTAB 0 0 10.0.20.11:43424 10.0.20.11:mysql users:(("apache2",pid=6451,fd=20))
ESTAB 0 0 10.0.20.11:59030 10.0.20.11:11211 users:(("apache2",pid=6458,fd=17))
ESTAB 0 0 10.0.20.11:43428 10.0.20.11:mysql users:(("apache2",pid=6458,fd=12))
ESTAB 0 0 10.0.20.11:56250 10.0.20.11:5000 users:(("apache2",pid=6458,fd=21))
ESTAB 0 0 127.0.0.1:54684 127.0.0.1:epmd users:(("beam.smp",pid=814,fd=19))
ESTAB 0 0 10.0.20.11:39544 10.0.20.11:8778 users:(("openstack",pid=22082,fd=4))
ESTAB 0 0 10.0.20.11:mysql 10.0.20.11:43424 users:(("mariadbd",pid=966,fd=115))
3.3.2 抓包结果
需要指出的是,在本次练习中,所有相关组件都在控制节点上进行交互,因此无法通过IP地址来区分不同服务,同时目前的wireshark版本抓包信息中,没有相关的进程信息。我们只能通过分析具体的报文来进行判断。对于某些报文,我们需要根据端口号来检查特定的TCP连接,并通过这些连接找到相应的PID号,然后根据这个PID号来确定具体的服务。
例如,在上图的第3943号报文中,源端口是59030,目的端口是11211,无法确定是哪个服务发出的源端口,需要检查TCP连接(参见3.3.1节)。通过这种方式,我们发现相应的进程号(pid)是6458:
根据PID 6458进行信息查询(参见2.1章节),可以确定是由placement服务发出的:
4、Mermaid绘制时序图
附mermaid code:
sequenceDiagramautonumberparticipant C as OpenStackClientparticipant P as placementparticipant M as memcachedparticipant K as keystoneparticipant KD as keystone DBparticipant PD as placement DB C ->> K: user admin scope to project admin, 发送username:admin/password:openstackNote left of C: 命令行中输入: <br/> openstack <br/>--os-placement-api-version 1.2 <br/>resource class list <br/>--sort-column nameK ->> KD: Keystone第一次login keyston DB, 查询user admin的身份KD ->> K: okK ->> C: user admin身份验证成功,Keystone生成admin tokenC ->> P: user admin向placement service发送GET /resource_classes HTTP/1.1,请求中包含之前从Keystone 获取的admin tokenP ->> PD: placement第一次Login placement DB,(没有进行实际的查询)PD ->> P: ResponseP ->> M: placement服务接收到请求,去memcache检查请求中的admin tokenNote right of M: 先检查memcached是否有admin tokenM ->> P: 没有,继续去keystone检查P ->> K: user placement scope to project service,发送username:placement/password:openstackNote right of P: placement首先要认证自己的身份!K ->> KD: Keystone第二次login, 查询user placement的身份KD ->> K: okK ->> P: placement的身份验证成功,Keystone 生成placement tokenP ->> K: placement服务将admin token发送回 Keystone,请求验证admin token的有效性,请求中包含之前从 Keystone 获取的placement tokenNote right of P: placement拿着自己的token,去验证admin tokenK ->> KD: Keystone第三次login, 查询admin tokenKD ->> K: okK ->> P: admin token有效,Keystone 返回给placement serviceP ->> M: please store admin tokenNote right of M: 保存一份到memcacheM ->> P: storedP ->> PD: placement service继续查询placement db,没有重新loginPD ->> P: 返回查询结果P ->> C: 返回查询结果