云计算深度实践者。《每天5分钟玩转OpenStack》《每天5分钟玩转Docker容器技术》作者。
前面我们创建了 vlan101,今天继续部署 instance 到该 vlan network, 并讨论 instance 之间的连通性。 launch 新的 instance “cirros-vm3”,网络选择 vlan101。
前面我们创建了 vlan100,并部署了 instance,今天将继续创建第二个 vlan network “vlan101”。 subnet IP 地址为 172.16.101.0/24。 底层网络发生了什么变化 Neutron 自动创建了 vlan101 对应的网桥 brq1d7040b8-01,vlan interface eth1.101,以及 dhcp 的 tap 设备 tap5b1a2247-32。
上一节我们创建了 vlan100,今天将部署两个 instance 到 vlan 并验证其连通性。 同时我们也将讨论底层网络结构的变化。 launch 新的 instance “cirros-vm1”,网络选择 vlan100。
上一节我们在 ML2 配置中 enable 了 vlan network,今天将创建 vlan100 并讨论底层网络变化。 打开菜单 Admin -> Networks,点击 “Create Network” 按钮。
上一节我们学习了 Neutron Vlan Network 的原理,今天讨论如何在 ML2 配置中 enable 它。 首先在 /etc/neutron/plugins/ml2/ml2_conf.ini 中设置 vlan network 相关参数。
前面我们陆续学习了 Neutron local network,flat network 和 DHCP 服务,从本节将开始讨论 vlan network。 vlan network 是带 tag 的网络,是实际应用最广泛的网络类型。
前面我们已经讨论了 DHCP agent 的配置以及 namespace 如何隔离 dnsmasq 服务,本节将以 cirros-vm1 为例分析获取 DHCP IP 的详细过程。 在创建 instance 时,Neutron 会为其分配一个 port,里面包含了 MAC 和 IP 地址信息。
Neutron 通过 dnsmasq 提供 DHCP 服务,而 dnsmasq 如何独立的为每个 network 服务呢? 答案是通过 Linux Network Namespace 隔离,本节将详细讨论。
前面章节我们看到 instance 在启动过程中能够从 Neutron 的 DHCP 服务获得 IP,本节将详细讨论其内部实现机制。 Neutron 提供 DHCP 服务的组件是 DHCP agent。
上一节我们创建了 "flat_net",本节将在此网络中部署 instance 并验证连通性。 launch 新的 instance “cirros-vm1”,选择网络 falt_net。 cirros-vm1 分配到的 IP 为 172.16.1.103。
上一节我们讨论了 flat network 的原理,今天就来创建 "flat_net" 并分析底层网络的实现。 打开菜单 Admin -> Networks,点击 “Create Network” 按钮。
flat network 是不带 tag 的网络,要求宿主机的物理网卡直接与 linux bridge 连接,这意味着: 每个 flat network 都会独占一个物理网卡。 上图中 eth1 桥接到 brqXXX,为 instance 提供 flat 网络。
今天是 local network 的最后一个小节,我们将验证两个local network 的连通性。 launch 新的 instance “cirros-vm3”,网络选择 second_local_net。
GUI 中有两个地方可以创建 network: 1. Project -> Network -> Networks 这是普通用户在自己的 tenant 中创建 network 的地方。 2. Admin -> Networks 这是 admin 创建 network 的地方。
上一节在 first_local_net 中已经部署了 cirros-vm1,今天将再部署一个instance,并验证两个 instance 的连通性。 以同样的方式 launch instance “cirros-vm2” 分配的 IP 为 172.16.1.4 cirros-vm2 也被 schedule 到控制节点,virsh list 和 brctl show 输出如下 cirros-vm2 对于的 tap 设备为 tapa5bd3746-3f。
上一节 first_local_net 已经就绪,下面创建 instance 并将其连接到该网络。 将 instance 连接到 first_local_net launch 一个 instance,在“Networking”标签页面选择 first_local_net 网络。
上一节通过 Web GUI 创建了 “first_local_net”,本节我们需要搞清楚底层网络结构有了哪些变化? 点击 “first_local_net” 链接,显示 network 的 subnet 和 port 信息。
在 ML2 配置文件中 enable local network 后,本节将开始创建第一个 local network。 我们将通过 Web GUI 创建第一个 local network。
前面完成了一系列准备工作,本节开始将创建各种 Neutorn 网络,我们首先讨论 local network。 local network 的特点是不会与宿主机的任何物理网卡相连,也不关联任何的 VLAN ID。
上一节配置了 linux-bridge mechanism driver,本节再做两个准备工作: 1. 检视初始的网络状态。2. 了解 linux bridge 环境中的各种网络设备。 初始网络状态 我们首先考察实验环境最初始的网络状态。
本节开始我们将学习 Linux Bridge 如何实现 Neutron 的各种功能。首先需要配置 linux-bridge mechanism driver。Neutorn ML2 plugin 默认使用的 mechanism driver 是 open vswitch 而不是 linux bridge。
前面讨论了 Neutron 的架构和基础知识,接下来就要通过实验深入学习和实践了。 第一步就是准备实验用的物理环境,考虑如下几个问题: 需要几个节点? 如何分配节点的角色? 节点上部署哪些服务? 配几个网卡? 物理网络如何连接? 1 控制节点 + 1 计算节点 的部署方案 我们的目的是通过实验学习 Neutron 的各种特性。
Core Plugin/Agent 负责管理核心实体:net, subnet 和 port。而对于更高级的网络服务,则由 Service Plugin/Agent 管理。Service Plugin 及其 Agent 提供更丰富的扩展功能,包括路由,load balance,firewall等,如图所示: DHCPdhcp agent 通过 dnsmasq 为 instance 提供 dhcp 服务。
上一节我们讨论了 ML2 Plugin 解决的问题,本节将继续研究 ML2 的架构。 ML2 对二层网络进行抽象和建模,引入了 type driver 和 mechanism driver。 这两类 driver 解耦了 Neutron 所支持的网络类型(type)与访问这些网络类型的机制(mechanism),其结果就是使得 ML2 具有非常好的弹性,易于扩展,能够灵活支持多种 type 和 mechanism。
Neutron 的架构是非常开放的,可以支持多种 network provider,只要遵循一定的设计原则和规范。本节我们将开始讨论这个主题。先讨论一个简单的场景:在 Neutorn 中使用 linux bridge 这一种 network provider。
本节开始讨论 Neutron 的各个服务组件,首先学习 Neutron Server 。 上图是 Neutron Server 的分层结构,至上而下依次为: Core API对外提供管理 network, subnet 和 port 的 RESTful API。
前面我们讨论了 Neutron 的架构,本节讨论 Neutron 的物理部署方案:不同节点部署不同的 Neutron 服务组件。 方案1:控制节点 + 计算节点 在这个部署方案中,OpenStack 由控制节点和计算节点组成。
上次我们讨论了 Neutron 提供的功能,今天我们学习 Neutron 模块几个重要的概念。 Neutron 管理的网络资源包括 Network,subnet 和 port,下面依次介绍。 network network 是一个隔离的二层广播域。
今天我们将前一小节创建的 NFS volume “nfs-vol-1” attach 到 instance “c2”上。 这里我们重点关注 nova-compute 如何将“nfs-vol-1” attach 到“c2”。
上一节我们将 NFS volume provider 配置就绪,本节将创建 volume。 创建 volume 创建 NFS volume 操作方法与 LVM volume 一样,唯一区别是在 volume type 的下拉列表中选择“nfs”。
cinder-volume 支持多种 volume provider,前面我们一直使用的是默认的 LVM,本节我们将增加 NFS volume provider。 虽然 NFS 更多地应用在实验或小规模 cinder 环境,由于性能和缺乏高可用的原因在生产环境中不太可能使用,但是学习 NFS volume provider 的意义在于:1. 理解 cinder-volume 如何支持多 backend2. 更重要的,可以理解 cinder-volume,nova-compute 和 volume provider 是如何协同工作,共同为 instance 提供块存储。
Volume 除了可以用作 instance 的数据盘,也可以作为启动盘(Bootable Volume),那么如何使 volume 成为 bootable 呢? 现在我们打开 instance 的 launch 操作界面。
前面我们 backup 了 voluem,今天我们将讨论如何 restore volume。 restore 的过程其实很简单,两步走: 在存储节点上创建一个空白 volume。 将 backup 的数据 copy 到空白 voluem 上。
Snapshot 可以为 volume 创建快照,快照中保存了 volume 当前的状态,以后可以通过 snapshot 回溯。snapshot 操作实现比较简单,流程图如下: 向 cinder-api 发送 snapshot 请求 cinder-api 发送消息 cinder-volume 执行 snapshot 操作 下面我们详细讨论每一个步骤。
今天讨论 cinder 如何删除 volume 。 状态为 Available 的 volume 才能够被 delete。如果 volume 当前已经 attach 到 instance,需要先 detach 后才能 delete。
前面我们讨论了 volume 的 attach 和 detach 操作,今天讨论如何扩大 volume 的容量。为了保护现有数据,cinder 不允许缩小 volume。 Extend 操作用于扩大 Volume 的容量,状态为 Available 的 volume 才能够被 extend。
上一节我们成功地通过 attach 操作为 instance 添加了 volume,而与之相对的操作是 detach,就是将 volume 从 instance 上卸载下来。 下图是 Detach 操作的流程图 向 cinder-api 发送 detach 请求 cinder-api 发送消息 nova-compute detach volume cinder-volume 删除 target 下面我们详细讨论每一个步骤。
上一节我们讨论了 attach volume 操作中 cinder-api 的工作,本节讨论 cinder-volume 和 nova-compute 如何将 volume attach 到 Instance。
上一节我们创建了 volume,本节讨论如何将 volume attach 到 Instance,今天是第一部分。 Volume 的最主要用途是作为虚拟硬盘提供给 instance 使用。Volume 是通过 Attach 操作挂载到 instance 上的。
本节是创建 Volume 的第三部分,也是最后一部分:cinder-volume 的处理过程。 第一部分和第二部分可以参考前面两个小节。cinder-volume 通过 driver 创建 volume,日志为 /opt/stack/logs/c-vol.log。
上一节我们讨论了 Cinder 创建 Volume 的第一部分,cinder-api 的操作,本节继续第二部分,cinder-scheduler 调度工作。 cinder-scheduler 执行调度 cinder-scheduler 执行调度算法,通过 Filter 和 Weigher 挑选最优的存储节点 日志为 /opt/stack/logs/c-sch.log。
前面已经学习了 Cinder 的架构和相关组件,从本节我们开始详细分析 Cinder 的各种操作,首先讨论 Cinder 如何创建 volume。 Create 操作流程如下: 客户(可以是 OpenStack 最终用户,也可以是其他程序)向 API(cinder-api)发送请求:“帮我创建一个 volume”。
Cinder 真正负责 Volume 管理的组件是 volume provider。 Cinder 支持多种 volume provider,LVM 是默认的 volume provider。Devstack 安装之后,/etc/cinder/cinder 已经配置好了 LVM,如下图所示: 上面的配置定义了名为“lvmdriver-1”的 volume provider,也称作 back-end。
上一节我们详细讨论了 cinder-api 和 cinder-volume,今天讨论另一个重要的 Cinder 组件 cinder-scheduler。 创建 Volume 时,cinder-scheduler 会基于容量、Volume Type 等条件选择出最合适的存储节点,然后让其创建 Volume。
本节我们将详细讲解 Cinder 的各个子服务。 cinder-api cinder-api 是整个 Cinder 组件的门户,所有 cinder 的请求都首先由 nova-api 处理。
上一节介绍了 Cinder 的架构,这节讨论 Cinder 个组件如何协同工作及其设计思想。 从 volume 创建流程看 cinder-* 子服务如何协同工作 对于 Cinder 学习来说,Volume 创建是一个非常好的场景,涉及各个 cinder-* 子服务,下面是流程图。
从本节开始我们学习 OpenStack 的 Block Storage Service,Cinder 理解 Block Storage 操作系统获得存储空间的方式一般有两种: 通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区、格式化、创建文件系统;或者直接使用裸硬盘存储数据(数据库) 通过 NFS、CIFS 等 协议,mount 远程的文件系统 第一种裸硬盘的方式叫做 Block Storage(块存储),每个裸硬盘通常也称作 Volume(卷) 第二种叫做文件系统存储。
前面我们讨论了 Instance 的若干操作,有的操作功能比较类似,也有各自的适用场景,现在是时候系统地总结一下了。 如上图所示,我们把对 Instance 的管理按运维工作的场景分为两类:常规操作和故障处理。
Rebuild 可以恢复损坏的 instance。 那如果是宿主机坏了怎么办呢? 比如硬件故障或者断电造成整台计算节点无法工作,该节点上运行的 instance 如何恢复呢? 用 Shelve 或者 Migrate 可不可以? 很不幸,这两个操作都要求 instance 所在计算节点的 nova-compute 服务正常运行。
Migrate 操作会先将 instance 停掉,也就是所谓的“冷迁移”。而 Live Migrate 是“热迁移”,也叫“在线迁移”,instance不会停机。 Live Migrate 分两种: 源和目标节点没有共享存储,instance 在迁移的时候需要将其镜像文件从源节点传到目标节点,这叫做 Block Migration(块迁移) 源和目标节点共享存储,instance 的镜像文件不需要迁移,只需要将 instance 的状态迁移到目标节点。