Intro

Написано по мотивам недавней статьи: Особенности национальной виртуализации на SharxBase
и Большое тестирование российских систем виртуализации

Оставим критику этих замечательных продуктов для тех кому с ними приходится работать. Ребята стараются и это уже не плохо.

Такие проекты как OpenStack стоят достаточно дорого в обслуживании, если ваша компания не облачный провайдер или интегратор, а возможностей Proxmox не хватает для строительства IaaS.

К счастью есть такой проект как Сloudstack который отвечает всем современным требованиям: API, готовые модули terraform и ansible, поддержка Kubernetes и встроенный мониторинг.

Когда-то эта платформа принадлежала Citrix, но сейчас кодовая база распространяется свободно. Некоторые российские компании используют его для предоставления облачных услуг.

Важное отличие – это не гипервизор, а «managment panel»: middleware и frontend который управляет хостами виртуализации. Вы подключаете хосты с виртализаций на базе QEMU/KVM, Xen и ESXI к control plane и дальше управляете ими через CloudStack. Не хватает только биллинга, но это можно исправить.

Ниже приведена инструкция по установке control plane CloudStack на centos.

Это ознакомительная установка – для прода процесс отличается и включает в себя дополнительные шаги.

Обновляем систему:

yum -y upgrade

Устанавливаем приреквизиты:

yum install bridge-utils net-tools -y

SELINUX

Отключаем SELINUX:

sed -i 's/^[[:blank:]]*SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

cat /etc/selinux/config

setenforce 0

chrony

Устанавливаем chrony:

yum install chrony

Убедится в том, что служба chrony работает:

systemctl start chronyd
systemctl enable chronyd

Разкомментировать следующую строчку в файле /etc/chrony.conf:

#local stratum 10

Перезапустить службу chrony:

systemctl restart chronyd

Repo

Добавить репозиторий Cloudstack:
/etc/yum.repos.d/cloudstack.repo:

[cloudstack]
name=cloudstack
baseurl=http://download.cloudstack.org/centos/$releasever/4.18/
enabled=1
gpgcheck=0

NFS

Установить NFS:

yum -y install nfs-utils

Создать две директории для NFS шар:

mkdir -p /export/primary
mkdir /export/secondary

Добавить в /etc/exports:

/export/primary 185.149.240.25(rw,sync,no_root_squash,no_subtree_check)
/export/secondary 185.149.240.25(rw,sync,no_root_squash,no_subtree_check)
exportfs -r

Проверяем запущена ли служба NFS сервера:

systemctl status rpcbind nfs-server

Проеряем шары NFS:

 exportfs
/export/primary
		185.149.240.25
/export/secondary
		185.149.240.25

Проверяем запущена ли служба rpcbind:

systemctl start rpcbind
systemctl enable rpcbind

firewalld

Выключите firewalld:

systemctl stop firewalld
systemctl disable firewalld

Сервисы

Добавите в автозапуск и стартуйте следующие службы:

systemctl enable rpcbind
systemctl enable nfs-server
systemctl start nfs-server
systemctl start rpcbind
systemctl daemon-reload

MySQL

Скачиваем репозиторий mysql:

https://dev.mysql.com/downloads/repo/yum

Устанавливаем репозиторий:

rpm -Uvh mysql80-community-release-el9-1.noarch.rpm

Устанавливаем mysql:

yum install mysql-community-server

Содержимое конфига /etc/my.cnf:

innodb_rollback_on_timeout=1
innodb_lock_wait_timeout=600
max_connections=350
log-bin=mysql-bin
binlog-format = 'ROW'
systemctl enable mysqld
systemctl start mysqld
systemctl status mysqld
● mysqld.service - MySQL Server
     Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; preset: disabled)
     Active: active (running) since Sat 2023-07-01 15:26:14 MSK; 7s ago
       Docs: man:mysqld(8)
             http://dev.mysql.com/doc/refman/en/using-systemd.html
    Process: 36794 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
   Main PID: 36873 (mysqld)
     Status: "Server is operational"
      Tasks: 38 (limit: 306975)
     Memory: 487.8M
        CPU: 9.679s
     CGroup: /system.slice/mysqld.service
             └─36873 /usr/sbin/mysqld

Jul 01 15:24:58 Pythagoras systemd[1]: Starting MySQL Server...
Jul 01 15:26:14 Pythagoras systemd[1]: Started MySQL Server.

Перезапускаем службу mysql:

systemctl stop mysqld
systemctl start mysqld

Временный пароль mysql:

grep 'temporary password' /var/log/mysqld.log

Используем скрипт mysql:

mysql_secure_installation

Должен появится следующий запрос:

Estimated strength of the password: 100
Change the password for root ? (Press y|Y for Yes, any other key for No) :

Проверяем доступ:

mysqladmin -u root -p version

MySQL connector

Устанавливаем коннектор для mysql:

yum install mysql-connector-python3

Cloudstack-management

Устанавливаем панель управления Cloudstack:

yum install cloudstack-management

Cloudstack-agent

Устанавливаем Agent Cloudstack:

yum install cloudstack-agent

QEMU & Libvirt

На хосте нужно будет установить QEMU и Libvirt.

QEMU VNC нужно расомментировать /etc/libvirt/qemu.conf:

#vnc_listen = "0.0.0.0"

Libvirt

В конфиг Libvirt добавить следующие строчки /etc/libvirt/libvirtd.conf:

listen_tls = 0
listen_tcp = 1
tcp_port = "16509"
auth_tcp = "none"
mdns_adv = 0

Юнит-файл systemd Libvirt /usr/lib/systemd/system/libvirtd.service

systemctl mask libvirtd.socket libvirtd-ro.socket libvirtd-admin.socket libvirtd-tls.socket libvirtd-tcp.socket

Для компонента cloudstack-agent необходимо создать пустой файл в директории /etc/sysconfig/:

touch /etc/sysconfig/libvirtd

Перезапустить демон libvirt:

systemctl restart libvirtd

Ссылки:

Networking

Включаем IP Forwarding

Нужно будет обязательно включить на хосте (в нашем случае это одна машина) IP Forwarding.

Добавить в файл /etc/sysctl.d/cloudstack.conf следующие строчки:

net.ipv4.ip_forward=1

Удостоверится в том, что IP Forwarding включен:

sysctl net.ipv4.ip_forward

Сначала настраиваем eth0 /etc/sysconfig/network-scripts/ifcfg-eth0:

DEVICE=eth0
HWADDR=00:04:xx:xx:xx:xx
ONBOOT=yes
HOTPLUG=no
BOOTPROTO=none
TYPE=Ethernet
BRIDGE=cloudbr0

И затем два бриджа - cloudbr0:

DEVICE=cloudbr0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=none
IPV6INIT=no
IPV6_AUTOCONF=no
DELAY=5
IPADDR=192.168.42.11
GATEWAY=192.168.42.1
NETMASK=255.255.255.0
STP=yes

cloudbr1 /etc/sysconfig/network-scripts/ifcfg-cloudbr1:

DEVICE=cloudbr1
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=none
IPV6INIT=no
IPV6_AUTOCONF=no
DELAY=5
STP=yes

Запускаем скрипт cloudstack-setup-databases:

cloudstack-setup-databases cloud:<PASSWORD>@localhost --deploy-as=root

Планируемый результат:

Mysql user name:cloud                                                           [ OK ]
Mysql user password:******                                                      [ OK ]
Mysql server ip:localhost                                                       [ OK ]
Mysql server port:3306                                                          [ OK ]
Mysql root user name:root                                                       [ OK ]
Mysql root user password:******                                                 [ OK ]
Checking Cloud database files ...                                               [ OK ]
Checking local machine hostname ...                                             [ OK ]
Checking SELinux setup ...                                                      [ OK ]
Detected local IP address as 185.149.240.25, will use as cluster management server node IP[ OK ]
Preparing /etc/cloudstack/management/db.properties                              [ OK ]
Applying /usr/share/cloudstack-management/setup/create-database.sql             [ OK ]
Applying /usr/share/cloudstack-management/setup/create-schema.sql               [ OK ]
Applying /usr/share/cloudstack-management/setup/create-database-premium.sql     [ OK ]
Applying /usr/share/cloudstack-management/setup/create-schema-premium.sql       [ OK ]
Applying /usr/share/cloudstack-management/setup/server-setup.sql                [ OK ]
Applying /usr/share/cloudstack-management/setup/templates.sql                   [ OK ]
Processing encryption ...                                                       [ OK ]
Finalizing setup ...                                                            [ OK ]

CloudStack has successfully initialized database, you can check your database configuration in /etc/cloudstack/management/db.properties

sudoers

Для компонента cloudstack-agent необходимо добавить следующие строчки в /etc/sudoers:

cloudstack ALL=NOPASSWD: /usr/bin/cloudstack-setup-agent
defaults:cloudstack !requiretty

End

Запуск cloudstack-setup-management:

Starting to configure CloudStack Management Server:
Configure CloudStack Management Server ...[OK]
CloudStack Management Server setup is Done!
Please ensure ports 8080, 8250, 8443, and 9090 are opened and not firewalled for the management server and not in use by other processes on this host.

Запуск агента Cloudstack:

systemctl enable cloudstack-agent
systemctl start cloudstack-agent
systemctl status cloudstack-agent

UI

Теперь можно использовать WebUI CloudStack:
http://:8080/client

Учетные данные по умолчанию:

admin
password
Login
Login
UI
UI

Комментарии (5)


  1. Heggi
    26.12.2023 10:40
    +1

    Выключите firewalld

    А потом: ой нас взломали! Как это могло произойти?

    Надо не отключать, а добавлять необходимые правила, разрешающие конкретные порты и протоколы.


    1. Rikimaru22 Автор
      26.12.2023 10:40

      "Это ознакомительная установка – для прода процесс отличается и включает в себя дополнительные шаги."


      1. Heggi
        26.12.2023 10:40
        +1

        Все-равно не помешает добавить в разделе конфигурации firewalld хотя бы информацию про какие порты куда и зачем нужны.

        Очень часто в документации к разнообразному софту этой инфы нет или она так запрятана, что не сразу найдешь. И приходится догадываться что и куда надо разрешить.


  1. Speccyfan
    26.12.2023 10:40

    Для какой версии CentOS написан туториал?


    1. Rikimaru22 Автор
      26.12.2023 10:40

      PRETTY_NAME="CentOS Linux 7 (Core)"