Primeiros passos com Openstack

Dalton Cézane
15 min readOct 8, 2020

--

Representação de uma nuvem em cima de uma cidade com fluxo de comunicação em código binário entre a cidade e a nuvem.

Introdução

O Openstack é uma plataforma de código aberto, criada pela NASA e pela Rackspace Hosting em 2010, para implantação e gerenciamento de serviços de computação em nuvem. É muito utilizada com o paradigma de infraestrutura como serviço (Infrastructure as a Service — IaaS) para prover recursos de processamento, rede e armazenamento para variados tipos de aplicação.

Os principais componentes do Openstack estão listados abaixo:

Nova — gerencia máquinas virtuais para realização de tarefas de computação (computing).

Swift — gerencia o armazenamento de arquivos e objetos, possibilitando referenciá-los por identificadores únicos ao invés dos caminhos completos (paths).

Cinder — gerencia o armazenamento persistente (espaço em disco), em blocos, para as máquinas virtuais.

Neutron — gerencia redes, subredes e os componentes necessários para comunicação entre elas.

Horizon — painel de controle que possibilita gerenciar os componentes da nuvem. Fornece uma API para que desenvolvedores possam interagir com todos os componentes.

Keystone — gerencia o serviço de identidades, realizando a autenticação de usuários e controlando acesso a recursos baseado em permissões.

Glance — gerencia as imagens de sistemas operacionais utilizadas pelas máquinas virtuais.

Ceilometer — gerencia o uso dos recursos da nuvem, fornecendo serviços de telemetria para os usuários.

Heat — gerencia a orquestração dos recursos para os serviços de nuvem.

Alguma comunidades e empresas mantêm diferentes versões do Openstack. Eu tentei usar algumas, listadas abaixo:

Devstack — Simples de instalar e muito utilizada em ambiente de desenvolvimento, para quem desenvolve funcionalidades para os componentes da plataforma.

Kolla — Disponibiliza os componentes do Openstack em contêineres. Consegui instalar, mas desisti de utilizar devido à documentação (falta dela!).

Packstack — Pacote de instalação do Openstack para Red Hat e CentOS. Como utilizo Ubuntu, não cheguei a instalar essa versão.

Microstack —Mantido pela Canonical, possibilita a instalação e configuração do Openstack no Ubuntu, de forma simples. Embora tenha encontrado alguns problemas com esta versão, é a que possibilitou progresso no uso do Openstack.

Senti falta de uma documentação bem organizada com fundamentos da plataforma e um tutorial de uso básico. Aparentemente, esse tipo de conteúdo não é disponibilizado de forma gratuita.

Uso básico do Microstack

Para instalar o Microstack, você pode utilizar a versão beta. Se estiver usando o Ubuntu 18.04, utilize o seguinte comando:

sudo snap install microstack --classic --beta

Se estiver usando Ubuntu 20.04, use a versão edge, pois tivemos problema com a versão classic:

sudo snap install microstack --devmode --edge

Para configurar e iniciar o Microstack, execute:

sudo microstack.init --auto

Uma vez que o Microstack foi corretamente configurado e inicializado, você pode acessar o painel de controle (Horizon) no endereço http://10.20.20.1/, com as seguintes credenciais:

Nome de usuário: admin
Senha: keystone

Como encontrei um problema no login em minha máquina, segui utilizando os comandos do Openstack via CLI (Command-line Interface). Por isso, as operações aqui estão descritas com os respectivos comandos. Entretanto, o Openstack disponibiliza uma API REST para realizar as operações em seus componentes.

O Microstack já vem com uma imagem do Cirros registrada no Glance. Para exibir as imagens registradas, use o comando abaixo:

microstack.openstack image list
+--------------------------------------+---------------+--------+
| ID | Name | Status |
+--------------------------------------+---------------+--------+
| dee7c0d4-834c-4c0e-a389-7306141e9870 | cirros | active |
| 03a49346-b5d9-4955-ba5f-0579465e29db | ubuntu_bionic | active |
+--------------------------------------+---------------+--------+

Como vemos, além da imagem do Cirros, com nome cirros, temos uma do Ubuntu 18.04, com nome ubuntu_bionic. Esta imagem do Ubuntu Bionic foi obtida com o seguinte comando:

wget https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img

Este repositório (cloud-images.ubuntu.com) mantém imagens do Ubuntu já preparadas para o ambiente de nuvem. Para registrar a imagem no Microstack, utilize este comando (o último parâmetro será o nome da imagem):

microstack.openstack image create --file bionic-server-cloudimg-amd64.img --public --container-format=bare disk-format=qcow2 ubuntu_bionic

A configuração automática do Microstack já fornece duas redes criadas. Para listá-las, execute este comando:

microstack.openstack network list
+--------------------+----------+-----------------------+
| ID | Name | Subnets |
+--------------------+----------+-----------------------+
| 541f68e4-e7a5-436e | external | 2d91d661-9c10-463b- |
| 986d190d-f657-4463 | test | 3682f140-0774-4ecd- |
+--------------------+----------+-----------------------+

Se precisar ver detalhes de uma rede específica, utilize o comando show e informe o nome ou ID da rede:

microstack.openstack network show external
+---------------------------+--------------------------------------+
| Field | Value |
+---------------------------+--------------------------------------+
| admin_state_up | UP |
| availability_zone_hints | |
| availability_zones | nova |
| created_at | 2020-09-08T18:18:59Z |
| description | |
| dns_domain | None |
| id | 541f68e4-e7a5-436e-982b-5a464a215997 |
| ipv4_address_scope | None |
| ipv6_address_scope | None |
| is_default | False |
| is_vlan_transparent | None |
| location | Munch({'cloud': '', 'region_name': '', 'zone': None, 'project': Munch({'id': '66c97537384f4880814027af9bc4cf02', 'name': 'admin', 'domain_id': None, 'domain_name': 'default'})}) |
| mtu | 1500 |
| name | external |
| port_security_enabled | True |
| project_id | 66c97537384f4880814027af9bc4cf02 |
| provider:network_type | flat |
| provider:physical_network | physnet1 |
| provider:segmentation_id | None |
| qos_policy_id | None |
| revision_number | 2 |
| router:external | External |
| segments | None |
| shared | False |
| status | ACTIVE |
| subnets | 2d91d661-9c10-463b-b745-07e33660d8a1 |
| tags | |
| updated_at | 2020-09-08T18:19:04Z |
+---------------------------+--------------------------------------+

As diferentes configurações para criação de máquinas virtuais são chamadas de flavors. Para listar as configurações (flavors) disponíveis, utilize o seguinte comando:

microstack.openstack flavor list
+----+-----------+-------+------+-----------+-------+-----------+
| ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public |
+----+-----------+-------+------+-----------+-------+-----------+
| 1 | m1.tiny | 512 | 1 | 0 | 1 | True |
| 2 | m1.small | 2048 | 20 | 0 | 1 | True |
| 3 | m1.medium | 4096 | 20 | 0 | 2 | True |
| 4 | m1.large | 8192 | 20 | 0 | 4 | True |
| 5 | m1.xlarge | 16384 | 20 | 0 | 8 | True |
+----+-----------+-------+------+-----------+-------+-----------+

Se precisar criar configurações diferentes, basta criar novos flavors com o seguinte comando (o último parâmetro é o nome do flavor):

microstack.openstack flavor create --ram 4096 --vcpus 2 --disk 40 m2.medium
+----------------------------+-------------------------------------+
| Field | Value |
+----------------------------+-------------------------------------+
| OS-FLV-DISABLED:disabled | False |
| OS-FLV-EXT-DATA:ephemeral | 0 |
| disk | 40 |
| id | 7ccbd0a0-9977-48bc-9754-5cf1113a44ce |
| name | m2.medium |
| os-flavor-access:is_public | True |
| properties | |
| ram | 4096 |
| rxtx_factor | 1.0 |
| swap | |
| vcpus | 2 |
+----------------------------+-------------------------------------+

O Microstack fornece um comando para criar uma máquina virtual de forma bem simples. Por exemplo, para criar uma máquina virtual utilizando a imagem do Ubuntu Bionic (ubuntu_bionic) e o flavor criado (m2.medium), use o comando abaixo:

microstack.launch ubuntu_bionic --flavor m2.medium --name ubuntu_testLaunching server ...
Allocating floating ip ...
Server ubuntu_test launched! (status is BUILD)

Access it with `ssh -i $HOME/.ssh/id_microstack ubuntu@10.20.20.36`
You can also visit the OpenStack dashboard at http://10.20.20.1:80

Por padrão, o Microstack armazena as chaves para acesso remoto às máquinas no diretório $HOME/.ssh/ . Para listar as chaves registradas no Openstack, utilize o comando abaixo:

microstack.openstack keypair list
+------------+-------------------------------------------------+
| Name | Fingerprint |
+------------+-------------------------------------------------+
| microstack | c3:45:c3:06:14:33:17:58:8e:13:f7:ca:18:51:47:b9 |
+------------+-------------------------------------------------+

Para listar as máquinas virtuais criadas, use o seguinte comando:

microstack.openstack server list
+----------+-----------+---------+------------+-------+-----------+
| ID | Name | Status | Networks | Image | Flavor |
+----------+-----------+---------+------------+-------+-----------+
| dce041fc | ubuntu_test | ACTIVE | test=192.168.222.192, 10.20.20.36 | ubuntu_bionic | m2.medium |
| 058067fc | cirro_test | SHUTOFF | test=192.168.222.139, 10.20.20.93 | cirros | m1.tiny |
+----------+-----------+---------+------------+-------+-----------+

Podemos ver que a máquina criada, ubuntu_test, está ativa. Ela possui o IP 192.168.222.192 da rede test, e o IP flutuante 10.20.20.36 da rede external. Como listado ao término da criação da máquina virtual, para acessá-la, utilize o seguinte comando (usuário ubuntu e chave microstack):

ssh -i $HOME/.ssh/id_microstack ubuntu@10.20.20.36
The authenticity of host '10.20.20.36 (10.20.20.36)' can't be established.
ECDSA key fingerprint is SHA256:4O1tM/dXBUAJh/R4/VioAkTcRxES3QzA2RjWilKHCGc.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.20.20.36' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 4.15.0-112-generic x86_64)

* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage

System information as of Thu Oct 8 18:06:11 UTC 2020

System load: 0.0 Processes: 90
Usage of /: 2.6% of 38.60GB Users logged in: 0
Memory usage: 4% IP address for ens3: 192.168.222.192
Swap usage: 0%


* Canonical Livepatch is available for installation.
- Reduce system reboots and improve kernel security. Activate at:
https://ubuntu.com/livepatch

0 packages can be updated.
0 updates are security updates.



The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

ubuntu@ubuntu-test:~$

Também é possível usar o ping para verificar se a máquina virtual está acessível:

ping 10.20.20.36
PING 10.20.20.36 (10.20.20.36) 56(84) bytes of data.
64 bytes from 10.20.20.36: icmp_seq=1 ttl=63 time=2.04 ms
64 bytes from 10.20.20.36: icmp_seq=2 ttl=63 time=1.23 ms
64 bytes from 10.20.20.36: icmp_seq=3 ttl=63 time=0.544 ms
^C
--- 10.20.20.36 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 0.544/1.274/2.042/0.612 ms

Podemos acessar as máquinas virtuais por ping e por ssh porque, por padrão, o grupo de segurança já foi automaticamente configurado no Microstack. Para listar os grupos de segurança, use o comando abaixo:

microstack.openstack security group list
+----------+---------+------------------------+-----------+------+
| ID | Name | Description | Project | Tags |
+----------+---------+------------------------+-----------+------+
| 0d719815 | default | Default security group | | [] |
| 3772dea7 | default | Default security group | 6a15fdc92 | [] |
| cdf1c322 | default | Default security group | 66c975373 | [] |
+----------+---------+------------------------+-----------+------+

Para listar os detalhes de um grupo de segurança específico, utilize o comando abaixo, informando o id do grupo:

microstack.openstack security group show cdf1c322
+-----------------+------------------------------------------------+
| Field | Value |
+-----------------+------------------------------------------------+
| created_at | 2020-09-08T18:18:50Z |
| description | Default security group |
| id | cdf1c322-c6ff-4c1b-8a0b-14d9755e0fa5 |
| location | Munch({'cloud': '', 'region_name': '', 'zone': None, 'project': Munch({'id': '66c97537384f4880814027af9bc4cf02', 'name': 'admin', 'domain_id': None, 'domain_name': 'default'})}) |
| name | default |
| project_id | 66c97537384f4880814027af9bc4cf02 |
| revision_number | 3 |
| rules | created_at='2020-09-08T18:20:16Z', direction='ingress', ethertype='IPv4', id='06927321-fb30-4e17-b659-ab97f4e935ca', protocol='icmp', remote_ip_prefix='0.0.0.0/0', updated_at='2020-09-08T18:20:16Z' |
| | created_at='2020-09-08T18:18:50Z', direction='egress', ethertype='IPv4', id='158868a8-b1a6-480c-b171-78a697111ea5', updated_at='2020-09-08T18:18:50Z' |
| | created_at='2020-09-08T18:18:51Z', direction='egress', ethertype='IPv6', id='265082d7-ea9c-4f98-9872-cf3b23bc3b28', updated_at='2020-09-08T18:18:51Z' |
| | created_at='2020-09-08T18:18:50Z', direction='ingress', ethertype='IPv4', id='5e9501de-888b-48ec-9edb-fa879f162881', remote_group_id='cdf1c322-c6ff-4c1b-8a0b-14d9755e0fa5', updated_at='2020-09-08T18:18:50Z' |
| | created_at='2020-09-08T18:18:50Z', direction='ingress', ethertype='IPv6', id='841d65ad-96e7-46a4-b6da-b401b56ca8bf', remote_group_id='cdf1c322-c6ff-4c1b-8a0b-14d9755e0fa5', updated_at='2020-09-08T18:18:50Z' |
| | created_at='2020-09-08T18:20:18Z', direction='ingress', ethertype='IPv4', id='a146fd79-3150-4fc9-aa48-a3486143d5e4', port_range_max='22', port_range_min='22', protocol='tcp', remote_ip_prefix='0.0.0.0/0', updated_at='2020-09-08T18:20:18Z' |
| tags | [] |
| updated_at | 2020-09-08T18:20:18Z |
+-----------------+------------------------------------------------+

Para listar as regras de um grupo, utilize o seguinte comando, informando o id do grupo:

microstack.openstack security group rule list cdf1c322
+----------+------------+-----------+-----------+------------------+
| ID | IP Protocol| IP Range | Port Range| Remote Sec. Group|
+----------+------------+-----------+-----------+------------------+
| 06927321| icmp | 0.0.0.0/0 | | None |
| 158868a8| None | None | | None |
| 265082d7| None | None | | None |
| 5e9501de| None | None | | cdf1c322 |
| 841d65ad| None | None | | cdf1c322 |
| a146fd79| tcp | 0.0.0.0/0 | 22:22 | None |
+---------+-------------+-----------+-----------+------------------+

Se o grupo de segurança não tivesse as regras para acesso por ping e ssh, seria possível adicioná-las. Para exemplificar, vamos criar uma regra que permite acessar a porta 8080 da máquina virtual a partir de qualquer IP. Use o comando abaixo, especificando o id do grupo de segurança:

microstack.openstack security group rule create --proto tcp --dst-port 8080 cdf1c322
+-------------------+----------------------------------------------+
| Field | Value |
+-------------------+----------------------------------------------+
| created_at | 2020-10-08T18:34:03Z |
| description | |
| direction | ingress |
| ether_type | IPv4 |
| id | 988b6cbc-9546-4937-9ea1-80d081e2780b |
| location | Munch({'cloud': '', 'region_name': '', 'zone': None, 'project': Munch({'id': '66c97537384f4880814027af9bc4cf02', 'name': 'admin', 'domain_id': None, 'domain_name': 'default'})}) |
| name | None |
| port_range_max | 8080 |
| port_range_min | 8080 |
| project_id | 66c97537384f4880814027af9bc4cf02 |
| protocol | tcp |
| remote_group_id | None |
| remote_ip_prefix | 0.0.0.0/0 |
| revision_number | 0 |
| security_group_id | cdf1c322-c6ff-4c1b-8a0b-14d9755e0fa5 |
| tags | [] |
| updated_at | 2020-10-08T18:34:03Z |
+-------------------+----------------------------------------------+

Caso precise criar as regras para acesso com ping e ssh, use os comandos abaixo, informando o id do grupo de segurança:

microstack.openstack security group rule create --proto icmp cdf1c322
microstack.openstack security group rule create --proto tcp --dst-port 22 cdf1c322

VMs com especificação de rede e atribuição de IP flutuante

Agora vamos criar uma máquina virtual informando todos os parâmetros, sem usar o comando microstack.launch. Para isto, vamos criar uma rede privada, especificando uma faixa de IPs específica. O comando abaixo cria a rede priv_net:

microstack.openstack network create priv_net
+---------------------------+--------------------------------------+
| Field | Value |
+---------------------------+--------------------------------------+
| admin_state_up | UP |
| availability_zone_hints | |
| availability_zones | |
| created_at | 2020-10-08T19:14:37Z |
| description | |
| dns_domain | None |
| id | ecf63d39-2e66-47cc-b8d4-27b59b099ad9 |
| ipv4_address_scope | None |
| ipv6_address_scope | None |
| is_default | False |
| is_vlan_transparent | None |
| location | Munch({'cloud': '', 'region_name': '', 'zone': None, 'project': Munch({'id': '66c97537384f4880814027af9bc4cf02', 'name': 'admin', 'domain_id': None, 'domain_name': 'default'})}) |
| mtu | 1450 |
| name | priv_net |
| port_security_enabled | True |
| project_id | 66c97537384f4880814027af9bc4cf02 |
| provider:network_type | geneve |
| provider:physical_network | None |
| provider:segmentation_id | 86 |
| qos_policy_id | None |
| revision_number | 1 |
| router:external | Internal |
| segments | None |
| shared | False |
| status | ACTIVE |
| subnets | |
| tags | |
| updated_at | 2020-10-08T19:14:37Z |
+---------------------------+--------------------------------------+

Agora criaremos uma subrede com a faixa de IPs 10.10.10.0/24. Utilize o seguinte comando:

microstack.openstack subnet create priv_sub --network priv_net --subnet-range 10.10.10.0/24
+-------------------+----------------------------------------------+
| Field | Value |
+-------------------+----------------------------------------------+
| allocation_pools | 10.10.10.2-10.10.10.254 |
| cidr | 10.10.10.0/24 |
| created_at | 2020-10-08T19:19:45Z |
| description | |
| dns_nameservers | |
| enable_dhcp | True |
| gateway_ip | 10.10.10.1 |
| host_routes | |
| id | 8694a6f8-0456-4162-869e-d5f72eebc56a |
| ip_version | 4 |
| ipv6_address_mode | None |
| ipv6_ra_mode | None |
| location | Munch({'cloud': '', 'region_name': '', 'zone': None, 'project': Munch({'id': '66c97537384f4880814027af9bc4cf02', 'name': 'admin', 'domain_id': None, 'domain_name': 'default'})}) |
| name | priv_sub |
| network_id | ecf63d39-2e66-47cc-b8d4-27b59b099ad9 |
| prefix_length | None |
| project_id | 66c97537384f4880814027af9bc4cf02 |
| revision_number | 0 |
| segment_id | None |
| service_types | |
| subnetpool_id | None |
| tags | |
| updated_at | 2020-10-08T19:19:45Z |
+-------------------+----------------------------------------------+

Para listar as subredes criadas, utilize o comando abaixo:

microstack.openstack subnet list
+----------+-----------------+----------+------------------+
| ID | Name | Network | Subnet |
+----------+-----------------+----------+------------------+
| 2d91d661 | external-subnet | 541f68e4 | 10.20.20.0/24 |
| 3682f140 | test-subnet | 986d190d | 192.168.222.0/24 |
| 8694a6f8 | priv_sub | ecf63d39 | 10.10.10.0/24 |
+----------+-----------------+----------+------------------+

Agora vamos criar uma máquina virtual nesta rede criada. Para isso, utilizaremos o flavor m1.tiny, o grupo de segurança default, a imagem cirros, o id da rede priv_nete a chave microstack. Caso queira conferir as opções de flavors, grupos de segurança, imagens, redes e chaves, basta utilizar os comandos abaixo (se precisar ver detalhes de alguma opção desses itens, basta trocar o list por show e especificar o nome ou id da opção):

microstack.openstack flavor list
microstack.openstack security group list
microstack.openstack image list
microstack.openstack network list
microstack.openstack keypair list

O comando abaixo cria a máquina virtual custom_vm com as configurações descritas acima:

microstack.openstack server create --flavor m1.tiny --security-group cdf1c322-c6ff-4c1b-8a0b-14d9755e0fa5 --image cirros --nic net-id=ecf63d39-2e66-47cc-b8d4-27b59b099ad9 --key-name microstack custom_vm
+-------------------------------------+----------------------------+
| Field | Value |
+-------------------------------------+----------------------------+
| OS-DCF:diskConfig | MANUAL |
| OS-EXT-AZ:availability_zone | |
| OS-EXT-SRV-ATTR:host | None |
| OS-EXT-SRV-ATTR:hypervisor_hostname | None |
| OS-EXT-SRV-ATTR:instance_name | |
| OS-EXT-STS:power_state | NOSTATE |
| OS-EXT-STS:task_state | scheduling |
| OS-EXT-STS:vm_state | building |
| OS-SRV-USG:launched_at | None |
| OS-SRV-USG:terminated_at | None |
| accessIPv4 | |
| accessIPv6 | |
| addresses | |
| adminPass | 47gaiNsgXuZi |
| config_drive | |
| created | 2020-10-08T19:53:55Z |
| flavor | m1.tiny (1) |
| hostId | |
| id | 221538d7-d647-4a3c-9dfd-e558857c4b35 |
| image | cirros (dee7c0d4-834c-4c0e-a389-7306141e9870) |
| key_name | microstack |
| name | custom_vm |
| progress | 0 |
| project_id | 66c97537384f4880814027af9bc4cf02 |
| properties | |
| security_groups | name='cdf1c322-c6ff-4c1b-8a0b-14d9755e0fa5' |
| status | BUILD |
| updated | 2020-10-08T19:53:55Z |
| user_id | d8f5bba950494dd4911744cbd1dcb285|
| volumes_attached | |
+-------------------------------------+----------------------------+

Listando as máquinas virtuais criadas, podemos ver a custom_vm:

microstack.openstack server list
+----------+-----------+---------+------------+-------+-----------+
| ID | Name | Status | Networks | Image | Flavor |
| 221538d7 | custom_vm | ACTIVE | priv_net=10.10.10.144 | cirros | m1.tiny
| dce041fc | ubuntu_test | ACTIVE | test=192.168.222.192, 10.20.20.36 | ubuntu_bionic | m2.medium |
| 058067fc | cirro_test | SHUTOFF | test=192.168.222.139, 10.20.20.93 | cirros | m1.tiny |
+----------+-----------+---------+------------+-------+-----------+

Se tentarmos acessar a máquina virtual custom_vm, por ping ou ssh, não teremos sucesso, pois a mesma ainda não possui IP flutuante. Como visto acima, ela possui apenas o IP 10.10.10.144, da rede privada priv_net. Para criar um IP flutuante, utilize o comando a seguir, especificando o nome da rede externa/pública (external):

microstack.openstack floating ip create external
+---------------------+--------------------------------------------+
| Field | Value |
+---------------------+--------------------------------------------+
| created_at | 2020-10-08T20:12:59Z |
| description | |
| dns_domain | None |
| dns_name | None |
| fixed_ip_address | None |
| floating_ip_address | 10.20.20.163 |
| floating_network_id | 541f68e4-e7a5-436e-982b-5a464a215997 |
| id | 8fe822e5-6863-4116-9ff8-86748b508885 |
| location | Munch({'cloud': '', 'region_name': '', 'zone': None, 'project': Munch({'id': '66c97537384f4880814027af9bc4cf02', 'name': 'admin', 'domain_id': None, 'domain_name': 'default'})}) |
| name | 10.20.20.163 |
| port_details | None |
| port_id | None |
| project_id | 66c97537384f4880814027af9bc4cf02 |
| qos_policy_id | None |
| revision_number | 0 |
| router_id | None |
| status | DOWN |
| subnet_id | None |
| tags | [] |
| updated_at | 2020-10-08T20:12:59Z |
+---------------------+--------------------------------------------+

O IP flutuante 10.20.20.163 foi criado. Para listar todos os IPs flutuantes, usamos o comando abaixo:

microstack.openstack floating ip list
+-----------+---------------------+------------------+--------------------------------------+--------------------------------------+----------------------------------+
| ID | Floating IP Address | Fixed IP Address | Port | Floating Network | Project |
+-----------+---------------------+------------------+--------------------------------------+--------------------------------------+----------------------------------+
| 4b23f5b30 | 10.20.20.172 | None | None | 541f68e4 | 66c9753738 |
| 5f14f7380 | 10.20.20.193 | 192.168.222.196 | 4c9c61bd | 541f68e4 | 66c9753738 |
| 6fb63178b | 10.20.20.93 | 192.168.222.139 | ec1edb43 | 541f68e4 | 66c9753738 |
| 8fe822e5 | 10.20.20.163 | None | None | 541f68e4 | 66c9753738 |
| b1c386024 | 10.20.20.36 | 192.168.222.192 | 697a22c2 | 541f68e4 | 66c9753738 |
| da5b949f | 10.20.20.92 | 10.10.10.72 | 5eff5ad8 | 541f68e4 | 66c9753738 |
+--------+---------------------+------------------+--------------------------------------+--------------------------------------+----------------------------------+

Podemos ver que o IP criado ainda não foi atribuído. Quando atribuímos, a coluna Fixed IP Address exibe o IP fixo da máquina virtual à qual o IP flutuante está associado.

Além de atribuir o IP flutuante à máquina virtual custom_vm, precisamos associar a rede privada priv_net à rede externa external. Para isso, criaremos um roteador e o associaremos às redes. Crie o roteador com o comando abaixo:

microstack.openstack router create router1
+-------------------------+----------------------------------------+
| Field | Value |
+-------------------------+----------------------------------------+
| admin_state_up | UP |
| availability_zone_hints | |
| availability_zones | |
| created_at | 2020-10-08T20:27:33Z |
| description | |
| distributed | False |
| external_gateway_info | None |
| flavor_id | None |
| ha | False |
| id | 819d543c-cc2d-45d4-8696-81478d950487 |
| location | Munch({'cloud': '', 'region_name': '', 'zone': None, 'project': Munch({'id': '66c97537384f4880814027af9bc4cf02', 'name': 'admin', 'domain_id': None, 'domain_name': 'default'})}) |
| name | router1 |
| project_id | 66c97537384f4880814027af9bc4cf02 |
| revision_number | 1 |
| routes | |
| status | ACTIVE |
| tags | |
| updated_at | 2020-10-08T20:27:33Z |
+-------------------------+----------------------------------------+

Associe a rede external como gateway externo do roteador router1:

microstack.openstack router set router1 --external-gateway external

Adicione a subrede priv_sub ao roteador router1:

microstack.openstack router add subnet router1 priv_sub

Agora, atribuímos o IP flutuante 10.20.20.163 à máquina virtual custom_vm:

microstack.openstack server add floating ip custom_vm 10.20.20.163

Com isso, podemos acessar a máquina usando o ping:

ping 10.20.20.163
PING 10.20.20.163 (10.20.20.163) 56(84) bytes of data.
64 bytes from 10.20.20.163: icmp_seq=1 ttl=63 time=4.62 ms
64 bytes from 10.20.20.163: icmp_seq=2 ttl=63 time=0.876 ms
64 bytes from 10.20.20.163: icmp_seq=3 ttl=63 time=0.420 ms
^C
--- 10.20.20.163 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.420/1.975/4.629/1.885 ms

E podemos acessar a máquina usando ssh(com usuário cirros e chave microstack):

ssh -i $HOME/.ssh/id_microstack cirros@10.20.20.163

Espero que este tutorial possa simplificar o trabalho de quem esteja começando a usar o Openstack. Qualquer sugestão de melhoria é bem vinda.

--

--

Dalton Cézane
0 Followers

Professor @ IFPE Caruaru — Researcher @ EmbeddedLab