1. 项目概述从零搭建一个云计算虚拟化实验环境几年前我刚接触云计算时总觉得那些概念——弹性伸缩、资源池化、软件定义网络——听起来很酷但离自己很远。直到我决定亲手从零开始在几台旧电脑上搭建一个属于自己的“迷你云”实验环境一切才变得清晰起来。这个“云计算虚拟机实验”项目本质上就是一个将理论落地的沙盘。它不是为了替代成熟的公有云或企业级私有云而是为了让你我这样的开发者、运维人员或学生能在一个安全、可控的环境里彻底搞懂虚拟化、网络、存储这些云计算的基石是如何协同工作的。无论你是想验证一个架构设计学习KVM、OpenStack或Docker的底层机制还是单纯想有一个随时可以“折腾”又不怕搞崩的生产环境自己搭建一套实验环境都是性价比最高的选择。它让你对“云”的理解从抽象的PPT和文档变成可以敲命令、看日志、调配置的真实体验。2. 实验环境整体设计与核心组件选型搭建实验环境第一步不是急着装软件而是要想清楚目标和边界。我们这个实验的核心目标是模拟一个具备IaaS基础设施即服务基础能力的微型云平台能够创建、管理、监控虚拟机并实现基本的网络隔离与通信。基于这个目标我选择了最经典、也最贴近工业实践的组件栈底层虚拟化用KVM管理平台用OpenStack辅以一些必要的网络和存储工具。2.1 为什么选择KVMOpenStack这套组合市面上虚拟化方案很多有VMware ESXi这样的商业王者也有VirtualBox、Hyper-V这类桌面级方案。选择KVM首要原因是它内核原生。作为Linux内核的一部分KVM基于内核的虚拟机直接利用CPU的硬件虚拟化支持Intel VT-x或AMD-V性能损耗极低几乎与物理机无异。这对于实验后期进行性能压测或高负载模拟至关重要。其次它是开源免费的这意味着你可以无限制地使用、修改和分发完全符合实验的“可深度定制”需求。最后KVM是众多公有云如AWS、阿里云早期和OpenStack的默认或首选虚拟化驱动学习它等于直通行业核心。而选择OpenStack是因为它是开源IaaS领域的事实标准。它不是一个单一的软件而是一个由众多独立服务项目组成的庞大生态系统如计算Nova、网络Neutron、镜像Glance、身份认证Keystone等。通过部署OpenStack你不仅能学会如何启动一个虚拟机更能理解这些服务如何通过REST API相互调用如何通过消息队列如RabbitMQ异步通信从而深刻把握云平台的架构精髓。虽然部署过程相对复杂但这份复杂性正是其价值的体现——它逼着你去理解每一个配置项的意义。2.2 硬件与基础软件准备清单实验环境对硬件有一定要求但并非高不可攀。我的实验环境基于一台淘汰的服务器或一台性能尚可的台式机配置如下你可以根据实际情况调整CPU: 支持硬件虚拟化VT-x/AMD-V的Intel i5或AMD Ryzen 5及以上。核心数越多越好建议至少4核8线程。务必在BIOS中开启虚拟化支持。内存: 这是最关键的资源。OpenStack控制节点本身需要至少8GB内存若要同时运行多个虚拟机实例建议总内存不低于16GB32GB则更为从容。存储: 建议使用SSD。系统盘至少100GB用于安装宿主机OS和OpenStack组件。另外准备一块大容量硬盘机械或SSD均可500GB以上作为额外的存储卷或镜像仓库。网络: 至少两个物理网络接口NIC。一个用于管理网络承载OpenStack各服务间的内部通信、API访问另一个用于提供者网络虚拟机连接外部互联网或内部数据网络。如果只有单网卡可以通过VLAN进行逻辑隔离但配置会复杂一些。宿主机操作系统:Ubuntu Server 20.04 LTS。这是2020年时的稳定长期支持版本拥有最广泛的社区支持和文档。选择LTS版本能确保在实验周期内获得稳定的安全更新避免因版本迭代带来的兼容性问题。注意如果你的机器是笔记本电脑且只有单网卡可以考虑使用USB外接千兆网卡来增加一个物理接口这会极大简化后续的网络配置难度。虚拟网卡桥接在单物理口上做复杂网络实验时容易遇到意料之外的包转发问题。3. 底层基石KVM虚拟化平台部署与调优OpenStack是管理者KVM才是干活的“工人”。我们必须先把KVM这个底层平台搭建稳固。3.1 宿主机系统初始化与KVM安装首先在准备好的硬件上安装Ubuntu Server 20.04。安装时建议选择“最小化安装”并勾选“OpenSSH server”以便远程管理。系统安装完成后第一件事是更新软件源并升级系统sudo apt update sudo apt upgrade -y sudo apt autoremove -y接下来安装KVM及其相关的管理工具套件sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-managerqemu-kvm: 提供处理器和硬件仿真的核心软件。libvirt-daemon-systemlibvirt-clients: Libvirt是管理虚拟化平台的工具包和API它提供了一个统一的方式来管理KVM、Xen等。daemon是服务端clients是客户端工具如virsh。bridge-utils: 用于配置Linux网桥的命令行工具这是实现虚拟机网络连接的关键。virt-install: 用于通过命令行创建虚拟机的工具。virt-manager: 一个图形化的虚拟机管理工具需要桌面环境在纯服务器上可以不装但初学者在本地实验时很有用。安装完成后将当前用户加入libvirt和kvm用户组以便无需sudo即可管理虚拟机sudo adduser whoami libvirt sudo adduser whoami kvm注销并重新登录使组权限生效。然后启动libvirt服务并设置开机自启sudo systemctl start libvirtd sudo systemctl enable libvirtd验证KVM是否安装成功且硬件虚拟化支持已开启virt-host-validate如果看到“QEMU: Checking for hardware virtualization... PASS”和“KVM: Checking for KVM... PASS”等字样说明一切就绪。3.2 网络配置Linux Bridge的创建与理解这是第一个容易踩坑的地方。默认安装后Libvirt会创建一个名为virbr0的虚拟网桥并运行一个内置的DHCP服务器dnsmasq。这个“默认网络”default network使用NAT模式虚拟机可以通过它访问外网但外部无法直接访问虚拟机。对于简单的单机实验这足够了。但我们的目标是搭建云平台需要更灵活的网络模型。我推荐在宿主机上创建一个桥接网络将物理网卡例如ens33桥接到一个虚拟网桥例如br0上。这样连接到br0的虚拟机就像直接连接到了物理网络会从你的路由器获取IP地址与宿主机处于同一局域网段拥有独立的网络身份。操作步骤如下备份原网络配置sudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.backup编辑Netplan配置文件Ubuntu 18.04使用Netplan管理网络sudo nano /etc/netplan/00-installer-config.yaml将内容修改为如下示例假设你的物理网卡是ens33请根据ip addr命令的实际输出修改network: version: 2 renderer: networkd ethernets: ens33: dhcp4: no # 物理网卡本身不再获取IP bridges: br0: interfaces: [ens33] # 将物理网卡ens33加入桥接 dhcp4: yes # 由桥接接口br0来获取IP parameters: stp: false # 在简单环境中可关闭生成树协议 forward-delay: 0应用配置sudo netplan apply执行后使用ip addr show br0查看br0是否获得了IP地址。此时宿主机自身的IP地址已经绑定在br0上ens33则变成了一个单纯的“端口”。实操心得在应用Netplan配置前最好确保你有另一种方式如物理控制台或另一个活跃的网络连接能访问到这台机器。因为配置错误可能导致网络中断。一个稳妥的做法是先在虚拟机上测试这个配置成功后再应用到物理宿主机。3.3 使用virt-install创建第一个测试虚拟机现在我们可以抛开OpenStack先用纯KVM创建一个虚拟机验证底层虚拟化是否工作正常。你需要准备一个系统镜像文件例如从Ubuntu官网下载的ubuntu-20.04-server-amd64.iso。sudo virt-install \ --name test-vm-01 \ --ram 2048 \ --disk path/var/lib/libvirt/images/test-vm-01.qcow2,size20,formatqcow2 \ --vcpus 2 \ --os-type linux \ --os-variant ubuntu20.04 \ --network bridgebr0,modelvirtio \ --graphics spice \ --console pty,target_typeserial \ --cdrom /path/to/your/ubuntu-20.04-server-amd64.iso参数解释--name: 虚拟机名称。--ram: 分配内存大小MB。--disk: 指定虚拟磁盘。path是磁盘文件路径size是大小GBformatqcow2是推荐格式支持快照和稀疏分配即用多少占多少物理空间。--vcpus: 虚拟CPU核心数。--network: 网络配置。bridgebr0指定使用我们刚才创建的桥接网络modelvirtio使用半虚拟化驱动以获得最佳网络性能。--graphics: 图形显示协议spice性能较好。--console: 配置串行控制台便于在无图形界面时通过virsh console命令连接。--cdrom: 指定安装镜像。命令执行后如果安装了图形界面virt-viewer会自动弹出进行安装。如果没有可以通过virsh console test-vm-01连接到串行控制台进行文本安装。创建成功后使用virsh list --all查看所有虚拟机状态。这个阶段成功就证明KVM和网络桥接的基石已经稳固可以向上构建OpenStack了。4. OpenStack控制节点部署详解以Train版为例OpenStack版本迭代很快我们选择2020年前后稳定的Train版本进行部署。部署OpenStack有多种方式如DevStack快速开发、PackstackRHEL/CentOS、Kolla-Ansible容器化。为了最大化学习价值我选择使用OpenStack官方推荐的、也是最经典的手动部署方式即通过APT包管理逐个安装和配置服务。注意手动部署过程繁琐但能让你清晰地看到每个服务的配置文件、数据库表、消息队列交互是理解OpenStack架构的不二法门。请预留充足时间并准备好查阅日志排错。4.1 基础环境准备数据库、消息队列与MemcachedOpenStack服务之间需要共享数据和通信因此我们先搭建这些基础设施。安装MySQLMariaDB数据库sudo apt install -y mariadb-server python3-pymysql创建配置文件/etc/mysql/mariadb.conf.d/99-openstack.cnf设置绑定地址、字符集和优化参数重点是启用innodb_file_per_table和调整缓冲池大小根据你内存调整如innodb_buffer_pool_size 256M。然后重启数据库并运行安全初始化脚本。安装RabbitMQ消息队列sudo apt install -y rabbitmq-server添加OpenStack专用用户和虚拟主机sudo rabbitmqctl add_user openstack RABBIT_PASS # 请替换RABBIT_PASS为强密码 sudo rabbitmqctl set_permissions openstack .* .* .*安装Memcached缓存服务sudo apt install -y memcached python3-memcache编辑/etc/memcached.conf将-l 127.0.0.1改为-l 0.0.0.0或-l 你的管理网IP以允许其他服务访问。然后重启服务。4.2 身份认证服务Keystone部署Keystone是OpenStack的入口管理所有用户、角色、项目和服务的认证与授权。创建Keystone数据库mysql -u root -p MariaDB [(none)] CREATE DATABASE keystone; MariaDB [(none)] GRANT ALL PRIVILEGES ON keystone.* TO keystonelocalhost IDENTIFIED BY KEYSTONE_DBPASS; MariaDB [(none)] GRANT ALL PRIVILEGES ON keystone.* TO keystone% IDENTIFIED BY KEYSTONE_DBPASS;安装和配置Keystone组件sudo apt install -y keystone apache2 libapache2-mod-wsgi-py3编辑/etc/keystone/keystone.conf配置数据库连接、Token提供者Fernet、Memcached等。然后填充数据库sudo su -s /bin/sh -c keystone-manage db_sync keystone初始化Fernet密钥库sudo keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone sudo keystone-manage credential_setup --keystone-user keystone --keystone-group keystone引导身份服务这里创建默认的admin项目和用户sudo keystone-manage bootstrap --bootstrap-password ADMIN_PASS \ --bootstrap-admin-url http://controller:5000/v3/ \ --bootstrap-internal-url http://controller:5000/v3/ \ --bootstrap-public-url http://controller:5000/v3/ \ --bootstrap-region-id RegionOne配置Apache HTTP Server将Keystone作为WSGI应用运行在Apache下编辑/etc/apache2/sites-available/wsgi-keystone.conf并启用站点。重启Apache后设置环境变量就可以用openstack命令行工具进行验证了。4.3 镜像服务Glance部署Glance负责存储和管理虚拟机镜像模板。创建数据库和用户同Keystone步骤。安装软件包sudo apt install -y glance。配置/etc/glance/glance-api.conf和/etc/glance/glance-registry.conf主要配置数据库连接、Keystone认证、存储后端这里使用本地文件系统生产环境会用Ceph/Swift等。填充数据库并重启服务。下载一个测试镜像如CirrOS一个微型Linux并上传到Glancewget http://download.cirros-cloud.net/0.5.2/cirros-0.5.2-x86_64-disk.img openstack image create cirros \ --file cirros-0.5.2-x86_64-disk.img \ --disk-format qcow2 --container-format bare \ --public使用openstack image list查看上传成功的镜像。4.4 计算服务Nova部署Nova是OpenStack的核心负责虚拟机实例的生命周期管理。它包含多个组件nova-api接收请求、nova-scheduler调度决策、nova-compute在计算节点上运行虚拟机、nova-conductor数据库代理等。在控制节点上我们先安装除nova-compute外的所有组件。创建Nova数据库和用户。安装控制节点组件sudo apt install -y nova-api nova-conductor nova-novncproxy nova-scheduler。配置/etc/nova/nova.conf。这是最复杂的配置文件之一需要配置数据库、消息队列、Keystone认证、Glance镜像地址、网络接口my_ip设置为控制节点的管理IP、VNC代理地址等。填充数据库并重启所有Nova服务。4.5 网络服务Neutron部署Neutron提供网络即服务NaaS。我们采用最简单的provider networks模式即OpenStack只负责创建端口并将其连接到宿主机上已有的物理网络我们之前创建的br0。创建Neutron数据库和用户。安装控制节点组件sudo apt install -y neutron-server neutron-plugin-ml2 neutron-linuxbridge-agent neutron-dhcp-agent neutron-metadata-agent。配置/etc/neutron/neutron.conf核心配置消息队列、Keystone等和/etc/neutron/plugins/ml2/ml2_conf.iniML2插件配置定义网络类型如flat, vlan, vxlan等。配置Linux Bridge代理/etc/neutron/plugins/ml2/linuxbridge_agent.ini指定物理网络映射如physical_interface_mappings provider:ens33和桥接名称。配置DHCP和Metadata代理。重启所有Neutron服务并将Neutron网络信息同步到Nova。至此OpenStack控制节点的主要服务已部署完毕。接下来需要在另一台机器或同一台机器的不同资源分区上部署计算节点。5. 计算节点部署与集成计算节点是实际运行虚拟机的地方。它可以是一台独立的物理服务器也可以是与控制节点共享资源的虚拟机嵌套虚拟化性能有损耗仅用于功能测试。5.1 计算节点基础环境准备在计算节点上同样需要安装KVM、Libvirt并配置网络桥接br0步骤与控制节点的KVM安装完全一致。确保计算节点与控制节点之间管理网络通常是一个独立的VLAN或物理网络可以互相通信主机名解析正常可通过/etc/hosts文件互相添加记录。5.2 安装与配置Nova-Compute安装软件包sudo apt install -y nova-compute配置/etc/nova/nova.conf。大部分配置与控制节点类似但需要特别关注[DEFAULT]部分的transport_url消息队列地址和my_ip计算节点的管理IP。[vnc]部分enabledtrueserver_listen0.0.0.0server_proxyclient_address$my_ipnovncproxy_base_urlhttp://控制节点管理IP:6080/vnc_auto.html。这配置了VNC控制台的访问路径。[libvirt]部分virt_typekvm或qemu如果CPU不支持硬件虚拟化则用qemu性能差很多。检查计算节点是否支持硬件虚拟化egrep -c (vmx|svm) /proc/cpuinfo如果输出大于0则支持。如果不支持需要在/etc/nova/nova-compute.conf中设置[libvirt] virt_type qemu。重启Nova-Compute服务sudo systemctl restart nova-compute。5.3 安装与配置Neutron Linux Bridge Agent计算节点也需要网络代理来连接虚拟机网络。安装软件包sudo apt install -y neutron-linuxbridge-agent配置/etc/neutron/neutron.conf和/etc/neutron/plugins/ml2/linuxbridge_agent.ini内容与控制节点的Neutron代理配置相呼应特别是physical_interface_mappings必须指向计算节点上连接提供者网络的物理网卡例如ens33。重启Neutron代理服务。5.4 将计算节点添加到控制节点回到控制节点使用Nova命令发现并注册计算节点openstack compute service list --service nova-compute sudo su -s /bin/sh -c nova-manage cell_v2 discover_hosts --verbose nova如果一切顺利你应该能在控制节点的openstack hypervisor list命令中看到新加入的计算节点状态为up。6. 创建第一个云虚拟机完整流程与排错环境搭建完毕现在让我们通过OpenStack DashboardHorizon或命令行创建第一个虚拟机。6.1 通过Dashboard创建虚拟机安装DashboardHorizonsudo apt install -y openstack-dashboard配置/etc/openstack-dashboard/local_settings.py主要修改OPENSTACK_HOST为控制节点IPALLOWED_HOSTS等。重启Apache服务。登录Dashboard浏览器访问http://控制节点IP/dashboard使用Keystone引导时创建的admin用户和密码登录。创建流程项目 - 计算 - 实例 - 启动实例。详情输入实例名称选择之前创建的admin项目。源选择镜像源从“可用”栏选择我们上传的cirros镜像为引导卷创建新卷大小1GB。实例类型选择或创建一个小型规格如m1.tiny1 vCPU 512MB RAM 1GB 根磁盘。网络在“可用网络”中选择Neutron创建的提供者网络例如provider将其添加到“已选网络”。安全组选择default安全组默认只允许ICMP和SSH入站但CirrOS镜像默认没有SSH需要添加允许所有端口的规则用于测试生产环境切勿如此。启动点击“启动实例”。6.2 通过命令行创建虚拟机对于自动化或更喜欢命令行的用户创建密钥对用于SSH登录openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey创建安全组规则允许ICMP和所有TCP端口用于测试openstack security group rule create --proto icmp default openstack security group rule create --proto tcp --dst-port 1:65535 default启动实例openstack server create \ --image cirros \ --flavor m1.tiny \ --key-name mykey \ --network provider \ vm-test-01查看状态和分配到的IPopenstack server list openstack server show vm-test-01 -c addresses6.3 连接与验证如果使用CirrOS镜像获取到IP后例如192.168.1.100可以尝试ping通并通过VNC控制台登录用户名cirros密码gocubsgo。在Dashboard的实例详情页点击“控制台”标签页即可打开VNC窗口。7. 实验环境中的常见问题与深度排查实录搭建过程极少一帆风顺以下是我在多次实验中遇到的典型问题及解决方法。7.1 虚拟机创建失败状态显示“Error”这是最常见的问题。排查思路是从下往上从里到外。查看Nova计算节点日志# 在计算节点上 sudo tail -f /var/log/nova/nova-compute.log创建虚拟机时观察此日志的输出。常见错误No valid host was found: 调度失败。检查计算节点服务是否up资源是否充足内存、磁盘以及Nova调度器过滤器配置。DiskFilter: (ram) 512 (disk) 1024 ...: 资源不足。检查计算节点的可用资源openstack hypervisor show id。libvirtError: internal error: ...: 通常是Libvirt/QEMU层面错误。检查/var/log/libvirt/qemu/instance-name.log。可能是镜像格式问题、存储路径权限问题/var/lib/nova/instances/目录的属主应为nova:nova或KVM内核模块未加载。查看Nova API和控制节点日志# 在控制节点上 sudo tail -f /var/log/nova/nova-api.log /var/log/nova/nova-scheduler.log /var/log/nova/nova-conductor.log看请求是否被正确接收、调度和传递。检查Neutron网络虚拟机创建需要网络端口。查看端口创建状态openstack port list --server vm-id如果端口状态不是ACTIVE检查Neutron代理日志/var/log/neutron/linuxbridge-agent.log看是否有桥接接口添加失败等问题。7.2 虚拟机无法获取IP地址DHCP失败虚拟机启动后在控制台里执行ifconfig或ip addr发现只有回环地址lo没有分配到IP。检查Neutron DHCP Agent确保计算节点上的neutron-dhcp-agent服务正在运行。检查网络命名空间OpenStack为每个网络非提供商网络创建独立的网络命名空间namespace。sudo ip netns list # 找到类似 qdhcp-network-id 的命名空间 sudo ip netns exec qdhcp-network-id ip addr查看该命名空间内是否有tap设备并获取到了IP。如果没有可能是DHCP进程启动失败查看/var/log/neutron/dhcp-agent.log。检查安全组和网络策略确保安全组规则允许DHCP客户端端口UDP 67的通信。检查计算节点的网络桥接确保虚拟机的虚拟网卡tap设备被正确添加到了Linux Bridgebr0上。sudo brctl show br0在虚拟机启动前后对比此命令输出看是否有新的vnet*接口加入。7.3 虚拟机无法访问外网或外部无法访问虚拟机这通常与网络配置模式有关。情况一使用NAT网络默认网络虚拟机可以访问外网但外网无法直接访问虚拟机。这是预期行为。需要配置浮动IPFloating IP或端口转发。情况二使用提供商网络桥接到物理网络无法访问外网检查宿主机计算节点的br0是否已启用IP转发sysctl net.ipv4.ip_forward1以及是否配置了正确的防火墙规则NAT或路由。在宿主机上尝试ping外部网关和DNS。外部无法访问虚拟机检查物理交换机的端口配置。如果宿主机网卡连接的是交换机的access口需要确保该端口允许虚拟机所用VLAN通过如果是trunk口则需确保Neutron配置的VLAN ID在trunk允许列表中。此外检查宿主机和虚拟机的防火墙是否屏蔽了相关端口。7.4 OpenStack服务状态异常使用systemctl命令检查关键服务的状态sudo systemctl status nova-api neutron-server apache2 mariadb rabbitmq-server如果服务状态不是active (running)使用sudo journalctl -u service-name -f或查看对应的/var/log/下的日志文件。常见原因包括配置文件语法错误YAML或INI格式错误如缩进不对、缺少引号。数据库连接失败检查数据库服务是否运行以及配置文件中密码、主机名是否正确。消息队列连接失败检查RabbitMQ服务状态以及用户权限。依赖服务未启动例如Keystone未启动会导致其他所有服务认证失败。7.5 性能问题排查如果虚拟机运行缓慢可以从以下几个方面排查CPU在计算节点上使用virsh vcpuinfo instance-name查看虚拟CPU的绑定和状态。确保宿主机没有过载。使用top或htop查看qemu-system-x86_64进程的CPU占用。内存检查是否发生了内存交换swapping。使用free -h和swapon -s查看。KVM虚拟机内存是锁定的如果宿主机物理内存不足会导致其他进程被交换影响整体性能。磁盘I/O虚拟机磁盘如果是存储在机械硬盘上I/O性能会成为瓶颈。使用iostat -x 1观察磁盘利用率%util和响应时间await。考虑使用SSD或配置缓存模式如writethrough,writeback在nova.conf的[libvirt]部分配置disk_cachemodes。网络I/O确保虚拟网卡使用virtio驱动在创建镜像或实例类型中指定。在宿主机上使用sar -n DEV 1监控网络流量和错误包。8. 实验进阶探索更复杂的云场景基础环境跑通后这个实验平台的价值才真正开始显现。你可以尝试以下方向进行深度探索多节点扩展添加第二个、第三个计算节点体验资源池化和高可用。研究Nova调度器的不同过滤器如ComputeFilter,RamFilter,DiskFilter和权重器Weight。高级网络从简单的提供商网络flat切换到VLAN或VXLAN网络创建真正的租户私有网络self-service network并配置路由器实现内外网互通。学习Neutron的ML2插件机制、L3 Agent和DHCP Agent的工作原理。块存储服务Cinder部署Cinder为虚拟机提供可挂载、卸载的持久化块存储卷。理解卷类型volume type、后端驱动LVM, Ceph RBD和快照功能。对象存储服务Swift搭建一个迷你版的“云盘”学习对象存储的环ring机制、数据一致性哈希和最终一致性模型。编排服务Heat编写YAML格式的模板实现“一键”部署包含多个虚拟机、网络、存储卷的复杂应用栈体验基础设施即代码IaC。监控与告警Ceilometer/Gnocchi/Aodh收集虚拟机的CPU、内存、网络使用指标并设置阈值告警。学习时间序列数据库在云监控中的应用。容器化部署Kolla-Ansible厌倦了手动部署的繁琐尝试使用Kolla-Ansible通过Ansible剧本将所有OpenStack服务以Docker容器的方式部署体验声明式部署和快速升级。这个“云计算虚拟机实验”环境就像是一个云计算的乐高套装。从最初几块基础的KVM和OpenStack积木开始你可以不断添加新的组件构建出越来越复杂、越来越接近生产环境的系统。每一次部署失败和排查问题的过程都是对云计算底层原理的一次深刻叩问。当你能从容地在这个自建的小云平台上规划网络、调度资源、部署应用时你对公有云上那些黑盒服务的理解将不再是浮于表面的操作而是洞察其本质的掌控。这正是这个实验最大的价值所在。