当发现你的OpenStack虚拟机网络有问题,不妨先试一下这16个步骤
1. Security Group全部打开,这是最基本的,但是很多人容易忘记
其实遇到过无数这种场景了,Debug了半天网络问题,各种手段都用上了,最后发现安全组竟然没有打开。
2. 通过界面查看虚拟机的log,也可以在compute节点上查看console.log文件,看看里面是否有DHCP获取IP成功的日志
在界面上可以看控制台日志
在compute节点上可以查看
/var/lib/nova/instances/6323a941-de10-4ed3-9e2f-1b2b25e79b66/console.log
如果没有日志,则说明image有问题
在grub里面
linux /boot/vmlinuz-3.2.0-49-virtual root=UUID=6d2231e4-0975-4f35-a94f-56738c1a8150 ro console=ttyS0
GRUB_CMDLINE_LINUX_DEFAULT="console=ttyS0“
update-grub
3. 如果虚拟机连不上DHCP Server,则需要准备一个不使用metadata server,而是用用户名密码可以登录的image
这种Image很好做,自己动手做一个就可以了,启动镜像后去掉cloud-init相关配置,然后设置一个默认的用户名密码。
4. 通过VNC登录
5. 如果VNC登录不进去,说明VNC配置的有问题,方法一重新配置VNC
VNC Proxy的功能:
将公网(public network)和私网(private network)隔离
VNC client运行在公网上,VNCServer运行在私网上,VNC Proxy作为中间的桥梁将二者连接起来
VNC Proxy通过token对VNC Client进行验证
VNC Proxy不仅仅使得私网的访问更加安全,而且将具体的VNC Server的实现分离,可以支持不同Hypervisor的VNC Server但不影响用户体验
VNC Proxy的部署
在Controller节点上部署nova-consoleauth 进程,用于Token验证
在Controller节点上部署nova-novncproxy 服务,用户的VNC Client会直接连接这个服务
Controller节点一般有两张网卡,连接到两个网络,一张用于外部访问,我们称为public network,或者API network,这张网卡的IP地址是外网IP,如图中172.24.1.1,另外一张网卡用于openstack各个模块之间的通信,称为management network,一般是内网IP,如图中10.10.10.2
在Compute节点上部署nova-compute,在nova.conf文件中有下面的配置
vnc_enabled=True
vncserver_listen=0.0.0.0 //VNC Server的监听地址
vncserver_proxyclient_address=10.10.10.2 //nova vnc proxy是通过内网IP来访问vnc server的,所以nova-compute会告知vnc proxy用这个IP来连接我。
novncproxy_base_url=http://172.24.1.1:6080/vnc_auto.html //这个url是返回给客户的url,因而里面的IP是外网IP
VNC Proxy的运行过程:
一个用户试图从浏览器里面打开连接到虚拟机的VNC Client
浏览器向nova-api发送请求,要求返回访问vnc的url
nova-api调用nova-compute的get vnc console方法,要求返回连接VNC的信息
nova-compute调用libvirt的get vnc console函数
libvirt会通过解析虚拟机运行的/etc/libvirt/qemu/instance-0000000c.xml文件来获得VNC Server的信息
libvirt将host, port等信息以json格式返回给nova-compute
nova-compute会随机生成一个UUID作为Token
nova-compute将libvirt返回的信息以及配置文件中的信息综合成connect_info返回给nova-api
nova-api会调用nova-consoleauth的authorize_console函数
nova-consoleauth会将instance –> token, token –> connect_info的信息cache起来
nova-api将connect_info中的access url信息返回给浏览器:http://172.24.1.1:6080/vnc_auto.html?token=7efaee3f-eada-4731-a87c-e173cbd25e98&title=helloworld%289169fdb2-5b74-46b1-9803-60d2926bd97c%29
浏览器会试图打开这个链接
这个链接会将请求发送给nova-novncproxy
nova-novncproxy调用nova-consoleauth的check_token函数
nova-consoleauth验证了这个token,将这个instance对应的connect_info返回给nova-novncproxy
nova-novncproxy通过connect_info中的host, port等信息,连接compute节点上的VNC Server,从而开始了proxy的工作
6. 如果VNC登录不进去,还有一个方法,使用自己的VNC Client,通过compute物理节点的IP地址登陆
qemu-system-x86_64 有参数 -vnc 0.0.0.0:5
就可以通过compute node的ip地址进入
7. 通过ovs-vsctl show和brctl来查看,各个网卡和bridge之间关系是否正确,tunnel之间是否能够通,网卡是否都处于up的状态
8. 如果从虚拟机的虚拟网卡到DHCP Server的网卡一路都是配置正确的,则需要查看br-tun上ovs-ofctl dumpflows查看flows规则,是否对包的改写正确,是否有正确的规则
9. 通过VNC登录进去后,就可以通过命令行运行dhclient,来重启连接DHCP Server, 从compute节点上的网卡和bridge,一个个进行tcpdump,看到底哪个网卡或者bridge没有收到包,收到的包里面的VLAN ID等是否正确
10. 如果VM能从DHCP Server获得IP,则好事成了一半,接下来换一个有cloud-init的image,看metadata server能够连接成功,能够注入key,也是通过console.log来看
11. 如果metadata server不能连接成功,就需要顺着metadata server的整个流程,一个一个模块看,看每个模块的log,端口是否正确,是否收到请求,也可以在VM里面用curl来模拟metadata server的请求
openstack里的metadata,是提供一个机制给用户,可以设定每一个instance 的参数。比如你想给instance设置某个属性,比如主机名。
Instance访问metadata server http://169.254.169.254
metadata的一个重要应用,是设置每个instance的ssh公钥。
获取metadata的api接口是:
http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
这个IP地址,在 openstack 是不存在的。为什么可以获取到metadata呢?
这是由于Amazon的原因,最早metadata是亚马逊提出来的,参见:http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html
后来很多人给亚马逊定制了一些操作系统的镜像,比如 ubuntu, fedora, centos 等等,而且将里面获取 metadta 的api地址也写死了。所以opentack为了兼容,保留了这个地址169.254.169.254。
然后通过iptables nat映射到真实的api上:
iptables -A nova-network-PREROUTING -d 169.254.169.254/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 16.158.166.197:8775
nova如何区分到底是哪个虚拟机请求metadata?采取的方法是在HTTP头部识别是哪个虚拟机。
一个虚拟机访问169.254.169.254的流程如下:
(1) 虚拟机发出请求
虚拟机启动时会访问169.254.169.254
数据包会直接发送到虚拟机的默认网关172.71.71.1
默认网关在network node上,qr-XXXXX
(2) namespace中的iptables
因为使用了namespace,在network node上每个namespace里都会有相应的iptables规则和网络设备。
iptables规则中,会把目的地址169.254.169.254的数据包,重定向到本地端口9697
ip netns exec qrouter-5a74908c-712c-485c-aa9f-6c1e8b57e3e1 iptables -t nat -nvL
(3) namespace-metadata-proxy
启用namespace场景下,对于每一个router,都会创建这样一个进程。该进程监听9697端口,其主要功能:
1、向请求头部添加X-Forwarded-For和X-Neutron-Router-ID,分别表示虚拟机的fixedIP和router的ID
2、将请求代理至Unix domain socket(/var/lib/neutron/metadata_proxy)
(4) Neutron-metadata-agent
network node上的metadata agent监听/var/lib/neutron/metadata_proxy:
该进程的功能是,根据请求头部的X-Forwarded-For和X-Neutron-Router-ID参数,向Neutron service查询虚拟机ID,然后向Nova Metadata服务发送请求(默认端口8775),消息头:X-Forwarded-For,X-Instance-ID、X-Instance- ID-Signature分别表示虚拟机的fixedIP,虚拟机ID和虚拟机ID的签名。
12. 如果metadata server能够连接成功,key成功注入,下一步需要从namespace里面看是否能够ping通,能够ssh
13. 如果namespace里面能够成功,则在network节点上,ping floating ip和ssh,是否能够成功,如果不成功,看br-ex的网卡是否添加正确,是否配置了ip,路由表是否正确,namespace里面floating ip的iptables规则是否添加正确
14. 在network节点上能够ssh到floating ip,则需要从其他节点上ssh,如果不成功,可能br-ex的网址配置有问题,很可能是br-ex添加的物理网卡不是混合状态,也可能是路由配置有问题,对于floating ip所在的网段,不指向network节点
15.
如果floating ip能够成功,则需要进去VM里面运行apt-get
update,如果不可以,看能否ping通openstack里面的gateway(10.0.0.1),然后看能否ping通物理网络环境的gateway(16.158.XXX.1)
16. 看DNS Server是否配置正确,是否能够ping通,如果能,apt-get update运行成功
欢迎关注微信公众号
当发现你的OpenStack虚拟机网络有问题,不妨先试一下这16个步骤的更多相关文章
- OpenStack虚拟机网络问题
当发现你的OpenStack虚拟机网络有问题,不妨先试一下这16个步骤 1. Security Group全部打开,这是最基本的,但是很多人容易忘记 其实遇到过无数这种场景了,Debug了半天网络 ...
- openstack的一台Nova主机上的虚拟机网络的配置
1.一台虚拟机器的网络配置,通过openstack/nova计算节点服务生成的虚拟机配置文件 <interface type='bridge'> <mac address='fa:1 ...
- 别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(5)
八.KVM 这一步,像virsh start命令一样,将虚拟机启动起来了.虚拟机启动之后,还有很多的步骤需要完成. 步骤38:从DHCP Server获取IP 有时候往往数据库里面,VM已经有了IP, ...
- openstack——neutron网络服务
一.neutron 介绍: Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需要 ...
- OpenStack 虚拟机冷/热迁移的实现原理与代码分析
目录 文章目录 目录 前文列表 冷迁移代码分析(基于 Newton) Nova 冷迁移实现原理 热迁移代码分析 Nova 热迁移实现原理 向 libvirtd 发出 Live Migration 指令 ...
- vmware虚拟机网络自动断开的问题
最近搭建一个集群环境,因此用vmware安装了几台虚拟机,系统是centos7.2. 但是发现网络总是不经意间自动断开,重启网络(service network restart)恢复. 虚拟机网络类型 ...
- openstack虚拟机启动过程
核心项目3个 1.控制台 服务名:Dashboard 项目名:Horizon 功能:web方式管理云平台,建云主机,分配网络,配安全组,加云盘 2.计算 服务名:计算 项目名:Nova 功能:负责响应 ...
- VirtualBox 内的 Ubuntu Server 虚拟机网络配置
环境: 宿主机:Windows 7,单网卡: 虚拟机:ubuntu-14.04.1-server-amd64: 宿主机上网是连接的路由器,IP 地址是通过 DHCP 服务自动获取的: 基本情况: Ub ...
- linux笔记:linux系统安装-虚拟机网络设置
vmware虚拟机网络配置的3种方式: 1.桥接:在桥接模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机(主机和虚拟机处于对等地位),它可以访问网内任何一台机器.在桥接模式下,我们 ...
随机推荐
- SDN第一次作业
作业链接 你会选择作 网络编程 方向的程序员吗?为什么? 光凭阅读此篇文章我还无法确定以后是否选择作 网络编程 方向的程序员.出于自身知识的匮乏,文章中提到的很多东西都没有概念,全篇一口气阅读下来,给 ...
- pandas中的分组技术
目录 1 分组操作 1.1 按照列进行分组 1.2 按照字典进行分组 1.3 根据函数进行分组 1.4 按照list组合 1.5 按照索引级别进行分组 2 分组运算 2.1 agg 2 ...
- ThinkPHP删除栏目(单)
当我们做一些网站项目的时候,都会遇到这样一类问题,删除一个栏目,而这个栏目又不是最底层栏目,也就是说,被删除的栏目拥有子栏目,这时,我们执行删除该栏目的命令,就需要将该栏目及其子栏目一并删除,因为我们 ...
- 基于Spring Boot,使用JPA动态调用Sql查询数据
在<基于Spring Boot,使用JPA操作Sql Server数据库完成CRUD>,<基于Spring Boot,使用JPA调用Sql Server数据库的存储过程并返回记录集合 ...
- 使用requireJS
什么是require? require是AMD模块化规范的具体实现. 目前,通行的js模块化规范有两种,CommonJS和AMD. CommonJS和AMD有什么不同呢? CommonJS主要用于服务 ...
- 搭建简易的c语言与python语言CGI和Apache服务器的开发环境
搭建简易的c语言CGI和Apache服务器的开发环境 http://www.cnblogs.com/tt-0411/archive/2011/11/21/2257203.html python配置ap ...
- 关于Apache配置虚拟主机后在局域网中让其他电脑访问
#-----------adxssp------------# NameVirtualHost *:80 <VirtualHost *:80> ServerName www.b.com D ...
- Android查缺补漏(IPC篇)-- 进程间通讯基础知识热身
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8479282.html 在Android中进程间通信是比较难的一部分,同时又非常 ...
- php 链接mysql的三种方式对比
PHP连接Mysql的三种方式: 1.原生的连接方式 原生的连接方式是面向过程的写法 <?php $host = 'localhost'; $database = 'test'; $usern ...
- MySQL Server 5.0安装教程
相信很多朋友刚开始接触mysql数据库服务器,下面是mysql的安装教程,步骤明细也有详细的说明. 工具/原料 mysql MySQL安装的图解 1 打开下载的mysql安装文件mysql-5 ...