root@devstack-controller:~# openstack catalog list //查询服务的Endpoint
复制代码
Role:安全包罗两部分:Authentication(认证)和 Authorization(鉴权)。Keystone 是借助 Role 来实现 Authorization 的。
Keystone定义Role:
可以为 User 分配一个或多个 Role,Horizon 的菜单为 Identity->roject->Manage Members:
Service 决定每个 Role 能做什么事情 Service 通过各自的 policy.json 文件对 Role 举行访问控制。下面是 Nova 服务 /etc/nova/policy.json 中的示例:
上面设置的寄义是:对于 create、attach_network 和 attach_volume 操作,任何Role的 User 都可以执行; 但只有 admin 这个 Role 的 User 才气执行 forced_host 操作。OpenStack 默认设置只区分 admin 和非 admin Role。 如果必要对特定的 Role 举行授权,可以修改 policy.json。
2.1.3 举例说明:admin用户查看Project中的image
登录:账号密码为admin/admin,点击“Connect”:
此时OpenStack 内部发生了哪些事情?请看下面:Token 中包罗了 User 的 Role 信息。
每个 OpenStack 组件可能包罗若干子服务,其中必定有一个 API 服务负责接收客户请求。以 Nova 为例,nova-api 作为 Nova 组件对外的唯一窗口,向客户暴露 Nova 能够提供的功能。当客户必要执行虚机相干的操作,能且只能向 nova-api 发送 REST 请求。这里的客户包括终端用户、下令行和 OpenStack 其他组件。
计划 API 前端服务的好处在于:对外提供同一接口,隐藏实现细节;API 提供 REST 标准调用服务,便于与第三方体系集成;可以通过运行多个 API 服务实例轻松实现 API 的高可用,好比运行多个 nova-api 历程。
a)AvailabilityZoneFilter:
为提高容灾性和提供隔离服务,可以将存储节点和计算节点分别到不同的 Availability Zone 中。比方把一个机架上的机器分别在一个 Availability Zone 中。OpenStack 默认有一个定名为“Nova” Availability Zone 的,所有的节点初始都是放在“Nova”中。用户可以根据必要创建自己的 Availability Zone。
如果用该 volume 创建 snapshot,之后就可以通过 Boot from volume snapshot (create a new volume) 部署新的instance。boot from volume 的 instance 也可以执行 live migrate。前面的实验使用的是 LVM provider,cinder 当然也支持其他 provider。
5)设置 subnet 的 IP 地址范围为 172.16.1.2-172.16.1.100,instance 的 IP 会从这里分配,点击 “Create”。默认会“Enable DHCP”,同时还可以设置 subnet 的 DNS 和添加静态路由条目。
6)network 创建成功:
7)点击 “first_local_net” 链接,显示 network 的 subnet 和 port 信息:
8)在 Ports 列表中已经创建了一个 port,名称为 “(a5bd3746-3f89)”,IP 为 172.16.1.2, Attached Device 是 network:dhcp。打开控制节点的 shell 终端,用 brctl show 查看当前 linux bridge 的状态:
9)可以看到 Neutron 自动创建了如下两个装备: brqbb9b6d21-c6 对应 local network “first_local_net”,定名规则为 brqXXX,XXX 为 network ID 的前 11 个字符。tapa5bd3746-3f 对应 port (a5bd3746-3f89),定名规则为 tapYYY, YYY 为 port ID 的前 11 个字符。该 tap 装备已经毗连到 bridge,即毗连到该 local 网络。
3)对于 instance “cirros-vm1”,Neutron 会在 subnet 中创建一个 port,分配 IP 和 MAC 地址,并将 port 分配给 cirros-vm1:
4)如上图所示,port 列表中增加了一个 port “(fa7e090e-a29c)”,IP 为 172.16.1.3。点击 port 名称查看 MAC 信息:
5)当 cirros-vm1 启动时,宿主机上的 neutron-linuxbridge-agent 会根据 port 信息创建 tap 装备,并毗连到 local 网络地点的 bridge;同时该 tap 会映射成 cirros-vm1 的虚拟网卡,即 virtual interface (VIF)。cirros-vm1 部署到了控制节点,通过 brctl show 查看 bridge 的设置:
6)可以看到 bridge brqbb9b6d21-c6 上毗连了一个新的 tap 装备 tapfa7e090e-a2 从定名上可知 tapfa7e090e-a2 对应着 port “(fa7e090e-a29c)”。virsh list 中显示的虚拟机 instance-00000001 即为 “cirros-vm1”,定名方式有所不同,需注意。通过 virsh edit 下令查看 cirros-vm1 的设置,确认 VIF 就是 tapfa7e090e-a2:
7)另外,VIF 的 MAC 地址为 fa:16:3e:c1:66:a5,这个数据就是从 port “(fa7e090e-a29c)” 取过来的。在 cirros-vm1 中执行 ifconfig,通过 MAC 地址可以确认 eth0 与 tapfa7e090e-a2 对应。
2)显示创建页面,Provider Network Type 选择 “VXLAN” Segmentation ID 即 VNI,设置为 100。点击 “Create Network”,vxlan100 创建成功:
3)点击 vxlan100 链接,进入 network 设置页面:
4)目前还没有 subnet,点击 “Create Subnet” 按钮:
5)创建 subnet_172_16_100_0,IP 地址为 172.16.100.0/24:
6)底层网络发生了什么变化 。在控制节点上执行 brctl show,查看当前的网络布局:
Neutron 创建了:
a. vxlan100 对应的网桥 brq1762d312-d4
b. vxlan interface vxlan-100
c. dhcp 的 tap 装备 tap4df76d0e-59
d. vxlan-100 和 tap4df76d0e-59 已经毗连到 brq1762d312-d4,vxlan100 的二层网络停当。
7)执行 ip -d link show dev vxlan-100 查看 vxlan interface 的详细设置
L2 Population 原理:
1)作用:L2 Population 是用来提高 VXLAN 网络 Scalability 的。通常我们说某个体系的 Scalability 好,其意思是:当体系的规模变大时,仍然能够高效地工作。
2)L2 Population 到底解决了怎样的 Scalability 题目,请看下图:
3)这是一个包罗 5 个节点的 VXLAN 网络,每个节点上运行了若干 VM。如今假设 Host 1 上的 VM A 想与 Host 4 上的 VM G 通讯。VM A 要做的第一步是获知 VM G 的 MAC 地址。于是 VM A 必要在整个 VXLAN 网络中广播 APR 报文:“VM G 的 MAC 地址是多少?”
4)如果 VXLAN 网络的节点许多,广播的成本会很大,如许 Scalability 就成题目了,幸好 L2 Population 出现了:L2 Population 的作用是在 VTEP 上提供 Porxy ARP 功能,使得 VTEP 能够预先获知 VXLAN 网络中如下信息:VM IP — MAC 对应关系、VM — VTEP 的对应关系:
5)当 VM A 必要与 VM G 通讯时:a)Host 1 上的 VTEP 直接响应 VM A 的 APR 请求,告之 VM G 的 MAC 地址。b)因为 Host 1 上的 VTEP 知道 VM G 位于 Host 4,会将封装好的 VXLAN 数据包直接发送给 Host 4 的 VTEP。如许就解决了 MAC 地址学习和 APR 广播的题目,从而保证了 VXLAN 的 Scalability。
6)那么下一个关键题目是:VTEP 是怎样提前获知 IP — MAC — VTEP 相干信息的呢?
答案是:a)Neutron 知道每一个 port 的状态和信息; port 生存了 IP,MAC 相干数据。b)instance 启动时,其 port 状态变化过程为:down -> build -> active。c)每当 port 状态发生变化时,Neutron 都会通过 RPC 消息通知各节点上的 Neutron agent,使得 VTEP 能够更新 VM 和 port 的相干信息。VTEP 可以根据这些信息判定出其他 Host 上都有哪些 VM,以及它们的 MAC 地址,如许就能直接与之通讯,从而避免了不须要的隧道毗连和广播。
设置 L2 Population:
1)目前 L2 Population 支持 VXLAN with Linux bridge 和 VXLAN/GRE with OVS;
2)在 /etc/neutron/plugins/ml2/ml2_conf.ini 设置 l2population mechanism driver:
3)同时在 [VXLAN] 中设置 enable L2 Population:
4)L2 Population 生效后,输入ip -d link show dev vxlan-100下令,发现创建的 vxlan-100 会多一个 Proxy ARP 功能:
5)输入bridge fdb show dev vxlan-100下令查看控制节点上的 forwarding database,可以看到 VTEP 生存了 cirros-vm2 的 port 信息:
6)cirros-vm2 的 MAC 为 fa:16:3e:1d:23:a3。 VTEP IP 为 166.66.16.11。当必要与 cirros-vm2 通讯时,控制节点 VTEP 166.66.16.10 会将封装好的 VXLAN 数据包直接发送给计算节点的 VTEP 166.66.16.11。
7)输入bridge fdb show dev vxlan-100下令查看计算节点上的 forwarding database:
5)下面我们讨论一个有趣的题目:cirros-vm3 能否 Ping 到 cirros-vm1 呢?根据我们在 linux bridge 中学到的知识,既然 cirros-vm3 和 cirros-vm1 都毗连到同一个网桥 br-int,那么它们之间应该是可以 Ping 通的。但另一方面,根据 Neutron 的计划,不同 local 网络之间是无法通讯的。那么究竟到底是怎样呢?
实验证实 cirros-vm3 无法 Ping 到 cirros-vm1。
6)下面我们必要表明同一个网桥上的 port 为什么不能通讯,让我们重新审阅一下 br-int 上各个 port 的设置。
这次我们注意到,虚拟网卡和 DHCP 对应的 port 都有一个特殊的 tag 属性。first_local_net 相干 port 其 tag 为 1;second_local_net 相干 port 其 tag 为 2。玄机就在这里了: Open vSwitch 的每个网桥都可以看作一个真正的交换机,可以支持 VLAN,这里的 tag 就是 VLAN ID。br-int 中标志 tag 1 的 port 和 标志 tag 2 的 port 分别属于不同的 VLAN,它们之间是隔离的。必要特别说明的是: Open vSwitch 中的 tag 是内部 VLAN,用于隔离网桥中的 port,与物理网络中的 VLAN 没有关系。
7)我们将 tag 信息添加到网络布局图中,如下所示:
2.5.6.2 flat network
flat network 是不带 tag 的网络,要求宿主机的物理网卡直接与 linux bridge 毗连,这意味着:每个 flat network 都会独占一个物理网卡。