Como instalar o OpenStack no Debian 12 (Bookworm)
Openstack é uma solução em nuvem de código aberto e de uso gratuito que permite construir uma plataforma privada de infraestrutura como serviço (IaaS) por meio de uma variedade de serviços complementares. Cada serviço no OpenStack oferece uma Interface de Programação de Aplicativo (API) para facilitar a integração. Os principais componentes disponíveis no OpenStack fornecerão recursos de computação, rede e armazenamento. Ele pode ser operado a partir de uma interface de linha de comando usando a ferramenta openstack
ou através de seu painel intuitivo de onde você pode administrar a nuvem OpenStack e monitorar seus recursos.
Neste artigo, abordamos detalhadamente as etapas necessárias para configurar uma nuvem OpenStack privada localmente em sua máquina Debian 12 Linux. Esta é uma instalação de nó único adequada apenas para fins de aprendizado e teste em laboratório doméstico. Estamos usando um método manual de instalação de outras soluções como Kolla e OpenStack Ansible.
Antes de começar com esta configuração, certifique-se de que sua máquina atenda aos seguintes requisitos mínimos.
- Uma nova instalação do Debian 12 Linux
- Extensão de virtualização de CPU habilitada no BIOS
- usuário root ou usuário com privilégios sudo
- 2 vCPUs
- 8 GB de RAM
- Capacidade de disco de 20 GB
- Boa conexão com a internet
Vamos começar!.
1. Prepare o ambiente
Nosso ambiente possui as seguintes variáveis;
- Endereço IP do servidor Debian 12: 192.168.1.2
- Nome do host do servidor Debian 12: osp01.home.cloudlabske.io
- Interface de rede: eno1
- Região padrão do OpenStack: RegionOne
- Domínio padrão: padrão
Defina o nome do host do servidor.
sudo hostnamectl set-hostname osp01.home.cloudlabske.io
Edite o arquivo /etc/hosts
para mapear o endereço IP do seu servidor para o nome do host configurado.
$ sudo vim /etc/hosts
192.168.1.2 osp01.home.cloudlabske.io osp01
Atualize o sistema antes de iniciar outras configurações. A suposição é que você está trabalhando em uma máquina Debian limpa.
sudo apt update && sudo apt upgrade -y
Uma reinicialização pode ser necessária. Apenas confirme.
[ -e /var/run/reboot-required ] && sudo reboot
Configure a sincronização de horário NTP.
- Usando Systemd timesyncd
Abra o arquivo timesyncd.conf
para edição e atualize o endereço do seu servidor NTP.
$ sudo vim /etc/systemd/timesyncd.conf
[Time]
NTP=192.168.1.1
Reinicie o serviço systemd-timesyncd .
sudo systemctl restart systemd-timesyncd
Confirme o estado
sudo timedatectl timesync-status
- Usando o Chrony
Instale o Chrony e configure o servidor NTP para ajuste de horário. O NTP usa 123/UDP.
sudo apt -y install chrony vim
Você pode alterar os servidores NTP ou usar o padrão.
$ sudo vim /etc/chrony/chrony.conf
pool 2.debian.pool.ntp.org iburst
Defina o fuso horário para sua localização atual
sudo timedatectl set-timezone Africa/Nairobi
sudo timedatectl set-ntp true
Confirme as configurações
$ timedatectl
Local time: Wed 2024-01-31 21:47:22 EAT
Universal time: Wed 2024-01-31 18:47:22 UTC
RTC time: Wed 2024-01-31 18:47:22
Time zone: Africa/Nairobi (EAT, +0300)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
Reinicie o serviço chrony
sudo systemctl restart chrony
Sincronize manualmente a hora no sistema.
$ sudo chronyc sources
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^- ntp1.icolo.io 2 6 37 57 +770us[ +770us] +/- 13ms
^* ntp0.icolo.io 2 6 37 57 -15us[ -895us] +/- 13ms
^- time.cloudflare.com 3 6 37 58 +3221us[+3221us] +/- 71ms
^- time.cloudflare.com 3 6 37 59 +3028us[+2156us] +/- 71ms
2. Instale MariaDB, RabbitMQ, Memcached
A partir deste ponto, podemos mudar para a conta de usuário root.
$ sudo -i
# or
$ sudo su -
Instale o servidor de banco de dados MariaDB
apt install mariadb-server -y
Ajuste o máximo de conexões com o banco de dados para evitar tempos limite de conexão.
# vim /etc/mysql/mariadb.conf.d/50-server.cnf
max_connections = 700
Reinicie o serviço MariaDB após fazer a alteração.
systemctl restart mariadb
Instale também o pacote de extensão Python MySQL.
apt install python3-pymysql
Feito isso, execute a instalação do servidor web RabbitMQ, Memcached e Nginx.
apt install memcached rabbitmq-server nginx libnginx-mod-stream
Adicione o usuário RabbitMQ para OpenStack, defina a senha e conceda permissões.
rabbitmqctl add_user openstack StrongPassw0rd01
rabbitmqctl set_permissions openstack ".*" ".*" ".*"
Desative a página da web nginx padrão.
unlink /etc/nginx/sites-enabled/default
Reinicie os serviços.
systemctl restart mariadb rabbitmq-server memcached nginx
3. Instale e configure o Keystone
O serviço OpenStack Identity (Keystone) é um ponto único de integração para autenticação, autorização e um catálogo de serviços.
Crie um banco de dados e um usuário com as permissões adequadas concedidas.
# mysql
create database keystone;
grant all privileges on keystone.* to keystone@'localhost' identified by 'StrongPassw0rd01';
flush privileges;
exit;
Instale o Keystone e suas dependências, incluindo o cliente OpenStack.
apt install keystone python3-openstackclient apache2 python3-oauth2client libapache2-mod-wsgi-py3 -y
Responda “Não” para todos os prompts.
Edite o arquivo de configuração keystone e altere o endereço e defina as configurações de conexão do banco de dados e o provedor de token.
# vim /etc/keystone/keystone.conf
# Specify Memcache Server on line 363
memcache_servers = localhost:11211
# Add MariaDB connection information around line 543:
[database]
connection = mysql+pymysql://keystone:StrongPassw0rd01@localhost/keystone
# Set token provider in line 2169
provider = fernet
Preencha o banco de dados do serviço de identidade com dados executando os comandos abaixo.
su -s /bin/bash keystone -c "keystone-manage db_sync"
Ignore com segurança o erro “Exceção ignorada em:…”.
A seguir inicializamos os repositórios de chaves Fernet:
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
Inicialize o serviço de identidade. Com a versão mais recente do OpenStack, a identidade keystone pode ser executada na mesma porta para todas as interfaces.
export controller=$(hostname -f)
keystone-manage bootstrap --bootstrap-password StrongPassw0rd01 \
--bootstrap-admin-url https://$controller:5000/v3/ \
--bootstrap-internal-url https://$controller:5000/v3/ \
--bootstrap-public-url https://$controller:5000/v3/ \
--bootstrap-region-id RegionOne
Defina o FQDN do seu servidor conforme definido anteriormente no arquivo de configuração do Apache.
# vim /etc/apache2/apache2.conf
ServerName osp01.home.cloudlabske.io
Crie a configuração do Apache VirtualHost para keystone. Isso nos permitirá acessar a API usando FQDN em vez do uso de endereçamento IP.
vim /etc/apache2/sites-available/keystone.conf
Modifique e cole o seguinte conteúdo. Mas lembre-se de substituir os caminhos SSL pelos seus.
1. Usando Let's Encrypt
Consulte o guia a seguir sobre como usar o Let’s Encrypt.
- Como gerar certificados SSL vamos criptografar no Linux
- Gere o certificado Let's Encrypt SSL usando Cloudflare em rede privada
- Como gerar o certificado SSL Let's Encrypt Wildcard
Neste exemplo, os certificados SSL usados são os seguintes.
- /etc/letsencrypt/live/osp01.home.cloudlabske.io/cert.pem
- /etc/letsencrypt/live/osp01.home.cloudlabske.io/privkey.pem
- /etc/letsencrypt/live/osp01.home.cloudlabske.io/chain.pem
2. Usando OpenSSL
Para certificados autoassinados OpenSSL, gerados da seguinte forma.
# vim /etc/ssl/openssl.cnf
[ home.cloudlabske.io ]
subjectAltName = DNS:osp01.home.cloudlabske.io
# Generate certificates
cd /etc/ssl/private
openssl genrsa -aes128 2048 > openstack_server.key
openssl rsa -in server.key -out openstack_server.key
openssl req -utf8 -new -key openstack_server.key -out openstack_server.csr
openssl x509 -in openstack_server.csr -out openstack_server.crt -req -signkey openstack_server.key -extfile /etc/ssl/openssl.cnf -extensions home.cloudlabske.io -days 3650
chmod 600 server.key
Os caminhos para a chave e os certificados serão.
- /etc/ssl/private/openstack_server.crt
- /etc/ssl/private/openstack_server.key
Modifique o conteúdo abaixo para se adequar ao seu ambiente.
Listen 5000
<VirtualHost *:5000>
SSLEngine on
SSLHonorCipherOrder on
SSLCertificateFile /etc/letsencrypt/live/osp01.home.cloudlabske.io/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/osp01.home.cloudlabske.io/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/osp01.home.cloudlabske.io/chain.pem
WSGIScriptAlias / /usr/bin/keystone-wsgi-public
WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
WSGIProcessGroup keystone-public
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
LimitRequestBody 114688
<IfVersion >= 2.4>
ErrorLogFormat "%{cu}t %M"
</IfVersion>
ErrorLog /var/log/apache2/keystone.log
CustomLog /var/log/apache2/keystone_access.log combined
<Directory /usr/bin>
Require all granted
</Directory>
</VirtualHost>
Alias /identity /usr/bin/keystone-wsgi-public
<Location /identity>
SetHandler wsgi-script
Options +ExecCGI
WSGIProcessGroup keystone-public
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
</Location>
Habilite os módulos Apache necessários e a configuração da web keystone.
a2enmod ssl
a2ensite keystone
systemctl disable --now keystone
systemctl restart apache2
Gere arquivo de acesso keystone para cliente OpenStack.
export controller=$(hostname -f)
tee ~/keystonerc<<EOF
export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=StrongPassw0rd01
export OS_AUTH_URL=https://$controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
EOF
Defina permissões e forneça o arquivo para usá-lo.
chmod 600 ~/keystonerc
source ~/keystonerc
echo "source ~/keystonerc " >> ~/.bashrc
Criar projetos
Crie um projeto de serviço que conterá um usuário exclusivo para cada serviço adicionado ao seu ambiente.
root@osp01 ~(keystone)$ openstack project create --domain default --description "Service Project" service
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Service Project |
| domain_id | default |
| enabled | True |
| id | 1067895d9b99452b8d1758eda755c7bc |
| is_domain | False |
| name | service |
| options | {} |
| parent_id | default |
| tags | [] |
+-------------+----------------------------------+
root@osp01 ~(keystone)$ openstack project list
+----------------------------------+---------+
| ID | Name |
+----------------------------------+---------+
| 1067895d9b99452b8d1758eda755c7bc | service |
| 9a102dfdf9a54e8382fefdca727b2553 | admin |
+----------------------------------+---------+
root@osp01 ~(keystone)$
4. Instalar e configurar o Glance (serviço de imagem)
O serviço OpenStack Image (glance) permite que os usuários do cluster descubram, registrem e recuperem imagens de máquinas virtuais usando a API REST. Com a API você pode consultar metadados de imagens de máquinas virtuais e recuperar uma imagem real. As imagens de máquinas virtuais são disponibilizadas por meio do serviço de imagem em vários locais.
Adicione usuário e senha do banco de dados para visualização. O banco de dados armazenará metadados de imagem de máquina virtual.
# mysql
create database glance;
grant all privileges on glance.* to glance@'localhost' identified by 'StrongPassw0rd01';
flush privileges;
exit;
Adicione o usuário de relance ao projeto de serviço Keystone.
# openstack user create --domain default --project service --password StrongPassw0rd01 glance
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| default_project_id | 1067895d9b99452b8d1758eda755c7bc |
| domain_id | default |
| enabled | True |
| id | a4af040dceff40d1a01beb14d268a7d9 |
| name | glance |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+
Adicione a função de administrador ao usuário e projeto de serviço do Glance:
openstack role add --project service --user glance admin
Crie a entidade de serviço de relance:
# openstack service create --name glance --description "OpenStack Image service" image
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | OpenStack Image service |
| enabled | True |
| id | db9cb71d9f2b41128784458b057d468d |
| name | glance |
| type | image |
+-------------+----------------------------------+
Salve o FQDN do controlador como variável para facilitar o uso.
export controller=$(hostname -f)
Crie endpoints de API de serviço de imagem na região padrão RegionOne. Criaremos endpoints públicos, administrativos e internos.
# openstack endpoint create --region RegionOne image public https://$controller:9292
+--------------+----------------------------------------+
| Field | Value |
+--------------+----------------------------------------+
| enabled | True |
| id | 5f5a8246813e436ab31ebeb37b1bb843 |
| interface | public |
| region | RegionOne |
| region_id | RegionOne |
| service_id | db9cb71d9f2b41128784458b057d468d |
| service_name | glance |
| service_type | image |
| url | https://osp01.home.cloudlabske.io:9292 |
+--------------+----------------------------------------+
# openstack endpoint create --region RegionOne image internal https://$controller:9292
+--------------+----------------------------------------+
| Field | Value |
+--------------+----------------------------------------+
| enabled | True |
| id | 953c077f90944774a205f5244aa28ce8 |
| interface | internal |
| region | RegionOne |
| region_id | RegionOne |
| service_id | db9cb71d9f2b41128784458b057d468d |
| service_name | glance |
| service_type | image |
| url | https://osp01.home.cloudlabske.io:9292 |
+--------------+----------------------------------------+
# openstack endpoint create --region RegionOne image admin https://$controller:9292
+--------------+----------------------------------------+
| Field | Value |
+--------------+----------------------------------------+
| enabled | True |
| id | 3788fbdc728f4e8fab7d370ba2559103 |
| interface | admin |
| region | RegionOne |
| region_id | RegionOne |
| service_id | db9cb71d9f2b41128784458b057d468d |
| service_name | glance |
| service_type | image |
| url | https://osp01.home.cloudlabske.io:9292 |
+--------------+----------------------------------------+
Instale o pacote OpenStack Glance
apt install glance -y
Responda “Não” para todas as opções de configuração automática.
Configurar API Glance
A API aceita chamadas de API de imagem para descoberta, recuperação e armazenamento de imagens.
Faça backup do arquivo de configuração atual da API Glance.
mv /etc/glance/glance-api.conf /etc/glance/glance-api.conf.orig
Crie um novo arquivo de configuração da API Glance.
vim /etc/glance/glance-api.conf
Cole e modifique os valores fornecidos abaixo para se adequar ao seu ambiente.
- Na seção
[DEFAULT]
, configure a conexão RabbitMQ - Na seção
[glance_store]
, configure o armazenamento do sistema de arquivos local e a localização dos arquivos de imagem - Na seção
[database]
, configure o acesso ao banco de dados - Nas seções
[keystone_authtoken]
e[paste_deploy]
, configure o acesso ao serviço de identidade
[DEFAULT]
bind_host = 127.0.0.1
# RabbitMQ connection info
transport_url = rabbit://openstack:StrongPassw0rd01@localhost
enforce_secure_rbac = true
[glance_store]
stores = file,http
default_store = file
filesystem_store_datadir = /var/lib/glance/images/
[database]
# MariaDB connection info
connection = mysql+pymysql://glance:StrongPassw0rd01@localhost/glance
# keystone auth info
[keystone_authtoken]
www_authenticate_uri = https://osp01.home.cloudlabske.io:5000
auth_url = https://osp01.home.cloudlabske.io:5000
memcached_servers = 127.0.0.1:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = glance
password = StrongPassw0rd01
# if using self-signed certs on Apache2 Keystone, turn to [true]
insecure = false
[paste_deploy]
flavor = keystone
[oslo_policy]
enforce_new_defaults = true
Defina novas permissões de arquivo.
chown root:glance /etc/glance/glance-api.conf
chmod 640 /etc/glance/glance-api.conf
Preencha o banco de dados do serviço de imagem:
su -s /bin/bash -c "glance-manage db_sync" glance
Inicie e ative o serviço Glance.
systemctl restart glance-api && systemctl enable glance-api
Configurar o Nginx
vim /etc/nginx/nginx.conf
Modifique adicionando detalhes de conexão do Glance à solicitação de proxy. Lembre-se de definir valores corretos para endereço de escuta, certificado SSL e chave.
# Add the following to the end of file
stream {
upstream glance-api {
server 127.0.0.1:9292;
}
server {
listen 192.168.1.2:9292 ssl;
proxy_pass glance-api;
}
ssl_certificate "/etc/letsencrypt/live/osp01.home.cloudlabske.io/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/osp01.home.cloudlabske.io/privkey.pem";
}
Reinicie o serviço da web nginx quando terminar.
systemctl restart nginx
5. Instale e configure o Nova
O OpenStack Compute é uma parte importante de um sistema de infraestrutura como serviço (IaaS). Ele fornece hospedagem e gerenciamento de sistemas de computação em nuvem.
Componentes do serviço OpenStack Compute.
- serviço nova-api: aceita e responde a chamadas de API de computação do usuário final.
- serviço nova-api-metadata: aceita solicitações de metadados de instâncias.
- serviço nova-compute: um daemon de trabalho que cria e encerra instâncias de máquinas virtuais por meio de APIs de hipervisor.
- serviço nova-scheduler: pega uma solicitação de instância de máquina virtual da fila e determina em qual host do servidor de computação ela é executada.
- módulo nova-conductor: Media as interações entre o serviço nova-compute e o banco de dados.
- daemon nova-novncproxy: fornece um proxy para acessar instâncias em execução por meio de uma conexão VNC.
- daemon nova-spicehtml5proxy: fornece um proxy para acessar instâncias em execução por meio de uma conexão SPICE.
- A fila: um hub central para passar mensagens entre daemons
- Banco de dados SQL: armazena a maioria dos estados de tempo de construção e tempo de execução para uma infraestrutura em nuvem, incluindo tipos de instâncias disponíveis, instâncias em uso, redes disponíveis e projetos.
1) Prepare os pré-requisitos de configuração
Neste guia, nossa virtualização preferida é KVM com libvirt. Instale o KVM e outros utilitários necessários.
apt install qemu-kvm libvirt-daemon libvirt-daemon-system bridge-utils libosinfo-bin virtinst
Confirme se as extensões de virtualização da CPU estão habilitadas em seu BIOS.
# lsmod | grep kvm
kvm_intel 380928 0
kvm 1142784 1 kvm_intel
irqbypass 16384 1 kvm
Adicione um usuário e banco de dados no MariaDB para Nova, Nova API, Placement, Nova cell.
# mysql
create database nova;
grant all privileges on nova.* to nova@'localhost' identified by 'StrongPassw0rd01';
create database nova_api;
grant all privileges on nova_api.* to nova@'localhost' identified by 'StrongPassw0rd01';
create database placement;
grant all privileges on placement.* to placement@'localhost' identified by 'StrongPassw0rd01';
create database nova_cell0;
grant all privileges on nova_cell0.* to nova@'localhost' identified by 'StrongPassw0rd01';
flush privileges;
exit
Crie o usuário nova:
# openstack user create --domain default --project service --password StrongPassw0rd01 nova
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| default_project_id | 1067895d9b99452b8d1758eda755c7bc |
| domain_id | default |
| enabled | True |
| id | 424afd4671ad49268bdbd14fe32b6fe2 |
| name | nova |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+
Adicione a função admin ao usuário nova:
openstack role add --project service --user nova admin
Adicionar usuário de veiculação no projeto de serviço
openstack user create --domain default --project service --password StrongPassw0rd01 placement
Adicione a função de administrador ao usuário da veiculação:
openstack role add --project service --user placement admin
Criar nova entrada de serviço
# openstack service create --name nova --description "OpenStack Compute service" compute
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | OpenStack Compute service |
| enabled | True |
| id | ba737aa8b0a240fab38bdf49b31a60f0 |
| name | nova |
| type | compute |
+-------------+----------------------------------+
Crie uma entrada de serviço de colocação.
# openstack service create --name placement --description "OpenStack Compute Placement service" placement
+-------------+-------------------------------------+
| Field | Value |
+-------------+-------------------------------------+
| description | OpenStack Compute Placement service |
| enabled | True |
| id | ae365b6e32ec4db985ec9c6e7f685ae1 |
| name | placement |
| type | placement |
+-------------+-------------------------------------+
Definir host da API Nova
export controller=$(hostname -f)
Crie um endpoint público para nova.
# openstack endpoint create --region RegionOne compute public https://$controller:8774/v2.1/%\(tenant_id\)s
+--------------+-----------------------------------------------------------+
| Field | Value |
+--------------+-----------------------------------------------------------+
| enabled | True |
| id | 50890db0f27443ddb547d24786340330 |
| interface | public |
| region | RegionOne |
| region_id | RegionOne |
| service_id | ba737aa8b0a240fab38bdf49b31a60f0 |
| service_name | nova |
| service_type | compute |
| url | https://osp01.home.cloudlabske.io:8774/v2.1/%(tenant_id)s |
+--------------+-----------------------------------------------------------+
Crie um endpoint privado para nova.
# openstack endpoint create --region RegionOne compute internal https://$controller:8774/v2.1/%\(tenant_id\)s
+--------------+-----------------------------------------------------------+
| Field | Value |
+--------------+-----------------------------------------------------------+
| enabled | True |
| id | 96b3abd5ca314429b0602a2bc153af77 |
| interface | internal |
| region | RegionOne |
| region_id | RegionOne |
| service_id | ba737aa8b0a240fab38bdf49b31a60f0 |
| service_name | nova |
| service_type | compute |
| url | https://osp01.home.cloudlabske.io:8774/v2.1/%(tenant_id)s |
+--------------+-----------------------------------------------------------+
Crie um endpoint administrativo para nova.
# openstack endpoint create --region RegionOne compute admin https://$controller:8774/v2.1/%\(tenant_id\)s
+--------------+-----------------------------------------------------------+
| Field | Value |
+--------------+-----------------------------------------------------------+
| enabled | True |
| id | 8fcd6f0a2d4c4816b09ca214e311597a |
| interface | admin |
| region | RegionOne |
| region_id | RegionOne |
| service_id | ba737aa8b0a240fab38bdf49b31a60f0 |
| service_name | nova |
| service_type | compute |
| url | https://osp01.home.cloudlabske.io:8774/v2.1/%(tenant_id)s |
+--------------+-----------------------------------------------------------+
Crie um endpoint público, privado e administrativo para nova.
# openstack endpoint create --region RegionOne placement public https://$controller:8778
+--------------+----------------------------------------+
| Field | Value |
+--------------+----------------------------------------+
| enabled | True |
| id | 2fc42dd9223d41aea94779daa6a80e19 |
| interface | public |
| region | RegionOne |
| region_id | RegionOne |
| service_id | ae365b6e32ec4db985ec9c6e7f685ae1 |
| service_name | placement |
| service_type | placement |
| url | https://osp01.home.cloudlabske.io:8778 |
+--------------+----------------------------------------+
# openstack endpoint create --region RegionOne placement internal https://$controller:8778
+--------------+----------------------------------------+
| Field | Value |
+--------------+----------------------------------------+
| enabled | True |
| id | fd284797981540c2b219139edbdbdf69 |
| interface | internal |
| region | RegionOne |
| region_id | RegionOne |
| service_id | ae365b6e32ec4db985ec9c6e7f685ae1 |
| service_name | placement |
| service_type | placement |
| url | https://osp01.home.cloudlabske.io:8778 |
+--------------+----------------------------------------+
# openstack endpoint create --region RegionOne placement admin https://$controller:8778
+--------------+----------------------------------------+
| Field | Value |
+--------------+----------------------------------------+
| enabled | True |
| id | 4c40f9d36e384c6685b9f56e7d951329 |
| interface | admin |
| region | RegionOne |
| region_id | RegionOne |
| service_id | ae365b6e32ec4db985ec9c6e7f685ae1 |
| service_name | placement |
| service_type | placement |
| url | https://osp01.home.cloudlabske.io:8778 |
+--------------+----------------------------------------+
2) Instalar e configurar serviços Nova
Instale pacotes Nova
apt install nova-api nova-scheduler nova-conductor nova-novncproxy python3-novaclient placement-api
Faça backup do arquivo de configuração atual do Nova
mv /etc/nova/nova.conf /etc/nova/nova.conf.orig
Criar nova configuração
vim /etc/nova/nova.conf
Cole enquanto modifica as configurações no arquivo. Configurar conexão RabbitMQ, VNC, API Glance,
[DEFAULT]
allow_resize_to_same_host = True
osapi_compute_listen = 127.0.0.1
osapi_compute_listen_port = 8774
metadata_listen = 127.0.0.1
metadata_listen_port = 8775
state_path = /var/lib/nova
enabled_apis = osapi_compute,metadata
log_dir = /var/log/nova
# RabbitMQ connection details
transport_url = rabbit://openstack:StrongPassw0rd01@localhost
[api]
auth_strategy = keystone
[vnc]
enabled = True
novncproxy_host = 127.0.0.1
novncproxy_port = 6080
novncproxy_base_url = https://osp01.home.cloudlabske.io:6080/vnc_auto.html
# Glance connection info
[glance]
api_servers = https://osp01.home.cloudlabske.io:9292
[oslo_concurrency]
lock_path = $state_path/tmp
# MariaDB connection info
[api_database]
connection = mysql+pymysql://nova:StrongPassw0rd01@localhost/nova_api
[database]
connection = mysql+pymysql://nova:StrongPassw0rd01@localhost/nova
# Keystone auth info
[keystone_authtoken]
www_authenticate_uri = https://osp01.home.cloudlabske.io:5000
auth_url = https://osp01.home.cloudlabske.io:5000
memcached_servers = localhost:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = nova
password = StrongPassw0rd01
# if using self-signed certs on Apache2 Keystone, turn to [true]
insecure = false
[placement]
auth_url = https://osp01.home.cloudlabske.io:5000
os_region_name = RegionOne
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = placement
password = StrongPassw0rd01
# if using self-signed certs on Apache2 Keystone, turn to [true]
insecure = false
[wsgi]
api_paste_config = /etc/nova/api-paste.ini
[oslo_policy]
enforce_new_defaults = true
Defina propriedade e permissões.
chgrp nova /etc/nova/nova.conf
chmod 640 /etc/nova/nova.conf
Definir tipo de proxy do console para Nova
sudo sed -i 's/^NOVA_CONSOLE_PROXY_TYPE=.*/NOVA_CONSOLE_PROXY_TYPE=novnc/g' /etc/default/nova-consoleproxy
Fazer backup da configuração do canal atual
mv /etc/placement/placement.conf /etc/placement/placement.conf.orig
Crie um novo arquivo de configuração para posicionamento Nova
vim /etc/placement/placement.conf
Ajuste e cole as configurações no arquivo.
[DEFAULT]
debug = false
[api]
auth_strategy = keystone
[keystone_authtoken]
www_authenticate_uri = https://osp01.home.cloudlabske.io:5000
auth_url = https:/osp01.home.cloudlabske.io:5000
memcached_servers = localhost:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = placement
password = StrongPassw0rd01
# if using self-signed certs on Apache2 Keystone, turn to [true]
insecure = false
[placement_database]
connection = mysql+pymysql://placement:StrongPassw0rd01@localhost/placement
Criar API de posicionamento
vim /etc/apache2/sites-available/placement-api.conf
Aqui está o conteúdo para colocar no arquivo. Você não precisa mudar nada aqui.
Listen 127.0.0.1:8778
<VirtualHost *:8778>
WSGIScriptAlias / /usr/bin/placement-api
WSGIDaemonProcess placement-api processes=5 threads=1 user=placement group=placement display-name=%{GROUP}
WSGIProcessGroup placement-api
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
LimitRequestBody 114688
<IfVersion >= 2.4>
ErrorLogFormat "%{cu}t %M"
</IfVersion>
ErrorLog /var/log/apache2/placement_api_error.log
CustomLog /var/log/apache2/placement_api_access.log combined
<Directory /usr/bin>
Require all granted
</Directory>
</VirtualHost>
Alias /placement /usr/bin/placement-api
<Location /placement>
SetHandler wsgi-script
Options +ExecCGI
WSGIProcessGroup placement-api
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
</Location>
Defina as permissões de arquivo corretas
chgrp placement /etc/placement/placement.conf
chmod 640 /etc/placement/placement.conf
Atualize o endereço de ligação UWSGI para localhost.
sed -i -e "s/UWSGI_BIND_IP=.*/UWSGI_BIND_IP=\"127.0.0.1\"/" /etc/init.d/nova-api
sed -i -e "s/UWSGI_BIND_IP=.*/UWSGI_BIND_IP=\"127.0.0.1\"/" /etc/init.d/nova-api-metadata
Habilite o site apache da API de posicionamento.
a2ensite placement-api
Reinicie os serviços quando terminar.
systemctl disable --now placement-api && systemctl restart apache2
Abra o arquivo de configuração do Nginx.
vim /etc/nginx/nginx.conf
Atualize adicionando as linhas com cores. Substitua 192.168.1.2 pelo endereço IP do seu servidor.
stream {
upstream glance-api {
server 127.0.0.1:9292;
}
server {
listen 192.168.1.2:9292 ssl;
proxy_pass glance-api;
}
upstream nova-api {
server 127.0.0.1:8774;
}
server {
listen 192.168.1.2:8774 ssl;
proxy_pass nova-api;
}
upstream nova-metadata-api {
server 127.0.0.1:8775;
}
server {
listen 192.168.1.2:8775 ssl;
proxy_pass nova-metadata-api;
}
upstream placement-api {
server 127.0.0.1:8778;
}
server {
listen 192.168.1.2:8778 ssl;
proxy_pass placement-api;
}
upstream novncproxy {
server 127.0.0.1:6080;
}
server {
listen 192.168.1.2:6080 ssl;
proxy_pass novncproxy;
}
ssl_certificate "/etc/letsencrypt/live/osp01.home.cloudlabske.io/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/osp01.home.cloudlabske.io/privkey.pem";
}
Importe todos os dados necessários.
# Populate the placement database
su -s /bin/bash placement -c "placement-manage db sync"
# Populate the nova-api database
su -s /bin/bash nova -c "nova-manage api_db sync"
# Register the cell0 database
su -s /bin/bash nova -c "nova-manage cell_v2 map_cell0"
# Populate the nova database
su -s /bin/bash nova -c "nova-manage db sync"
# Create the cell1 cell
su -s /bin/sh nova -c "nova-manage cell_v2 create_cell --name cell1"
Pare os serviços associados às operações do Nova.
systemctl stop nova-api nova-api-metadata nova-conductor nova-scheduler nova-novncproxy
Reinicie o servidor web nginx
systemctl restart nginx
Em seguida, inicie outros serviços
systemctl enable --now nova-api nova-api-metadata nova-conductor nova-scheduler nova-novncproxy
Verifique se nova cell0 e cell1 estão registrados corretamente:
# su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova
+-------+--------------------------------------+-----------------------------------+------------------------------------------------+----------+
| Name | UUID | Transport URL | Database Connection | Disabled |
+-------+--------------------------------------+-----------------------------------+------------------------------------------------+----------+
| cell0 | 00000000-0000-0000-0000-000000000000 | none:/ | mysql+pymysql://nova:****@localhost/nova_cell0 | False |
| cell1 | d3a70005-5861-427e-9bdf-984b15400d7e | rabbit://openstack:****@localhost | mysql+pymysql://nova:****@localhost/nova | False |
+-------+--------------------------------------+-----------------------------------+------------------------------------------------+----------+
Listar serviços de computação registrados.
# openstack compute service list
+--------------------------------------+----------------+-------+----------+---------+-------+----------------------------+
| ID | Binary | Host | Zone | Status | State | Updated At |
+--------------------------------------+----------------+-------+----------+---------+-------+----------------------------+
| 6f75eb27-9c66-41c0-b0fa-15f1a48cb25c | nova-conductor | osp01 | internal | enabled | up | 2024-02-02T07:21:04.000000 |
| 802d523d-1f92-427b-9f90-691bf54268af | nova-scheduler | osp01 | internal | enabled | up | 2024-02-02T07:21:05.000000 |
+--------------------------------------+----------------+-------+----------+---------+-------+----------------------------+
3) Instale o computador Nova KVM
Instale o pacote de computação Nova KVM
apt install nova-compute nova-compute-kvm -y
Abra o arquivo de configuração do nova.
vim /etc/nova/nova.conf
Atualize as configurações do VNC da seguinte maneira.
[vnc]
enabled = True
server_listen = 192.168.1.2
server_proxyclient_address = 192.168.1.2
novncproxy_host = 127.0.0.1
novncproxy_port = 6080
ovncproxy_host = 127.0.0.1
novncproxy_port = 6080
novncproxy_base_url = https://osp01.home.cloudlabske.io:6080/vnc_auto.html
Reinicie o nova-compute quando terminar
systemctl restart nova-compute.service
Descubra células e mapas de hosts encontrados.
su -s /bin/bash nova -c "nova-manage cell_v2 discover_hosts"
Verifique a nova lista de serviços de host nova.
# openstack compute service list
+--------------------------------------+----------------+-------+----------+---------+-------+----------------------------+
| ID | Binary | Host | Zone | Status | State | Updated At |
+--------------------------------------+----------------+-------+----------+---------+-------+----------------------------+
| 6f75eb27-9c66-41c0-b0fa-15f1a48cb25c | nova-conductor | osp01 | internal | enabled | up | 2024-02-02T07:32:44.000000 |
| 802d523d-1f92-427b-9f90-691bf54268af | nova-scheduler | osp01 | internal | enabled | up | 2024-02-02T07:32:45.000000 |
| 83fd3604-7345-4258-a3a2-324900b04b8e | nova-compute | osp01 | nova | enabled | up | 2024-02-02T07:32:43.000000 |
+--------------------------------------+----------------+-------+----------+---------+-------+----------------------------+
6. Configurar serviço de rede (Neutron)
OpenStack Networking (neutron) fornece uma integração para criar e anexar dispositivos de interface gerenciados por outros serviços OpenStack a redes.
Componentes:
- neutron-server: aceita e roteia solicitações de API para o plug-in OpenStack Networking apropriado para ação.
- Plug-ins e agentes do OpenStack Networking: conecte e desconecte portas, crie redes ou sub-redes e forneça endereçamento IP.
- Fila de mensagens: Usado pela maioria das instalações do OpenStack Networking para rotear informações entre o servidor neutron e vários agentes
1) Prepare o ambiente
Crie banco de dados e usuário para o serviço de rede Neutron.
# mysql
create database neutron_ml2;
grant all privileges on neutron_ml2.* to neutron@'localhost' identified by 'StrongPassw0rd01';
flush privileges;
exit
Em seguida, adicionamos usuário ou serviço para Neutron no Keystone.
# openstack user create --domain default --project service --password StrongPassw0rd01 neutron
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| default_project_id | 1067895d9b99452b8d1758eda755c7bc |
| domain_id | default |
| enabled | True |
| id | 71d4813059f5472f852a946bdaf272f4 |
| name | neutron |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+
# openstack role add --project service --user neutron admin
# openstack service create --name neutron --description "OpenStack Networking service" network
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | OpenStack Networking service |
| enabled | True |
| id | 7da12e4154ad4f97b8f449f01d6a56ec |
| name | neutron |
| type | network |
+-------------+----------------------------------+
É necessário criar um endpoint.
# Save your server
export controller=$(hostname -f)
# openstack endpoint create --region RegionOne network public https://$controller:9696
+--------------+----------------------------------------+
| Field | Value |
+--------------+----------------------------------------+
| enabled | True |
| id | 3bc3eb0a234a46b68fa2190095f4cd53 |
| interface | public |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 7da12e4154ad4f97b8f449f01d6a56ec |
| service_name | neutron |
| service_type | network |
| url | https://osp01.home.cloudlabske.io:9696 |
+--------------+----------------------------------------+
# openstack endpoint create --region RegionOne network internal https://$controller:9696
+--------------+----------------------------------------+
| Field | Value |
+--------------+----------------------------------------+
| enabled | True |
| id | 2bc933e3f8fc4238874adc2cf0b764f9 |
| interface | internal |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 7da12e4154ad4f97b8f449f01d6a56ec |
| service_name | neutron |
| service_type | network |
| url | https://osp01.home.cloudlabske.io:9696 |
+--------------+----------------------------------------+
# openstack endpoint create --region RegionOne network admin https://$controller:9696
+--------------+----------------------------------------+
| Field | Value |
+--------------+----------------------------------------+
| enabled | True |
| id | fa110991eab34d4e9e1c639865ce2b14 |
| interface | admin |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 7da12e4154ad4f97b8f449f01d6a56ec |
| service_name | neutron |
| service_type | network |
| url | https://osp01.home.cloudlabske.io:9696 |
+--------------+----------------------------------------+
2) Instale e configure o Neutron
Instale pacotes Neutron para OpenStack
apt install neutron-server neutron-metadata-agent neutron-openvswitch-agent neutron-plugin-ml2 neutron-l3-agent neutron-metadata-agent openvswitch-switch python3-neutronclient neutron-dhcp-agent
Faça backup do arquivo de configuração atual.
mv /etc/neutron/neutron.conf /etc/neutron/neutron.conf.orig
Crie um novo arquivo de configuração
vim /etc/neutron/neutron.conf
Modifique ao colar o conteúdo fornecido aqui.
[DEFAULT]
bind_host = 127.0.0.1
bind_port = 9696
core_plugin = ml2
service_plugins = router
auth_strategy = keystone
state_path = /var/lib/neutron
dhcp_agent_notification = True
allow_overlapping_ips = True
notify_nova_on_port_status_changes = True
notify_nova_on_port_data_changes = True
# RabbitMQ connection info
transport_url = rabbit://openstack:StrongPassw0rd01@localhost
[agent]
root_helper = sudo /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf
# Keystone auth info
[keystone_authtoken]
www_authenticate_uri = https://osp01.home.cloudlabske.io:5000
auth_url = https://osp01.home.cloudlabske.io:5000
memcached_servers = localhost:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = StrongPassw0rd01
# if using self-signed certs on Apache2 Keystone, turn to [true]
insecure = false
# MariaDB connection info
[database]
connection = mysql+pymysql://neutron:StrongPassw0rd01@localhost/neutron_ml2
# Nova auth info
[nova]
auth_url = https://osp01.home.cloudlabske.io:5000
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = nova
password = StrongPassw0rd01
# if using self-signed certs on Apache2 Keystone, turn to [true]
insecure = false
[oslo_concurrency]
lock_path = $state_path/tmp
[oslo_policy]
enforce_new_defaults = true
Edite a configuração do agente de metadados e defina o host, o segredo compartilhado do proxy e o endereço do host do memcache.
# vim /etc/neutron/metadata_agent.ini
nova_metadata_host = osp01.home.cloudlabske.io
nova_metadata_protocol = https
# specify any secret key you like
metadata_proxy_shared_secret = metadata_secret
# specify Memcache server
memcache_servers = localhost:11211
Faça backup da configuração do ml2 e crie uma nova.
mv /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugins/ml2/ml2_conf.ini.orig
vim /etc/neutron/plugins/ml2/ml2_conf.ini
Atualize as novas configurações conforme abaixo.
[DEFAULT]
[ml2]
type_drivers = flat,vlan,vxlan
tenant_network_types =
mechanism_drivers = openvswitch
extension_drivers = port_security
[ml2_type_flat]
[ml2_type_vxlan]
[securitygroup]
enable_security_group = True
enable_ipset = True
Configure o agente da camada 3 definindo o driver de interface como openvswitch.
# vim /etc/neutron/l3_agent.ini
interface_driver = openvswitch
Também driver de interface DHCP para openvswitch e ativar o driver dnsmasq dhcp.
# vim /etc/neutron/dhcp_agent.ini
# Confirm in line 18
interface_driver = openvswitch
# uncomment line 37
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
Crie um novo arquivo de configurações do agente Open vSwitch.
mv /etc/neutron/plugins/ml2/openvswitch_agent.ini /etc/neutron/plugins/ml2/openvswitch_agent.ini.orig
vim /etc/neutron/plugins/ml2/openvswitch_agent.ini
Configure como abaixo:
[DEFAULT]
[agent]
[ovs]
[securitygroup]
firewall_driver = openvswitch
enable_security_group = True
enable_ipset = True
Crie os arquivos necessários e defina as permissões corretas
touch /etc/neutron/fwaas_driver.ini
chmod 640 /etc/neutron/{neutron.conf,fwaas_driver.ini}
chmod 640 /etc/neutron/plugins/ml2/{ml2_conf.ini,openvswitch_agent.ini}
chgrp neutron /etc/neutron/{neutron.conf,fwaas_driver.ini}
chgrp neutron /etc/neutron/plugins/ml2/{ml2_conf.ini,openvswitch_agent.ini}
Abra a configuração do Nova e adicione as configurações de rede Neutron.
# vim /etc/nova/nova.conf
# add follows into the [DEFAULT] section
vif_plugging_is_fatal = True
vif_plugging_timeout = 300
# Add the following to the end : Neutron auth info
# the value of [metadata_proxy_shared_secret] is the same with the one in [metadata_agent.ini]
[neutron]
auth_url = https://osp01.home.cloudlabske.io:5000
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = neutron
password = StrongPassw0rd01
service_metadata_proxy = True
metadata_proxy_shared_secret = metadata_secret
insecure = false
Atualize o endereço de ligação UWSGI_BIND_IP.
sed -i -e "s/UWSGI_BIND_IP=.*/UWSGI_BIND_IP=\"127.0.0.1\"/" /etc/init.d/neutron-api
Atualizar fluxos nginx
vim /etc/nginx/nginx.conf
Adicione parâmetros de servidor e upstream de nêutrons para proxy.
stream {
upstream glance-api {
server 127.0.0.1:9292;
}
server {
listen 192.168.1.2:9292 ssl;
proxy_pass glance-api;
}
upstream nova-api {
server 127.0.0.1:8774;
}
server {
listen 192.168.1.2:8774 ssl;
proxy_pass nova-api;
}
upstream nova-metadata-api {
server 127.0.0.1:8775;
}
server {
listen 192.168.1.2:8775 ssl;
proxy_pass nova-metadata-api;
}
upstream placement-api {
server 127.0.0.1:8778;
}
server {
listen 192.168.1.2:8778 ssl;
proxy_pass placement-api;
}
upstream novncproxy {
server 127.0.0.1:6080;
}
server {
listen 192.168.1.2:6080 ssl;
proxy_pass novncproxy;
}
upstream neutron-api {
server 127.0.0.1:9696;
}
server {
listen 192.168.1.2:9696 ssl;
proxy_pass neutron-api;
}
ssl_certificate "/etc/letsencrypt/live/osp01.home.cloudlabske.io/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/osp01.home.cloudlabske.io/privkey.pem";
}
Crie um link simbólico para ml2_conf.ini
ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini
Em seguida, preencha o banco de dados de nêutrons
su -s /bin/bash neutron -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugin.ini upgrade head"
Saída de execução esperada;
....
INFO [alembic.runtime.migration] Running upgrade 1e0744e4ffea -> 6135a7bd4425
INFO [alembic.runtime.migration] Running upgrade 6135a7bd4425 -> 8df53b0d2c0e
INFO [alembic.runtime.migration] Running upgrade 8df53b0d2c0e -> 1bb3393de75d, add qos policy rule Packet Rate Limit
INFO [alembic.runtime.migration] Running upgrade 1bb3393de75d -> c181bb1d89e4
INFO [alembic.runtime.migration] Running upgrade c181bb1d89e4 -> ba859d649675
INFO [alembic.runtime.migration] Running upgrade ba859d649675 -> e981acd076d3
INFO [alembic.runtime.migration] Running upgrade e981acd076d3 -> 76df7844a8c6, add Local IP tables
INFO [alembic.runtime.migration] Running upgrade 76df7844a8c6 -> 1ffef8d6f371, migrate RBAC registers from "target_tenant" to "target_project"
INFO [alembic.runtime.migration] Running upgrade 1ffef8d6f371 -> 8160f7a9cebb, drop portbindingports table
INFO [alembic.runtime.migration] Running upgrade 8160f7a9cebb -> cd9ef14ccf87
INFO [alembic.runtime.migration] Running upgrade cd9ef14ccf87 -> 34cf8b009713
INFO [alembic.runtime.migration] Running upgrade 34cf8b009713 -> I43e0b669096
INFO [alembic.runtime.migration] Running upgrade I43e0b669096 -> 4e6e655746f6
INFO [alembic.runtime.migration] Running upgrade 4e6e655746f6 -> 659cbedf30a1
INFO [alembic.runtime.migration] Running upgrade 659cbedf30a1 -> 21ff98fabab1
INFO [alembic.runtime.migration] Running upgrade 21ff98fabab1 -> 5881373af7f5
INFO [alembic.runtime.migration] Running upgrade 7d9d8eeec6ad -> a8b517cff8ab
INFO [alembic.runtime.migration] Running upgrade a8b517cff8ab -> 3b935b28e7a0
INFO [alembic.runtime.migration] Running upgrade 3b935b28e7a0 -> b12a3ef66e62
INFO [alembic.runtime.migration] Running upgrade b12a3ef66e62 -> 97c25b0d2353
INFO [alembic.runtime.migration] Running upgrade 97c25b0d2353 -> 2e0d7a8a1586
INFO [alembic.runtime.migration] Running upgrade 2e0d7a8a1586 -> 5c85685d616d
OK
root
Ative a interface OVS.
ip link set up ovs-system
Pare os serviços de nêutrons.
systemctl stop neutron-api neutron-rpc-server neutron-l3-agent neutron-dhcp-agent neutron-metadata-agent neutron-openvswitch-agent nova-api nova-compute nginx
Inicie os serviços de nêutrons.
systemctl start neutron-api neutron-rpc-server neutron-l3-agent neutron-dhcp-agent neutron-metadata-agent neutron-openvswitch-agent nova-api nova-compute nginx
Habilite que os serviços sejam iniciados na inicialização do sistema.
systemctl enable neutron-api neutron-rpc-server neutron-l3-agent neutron-dhcp-agent neutron-metadata-agent neutron-openvswitch-agent
Confirme a lista de agentes de rede.
# openstack network agent list
+--------------------------------------+--------------------+-------+-------------------+-------+-------+---------------------------+
| ID | Agent Type | Host | Availability Zone | Alive | State | Binary |
+--------------------------------------+--------------------+-------+-------------------+-------+-------+---------------------------+
| 2c802774-b93a-45fb-b23b-aa9994237e23 | Metadata agent | osp01 | None | :-) | UP | neutron-metadata-agent |
| 52e59a27-59c3-45a3-bca0-1c55dae3281e | L3 agent | osp01 | nova | :-) | UP | neutron-l3-agent |
| 96e812a7-fb0f-4099-a989-1b203843d8c8 | Open vSwitch agent | osp01 | None | :-) | UP | neutron-openvswitch-agent |
| e02cf121-ed3e-4a5e-9cf8-87dc28aa28be | DHCP agent | osp01 | nova | :-) | UP | neutron-dhcp-agent |
+--------------------------------------+--------------------+-------+-------------------+-------+-------+---------------------------+
3) Configurar rede Neutron Flat
Confirme suas interfaces ativadas no servidor.
$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether 1c:69:7a:ab:be:de brd ff:ff:ff:ff:ff:ff
altname enp0s31f6
3: ovs-system: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/ether 7e:b9:25:db:58:bd brd ff:ff:ff:ff:ff:ff
4: br-int: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 9e:91:4a:20:26:4f brd ff:ff:ff:ff:ff:ff
Abra o arquivo de configurações de rede e ajuste para ficar semelhante aos mostrados abaixo.
# vim /etc/network/interfaces
auto eno1
iface eno1 inet manual
auto br-eno1
iface br-eno1 inet static
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 192.168.1.1
auto ovs-system
iface ovs-system inet manual
Substituir
- eno1 pelo nome da interface de rede física
- br–eno1 com a ponte a ser adicionada.
- 192.168.1.2 com o endereço IP da sua máquina e 255.255.255.0 sendo a máscara de rede
- 192.168.1.1 é gateway e servidor DNS em 192.168.1.1 também.
Insira o nome da interface e o nome da ponte como variáveis.
INT_NAME=eno1
BR_NAME=br-eno1
Adicione a ponte OVS ao sistema.
ovs-vsctl add-br $BR_NAME
ip link set $INT_NAME up
ip link set $BR_NAME up
Adicione uma porta à ponte
ovs-vsctl add-port $BR_NAME $INT_NAME
Modifique openvswitch_agent.ini
e faça mapeamentos de pontes físicas.
# vim /etc/neutron/plugins/ml2/openvswitch_agent.ini
# add a line undet [ovs] section
[ovs]
bridge_mappings = physnet1:br-eno1
Como estamos usando uma rede plana, especifique a rede conforme mapeada para uma ponte acima.
# vim /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2_type_flat]
flat_networks = physnet1
Reinicie os serviços de nêutrons.
systemctl restart neutron-api neutron-rpc-server neutron-openvswitch-agent
4) Crie uma rede virtual
Definir ID do projeto
projectID=$(openstack project list | grep service | awk '{print $2}')
Crie uma rede compartilhada
# openstack network create --project $projectID \
--share --provider-network-type flat --provider-physical-network physnet1 private
+---------------------------+--------------------------------------+
| Field | Value |
+---------------------------+--------------------------------------+
| admin_state_up | UP |
| availability_zone_hints | |
| availability_zones | |
| created_at | 2024-02-02T08:45:27Z |
| description | |
| dns_domain | None |
| id | 36577b59-f6e1-4844-a0d8-a277c9ddc780 |
| ipv4_address_scope | None |
| ipv6_address_scope | None |
| is_default | False |
| is_vlan_transparent | None |
| mtu | 1500 |
| name | private |
| port_security_enabled | True |
| project_id | 1067895d9b99452b8d1758eda755c7bc |
| provider:network_type | flat |
| provider:physical_network | physnet1 |
| provider:segmentation_id | None |
| qos_policy_id | None |
| revision_number | 1 |
| router:external | Internal |
| segments | None |
| shared | True |
| status | ACTIVE |
| subnets | |
| tags | |
| updated_at | 2024-02-02T08:45:27Z |
+---------------------------+--------------------------------------+
Crie uma sub-rede na rede que acabamos de criar. Aqui estamos usando;
- Rede: 192.168.1.0/24
- Início do DHCP: 192.168.1.101
- Fim do DHCP: 192.168.1.149
- Gateway e servidor DNS: 192.168.1.1
openstack subnet create subnet1 --network private \
--project $projectID --subnet-range 192.168.1.0/24 \
--allocation-pool start=192.168.1.101,end=192.168.1.149 \
--gateway 192.168.1.1 --dns-nameserver 192.168.1.1
Liste redes e sub-redes criadas no openstack.
# openstack network list
+--------------------------------------+---------+--------------------------------------+
| ID | Name | Subnets |
+--------------------------------------+---------+--------------------------------------+
| 36577b59-f6e1-4844-a0d8-a277c9ddc780 | private | 6f216cd7-acd3-4c31-bc5e-67875c5dcc09 |
+--------------------------------------+---------+--------------------------------------+
# openstack subnet list
+--------------------------------------+---------+--------------------------------------+----------------+
| ID | Name | Network | Subnet |
+--------------------------------------+---------+--------------------------------------+----------------+
| 6f216cd7-acd3-4c31-bc5e-67875c5dcc09 | subnet1 | 36577b59-f6e1-4844-a0d8-a277c9ddc780 | 192.168.1.0/24 |
+--------------------------------------+---------+--------------------------------------+----------------+
7. Adicione sabores de computação e chave SSH
No OpenStack, tipos são usados para definir a capacidade de computação, memória e armazenamento das instâncias de computação nova. Pense nisso como uma configuração de hardware para um servidor.
Amostras;
- Sabor m1.tiny com: CPU 1, memória 2048M, disco raiz 20G
- Sabor m1.small com: CPU 2, memória 4096, disco raiz 30G
- Sabor m1.medium com: CPU 2, memória 8192, disco raiz 40G
Veja abaixo um exemplo de criação dos sabores.
openstack flavor create --id 1 --vcpus 1 --ram 2048 --disk 20 m1.tiny
openstack flavor create --id 2 --vcpus 1 --ram 4096 --disk 30 m1.small
openstack flavor create --id 3 --vcpus 1 --ram 8192 --disk 40 m1.medium
Liste os sabores disponíveis em sua nuvem OpenStack.
root@osp01 ~(keystone)$ openstack flavor list
+----+-----------+------+------+-----------+-------+-----------+
| ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public |
+----+-----------+------+------+-----------+-------+-----------+
| 1 | m1.tiny | 2048 | 20 | 0 | 1 | True |
| 2 | m1.small | 4096 | 30 | 0 | 1 | True |
| 3 | m1.medium | 8192 | 40 | 0 | 1 | True |
+----+-----------+------+------+-----------+-------+-----------+
Adicionar chave SSH
Você pode gerar um par de chaves SSH se não existir nenhum.
ssh-keygen -q -N ""
Adicione a chave criada dando um nome a ela.
# openstack keypair create --public-key ~/.ssh/id_rsa.pub default-pubkey
+-------------+-------------------------------------------------+
| Field | Value |
+-------------+-------------------------------------------------+
| created_at | None |
| fingerprint | 19:7b:5c:14:a2:21:7a:a3:dd:56:c6:e4:3a:22:e8:3f |
| id | default-pubkey |
| is_deleted | None |
| name | default-pubkey |
| type | ssh |
| user_id | 61800deb7d664bbcb4f3eef188cc8dbc |
+-------------+-------------------------------------------------+
# openstack keypair list
+----------------+-------------------------------------------------+------+
| Name | Fingerprint | Type |
+----------------+-------------------------------------------------+------+
| default-pubkey | 19:7b:5c:14:a2:21:7a:a3:dd:56:c6:e4:3a:22:e8:3f | ssh |
| jmutai-pubkey | 19:7b:5c:14:a2:21:7a:a3:dd:56:c6:e4:3a:22:e8:3f | ssh |
+----------------+-------------------------------------------------+------+
8. Crie grupos de segurança
Um grupo de segurança é um conjunto nomeado de regras de acesso à rede usadas para limitar os tipos de tráfego que têm acesso às instâncias. Ao executar uma instância, você pode atribuir um ou mais grupos de segurança a ela. Se você não criar grupos de segurança, novas instâncias serão automaticamente atribuídas ao grupo de segurança padrão, a menos que você especifique explicitamente um grupo de segurança diferente.
O grupo de segurança padrão é denominado default.
# openstack security group list
+--------------------------------------+---------+------------------------+----------------------------------+------+
| ID | Name | Description | Project | Tags |
+--------------------------------------+---------+------------------------+----------------------------------+------+
| c1ab8c8f-bd2e-43ab-8f6f-54a045885411 | default | Default security group | 9a102dfdf9a54e8382fefdca727b2553 | [] |
+--------------------------------------+---------+------------------------+----------------------------------+------+
# openstack security group rule list default
+--------------------------------------+-------------+-----------+-----------+------------+-----------+--------------------------------------+----------------------+
| ID | IP Protocol | Ethertype | IP Range | Port Range | Direction | Remote Security Group | Remote Address Group |
+--------------------------------------+-------------+-----------+-----------+------------+-----------+--------------------------------------+----------------------+
| 2a4aa470-935a-474a-a8bd-06623218a287 | None | IPv4 | 0.0.0.0/0 | | egress | None | None |
| 6cf36173-e187-4ed2-82f4-f5ead4ad3134 | None | IPv6 | ::/0 | | egress | None | None |
| 7d4af0e4-fb46-40b5-b447-8e7d22cbdb4d | None | IPv4 | 0.0.0.0/0 | | ingress | c1ab8c8f-bd2e-43ab-8f6f-54a045885411 | None |
| a98b779a-f63a-44ff-834e-c3a557f2864d | None | IPv6 | ::/0 | | ingress | c1ab8c8f-bd2e-43ab-8f6f-54a045885411 | None |
+--------------------------------------+-------------+-----------+-----------+------------+-----------+--------------------------------------+----------------------+
Vamos criar um grupo de segurança que permita a entrada e saída de tudo.
openstack security group create allow_all --description "Allow all ports"
openstack security group rule create --protocol TCP --dst-port 1:65535 --remote-ip 0.0.0.0/0 allow_all
openstack security group rule create --protocol ICMP --remote-ip 0.0.0.0/0 allow_all
Liste os grupos de segurança para confirmar que foram criados.
# openstack security group list
+--------------------------------------+-----------+------------------------+----------------------------------+------+
| ID | Name | Description | Project | Tags |
+--------------------------------------+-----------+------------------------+----------------------------------+------+
| 287e76b4-337a-4c08-9e3d-84efd9274edb | allow_all | Allow all ports | 9a102dfdf9a54e8382fefdca727b2553 | [] |
| c1ab8c8f-bd2e-43ab-8f6f-54a045885411 | default | Default security group | 9a102dfdf9a54e8382fefdca727b2553 | [] |
+--------------------------------------+-----------+------------------------+----------------------------------+------+
Abaixo está um grupo de segurança de acesso limitado. Permitindo acesso apenas a portas conhecidas, por exemplo, 22, 80, 443, icmp
openstack security group create base --description "Allow common ports"
openstack security group rule create --protocol TCP --dst-port 22 --remote-ip 0.0.0.0/0 base
openstack security group rule create --protocol TCP --dst-port 80 --remote-ip 0.0.0.0/0 base
openstack security group rule create --protocol TCP --dst-port 443 --remote-ip 0.0.0.0/0 base
openstack security group rule create --protocol ICMP --remote-ip 0.0.0.0/0 base
9. Adicione imagens do sistema operacional e crie uma VM de teste
Temos um artigo dedicado sobre como você pode fazer upload de imagens de nuvem do sistema operacional para o serviço de imagem OpenStack Glance.
- Como fazer upload de imagens VM Cloud para OpenStack Glance
Confirme uma vez carregado listando as imagens disponíveis.
# openstack image list
+--------------------------------------+-----------------+--------+
| ID | Name | Status |
+--------------------------------------+-----------------+--------+
| 37c638d5-caa0-4570-a126-2c9d64b262b4 | AlmaLinux-9 | active |
| 3ae8095e-a774-468b-8376-c3d1b8a70bdf | CentOS-Stream-9 | active |
| 83bf7ac6-9248-415b-ac89-269f2b70fdb4 | Debian-12 | active |
| 02799133-06ed-483d-9121-e3791c12bb1c | Fedora-39 | active |
+--------------------------------------+-----------------+--------+
Confirmar sabores
# openstack flavor list
+----+-----------+------+------+-----------+-------+-----------+
| ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public |
+----+-----------+------+------+-----------+-------+-----------+
| 1 | m1.tiny | 2048 | 20 | 0 | 1 | True |
| 2 | m1.small | 4096 | 30 | 0 | 1 | True |
| 3 | m1.medium | 8192 | 40 | 0 | 1 | True |
+----+-----------+------+------+-----------+-------+-----------+
Listar redes
# openstack network list
+--------------------------------------+---------+--------------------------------------+
| ID | Name | Subnets |
+--------------------------------------+---------+--------------------------------------+
| 36577b59-f6e1-4844-a0d8-a277c9ddc780 | private | 6f216cd7-acd3-4c31-bc5e-67875c5dcc09 |
+--------------------------------------+---------+--------------------------------------+
Confirme os grupos de segurança configurados.
# openstack security group list
+--------------------------------------+-----------+------------------------+----------------------------------+------+
| ID | Name | Description | Project | Tags |
+--------------------------------------+-----------+------------------------+----------------------------------+------+
| 287e76b4-337a-4c08-9e3d-84efd9274edb | allow_all | Allow all ports | 9a102dfdf9a54e8382fefdca727b2553 | [] |
| c1ab8c8f-bd2e-43ab-8f6f-54a045885411 | default | Default security group | 9a102dfdf9a54e8382fefdca727b2553 | [] |
+--------------------------------------+-----------+------------------------+----------------------------------+------+
Liste os pares de chaves configurados em seu OpenStack.
# openstack keypair list
+----------------+-------------------------------------------------+------+
| Name | Fingerprint | Type |
+----------------+-------------------------------------------------+------+
| default-pubkey | 19:7b:5c:14:a2:21:7a:a3:dd:56:c6:e4:3a:22:e8:3f | ssh |
| jmutai-pubkey | 19:7b:5c:14:a2:21:7a:a3:dd:56:c6:e4:3a:22:e8:3f | ssh |
+----------------+-------------------------------------------------+------+
Crie uma instância de VM no Nova Compute
openstack server create --flavor m1.small \
--image AlmaLinux-9 \
--security-group allow_all \
--network private \
--key-name default-pubkey \
AlmaLinux-9
10. Configurar Horizon – Painel OpenStack
Horizon é um projeto baseado em Django que visa fornecer um painel OpenStack completo junto com uma estrutura extensível para construir novos painéis a partir de componentes reutilizáveis. O único serviço principal exigido pelo painel é o serviço de Identidade.
Instale o pacote openstack do painel.
apt install openstack-dashboard -y
Abra o arquivo local_settings.py
para edição.
vim /etc/openstack-dashboard/local_settings.py
Ajuda
# In line 99 : change Memcache server
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
},
}
# In line 107 : add
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
# line 120 : set Openstack Host
# line 121 : comment out and add a line to specify URL of Keystone Host
OPENSTACK_HOST = "osp01.home.cloudlabske.io"
#OPENSTACK_KEYSTONE_URL = "http://%s/identity/v3" % OPENSTACK_HOST
OPENSTACK_KEYSTONE_URL = "https://osp01.home.cloudlabske.io:5000/v3"
# line 125 : set your timezone
TIME_ZONE = "Africa/Nairobi"
# Add to the end of file
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = 'Default'
# set [True] below if you are using self signed certificate
OPENSTACK_SSL_NO_VERIFY = False
Edite também o arquivo SSL padrão do Apache.
# vim /etc/apache2/sites-available/default-ssl.conf
# In line 31,32, configure path to your SSL certificate and key
SSLCertificateFile /etc/letsencrypt/live/osp01.home.cloudlabske.io/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/osp01.home.cloudlabske.io/privkey.pem
# In line 41 : uncomment and specify your chain file
SSLCertificateChainFile /etc/letsencrypt/live/osp01.home.cloudlabske.io/chain.pem
r
# change to your Memcache server
Especifique o endereço do Memcache
# vim /etc/openstack-dashboard/local_settings.d/_0006_debian_cache.py
CACHES = {
'default' : {
#'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}
Crie um novo arquivo de configuração Apache do painel OpenStack.
vim /etc/apache2/conf-available/openstack-dashboard.conf
Adicione o conteúdo abaixo.
WSGIScriptAlias / /usr/share/openstack-dashboard/wsgi.py process-group=horizon
WSGIDaemonProcess horizon user=horizon group=horizon processes=3 threads=10 display-name=%{GROUP}
WSGIProcessGroup horizon
WSGIApplicationGroup %{GLOBAL}
Alias /static /var/lib/openstack-dashboard/static/
Alias /horizon/static /var/lib/openstack-dashboard/static/
<Directory /usr/share/openstack-dashboard>
Require all granted
</Directory>
<Directory /var/lib/openstack-dashboard/static>
Require all granted
</Directory>
Habilitar sites
a2enconf openstack-dashboard
a2enmod ssl
a2ensite default-ssl
Copie o arquivo de política.
mv /etc/openstack-dashboard/policy /etc/openstack-dashboard/policy.org
Reinicie o servidor web Apache.
chown -R horizon /var/lib/openstack-dashboard/secret-key
systemctl restart apache2
Agora você pode acessar o painel do Horizon em https://(nome do host do servidor)/
Faça login com um usuário no Keystone e senha correspondente.
Conclusão
A instalação do OpenStack no Debian 12 (Bookworm) oferece uma solução de infraestrutura em nuvem poderosa, confiável e altamente escalável. Se você seguiu as etapas descritas neste artigo passo a passo, você poderá configurar com segurança seu sistema em nuvem OpenStack que aproveita a estabilidade do Debian. Esperamos que este artigo tenha sido de grande ajuda e agradecemos por visitar nosso site.