Публичный IaaS на базе ПО с открытым кодом

21

Transcript of Публичный IaaS на базе ПО с открытым кодом

Page 1: Публичный IaaS на базе ПО с открытым кодом
Page 2: Публичный IaaS на базе ПО с открытым кодом

За что мы любим Apache CloudStack?https://cloudstack.apache.org/

Page 3: Публичный IaaS на базе ПО с открытым кодом

За что мы любим Apache CloudStack?

Управляемость• единый портал управления;• универсальная VNC-консоль;• функциональный API.

Всеядность• гипервизоры: KVM, LXC, XEN, VMWare, Hyper-V;• хранилища: GlusterFS, Ceph, NFS, SMB, GFS2, OCFS2, локальные хранилища и файловые системы,

доступные через общую точку монтирования.

Высокий уровень безопасности• шифрование сетевых соединений (IPSec, HTTPS);• генерация и назначение административных паролей к виртуальным машинам;• брандмауеры и балансировщики (встроенный VR, NetScaler, F5, FortiGate, pfSense и другие звери).

https://cloudstack.apache.org/

Page 4: Публичный IaaS на базе ПО с открытым кодом

За что ещё мы любим Apache CloudStack?

https://cloudstack.apache.org/

Page 5: Публичный IaaS на базе ПО с открытым кодом

За что ещё мы любим Apache CloudStack?

Надёжность• кластеризация, живая миграция в пределах кластера,• аффинитивные группы;• снимки виртуальных дисков, снимки виртуальных машин.

Быстрота и удобство развёртывания• библиотеки ISO-образов и шаблонов виртуальных машин;• предпочитаемые операционные системы для хостов;• тегирование хранилищ и хостов, использование тегов в конфигурации офферингов.

Гибкость политик доступа• домены, учётные записи, пользователи;• лимитирование использования ресурсов;• поддержка LDAP.

https://cloudstack.apache.org/

Page 6: Публичный IaaS на базе ПО с открытым кодом

Пример развёртывания Apache CloudStack

Рецепт бессмертия CloudStack Server #1 CloudStack Server #2

MySQL Server #1 MySQL Server #2

M/M-replication

CARP

CARP

Storage ClusterVirtualization Cluster

GlusterFS over RDMAInfiniBand

кластер серверов управления

кластер базы данных

кластер виртуализации

кластер хранилища

стек коммутаторов

очень желательны прямые руки

https://cloudstack.apache.org/

Page 7: Публичный IaaS на базе ПО с открытым кодом

MonkeyMan: оператор системы управления

Фреймворк автоматизации MonkeyMan

реализован на Perl5 с применением Moose

объекты инфраструктуры – объекты Perl

использование словарей для связи с API

использование XML и XPath

подключаемые модули и выбор конфигурации

http://monkeyman.tucha.ua/

Page 8: Публичный IaaS на базе ПО с открытым кодом

MonkeyMan: Perl5 и Moose

# Use Moose and be happy :)use Moose::Role;

has 'monkeyman' => ( is => 'ro', isa => 'MonkeyMan', reader => 'get_monkeyman', writer => '_set_monkeyman', predicate => '_has_monkeyman', required => 1);

Что нам даёт Moose и зачем здесь этот лось?

Атрибуты

Аксессоры

Валидация

Роли

Подклассы

Расширение синтаксиса

Art by www.animalcrewshop.com

http://monkeyman.tucha.ua/

Page 9: Публичный IaaS на базе ПО с открытым кодом

MonkeyMan: пример запроса к Apache CloudStack

my $api = $monkeyman->get_cloudstack('PRIMARY')->get_api;

my $virtualmachine = $api->perform_action( type => 'VirtualMachine', action => 'create', requested => { 'element' => 'element' }, parameters => { zoneid => 'f09fe8dd-3567-4ff6-ac3a-2f85dec2636d', templateid => '8b53dc6a-084d-4b5a-8ac5-3f88301c6703', serviceofferingid => '97d74503-d609-4edb-8633-748d400aad5e', # ...skipped... });

http://monkeyman.tucha.ua/

Page 10: Публичный IaaS на базе ПО с открытым кодом

MonkeyMan: словари Apache CloudStack (запрос)

package MonkeyMan::CloudStack::API::Element::VirtualMachine;with 'MonkeyMan::CloudStack::API::Roles::Element';# ...skipped...our %vocabulary_tree = ( type => 'VirtualMachine', name => 'virtual machine', entity_node => 'virtualmachine', actions => { create => { request => { command => 'deployVirtualMachine', async => 1, paged => 0, parameters => { zoneid => { required => 1, command_parameters => { 'zoneid' => '<%VALUE%>' }, }, templateid => { required => 1, command_parameters => { 'templateid' => '<%VALUE%>' }, }, serviceofferingid => { required => 1, command_parameters => { 'serviceofferingid' => '<%VALUE%>' }, }, # ...skipped... }, # ...skipped... }, # ...skipped... }, # ...skipped... },);

http://monkeyman.tucha.ua/

Page 11: Публичный IaaS на базе ПО с открытым кодом

<?xml version="1.0" encoding="UTF-8"?><queryasyncjobresultresponse cloud-stack-version="4.8.0"> <accountid>e5447a8f-b0f1-4b00-9d1e-756ab3981987</accountid> <userid>b77f23fa-5bfa-4c05-88c3-a00b10f6f60c</userid> <cmd>org.apache.cloudstack.api.command.user.vm.DeployVMCmd</cmd> <jobstatus>1</jobstatus> <jobprocstatus>0</jobprocstatus> <jobresultcode>0</jobresultcode> <jobresulttype>object</jobresulttype> <jobresult> <virtualmachine> <id>48bd0c95-ee6a-4730-bdc4-1b9998570685</id> <name>VM-48bd0c95-ee6a-4730-bdc4-1b9998570685</name> <displayname>VM-48bd0c95-ee6a-4730-bdc4-1b9998570685</displayname> <account>[email protected]</account> <userid>b77f23fa-5bfa-4c05-88c3-a00b10f6f60c</userid> <username>[email protected]</username> <domainid>22452f80-4af5-452c-a894-06b02db6d43c</domainid> <domain>demo</domain> <created>2016-09-08T06:50:44+0000</created> <state>Running</state> <haenable>true</haenable> <zoneid>f09fe8dd-3567-4ff6-ac3a-2f85dec2636d</zoneid> <zonename>las</zonename> <templateid>8b53dc6a-084d-4b5a-8ac5-3f88301c6703</templateid> <templatename>Ubuntu Server 15.10</templatename> <templatedisplaytext>10GB SSD disk with Ubuntu Server 15.10</templatedisplaytext> <passwordenabled>true</passwordenabled> <serviceofferingid>97d74503-d609-4edb-8633-748d400aad5e</serviceofferingid> <serviceofferingname>Custom Compute Offering (3GHz Max)</serviceofferingname> <cpunumber>2</cpunumber> <cpuspeed>2000</cpuspeed> <memory>1024</memory> <guestosid>e4e2d9ae-0b3f-11e6-893a-005056901750</guestosid> <rootdeviceid>0</rootdeviceid> <rootdevicetype>ROOT</rootdevicetype> <password>yJ4zmD</password> <nic> <id>7f63e4b4-128c-4399-a28f-4ef650943eb7</id> <networkid>a3933f8c-37c3-455f-878c-a0f48337aab2</networkid> <networkname>PublicInternetNetwork-66.209.89.128/27</networkname> <netmask>255.255.255.224</netmask> <gateway>66.209.89.129</gateway> <ipaddress>66.209.89.152</ipaddress> <isolationuri>vlan://998</isolationuri> <broadcasturi>vlan://998</broadcasturi> <traffictype>Guest</traffictype> <type>Shared</type> <isdefault>true</isdefault> <macaddress>06:72:f0:00:01:3c</macaddress> </nic> <hypervisor>KVM</hypervisor> <isdynamicallyscalable>false</isdynamicallyscalable> <ostypeid>254</ostypeid> <jobid>e1973ec0-b948-4887-804d-b8320911c793</jobid> <jobstatus>0</jobstatus> </virtualmachine> </jobresult> <jobinstancetype>VirtualMachine</jobinstancetype> <jobinstanceid>48bd0c95-ee6a-4730-bdc4-1b9998570685</jobinstanceid> <created>2016-09-08T06:50:44+0000</created> <jobid>e1973ec0-b948-4887-804d-b8320911c793</jobid></queryasyncjobresultresponse>

<?xml version="1.0" encoding="UTF-8"?><queryasyncjobresultresponse cloud-stack-version="4.8.0"> <accountid>e5447a8f-b0f1-4b00-9d1e-756ab3981987</accountid> <userid>b77f23fa-5bfa-4c05-88c3-a00b10f6f60c</userid> <cmd>org.apache.cloudstack.api.command.user.vm.DeployVMCmd</cmd> <jobstatus>0</jobstatus> <jobprocstatus>0</jobprocstatus> <jobresultcode>0</jobresultcode> <jobinstancetype>VirtualMachine</jobinstancetype> <jobinstanceid>48bd0c95-ee6a-4730-bdc4-1b9998570685</jobinstanceid> <created>2016-09-08T06:50:44+0000</created> <jobid>e1973ec0-b948-4887-804d-b8320911c793</jobid></queryasyncjobresultresponse>

<?xml version="1.0" encoding="UTF-8"?><deployvirtualmachineresponse cloud-stack-version="4.8.0"> <id>48bd0c95-ee6a-4730-bdc4-1b9998570685</id> <jobid>e1973ec0-b948-4887-804d-b8320911c793</jobid></deployvirtualmachineresponse>

MonkeyMan: обработка ответа Apache CloudStack

http://monkeyman.tucha.ua/

Page 12: Публичный IaaS на базе ПО с открытым кодом

MonkeyMan: словари Apache CloudStack (ответ)

package MonkeyMan::CloudStack::API::Element::VirtualMachine;with 'MonkeyMan::CloudStack::API::Roles::Element';# ...skipped...our %vocabulary_tree = ( type => 'VirtualMachine', name => 'virtual machine', entity_node => 'virtualmachine', actions => { create => { response => { response_node => 'queryasyncjobresultresponse', results => { element => { return_as => [ qw( dom element id ) ], queries => [ '/<%OUR_RESPONSE_NODE%>/jobresult/<%OUR_ENTITY_NODE%>' ], required => 0, multiple => 1 }, id => { return_as => [ qw( value ) ], queries => [ '/<%OUR_RESPONSE_NODE%>/jobresult/<%OUR_ENTITY_NODE%>/id' ], required => 0, multiple => 1 }, # ...skipped... }, # ...skipped... }, # ...skipped... }, # ...skipped... },);

http://monkeyman.tucha.ua/

Page 13: Публичный IaaS на базе ПО с открытым кодом

<?xml version="1.0"?><virtualmachine> <id>48bd0c95-ee6a-4730-bdc4-1b9998570685</id> <name>VM-48bd0c95-ee6a-4730-bdc4-1b9998570685</name> <displayname>VM-48bd0c95-ee6a-4730-bdc4-1b9998570685</displayname> <account>[email protected]</account> <userid>b77f23fa-5bfa-4c05-88c3-a00b10f6f60c</userid> <username>[email protected]</username> <domainid>22452f80-4af5-452c-a894-06b02db6d43c</domainid> <domain>demo</domain> <created>2016-09-08T06:50:44+0000</created> <state>Running</state> <haenable>true</haenable> <zoneid>f09fe8dd-3567-4ff6-ac3a-2f85dec2636d</zoneid> <zonename>las</zonename> <templateid>8b53dc6a-084d-4b5a-8ac5-3f88301c6703</templateid> <templatename>Ubuntu Server 15.10</templatename> <templatedisplaytext>10GB SSD disk with Ubuntu Server 15.10</templatedisplaytext> <passwordenabled>true</passwordenabled> <serviceofferingid>97d74503-d609-4edb-8633-748d400aad5e</serviceofferingid> <serviceofferingname>Custom Compute Offering (3GHz Max)</serviceofferingname> <cpunumber>2</cpunumber> <cpuspeed>2000</cpuspeed> <memory>1024</memory> <guestosid>e4e2d9ae-0b3f-11e6-893a-005056901750</guestosid> <rootdeviceid>0</rootdeviceid> <rootdevicetype>ROOT</rootdevicetype> <password>yJ4zmD</password> <nic> <id>7f63e4b4-128c-4399-a28f-4ef650943eb7</id> <networkid>a3933f8c-37c3-455f-878c-a0f48337aab2</networkid> <networkname>PublicInternetNetwork-66.209.89.128/27</networkname> <netmask>255.255.255.224</netmask> <gateway>66.209.89.129</gateway> <ipaddress>66.209.89.152</ipaddress> <isolationuri>vlan://998</isolationuri> <broadcasturi>vlan://998</broadcasturi> <traffictype>Guest</traffictype> <type>Shared</type> <isdefault>true</isdefault> <macaddress>06:72:f0:00:01:3c</macaddress> </nic> <hypervisor>KVM</hypervisor> <isdynamicallyscalable>false</isdynamicallyscalable> <ostypeid>254</ostypeid> <jobid>e1973ec0-b948-4887-804d-b8320911c793</jobid> <jobstatus>0</jobstatus></virtualmachine>

MonkeyMan: XML и XPathhttp://monkeyman.tucha.ua/

Page 14: Публичный IaaS на базе ПО с открытым кодом

MonkeyMan: работа с XML DOM

my $virtualmachine = $api->perform_action( type => 'VirtualMachine', action => 'create', requested => { 'element' => 'element' }, parameters => { zoneid => 'f09fe8dd-3567-4ff6-ac3a-2f85dec2636d', templateid => '8b53dc6a-084d-4b5a-8ac5-3f88301c6703', serviceofferingid => '97d74503-d609-4edb-8633-748d400aad5e', # ...skipped... });

my @passwords = $virtualmachine->qxp( query => ‘//virtualmachine/password', return_as => 'value‘);

my @ipaddresses = $virtualmachine->qxp( query => ‘//virtualmachine/nic/ipaddress', return_as => 'value‘);

http://monkeyman.tucha.ua/

Page 15: Публичный IaaS на базе ПО с открытым кодом

MonkeyMan: словари Apache CloudStack (связи)

package MonkeyMan::CloudStack::API::Element::VirtualMachine;with 'MonkeyMan::CloudStack::API::Roles::Element';# ...skipped...our %vocabulary_tree = ( type => 'VirtualMachine', name => 'virtual machine', entity_node => 'virtualmachine', related => { our_volumes => { type => ‘Volume', keys => { own => { queries => [ '/<%OUR_ENTITY_NODE%>/id' ] }, foreign => { parameters => { filter_by_id => '<%OWN_KEY_VALUE%>' } }, } } }, # ...skipped...);

foreach my $volume ($virtualmachine->get_related(related => 'our_volumes')) { $logger->debugf( "Have got the %s %s (%s)", $volume, $volume->get_type(noun => 1), $volume->qxp(query => ‘//volume/name', return_as => 'value') );}

http://monkeyman.tucha.ua/

Page 16: Публичный IaaS на базе ПО с открытым кодом

foreach my $virtualmachine ($api->get_elements( type => 'VirtualMachine', return_as => 'element', xpaths => [ '//virtualmachine[nic/ipaddress="13.13.13.13"]' ] )) { # ...skipped...}

MonkeyMan: примеры выборок

MonkeyMan::CloudStack::API::Element::VirtualMachine

http://monkeyman.tucha.ua/

Page 17: Публичный IaaS на базе ПО с открытым кодом

foreach my $ipaddress ($api->get_elements( type => 'VirtualMachine', return_as => 'value', xpaths => [ '//virtualmachine[templatename="PortOS-6.6.6"]/nic[1]/ipaddress' ] )) { # ...skipped...}

10.6.6.657.14.91.130192.168.13.172.135.4.698.8.8.8195.3.204.1172.16.16.172193.223.98.1410.200.50.4066.249.66.1171.3.1.3217.71.45.30192.168.1.3193.151.90.177193.151.89.1366.66.66.6692.11.40.328.8.4.4185.35.28.252106.184.3.122163.172.169.1502.85.20.23260.167.113.126

MonkeyMan: примеры выборок

SCALAR

http://monkeyman.tucha.ua/

Page 18: Публичный IaaS на базе ПО с открытым кодом

foreach my $dom ($api->get_elements( type => 'VirtualMachine', return_as => 'dom', xpaths => [ '//virtualmachine' ] )) { # ...skipped...}

<?xml version="1.0"?><virtualmachine> <id>48bd0c95-ee6a-4730-bdc4-1b9998570685</id> <name>VM-48bd0c95-ee6a-4730-bdc4-1b9998570685</name> <displayname>VM-48bd0c95-ee6a-4730-bdc4-1b9998570685</displayname> <account>[email protected]</account> <userid>b77f23fa-5bfa-4c05-88c3-a00b10f6f60c</userid> <username>[email protected]</username> <domainid>22452f80-4af5-452c-a894-06b02db6d43c</domainid> <domain>demo</domain> <created>2016-09-08T06:50:44+0000</created> <state>Running</state> <haenable>true</haenable> <zoneid>f09fe8dd-3567-4ff6-ac3a-2f85dec2636d</zoneid> <zonename>las</zonename> <templateid>8b53dc6a-084d-4b5a-8ac5-3f88301c6703</templateid> <templatename>Ubuntu Server 15.10</templatename> <templatedisplaytext>10GB SSD disk with Ubuntu Server 15.10</templatedisplaytext> <passwordenabled>true</passwordenabled> <serviceofferingid>97d74503-d609-4edb-8633-748d400aad5e</serviceofferingid> <serviceofferingname>Custom Compute Offering (3GHz Max)</serviceofferingname> <cpunumber>2</cpunumber> <cpuspeed>2000</cpuspeed> <memory>1024</memory> <guestosid>e4e2d9ae-0b3f-11e6-893a-005056901750</guestosid> <rootdeviceid>0</rootdeviceid> <rootdevicetype>ROOT</rootdevicetype> <password>yJ4zmD</password> <nic> <id>7f63e4b4-128c-4399-a28f-4ef650943eb7</id> <networkid>a3933f8c-37c3-455f-878c-a0f48337aab2</networkid> <networkname>PublicInternetNetwork-66.209.89.128/27</networkname> <netmask>255.255.255.224</netmask> <gateway>66.209.89.129</gateway> <ipaddress>66.209.89.152</ipaddress> <isolationuri>vlan://998</isolationuri> <broadcasturi>vlan://998</broadcasturi> <traffictype>Guest</traffictype> <type>Shared</type> <isdefault>true</isdefault> <macaddress>06:72:f0:00:01:3c</macaddress> </nic> <hypervisor>KVM</hypervisor> <isdynamicallyscalable>false</isdynamicallyscalable> <ostypeid>254</ostypeid> <jobid>e1973ec0-b948-4887-804d-b8320911c793</jobid> <jobstatus>0</jobstatus></virtualmachine>

MonkeyMan: примеры выборок

XML::LibXML::Document

http://monkeyman.tucha.ua/

Page 19: Публичный IaaS на базе ПО с открытым кодом

MonkeyMan: выбор конфигурации

$ ./my_application.pl --help

...skipped...

-C <filename>, --configuration <filename> [opt] The main configuration file

...skipped...

--default-password-generator <ID> (the default actor is PRIMARY) [opt] The default Password Generator actor to be used --default-cloudstack <ID> (the default actor is PRIMARY) [opt] The default Apache CloudStack actor to be used --default-logger <ID> (the default actor is PRIMARY) [opt] The default Logger actor to be used --default-zendesk <ID> (the default actor is PRIMARY) [opt] The default Zendesk actor to be used

...skipped...

http://monkeyman.tucha.ua/

Page 20: Публичный IaaS на базе ПО с открытым кодом

MonkeyMan: выбор конфигурации

$ ./my_application.pl -C ~monkeyman/etc.Dev13/monkeyman.conf

$ ./my_application.pl --default-cloudstack=Dev13

$ ./my_application.pl --default-cloudstack=PRIMARY

http://monkeyman.tucha.ua/

Page 21: Публичный IaaS на базе ПО с открытым кодом