启动实例

所有操作均在控制节点上完成。

建立虚拟网络

网络选项一

实例将通过提供商的第二层网络连接到外部网络。

admin 以及其他特权用户必须建立该类型网络。

网络拓扑图:

Networking Option 1: Provider networks - Overview
Networking Option 1: Provider networks - Overview

网络连接图:

Networking Option 1: Provider networks - Connectivity
Networking Option 1: Provider networks - Connectivity
建立网络与子网

导入 admin 环境变量:

1
$ .admin-openrc

建立网络:

1
$ openstack network create --share --external --provider-physical-network provider --provider-network-type flat provider

建立子网:

1
$ openstack subnet create --network provider --allocation-pool start=START_IP_ADDRESS,end=END_IP_ADDRESS --dns-nameserver DNS_RESOLVER --gateway PROVIDER_NETWORK_GATEWAY --subnet-range PROVIDER_NETWORK_CIDR provider
  • START_IP_ADDRESSEND_IP_ADDRESS 替换为需要的 IP 段;
  • DNS_RESOLVER 替换为需要的 DNS 服务器 IP 地址;
  • PROVIDER_NETWORK_GATEWAY 替换为目的网关;
  • PROVIDER_NETWORK_CIDR 替换为目标网络的 CIDR 地址,如 192.168.1.0/24

网络选项二

实例将通过 DHCP 分配到内部子网段的 IP 地址,并能够通过 NAT 连接外部网络。外部网络主机需要通过浮动 IP 才能够访问到实例。

在建立自服务网络前必须先建立提供商网络(即网络选项一)。

网络拓扑图:

Networking Option 2: Self-service networks - Overview
Networking Option 2: Self-service networks - Overview

网络连接图:

Networking Option 2: Self-service networks - Connectivity
Networking Option 2: Self-service networks - Connectivity
建立网络与子网

导入 demo 用户环境变量:

1
$ . demo-openrc

建立网络:

1
$ openstack network create selfservice

建立子网:

1
$ openstack subnet create --network selfservice --dns-nameserver DNS_RESOLVER --gateway SELFSERVICE_NETWORK_GATEWAY --subnet-range SELFSERVICE_NETWORK_CIDR selfservice
  • DNS_RESOLVER 替换为需要的 DNS 服务器 IP 地址;
  • SELFSERVICE_NETWORK_GATEWAY 替换为目的网关;
  • SELFSERVICE_NETWORK_CIDR 替换为目的网络的 CIDR 地址,如 172.16.1.0/24
新建路由

导入 demo 环境变量:

1
$ . demo-openrc

新建路由:

1
$ openstack router create router
设置路由

将自服务网络中的子网接入路由:

1
$ neutron router-interface-add router selfservice

设置路由网关:

1
$ neutron router-gateway-set router provider
测试路由

导入 admin 环境变量:

1
$ . admin-openrc

查看网络命名空间:

1
$ ip netns

应该能看到一个 qrouter 命名空间和两个 qdhcp 命名空间。

查看网关 IP

1
$ neutron router-port-list router

测试连通性:

1
$ ping -c 4 GATEWAY_IP

GATEWAY_IP 替换成上一步中输出的 IP

新建虚拟主机类型

新建 m1.nano

1
$ openstack flavor create --id 0 --vcpus 1 --ram 64 --disk 1 m1.nano

新建密钥对

导入 demo 环境变量:

1
$ . demo-openrc

生成密钥对:

1
$ ssh-keygen -q -N ""

将公钥添加至密钥对:

1
$ openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey

查看密钥对:

1
$ openstack keypair list

添加安全组规则

允许 ICMP 通信:

1
$ openstack security group rule create --proto icmp default

若不打开可能会 ping 不通虚拟机。

允许 SSH 连接:

1
$ openstack security group rule create --proto tcp --dst-port 22 default

启动实例

导入 demo 用户环境变量:

1
$ . demo-openrc

查看虚拟主机类型:

1
$ openstack flavor list

查看镜像状态:

1
$ openstack image list

查看可用网络:

1
$ openstack network list

查看安全组信息:

1
$ openstack security group list

启动基于提供商网络(网络选项一)的实例:

1
$ openstack server create --flavor m1.nano --image IMAGE_NAME --nic net-id=PROVIDER_NET_ID --security-group default --key-name mykey provider-instance

IMAGE_NAMEPROVIDER_NET_ID 更改为需要选用的配置。

启动基于自服务网络(网络选项二)的实例:

1
$ openstack server create --flavor m1.nano --image IMAGE_NAME --nic net-id=SELFSERVICE_NET_ID --security-group default --key-name mykey selfservice-instance

IMAGE_NAMESELFSERVICE_NET_ID 更改为需要选用的配置。

实例无法启动: 错误信息:InvalidURL: Failed to parse: http:controller:9292 错误原因:控制节点 /etc/nova/nova.conf[glance] 部分的 api_servers 的值有误。 解决方案:补全 HTTP 协议头,将 http: 改写为 http://

查看实例启动状态:

1
$ openstack server list

实例启动错误 status:ERROR: 错误信息:VirtualInterfaceCreateException: Virtual Interface creation failed 错误原因:libvirt 再启动之前会等待 neutron 确认插件情况。这使得 libvirt 驱动在真正的虚拟机启动之前使用实例事件机制去等待 neutronVIF 信息。等待超时后,就会报虚拟机启动错误。 解决方案:在计算节点的 /etc/nova/nova.conf[DEFAULT] 部分中增加:

1
2
vif_plugging_is_fatal: false 
vif_plugging_timeout: 0

然后重新启动 openstack-nova-compute 即可。

登录实例

通过 VNC 登入

1
$ openstack console url show INSTANCE_NAME

INSTANCE_NAME 替换成自己的实例名称。

通过给出的 URL 登录实例。

通过命令行登入

查看网络情况:

1
$ openstack network list

查看虚拟网络中的命名空间:

1
$ ip netns

通过指定命名空间执行命令登入:

1
$ ip netns exec NETNS_NAME ssh USER@SERVER_IP_ADDRESS

需要将 NETNS_NAMEUSERSERVER_IP_ADDRESS 更换成目标服务器的信息。

验证网络连通性

1
2
$ ping -c 4 GATEWAY_IP
$ ping -c 4 triplez.cn

GATEWAY_IP 改为当前加入网络的网关 IP

CirrOS 启动卡在 further output written to /dev/ttys0 错误信息:further output written to /dev/ttys0 错误原因:无法获取网卡 IP 解决方案:在计算节点上运行 sudo systemctl restart openstack-compute neutron-linuxbridge-agent 即可。

实例无法联网: 错误信息:获取不到 IP 错误原因:更改了 nova-compute 模块后没有重启计算节点上的 neutron-linuxbridge-agent 服务。 解决方案:在计算节点上运行 sudo systemctl restart openstack-compute neutron-linuxbridge-agent 即可。

实例无法 ping 通域名: 错误信息:ping: bad address ’triplez.cn’ 错误原因:初始化的 DNS 服务不可用。 解决方案:移除原来子网中设置的 DNS 服务器,新增 8.8.8.89.9.9.9 公共 DNS 服务器。

添加浮动 IP

仅针对自服务网络(网络选项二)。

生成浮动 IP

1
$ openstack floating ip create provider

将生成的浮动 IP 绑定到目标实例 selfservice-instance 上:

1
$ openstack server add floating ip selfservice-instance FLOATING_IP

FLOATING_IP 改为生成的浮动 IP 地址。

在控制节点上验证网络连通性:

1
$ ping -c 4 FLOATING_IP

FLOATING_IP 改为生成的浮动 IP 地址。

总结

启动实例是一个比较综合的工作,需要之前安装的四个基础模块的互相配合才能够如我们预期般运行。OpenStack 本是一个解耦的系统,然而我们在部署时,需要将其重新耦合起来。出问题也是很正常的。还是要有耐心对待,仔细写配置文件,出错看日志文件,相信能够解决大多数问题。

共勉。


知识共享许可协议
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。