在openstack控制平台创建instance

创建实例类型
管理员------实例类型------创建实例类型------名称(test-vm1)------VCPU数量(1)------内存(128)------根磁盘(1)------创建实例类型

创建网络
管理员------网络------网络------创建网络------名称(net1)------项目(admin)------供应商网络类型(vxlan)------段ID(1)------共享的---
---下一步------子网名称(net1-subnet)------网络地址(10.3.147.0/24)------下一步------分配地址池(10.3.147.10,10.3.147.50)------创建

创建实例:
项目------计算------实例------创建实例
详情------实例名称------vm1
源------Image(创建新卷:不,该选项在配置cinder服务后才有)------选上上传的cirros3.2镜像
实例类型------选上前面创建的test-vm1实例类型
网络------选上前面创建的网络net1
创建实例


点击进入vm1------控制台
输入账号:cirros
输入密码:cubswin:)

恭喜你,成功创建instance,并登入系统


# nova list                                                                                                //查看所有instance
# nova show e3aafecc-f13f-46bf-bf2c-5f6952f2880e(编号)              //查看instance详细信息

# virsh list --all                                                                                       //查看本节点上的所有instance
# virsh console instance-0000001f(名称)                                           //登入instance,ctrl+]退出登录界面
# virsh edit instance-0000001f                                                              //查看kvm虚拟机配置

 

假设,在创建instance的时     创建新卷选择是,删除实例时删除卷最好选择是,因为在删除实例的时候如果不把卷也一起删除了cinder节点的空间就无法得到释放,变成僵尸卷,需要我们手动去删除
那创建新卷:是    和创建新卷否有什么区别呢,在于disk存放的位置,

创建新卷:是,会在cinder节点保存disk数据(后面对接ceph就会保存在ceph节点中)

创建新卷:否,disk会保存在当前计算节点
ll -h /var/lib/nova/instances/

 

ovs架构图.png

 

创建虚拟的的流程以及对应的端口设备:
# ip netns list                                                                                   //命令列出所有的 namespace,也可以使用openstack命令列出所有网络# openstack network list
# ip netns exec <network namespace name> <command>           //管理 namespace

例如:# ip netns exec qdhcp-67b9bd66-27b1-4ebd-91e5-fb2f54c54139 ip a
tap942b3bc9-fb: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether fa:16:3e:03:70:bc brd ff:ff:ff:ff:ff:ff
    inet 169.254.169.254/16 brd 169.254.255.255 scope global tap942b3bc9-fb
       valid_lft forever preferred_lft forever
    inet 10.3.147.10/24 brd 10.3.147.255 scope global tap942b3bc9-fb
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe03:70bc/64 scope link 
       valid_lft forever preferred_lft forever

然后就可以发现找到了对应的tap942b3bc9-fb

veth pair 是一种成对出现的特殊网络设备,它们象一根虚拟的网线,可用于连接两个 namespace
veth pair 用于两个网络设备通过成对的接进行连接

 

instance获取IP地址的过程
在创建 instance 时,Neutron 会为其分配一个 port,里面包含了 MAC 和 IP 地址信息。这些信息会同步更新到 dnsmasq 的 host 文件
路径为:ls /var/lib/neutron/dhcp/

例如:
# cat /var/lib/neutron/dhcp/67b9bd66-27b1-4ebd-91e5-fb2f54c54139/host

 
1. vm 开机启动,发出 DHCPDISCOVER 广播,该广播消息在整个 net 中都可以被收到。
 
2. 广播到达 veth tap19a0ed3d-fe,然后传送给 veth pair 的另一端 ns-19a0ed3d-fe。dnsmasq 在它上面监听,dnsmasq 检查其 host 文件,发现有对应项,于是dnsmasq 以  DHCPOFFER 消息将 IP(192.168.254.18)、子网掩码(255.255.255.0)、地址租用期限等信息发送给 vm。
 
3. vm 发送 DHCPREQUEST 消息确认接受此 DHCPOFFER。
 
4. dnsmasq 发送确认消息 DHCPACK,整个过程结束。

计算节点:
# virsh edit instance-0000001e       //interface,查看对应的mac地址,给instance分配IP地址,能够看到vm连接的qbr网络设备和tap接口

# brctl show                                    //查看linux-brideg设备,为什么vm不直接连接br-int,因为br-int做不了防火墙策略(iptables),所有在他们中间加上了linux-brideg做防火墙策略                     

# ovs-vsctl show                            //找出qvo与qvb的对应关系


Open vSwitch:
Open vSwitch 中的网络设备:
br-ex:连接外部(external)网络的网桥。
br-int:集成(integration)网桥,所有 instance 的虚拟网卡和其他虚拟网络设备都将连接到该网桥。
br-tun:隧道(tunnel)网桥,基于隧道技术的 VxLAN 和 GRE 网络将使用该网桥进行通信。
tap interface:命名为 tapXXXX。
linux bridge:命名为 qbrXXXX。
veth pair:命名为 qvbXXXX, qvoXXXX


instance连接外网

先创建路由
管理员------网络------路由------新建路由------路由名称(R1)------项目(admin)------新建路由

创建外部网络
管理员------网络------网络------创建网络------名称(ex-net)------项目(admin)------供应商网络类型(Flat)------物理网络(ph01)------共享的、外部网络---
---下一步------子网名称(ex-net-subnet)------网络地址(192.168.58.0/24)------网关IP(192.168.58.2)------下一步------分配地址池(192.168.58.200,192.168.58.220)------创建

将内部网络和外部网络连接到路由
项目------网络------路由------R1------接口------增加接口------net1-XXXXXXX------提交
项目------网络------路由------R1------接口------设置网关------外部网络(ex-net)------提交

创建安全组
项目------网络------安全组------创建安全组------名称(allow)------添加规则------定制TCP规则------添加
项目------网络------安全组------创建安全组------名称(allow)------添加规则------定制UDP规则------添加
项目------网络------安全组------创建安全组------名称(allow)------添加规则------所有ICMP协议------添加

使用安全组allow
项目------计算------实例------创建快照旁边有一个按钮(选择编辑安全组)------把allow安全组添加到实例安全组上,其他的安全组移除

验证:
# ping 8.8.8.8

 

查看route连接的两个接口qr、qg
# ip netns exec qrouter-5743477e-e692-4a03-8a3e-a1f7a1011932 ip a

SNAT 让 instance 能够直接访问外网,但外网还不能直接访问 instance。因为 instance 没有外网 IP。这里 “直接访问 instance” 是指通信连接由外网发起,例如从外网 SSH 实例
需要给instance分配一个浮动IP

(1)首先将实例绑定浮动 ip192.168.58.210, floating IP 是配置在 router 的外网 interface 上的,再查看 router 的 interface 配置:

(2)在实例中ping 8.8.8.8 外网地址,在路由 qr-ffad4acb-3d 接口上,实例访问外网ip,外网ip将数据包转发回实例ip;但在路由的qg-66cbe3d3-9e接口上,始终是通过 floating IP 192.168.58.210 与外网通信。

(3) 原因是在路由中iptables做了DNA T(基于目的地址转发),查看 router 的 NAT 规则:

当 router 接收到从外网发来的包,如果目的地址是 floating IP 192.168.58.210,将目的地址修改为实例的 IP 10.3.147.39。这样外网的包就能送达到实例;
当实例发送数据到外网,源地址 10.3.147.39 将被修改为 floating IP 192.168.58.210;
 

创建浮动IP
项目------网络------浮动IP------分配IP给项目------资源池(ex-net)------分配IP

项目------实例------vm1创建快照旁边有个按钮------选择绑定浮动IP------选择浮动IP的地址------关联

验证
# ssh cirros@192.168.58.210


subnet 是一个 IPv4 或者 IPv6 地址段。instance 的 IP 从 subnet 中分配。每个 subnet 需要定义 IP 地址的范围和掩码。
 
network 与 subnet 是 1对多 关系。一个 subnet 只能属于某个 network;一个 network 可以有多个 subnet,这些 subnet 可以是不同的 IP 段,但不能重叠。下面的配置是有效的:
network A   subnet A-a: 10.10.1.0/24  {"start": "10.10.1.1", "end": "10.10.1.50"}
                   subnet A-b: 10.10.2.0/24  {"start": "10.10.2.1", "end": "10.10.2.50"}
 
但下面的配置则无效,因为 subnet 有重叠
network A    subnet A-a: 10.10.1.0/24  {"start": "10.10.1.1", "end": "10.10.1.50"}
                    subnet A-b: 10.10.1.0/24  {"start": "10.10.1.51", "end": "10.10.1.100"}
 
这里不是判断 IP 是否有重叠,而是 subnet 的 CIDR 重叠(都是 10.10.1.0/24)。但是,如果 subnet 在不同的 network 中,CIDR 和 IP 都是可以重叠的,比如
network A    subnet A-a: 10.10.1.0/24  {"start": "10.10.1.1", "end": "10.10.1.50"}
network B    subnet B-a: 10.10.1.0/24  {"start": "10.10.1.1", "end": "10.10.1.50"}

 

例如这种情况:
net2    net2-subnet 10.3.148.0/24

net1    net1-subnet 10.3.147.0/24
           net2-subnet 10.3.146.0/24

在同一个路由中
10.3.148.0/24  与  10.3.147.0/24、10.3.146.0/24  可以进行通信
10.3.146.0/24  与  10.3.147.0/24  可以进行通信

在不同的路由中
10.3.146.0/24  与  10.3.147.0/24  无法进行通信,需要添加路由表才可以
10.3.148.0/24  与  10.3.147.0/24  无法进行通信,需要添加路由表才可以

例如:
R1路由的IP地址为 192.168.58.216
R2路由的IP地址为 192.168.58.204

10.3.147.0/24 连接 R1
10.3.148.0/24 连接 R2

10.3.147.0/24 想要与 10.3.148.0/24 通信,需在R1添加静态路由表
目标CIDR
10.3.148.0/24
下一跳
192.168.58.204

10.3.148.0/24 想要与 10.3.147.0/24 通信,需在R2添加静态路由表
目标CIDR
10.3.147.0/24
下一跳
192.168.58.216

测试连通性即可