Openstack4J API初体验之启动一个实例并为实例分配IP(将实例挂在某个网段上)

本文通过实战演示如何在OpenStack环境中创建虚拟机(VM),包括获取子网信息、选择合适的flavor与镜像,以及配置网络参数等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇文章讲了如何授权,在学会使用Openstack4J提供给我们授权的API后,现在我们要开始创建一台VM/实例了。

先授权:

OSClientV3 os = OSFactory.builderV3().endpoint("http://10.0.0.11:5000/v3").credentials("username", "psw", Identifier.byName("default")) .scopeToProject(Identifier.byId("8b21d3e746af43a9af7152d72ad54d02")).authenticate();

授权中需要填写的参数不清楚的可以看上一篇文章哈,这里就不再赘述了。

授权后拿到os,先查看在Openstack上已经有的子网(我们之后创建的虚拟机最后将挂在这个网段上):

List<? extends Subnet> subnets = os.networking().subnet().list();

声明和定义两个字符串变量(一个是subnetID之后会用到,ip就假设是用户想给VM分配的IP地址):

String subnetID = null;
String ip = "192.168.7.33";

刚刚拿到了存在的所有子网的集合,现在我们要在子网中找到跟用户输入的ip同一个网段,然后获取这个网段的netWorkID号,这个ID号之后在创建虚拟机的时候会用到。代码如下:

for (Subnet subnet : subnets) {
            if (subnet.getCidr().substring(0, subnet.getCidr().lastIndexOf("."))
                    .equals(ip.substring(0, ip.lastIndexOf(".")))) {
                subnetID = subnet.getNetworkId();
            }
        }

现在一切就绪,可以创建并启动实例了:

ServerCreate sc = Builders.server().name("Ubuntu 3").flavor("2").image("cbeb615d-fae5-4df7-9fb6-5913fa4c63e9").builsc.addNetwork(subnetID, ip);
erver server = os.compute().servers().boot(sc);
os.compute().servers().action(server.getId(), Action.START);

在一行中有几个参数,这里说明一下:
name:这里输入的字符串就是将来启动的实例的名字。
flavor:flavor标志着给这个实例分配的资源,例如RAM,Vcpu数量等。在装好Openstack后好像一个是有5个默认的flavor的,这里需要输入flavor的ID号 如图 在这里可以看到:
这里写图片描述
在管理员-系统-flavor数中 可以看到上图所示,倒数第二列的标识实际上就是flavor的ID号,我这里选择的ID为2的flavor。
image:镜像同上,找到镜像的标识号就行了。
上面的代码片的第二句:

sc.addNetwork(subnetID, ip);

这个填写刚刚需要挂的网段ID和用户给VM的IP地址。
这里说一下为什么要找到与用户输入的IP地址的同一网段的子网ID,想一下,用户如果输入的IP地址为:
192.168.10.4 而在Openstack中根本无192.168.10.0这个网段,那怎么可能把实例挂得上去,你总不可能把网段是10.0的挂在网段是7.0上面吧?
最上面的代码片的最后一句,就是启动实例啦。~
启动成功后在Openstack中的dashboard中效果如图:
这里写图片描述

当然 看到一朵云的图标了吗?那个就是我自己在Openstack上创建的网段,也就是192.168.7.0/24这个网段。没有这个网段,用户刚刚输入的ip地址就挂不上去啦。
本文结束~~!

### 解决 OpenStack 外部网络与宿主机网络不同网段时的通信问题 当 OpenStack 的外部网络与宿主机网络处于不同的子网时,可以通过配置路由和 NAT 来实现两者之间的通信以及连接到互联网的功能。 #### 配置路由和 NAT 为了使 OpenStack 实例外部网络能够与其他网络或互联网通信,通常需要启用 IP 转发并设置相应的 NAT 规则。以下是具体方法: - 启用内核中的 IP 转发功能: ```bash echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf sudo sysctl -p ``` 此命令通过修改 `/etc/sysctl.conf` 文件来永久启用 IP 转发[^3]。 - 设置 NAT 规则以便实例可以访问互联网: 使用 `iptables` 添加 SNAT 或 MASQUERADE 规则,允许流量从内部网络伪装成外部接口地址发出。 ```bash sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE ``` #### 创建路由器并关联网络 在 Neutron 中创建一个虚拟路由器并将它绑定到外部网络和内部网络上。 - 创建一个新的路由器: ```bash openstack router create ext_router ``` - 将该路由器附加到外部网络: ```bash openstack router set --external-gateway EXT_NET_ID ext_router ``` - 把内部子网加入此路由器: ```bash openstack router add subnet ext_router INTERNAL_SUBNET_ID ``` 以上操作会自动为所涉及的所有子网分配默认路由表项[^5]。 #### 宿主机上的桥接设备调整 如果使用的是基于 Linux Bridge 的网络模型,则可能还需要对宿主机上的 bridge 设备进行额外配置以支持跨子网通讯。这包括但不限于确认 br_netfilter 模块已加载,并确保 net.bridge.bridge-nf-call-iptables 参数被正确设定为 1。 对于更复杂的场景比如多租户隔离或者高级安全策略需求下,可能会涉及到更多细致入微之处如 VLAN tagging/untagging 等处理方式的选择应用等问题都需要综合考虑进去加以妥善安排解决才行。 ```python import os def enable_ip_forwarding(): """Enable IPv4 forwarding.""" command = &#39;echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf && sudo sysctl -p&#39; result = os.system(command) return True if result == 0 else False enable_ip_forwarding() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值