<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ІТ-Блогер</title>
	<atom:link href="http://itblogger.org.ua/feed/" rel="self" type="application/rss+xml" />
	<link>http://itblogger.org.ua</link>
	<description></description>
	<lastBuildDate>Tue, 01 Dec 2015 12:58:15 +0000</lastBuildDate>
	<language>uk</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.2.12</generator>
	<item>
		<title>Про ІТ-кар&#8217;єризм, професійний ріст та ісландських баранів</title>
		<link>http://itblogger.org.ua/pro-it-karjeryzm-profesijnyj-rist-ta-islandskyh-baraniv/</link>
		<comments>http://itblogger.org.ua/pro-it-karjeryzm-profesijnyj-rist-ta-islandskyh-baraniv/#comments</comments>
		<pubDate>Tue, 01 Dec 2015 12:57:18 +0000</pubDate>
		<dc:creator><![CDATA[core]]></dc:creator>
				<category><![CDATA[Особисте]]></category>

		<guid isPermaLink="false">http://itblogger.org.ua/?p=879</guid>
		<description><![CDATA[Почну з баранів, бо, як виявилося, колись смішна історія має зовсім реальний приклад застосування. У серпні ми з друзями літали в Ісландію. Як це часто буває у довгих поїздках &#8211; з кожним днем зміст розмов скочується на, здавалося б, вже пробите дно. І от десь на 8-ий день подорожі, переїжджаючи через черговий гірський масив, ми [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Почну з баранів, бо, як виявилося, колись смішна історія має зовсім реальний приклад застосування.</p>
<p>У серпні ми з друзями літали в Ісландію. Як це часто буває у довгих поїздках &#8211; з кожним днем зміст розмов скочується на, здавалося б, вже пробите дно. І от десь на 8-ий день подорожі, переїжджаючи через черговий гірський масив, ми завели тривалу дискусію про ісландських баранів. В Ісландії. Дискусія. Про баранів. На 4(!) години. А все чому? Відколи ми виїхали з міста Кефлавік, нам траплялися по дорозі безліч невеличких груп баранів. І особливість цих груп заключалася у тому, що їх в 90% випадків було троє. Ні, вони не зв&#8217;язані нічим, вільні ходити по безкраїх просторах прибережних зон, рівнин та гір. Але завжди, завжди три барани. Ми, інколи, зупинялися, коли бачили двох баранів і не рушали, поки не знайшли за якимось каменем третього. Така собі константа ісландська. Що трапилося на 8-ий день? Ця схема зовсім поламалася. Ми бачили баранів, які гуляли і по одному, і по двоє, і по троє і, навіть по четверо. Але не більше чотирьох. Власне, ця смішна обставина і збурила дискусію.<br />
<span id="more-879"></span></p>
<p>В результаті тривалих суперечок, ми прийшли до такого висновку. Три &#8211; це нормальна кількість баранів у групі. Але, як характерно для загального поняття груп людей/тварин &#8211; компанії змінюються. Наприклад, один баран переріс свою компанію &#8211; йому не подобаються території, на яких група випасається, йому не подобається напрямок, у якому вони просуваються та і не комфортно йому з теперішньою групою. Тож цей баран виходить з групи і йде шукати іншу. Звідси, власне, з&#8217;являються поодинокі барани та групи з двох баранів. Ці одинаки разом з молодими баранами, які тільки починають свій шлях, шукають нову групу. Буває так, що вони знаходять іншу групу з трьох баранів, приєднуються до неї, І їх стає четверо. При цьому, новоприбулий баран може давати групі більше, ніж хтось з діючих членів команди, тому, на якомусь етапі, нова коаліція може виперти когось із старих непотрібних баранів, оскільки вони хочуть рухатися в іншому напрямку, а цей один їм заважає та гальмує весь процес. Така от смішна дискусія в нас вийшла про те, звідки беруться один, два, три чи чотири барани в групах. А тепер про важливе &#8211; до чого тут кар&#8217;єризм?</p>
<p>Я працюю devops-інженером у компанії GlobalLogic. Прийшов сюди у серпні, переїхавши з Тернополя у Львів. Мені зовсім чужа ця політика аутсорсингових компаній визначати рівні розробників за якимось матрицями, що не мають жодного стандарту та утвердженої форми. Але гаразд, якщо компанії треба продавати людей і якось ранжувати ціну за них &#8211; поділ має бути. Хоча внутрішній. Чи це говорить щось про рівень технічних чи софт скілів працівника? Не маю певності в цьому. Це як сертифікації &#8211; ти готуєшся і здаєш, але про що говорить твій сертифікат &#8211; про пам&#8217;ять чи про навики &#8211; невідомо. Тим не менш, багатьом іт-спеціалістам важливо чи вони junior чи senior чи tech lead і всяке таке. З цього природнього бажання бути кращим за інших виникає багато розмов про те, що в одній компанії спеціалісти у тому ж званні гірші за спепціалістів на аналогічних позиціях іншої компанії. Щось на зразок того, що сержанти української армії стріляють гірше, ніж сержанти армії США. Так як в мене досить багато знайомих із ІТ-компаній Львова, то чую я таку думку дуже часто. Фрази накшталт &#8220;А, GlobalLogic &#8211; вони, навіть, не в першій п&#8217;ятірці&#8221;, &#8220;Lohika &#8211; ну та, вони дуже круті&#8221;, &#8220;О, зараз я middle на Epam-і, але на SoftServe вже була б senior-ом&#8221;, &#8220;Eleks &#8211; пфф, краще піду розвантажувати вагони&#8221;. Що там знайомі, я і в офісі своєї компанії чую такі думки. Бекенд-, фронтенд розробники, тестери, аналітики та іншого роду інженери узагальнюють інформацію про компанію до таких от примітивних трактувань. Насправді ж, кожна з компаній має штат висококласних спеціалістів у всіх сферах ІТ, завдяки яким замовлення продовжують приходити, що дозволяє цим компаніям набирати більше і більше людей. І, звісно ж, не всі з новоприйнятих одразу починають вносити свій внесок у позитивний рейтинг. Але як би цей аутсорс працював, якби в ньому справді були такі далекі спеціалісти, як про них відгукуються колеги з інших компаній?</p>
<p>Так склалися обставини &#8211; час, гроші, проект, рівень команди &#8211; що той, чи інший спеціаліст потрапив саме сюди. І, в першу чергу, від відношення до роботи залежить його професійний розвиток, а не від складності бюрократичних процедур по отриманню того чи іншого бейджа з ціною, яку має за тебе заплатити замовник. А ще команда. Твоя група баранів (жодних образ, я і себе сюди зачисляю). Якщо ви як один серйозно відноситесь до поставлених завдань, добре ладите один з одним, прагнете розвинути себе та своїх колеги, а проект та його менеджмент вам у цьому допомагають &#8211; ваша група тримається. Якшо ви почуваєте себе некомфортно &#8211; шукайте нову групу. Якщо ви не хочете розвиватись, але і йти не хочете &#8211; дочекайтесь новоприбулих &#8220;баранів&#8221;, співпраця з якими принесе команді набагато більше задоволення і вона сама випре вас на пошуки нового незвіданого. А ви втратите час, що, є надто цінним ресурсом, аби так просто ним розкидатись. Якось так.</p>
]]></content:encoded>
			<wfw:commentRss>http://itblogger.org.ua/pro-it-karjeryzm-profesijnyj-rist-ta-islandskyh-baraniv/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Distributed-cluster на коліні &#124; Nomad</title>
		<link>http://itblogger.org.ua/distributed-cluster-na-kolini-nomad/</link>
		<comments>http://itblogger.org.ua/distributed-cluster-na-kolini-nomad/#comments</comments>
		<pubDate>Thu, 26 Nov 2015 07:14:42 +0000</pubDate>
		<dc:creator><![CDATA[core]]></dc:creator>
				<category><![CDATA[devops]]></category>
		<category><![CDATA[Веб]]></category>
		<category><![CDATA[Огляд ПЗ]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[hashicorp]]></category>
		<category><![CDATA[nomad]]></category>
		<category><![CDATA[packer]]></category>
		<category><![CDATA[redis]]></category>
		<category><![CDATA[terrafor]]></category>

		<guid isPermaLink="false">http://itblogger.org.ua/?p=866</guid>
		<description><![CDATA[Цей допис планувався як продовження теми CROSS-PROVIDER IAAS та логічне завершення розмов про такі популярні інструменти від HashiCorp як Packer та Terraform. Зовсім недавно Хашимото&#038;Co випустили новий продукт Otto, який називають нащадком Vagrant. Чому не зробили новий реліз Vagrant? Це перше питання, яке я собі ставив, перед тим, як почитав документацію. Головна ціль Otto &#8211; [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Цей допис планувався як продовження теми CROSS-PROVIDER IAAS та логічне завершення розмов про такі популярні інструменти від HashiCorp  як Packer та Terraform. Зовсім недавно Хашимото&#038;Co випустили новий продукт Otto, який називають нащадком Vagrant. Чому не зробили новий реліз Vagrant? Це перше питання, яке я собі ставив, перед тим, як почитав документацію.</p>
<p>Головна ціль Otto &#8211; спростити життя розробникам і позбавити їх необхідності дружити з DevOps-ами. Жартую, звісно) Але це той випадок, коли автоматизація направлена в правильне русло. Адже з Otto вам не треба буде будувати образи з Packer-ом, описувати конфігурації для деплою в Terraform, що вимагає розрахунку потужностей для архітектури ваших сервісів та інші devops-related задачі.  На презентації продукту Хашимото користувався терміном &#8220;муміфікація&#8221;, описуючи відмінність між Vagrant та Otto. Мається на увазі, що за допомогою описаної конфігурації Vagrant/Packer/Terraform інші розробники зможуть розгорнути те ж саме середовище, як і ви в будь який момент часу. Але відповідальність за те, що використовувані ресурси чи параметри взаємодії з клаудами застаріють ви повинні брати на себе. Otto все це бере на себе. Просто скажіть яка мова у вашому проекті використовується, які бази даних (чи інші мікросервіси) використовуються в преокті, які порти треба прокласти в паблік, в який клауд деплоїти &#8211; і це все один єдиний конфігураційний файл, який можна зберігати в CVS і перейматися лише розробкою, а не розгортанням інфраструктури. На даний момент Otto працює лише з Ruby проектами, тому продовження матеріалу переноситься на потім, коли буде додана підтримка Python. </p>
<p>А поки &#8211; поговоримо про інший продукт HashiCorp, який був представлений разом з Otto і має, імхо, більше значення для DevOps світу, ніж Otto. Що це таке, для чого тут кластери і як з цим усім жити? Про це далі.<br />
<span id="more-866"></span></p>
<p>Так уже завернула професійна кар&#8217;єра, що блог перепрофілювався суто на DevOps тематику і, зокрема, популярні в наш час архітектури, орієнтовані на мікросервіси взамін монолітним системам. В попередніх матеріалах я багато писав про платформи для запуску вашої інфраструктури, про автоматичне розгортання інфраструктури, підготовку образів, оркестрацію. Але як цією кухнею керувати після запуску? Як її гнучко масштабувати, локалізовувати ресурси? Вирішенням саме цих непростих питань займається Nomad. І робить він це прозоро поверх віддалених датацентрів у різних регіонах. Все як у дорослих.</p>
<p>HashiCorp не зраджує своїм традиціям і надає нам можливість описувати всю інфраструктуру одним файлоа конфігурації, в який можна передавати параметри як через environment документ із змінними, так і через параметри в консолі. Власне, го до прикладу.</p>
<p>Кластер Nomad працює через комунікацію агентів на кожній з машин у кластері. Агенти можуть працювати у режимі сервера та клієнта. За рекомендаціями HashiCorp на кожен окремий регіон у вас має бути один серверний агент. Так як мені аби попробувати &#8211; то я запущу один інстанс в development режимі, що включає в себе і сервер і клієнт одночасно.</p>
<pre class="brush: bash; title: ; notranslate">
root@vagrant-ubuntu-vivid-64:/opt/hashicorp# nomad agent -dev
==&gt; Starting Nomad agent...
2015/11/24 07:50:12 [ERR] fingerprint.env_aws: Error querying AWS Metadata URL, skipping
==&gt; Nomad agent configuration:

                 Atlas: &lt;disabled&gt;
                Client: true
             Log Level: DEBUG
                Region: global (DC: dc1)
                Server: true

root@vagrant-ubuntu-vivid-64:~# nomad node-status
ID                                    DC   Name                     Class   Drain  Status
9696a23d-5daf-b210-098e-7699881f5f0e  dc1  vagrant-ubuntu-vivid-64  &lt;none&gt;  false  ready

root@vagrant-ubuntu-vivid-64:~# nomad server-members
Name                            Addr       Port  Status  Proto  Build  DC   Region
vagrant-ubuntu-vivid-64.global  127.0.0.1  4648  alive   2      0.2.0  dc1  global
</pre>
<p>Статус сервісу показує, що він запущений одночасно як клієнт і як сервер ат приєднаний то датацентру dc1 в регіоні global. Клієнти у кластері спілкуються через так званий gossip-протокол, який має бути знайомий вам за роботою із Serf (припускаю, що якщо вас зацікавив Nomad &#8211; то Serf ви теж бачили, адже це один з найпопулярніших продуктів HashiCorp). Його схему автори описують прикладом зомбі-апокаліпсису &#8211; спочатку &#8220;заражений&#8221; один інстанс, потім іде обмін повідомленнями між агентами аж поки всі не стануть частиною кластера.</p>
<p>Маючи робочий кластер, ми можемо запустити якусь задачу на ньому. В термінології Nomad &#8211; це job, що є по суті декларативним описом завдань, які Nomad має виконати.<br />
Приклад ініціалізації шаблону для завдання та його виконання на Nomad-і:</p>
<pre class="brush: bash; title: ; notranslate">
root@vagrant-ubuntu-vivid-64:/opt/nomad# nomad init
Example job file written to example.nomad
root@vagrant-ubuntu-vivid-64:/opt/nomad# nomad init itblogger
Usage: nomad init

  Creates an example job file that can be used as a starting
  point to customize further.
root@vagrant-ubuntu-vivid-64:/opt/nomad# vim example.nomad
root@vagrant-ubuntu-vivid-64:/opt/nomad# ls
example.nomad
root@vagrant-ubuntu-vivid-64:/opt/nomad# nomad run example.nomad
==&gt; Monitoring evaluation &quot;63f8d898-0dbd-a498-bb9e-1607324567ed&quot;
    Evaluation triggered by job &quot;example&quot;
    Allocation &quot;9634380b-01b9-26f4-3d5a-cb59a68262a5&quot; created: node &quot;9696a23d-5daf-b210-098e-7699881f5f0e&quot;, group &quot;cache&quot;
    Evaluation status changed: &quot;pending&quot; -&gt; &quot;complete&quot;
==&gt; Evaluation &quot;63f8d898-0dbd-a498-bb9e-1607324567ed&quot; finished with status &quot;complete&quot;
</pre>
<p>Для запску прикладу якоїсь реальної задачі земулюємо реальний кластер із окремим сервером та клієнтом.<br />
Конфігурація сервера server.hcl (детально про <a href="https://github.com/hashicorp/hcl#syntax">Hashicorp Configuration Language</a> HCL) </p>
<pre class="brush: bash; title: ; notranslate">
# Increase log verbosity
log_level = &quot;DEBUG&quot;

# Setup data dir
data_dir = &quot;/tmp/server1&quot;

# Enable the server
server {
    enabled = true

    # Self-elect, should be 3 or 5 for production
    bootstrap_expect = 1
}
</pre>
<p>Це мінімальна конфігруація, якої достатньо для запуску одного сервера та вибору його лідером кластеру:</p>
<pre class="brush: bash; title: ; notranslate">
root@vagrant-ubuntu-vivid-64:/opt/nomad# nomad agent -config server.hcl
==&gt; WARNING: Bootstrap mode enabled! Potentially unsafe operation.
==&gt; Starting Nomad agent...
==&gt; Nomad agent configuration:

                 Atlas: &lt;disabled&gt;
                Client: false
             Log Level: DEBUG
                Region: global (DC: dc1)
                Server: true
</pre>
<p>Додамо в кластер два клієнти:</p>
<pre class="brush: bash; title: ; notranslate">
Конфігурація клієнта #1 client1.hcl
# Increase log verbosity
log_level = &quot;DEBUG&quot;

# Setup data dir
data_dir = &quot;/tmp/client1&quot;

# Enable the client
client {
    enabled = true

    # For demo assume we are talking to server1. For production,
    # this should be like &quot;nomad.service.consul:4647&quot; and a system
    # like Consul used for service discovery.
    servers = [&quot;127.0.0.1:4647&quot;]
}

# Modify our port to avoid a collision with server1
ports {
    http = 5656
}
</pre>
<p>Конфігурація клієнта #2 client2.hcl</p>
<pre class="brush: bash; title: ; notranslate">
# Increase log verbosity
log_level = &quot;DEBUG&quot;

# Setup data dir
data_dir = &quot;/tmp/client2&quot;

# Enable the client
client {
    enabled = true

    # For demo assume we are talking to server1. For production,
    # this should be like &quot;nomad.service.consul:4647&quot; and a system
    # like Consul used for service discovery.
    servers = [&quot;127.0.0.1:4647&quot;]
}

# Modify our port to avoid a collision with server1
ports {
    http = 5657
}
</pre>
<p>Запускаємо процеси для клієнтів по аналогії із сервером передаючи як параметр конфігурації client1.hcl та client2.hcl. Отримуємо робочий кластер:</p>
<pre class="brush: bash; title: ; notranslate">
root@vagrant-ubuntu-vivid-64:/opt/nomad# nomad node-status
ID                                    DC   Name                     Class   Drain  Status
2f600d8d-0775-b65e-c310-7f6d5f1a1e90  dc1  vagrant-ubuntu-vivid-64  &lt;none&gt;  false  ready
1421228e-54a5-70d1-684d-b7ef278e2784  dc1  vagrant-ubuntu-vivid-64  &lt;none&gt;  false  ready
root@vagrant-ubuntu-vivid-64:/opt/nomad# nomad server-members
Name                            Addr       Port  Status  Proto  Build  DC   Region
vagrant-ubuntu-vivid-64.global  127.0.0.1  4648  alive   2      0.2.0  dc1  global 
</pre>
<p>Звісно, в production-середовищі всі ip-адреси будуть замінені на discovery-параметри від Consul-а чи іншого сервісу накшталт Zookeper чи etcd. </p>
<p>Останній крок &#8211; запуск demo-job на новоствореному кластері. init процес генерує приклад із redis, тож я не буду ускладнювати собі життя і запущу це ж завдання example.nomad. Єдиний параметр, який я змінив &#8211; count для групи ресурсів &#8220;cache&#8221;:</p>
<pre class="brush: bash; title: ; notranslate">
        group &quot;cache&quot; {
                # Control the number of instances of this groups.
                # Defaults to 1
                count = 4
 </pre>
<p>Запускаємо job:</p>
<pre class="brush: bash; title: ; notranslate">
root@vagrant-ubuntu-vivid-64:/opt/nomad# nomad run example.nomad
==&gt; Monitoring evaluation &quot;7816ee41-8d84-2f3f-7a6e-5a8360980389&quot;
    Evaluation triggered by job &quot;example&quot;
    Scheduling error for group &quot;cache&quot; (failed to find a node for placement)
    Allocation &quot;d3db07e7-b11f-13b9-82d8-6f37ddf3f435&quot; status &quot;failed&quot; (0/2 nodes filtered)
      * Resources exhausted on 2 nodes
      * Dimension &quot;memory exhausted&quot; exhausted on 2 nodes
    Allocation &quot;fcc3bb0a-4766-2d41-a421-91b473a4f57e&quot; created: node &quot;1421228e-54a5-70d1-684d-b7ef278e2784&quot;, group &quot;cache&quot;
    Allocation &quot;ca5ac406-1fea-8dfd-3893-9d7704ed0a3d&quot; modified: node &quot;2f600d8d-0775-b65e-c310-7f6d5f1a1e90&quot;, group &quot;cache&quot;
    Evaluation status changed: &quot;pending&quot; -&gt; &quot;complete&quot;
==&gt; Evaluation &quot;7816ee41-8d84-2f3f-7a6e-5a8360980389&quot; finished with status &quot;complete&quot;
</pre>
<p>Зверніть увагу &#8211; оперативної пам&#8217;яті вистачило лише на два з чотирьох контейнерів. Тим не менш cache-cluster стартовано на доступних ресурсах:</p>
<pre class="brush: bash; title: ; notranslate">
root@vagrant-ubuntu-vivid-64:/opt/nomad# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS              PORTS                                                              NAMES
2d417223b4e5        redis:latest        &quot;/entrypoint.sh redi   50 seconds ago       Up 49 seconds       10.0.2.15:53141-&gt;53141/tcp, 6379/tcp, 10.0.2.15:53141-&gt;53141/udp   redis-fcc3bb0a-4766-2d41-a421-91b473a4f57e
e4322f0e5d30        redis:latest        &quot;/entrypoint.sh redi   About a minute ago   Up About a minute   6379/tcp, 10.0.2.15:47099-&gt;47099/udp, 10.0.2.15:47099-&gt;47099/tcp   redis-ca5ac406-1fea-8dfd-3893-9d7704ed0a3d
root@vagrant-ubuntu-vivid-64:/opt/nomad# vim example.nomad
root@vagrant-ubuntu-vivid-64:/opt/nomad# nomad status example
ID          = example50
Name        = example
Type        = servicer job to only linux. We can specify multiple
Priority    = 50aints as needed.
Datacenters = dc1t {
Status      = &lt;none&gt;ibute = &quot;$attr.kernel.name&quot;
                value = &quot;linux&quot;
==&gt; Evaluations
ID                                    Priority  TriggeredBy   Status
7816ee41-8d84-2f3f-7a6e-5a8360980389  50        job-register  complete
12531fab-3ff4-77c0-e5b5-3178d7d017a0  50        job-register  complete
                # Stagger updates every 10 seconds
==&gt; Allocations stagger = &quot;10s&quot;
ID                                    EvalID                                NodeID                                TaskGroup  Desired  Status
d3db07e7-b11f-13b9-82d8-6f37ddf3f435  7816ee41-8d84-2f3f-7a6e-5a8360980389  &lt;none&gt;                                cache      failed   failed
fcc3bb0a-4766-2d41-a421-91b473a4f57e  7816ee41-8d84-2f3f-7a6e-5a8360980389  1421228e-54a5-70d1-684d-b7ef278e2784  cache      run      running
ca5ac406-1fea-8dfd-3893-9d7704ed0a3d  7816ee41-8d84-2f3f-7a6e-5a8360980389  2f600d8d-0775-b65e-c310-7f6d5f1a1e90  cache      run      running
</pre>
<p>Nomad кластер має вбудований scheduler, який моніторить ресурси і при їх доступності запустить додаткові контейнери відповідно до конфігурації. Також, можна на ходу змінювати конфігурацію завдання, наприклад, додавши більше worker-ів, або змінивши версію redis-а. В приведеній конфігурації кластер перевірятиме опис завдання кожних 10 секунд, що, звісно, не заважає форсувати оновлення завдання запустивши його через команду nomad run повторно.</p>
<p>Підсумовуючи &#8211; в мереж і я натрапив на велику кількість невдоволених відгуків стосовно Nomad. Їх суть була в тому, що користувачі не розуміють мети, якої прагне досягнути HashiCorp з продуктами на зразок Nomad, коли на ринку є Kubernetes та Mesos, які підтримуються такими гігантами як Google та Apache відповідно. Особисто моя думка &#8211; немає нічого поганого в альтернативах. Ті користувачі, які зуміли пристосувати до автоматизації своїх процесів Terraform, Consul, Serf &#8211; знають, що HashiCorp роблять дуже devops-oriented продукти, які відповідають вимогам часу та модернових процесів організації інфраструктури. З іншого боку, HashiCorp &#8211; відносно невелика контора, тому ідея концентрації на вже існуючих продуктах теж зрозуміла. В мене немає певності, що Nomad зможе якось конкурувати із інсталяцією Kubernetes over Mesos для масштабних проектів. А використання Nomad якраз орієнтоване на великі розподілені інфраструктури. Але успіх попередніх продуктів вселяє надію на те, що і Nomad знайде свого користувача.</p>
]]></content:encoded>
			<wfw:commentRss>http://itblogger.org.ua/distributed-cluster-na-kolini-nomad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cross-provider IAAS на стероїдах &#124; Terraform&amp;Packer &#124; Ch2</title>
		<link>http://itblogger.org.ua/cross-provider-iaas-na-sterojidah-terraformpacker-ch2/</link>
		<comments>http://itblogger.org.ua/cross-provider-iaas-na-sterojidah-terraformpacker-ch2/#comments</comments>
		<pubDate>Wed, 07 Oct 2015 14:32:02 +0000</pubDate>
		<dc:creator><![CDATA[core]]></dc:creator>
				<category><![CDATA[Веб]]></category>
		<category><![CDATA[Віртуалізація]]></category>
		<category><![CDATA[Мережі]]></category>
		<category><![CDATA[Огляд ПЗ]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[packer]]></category>
		<category><![CDATA[terraform]]></category>

		<guid isPermaLink="false">http://itblogger.org.ua/?p=838</guid>
		<description><![CDATA[Продовжую тему, почату в попередньому матеріалі. До речі, за час, поки я готував другу частину, з&#8217;явився матеріал для третьої, тому, імовірно, буде продовження. Отож, в нас є конфігурації для збирання AMI для AWS та образів для Virtualbox. Щоб не ускладнювати собі життя із preseeding-ом, обмежимося хмарними провайдерами дял побудови нашої інфраструктури. Зрештою, цеі є головною [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Продовжую тему, почату в попередньому матеріалі. До речі, за час, поки я готував другу частину, з&#8217;явився матеріал для третьої, тому, імовірно,  буде продовження.<br />
Отож, в нас є конфігурації для збирання AMI для AWS та образів для Virtualbox. Щоб не ускладнювати собі життя із preseeding-ом, обмежимося хмарними провайдерами дял побудови нашої інфраструктури. Зрештою,  цеі є головною метою. А збирання платформи для тестів &#8211; це вже індивідуально для кожного інженера.</p>
<p>Отже, Terraform дозволяє описувати, а потім білдити та розгортати інфраструктуру на базі декількох датацентрів без прив&#8217;язки до технологій хмарного провайдера. Наприклад, ви описуєте ресурси EC2 в AWS та дроплета в Digital Ocean, доступ до яких здійснюватиметься через якийсь DynDNS сервіс. І це все &#8211; в декілька рядків конфігураційного коду. Про ресурси я згадав недарма &#8211; саме такою термінологією користується Terraform. Наприклад:<br />
<span id="more-838"></span></p>
<pre class="brush: python; title: ; notranslate">
resource &quot;digitalocean_droplet&quot; &quot;web&quot; {
   name = &quot;tf-web&quot;
   size = &quot;512mb&quot;
   image = &quot;centos-5-8-x32&quot;
   region = &quot;sfo1&quot;
}

resource &quot;dnsimple_record&quot; &quot;hello&quot; {
   domain = &quot;example.com&quot;
   name = &quot;test&quot;
   value = &quot;${digitalocean_droplet.web.ipv4_address}&quot;
   type = &quot;A&quot;
}
</pre>
<p>10 рядків конфігурації, з яких генерується план досягнення описаного стану інфтраструктури. Після його виконання у вас є запущений дроплет Centos та А-запис із його ip-адресою для DNSSimple.</p>
<p>Перейдемо до якогось практичнішого прикладу. Наприклад, запуск двох веб-серверів із балансуванням через haproxy.<br />
На цей момент у вас має бути зареєстрований акаунт в Digital Ocean, доданий публічний ключ в налаштуваннях та згенерований Personal access token. Як у і випазку з Packer-ом &#8211; змінні можна передавати прямо в командному рядку, але грамотно і зручніше це робити через файли зі змінними. </p>
<p>Починаємо з декларування. Навідміну від Packer-а, в Terraformi-і можна описувати список обов&#8217;язкових та необов&#8217;язкових змінних, які потім можна додавати або з файла, або з командного рядка. Тому першим треба додати файлик зі список необхідних змінних:</p>
<p>variables.tf</p>
<pre class="brush: python; title: ; notranslate">
variable &quot;do_token&quot; {}
variable &quot;pub_key&quot; {}
variable &quot;pvt_key&quot; {}
variable &quot;ssh_fingerprint&quot; {}

provider &quot;digitalocean&quot; {
  token = &quot;${var.do_token}&quot;
}
</pre>
<p>Називати файл можна довільно, головне зберігати розширення *.tf, оскільки саме файли цього формату будуть підхоплені під час білду. </p>
<p>Наступним додамо файл, власне, із значеннями:</p>
<p>terraform.tfvars</p>
<pre class="brush: python; title: ; notranslate">
DO_PAT = &quot;cd85a4fdbf88xxxxxxxxxxxxxxxxxxxx1f41cd8dc43a&quot;
pub_key = &quot;D:\Projects\private\prj\access\digitalocean.pub&quot;
pvt_key = &quot;D:\Projects\private\prj\access\digitalocean&quot;
ssh_fingerprint = &quot;f8:eb:40:bxxxxxxxxxxxxxxxxxxxx13:3d:22:27&quot;
</pre>
<p>Файл terraform.tfvars за замовчуванням читається Terraform-ом. Якщо файл матиме інше ім&#8217;я &#8211; його потрібно буде вказати в командному рядку при виконанні через -var-file. </p>
<p>Кожен провайдер має свою специфікацію, відповідно, до якої відбувається виклик API обраного провайдера. У випадку Digital Ocean нам доступні три типи ресурсів:</p>
<ul>
<li>digitalocean_domain</li>
<li>digitalocean_droplet</li>
<li>digitalocean_record</ul>
</li>
</ul>
<p>Конфігурація дроплета першого веб-сервера:</p>
<p>www-1.tf</p>
<pre class="brush: python; title: ; notranslate">
resource &quot;digitalocean_droplet&quot; &quot;www-1&quot; {
    image = &quot;ubuntu-14-04-x64&quot;
    name = &quot;www-1&quot;
    region = &quot;nyc2&quot;
    size = &quot;512mb&quot;
    private_networking = true
    ssh_keys = [
      &quot;${var.ssh_fingerprint}&quot;
    ]

    connection {
      user = &quot;root&quot;
      type = &quot;ssh&quot;
      key_file = &quot;${var.pvt_key}&quot;
      timeout = &quot;2m&quot;
  }

    provisioner &quot;remote-exec&quot; {
    inline = [
      &quot;export PATH=$PATH:/usr/bin&quot;,
      # install nginx
      &quot;sudo apt-get update&quot;,
      &quot;sudo apt-get -y install nginx&quot;
    ]
  }
}
</pre>
<p>Коротко по блоках:</p>
<ul>
<li>конфігурація дроплета</li>
<li>спосіб підключення</li>
<li>shell-provisioning</li>
</ul>
<p>В результаті виконання terraform plan отримуємо:</p>
<pre class="brush: python; title: ; notranslate">
$ terraform plan
Refreshing Terraform state prior to plan...


The Terraform execution plan has been generated and is shown below.
Resources are shown in alphabetical order for quick scanning. Green resources
will be created (or destroyed and then created if an existing resource
exists), yellow resources are being changed in-place, and red resources
will be destroyed.

Note: You didn't specify an &quot;-out&quot; parameter to save this plan, so when
&quot;apply&quot; is called, Terraform can't guarantee this is what will execute.

+ digitalocean_droplet.www-1
    image:                &quot;&quot; =&gt; &quot;ubuntu-14-04-x64&quot;
    ipv4_address:         &quot;&quot; =&gt; &quot;&lt;computed&gt;&quot;
    ipv4_address_private: &quot;&quot; =&gt; &quot;&lt;computed&gt;&quot;
    ipv6_address:         &quot;&quot; =&gt; &quot;&lt;computed&gt;&quot;
    ipv6_address_private: &quot;&quot; =&gt; &quot;&lt;computed&gt;&quot;
    locked:               &quot;&quot; =&gt; &quot;&lt;computed&gt;&quot;
    name:                 &quot;&quot; =&gt; &quot;www-1&quot;
    private_networking:   &quot;&quot; =&gt; &quot;1&quot;
    region:               &quot;&quot; =&gt; &quot;nyc2&quot;
    size:                 &quot;&quot; =&gt; &quot;512mb&quot;
    ssh_keys.#:           &quot;&quot; =&gt; &quot;1&quot;
    ssh_keys.0:           &quot;&quot; =&gt; &quot;f8:eb:40:b4xxxxxxxxxxxxxxxxxd:22:27&quot;
    status:               &quot;&quot; =&gt; &quot;&lt;computed&gt;&quot;


Plan: 1 to add, 0 to change, 0 to destroy.
</pre>
<p>Підготуємо ще один дроплет із аналогічною конфігурацією:</p>
<p>www-2.tf</p>
<pre class="brush: python; title: ; notranslate">
resource &quot;digitalocean_droplet&quot; &quot;www-1&quot; {
    image = &quot;ubuntu-14-04-x64&quot;
    name = &quot;www-1&quot;
    region = &quot;nyc2&quot;
    size = &quot;512mb&quot;
    private_networking = true
    ssh_keys = [
      &quot;${var.ssh_fingerprint}&quot;
    ]

    connection {
      user = &quot;root&quot;
      type = &quot;ssh&quot;
      key_file = &quot;${var.pvt_key}&quot;
      timeout = &quot;2m&quot;
  }

    provisioner &quot;remote-exec&quot; {
    inline = [
      &quot;export PATH=$PATH:/usr/bin&quot;,
      # install nginx
      &quot;sudo apt-get update&quot;,
      &quot;sudo apt-get -y install nginx&quot;
    ]
  }
}
</pre>
<p>Ну і наостанок &#8211; haproxy для балансування навантаження.</p>
<p>aproxy-www.tf</p>
<pre class="brush: python; title: ; notranslate">
resource &quot;digitalocean_droplet&quot; &quot;haproxy-www&quot; {
    image = &quot;ubuntu-14-04-x64&quot;
    name = &quot;haproxy-www&quot;
    region = &quot;nyc2&quot;
    size = &quot;512mb&quot;
    private_networking = true
    ssh_keys = [
      &quot;${var.ssh_fingerprint}&quot;
    ]

    connection {
      user = &quot;root&quot;
      type = &quot;ssh&quot;
      key_file = &quot;${var.pvt_key}&quot;
      timeout = &quot;2m&quot;
  }

  provisioner &quot;remote-exec&quot; {
    inline = [
      &quot;export PATH=$PATH:/usr/bin&quot;,
      # install haproxy 1.5
      &quot;sudo add-apt-repository -y ppa:vbernat/haproxy-1.5&quot;,
      &quot;sudo apt-get update&quot;,
      &quot;sudo apt-get -y install haproxy&quot;,

      # download haproxy conf
      &quot;sudo wget https://gist.githubusercontent.com/corest/c51df9444a717ab210c9/raw/bc2b8cc1335b3e37c9bebb47bae70abf963f0c67/haproxy.cfg -O /etc/haproxy/haproxy.cfg&quot;,

      # replace ip address variables in haproxy conf to use droplet ip addresses
      &quot;sudo sed -i 's/HAPROXY_PUBLIC_IP/${digitalocean_droplet.haproxy-www.ipv4_address}/g' /etc/haproxy/haproxy.cfg&quot;,
      &quot;sudo sed -i 's/WWW_1_PRIVATE_IP/${digitalocean_droplet.www-1.ipv4_address_private}/g' /etc/haproxy/haproxy.cfg&quot;,
      &quot;sudo sed -i 's/WWW_2_PRIVATE_IP/${digitalocean_droplet.www-2.ipv4_address_private}/g' /etc/haproxy/haproxy.cfg&quot;,

      # restart haproxy to load changes
      &quot;sudo service haproxy restart&quot;
    ]
  }
}
</pre>
<p>Я не зупиняюся надто на коментуванні вмісту конфігурацій, оскільки, вони мають дуже простий формат і є, як то кажуть, self-explanatory. Загальна логіка файла конфігурації haproxy схожа з дроплетами для веб-серверів: описати ноду, сконфігурувати спосіб підключення до неї, налаштувати сервіс haproxy із параметрами приватних ip-адрес та публічної ip-адреси, які будуть вирахувані після запуску дроплетів (кожен тип ресурсу має свої дані, які експортуються після завершення деплою ресурсу).</p>
<p>Останнім кроком додамо DNS записи для нашої конфігурації. </p>
<p>terraform.itblogger.org.ua.tf</p>
<pre class="brush: python; title: ; notranslate">
# Create a new domain record
resource &quot;digitalocean_domain&quot; &quot;default&quot; {
   name = &quot;terraform.itblogger.org.ua&quot;
   ip_address = &quot;${digitalocean_droplet.haproxy-www.ipv4_address}&quot;
}

resource &quot;digitalocean_record&quot; &quot;CNAME-www&quot; {
  domain = &quot;${digitalocean_domain.default.name}&quot;
  type = &quot;CNAME&quot;
  name = &quot;www&quot;
  value = &quot;@&quot;
}
</pre>
<p>Можна білдити:</p>
<pre class="brush: python; title: ; notranslate">
terraform apply
</pre>
<p>В результаті отримуємо haproxy-сервер, доступний назовні, який балансує запити між двома нодами в приватный мережі.</p>
<p>А тепер підемо трохи далі і додамо тієї самої  кросс-платформенності. Наприклад, наша задача &#8211; збільшити кількість нод, аби через деякий час без зупинки роботи інфраструктури мігрувати з Digital Ocean на AWS. Для цього додамо ще ноду веб-сервера, але вже на AWS. </p>
<p>Почати варто із змінних для доступу та налаштування. </p>
<p>provider.tf</p>
<pre class="brush: python; title: ; notranslate">
variable &quot;do_token&quot; {}
variable &quot;pub_key&quot; {}
variable &quot;pvt_key&quot; {}
variable &quot;ssh_fingerprint&quot; {}

variable &quot;aws_access_key&quot; {}
variable &quot;aws_secret_key&quot; {}
variable &quot;source_ami&quot; {}
variable &quot;instance_type&quot; {}
variable &quot;associate_public_ip_address&quot; {}
variable &quot;aws_key_pair&quot; {}
variable &quot;aws_region&quot; {
    default = &quot;us-west-2&quot;
}

provider &quot;digitalocean&quot; {
  token = &quot;${var.do_token}&quot;
}

provider &quot;aws&quot; {
    access_key = &quot;${var.aws_access_key}&quot;
    secret_key = &quot;${var.aws_secret_key}&quot;
    region = &quot;${var.aws_region}&quot;
}
</pre>
<p>Ну і файл із значеннями (не забудьте імортувати ваш публічний ключ в AWS):</p>
<p>terraform.tfvars</p>
<pre class="brush: python; title: ; notranslate">
&quot;do_token&quot; = &quot;cd85a4fdbf8805cc2dbfxxxxxxxxxxxxx1bf1f41cd8dc43a&quot;
&quot;pub_key&quot; = &quot;D:\Projects\private\prj\access\digitalocean.pub&quot;
&quot;pvt_key&quot; = &quot;D:\Projects\private\prj\access\digitalocean&quot;
&quot;ssh_fingerprint&quot; = &quot;f8:eb:40:b4:05:d2:fa:0d:06:b0:55:c9:13:3d:22:27&quot;
&quot;aws_access_key&quot; = &quot;AKIAJxxxxxxxxxxxxxVWLA&quot;
&quot;aws_secret_key&quot; = &quot;Z4i6Zxxxxxxxxxxxxxxxxx0BVz/xYraS&quot;
&quot;aws_key_pair&quot; = &quot;do_import&quot;
&quot;source_ami&quot; = &quot;ami-5189a661&quot;
&quot;instance_type&quot; = &quot;t2.micro&quot;
&quot;associate_public_ip_address&quot; = &quot;true&quot;
</pre>
<p>Перед тим, як додати конфігурацію EC2-ноди, варто створити новий ресурс security-групи, оскільки на даний момент Terraform не підтримує імпорту вже існуючих груп (тоді можна було б використати групу, створену Packer-ом у попередньому матеріалі).</p>
<p>aws_security_group.tf</p>
<pre class="brush: python; title: ; notranslate">
resource &quot;aws_security_group&quot; &quot;allow_all&quot; {
  name = &quot;allow_all&quot;
  description = &quot;Allow all inbound traffic&quot;

  ingress {
      from_port = 0
      to_port = 0
      protocol = &quot;-1&quot;
      cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }

  egress {
      from_port = 0
      to_port = 0
      protocol = &quot;-1&quot;
      cidr_blocks = [&quot;0.0.0.0/0&quot;]
  }
}
</pre>
<p>Як бачите, нічого спільного із security ця група немає, адже вона дозволяє весь трафік на вхід і на вихід. Але для експерименту цього достатньо. </p>
<p>Третій крок &#8211; власне, сама нода. </p>
<p>www-3.tf</p>
<pre class="brush: python; title: ; notranslate">
resource &quot;aws_instance&quot; &quot;www-3&quot; {
    ami = &quot;${var.source_ami}&quot;
    instance_type = &quot;${var.instance_type}&quot;
    tags {
        Name = &quot;www-3&quot;
    }

    depends_on = [&quot;aws_security_group.allow_all&quot;]
    
    security_groups = [&quot;${aws_security_group.allow_all.id}&quot;,]    


    key_name = &quot;${var.aws_key_pair}&quot;


    connection {
      user = &quot;ubuntu&quot;
      type = &quot;ssh&quot;
      key_file = &quot;${var.pvt_key}&quot;
      timeout = &quot;2m&quot;
  }

    provisioner &quot;remote-exec&quot; {
    inline = [
      &quot;export PATH=$PATH:/usr/bin&quot;,
      # install nginx
      &quot;sudo apt-get update&quot;,
      &quot;sudo apt-get -y install nginx&quot;
    ]
  }
}
</pre>
<p>Ця конфігурація використовує id значення security-групи, яке буде експортовано для використання після створення групи. </p>
<p>Останні зміни: в конфігурації haproxy-ноди &#8211; додати рядок для щаміни шаблону на публічну адресу EC2-інстанса (після повної міграції також можна перейти на приватні адреси).</p>
<p>haproxy-www.tf</p>
<pre class="brush: python; title: ; notranslate">
      &quot;sudo sed -i 's/WWW_3_PUBLIC_IP/${aws_instance.www-3.public_ip}/g' /etc/haproxy/haproxy.cfg&quot;,
</pre>
<p>і шаблон в конфігурацію haproxy:</p>
<p>haproxy.cfg</p>
<pre class="brush: python; title: ; notranslate">
  server www-3 WWW_3_PUBLIC_IP:80 check
</pre>
<p>Виконуємо білд, і через декілька хвилин у нас оновлена інфраструктура із трьома нодами вебсерверів на різних хмарних провайдерах:</p>
<pre class="brush: python; title: ; notranslate">
  ip_address: &quot;&quot; =&gt; &quot;162.243.93.231&quot;
  name:       &quot;&quot; =&gt; &quot;terraform.itblogger.org.ua&quot;
digitalocean_domain.default: Creation complete
digitalocean_record.CNAME-www: Creating...
  domain:   &quot;&quot; =&gt; &quot;terraform.itblogger.org.ua&quot;
  name:     &quot;&quot; =&gt; &quot;www&quot;
  port:     &quot;&quot; =&gt; &quot;&lt;computed&gt;&quot;
  priority: &quot;&quot; =&gt; &quot;&lt;computed&gt;&quot;
  type:     &quot;&quot; =&gt; &quot;CNAME&quot;
  value:    &quot;&quot; =&gt; &quot;@&quot;
  weight:   &quot;&quot; =&gt; &quot;&lt;computed&gt;&quot;
digitalocean_record.CNAME-www: Creation complete

Apply complete! Resources: 6 added, 0 changed, 0 destroyed.

The state of your infrastructure has been saved to the path
below. This state is required to modify and destroy your
infrastructure, so keep it safe. To inspect the complete state
use the `terraform show` command.

State path: terraform.tfstate
</pre>
<p>Те, що робить Мітчел Хашимото та його компанія &#8211; дуже прогресивна річ. Навіть, порівняно із вже незамінними конфігураційними менеджерами. Як сказав сам Хашимото на одній з недавніх конференцій: &#8220;Ви можете мати скільки завгодно автоматизації для налаштування вашого продукту, але поки у вас немає автоматичного розгортання сервісів &#8211; який сенс у цьому? Ваш продукт не працюватиме.&#8221;. Еволюція devops-у іде семимильними кроками. Після традиційного bash-provisioning компанії стрімко інтегрували Puppet-и та Chef-и із своїми продуктовими API та SDK. Але Terraform &#8211; це ще вищий рівень абстракції. Я не маю на увазі, що вам обов&#8217;язково треба зав&#8217;язувати концентрувати увагу саме на цьому рівні, але грамотне поєднання кращих практик безумовно зекономить час, гроші та нерви у завданнях організації та управлінні інфраструктурою ваших сервісів. А Terraform &#8211; вже зараз у списку кращих практик кожного devops-а, який тримає руку на пульсі свого галузевого напрямку. </p>
]]></content:encoded>
			<wfw:commentRss>http://itblogger.org.ua/cross-provider-iaas-na-sterojidah-terraformpacker-ch2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cross-provider IAAS на стероїдах &#124; Terraform&amp;Packer &#124; Ch1</title>
		<link>http://itblogger.org.ua/cross-provider-iaas-na-sterojidah-terraformpacker-ch1/</link>
		<comments>http://itblogger.org.ua/cross-provider-iaas-na-sterojidah-terraformpacker-ch1/#comments</comments>
		<pubDate>Thu, 24 Sep 2015 12:28:05 +0000</pubDate>
		<dc:creator><![CDATA[core]]></dc:creator>
				<category><![CDATA[Веб]]></category>
		<category><![CDATA[Віртуалізація]]></category>
		<category><![CDATA[Огляд ПЗ]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[packer]]></category>
		<category><![CDATA[terraform]]></category>
		<category><![CDATA[vagrant]]></category>

		<guid isPermaLink="false">http://itblogger.org.ua/?p=829</guid>
		<description><![CDATA[Традиційний абзац про те, чому я так давно не писав нічого.  Мав трохи подорожей. Німеччині, Швейцарія, Ісландія. Змінив роботу. Переїхав у інше місто. Поки звикаю до нових умов та завдань, часу на селф-девелопмент було не так багато. Проте, тема, про яку я хочу трохи поговорити &#8211; одна з трьох, які давно знаходяться на такому собі [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Традиційний абзац про те, чому я так давно не писав нічого.  Мав трохи подорожей. Німеччині, Швейцарія, Ісландія. Змінив роботу. Переїхав у інше місто. Поки звикаю до нових умов та завдань, часу на селф-девелопмент було не так багато. Проте, тема, про яку я хочу трохи поговорити &#8211; одна з трьох, які давно знаходяться на такому собі порядку денному. Перша &#8211; це створення приватної хмари з блекджеком і &#8230; докерами (Docker&#038;Swarm). Друга тема &#8211; це CRIU &#8211; інструмент від розробників Parallels, який покликаний забезпечити реалізацію live-migration через checkpoint/restore стану запущених процесів, чи, зокрема, таких популярних зараз контейнерів. Але ця тема трохи пригальмувала, оскільки моєю кінцевою метою була демонстрація відновлення docker-контейнерів з допомогою CRIU, але через критичні зміни в libcontainer демонстрація накрилася, матеріал відсунувся &#8220;на потім&#8221;.</p>
<p>Ну і третя. IAAS  взяла найвищий пріоритет завдяки одній із співбесід, яку я мав змогу проходити в процесі пошуку роботи. Компанію не називатиму, але суть розмови зводилася до порівняння різних клауд-провайдерів та технологій віртуалізації. Серед основних питань, з приводу яких виникла дискусія &#8211; складність тестування інфрастуктури через пропрієтарність деяких форматів шаблонів обчислювальних ресурсів (AMI в AWS, наприклад) та використання різних хмарних провайдерів у одному проекті. Звісно, це не common case, але за це я і люблю проходити співбесіди кожного місяця незалежно від того чи шукаю роботу, чи ні.<br />
<span id="more-829"></span></p>
<p>Менше води. Використання різних технологій віртуалізації приводить нас до ситуації, коли взяти і запустити відтестовану локальну машину в хмарі &#8211; зовсім нетривіальна задача. Звісно, для цього і з&#8217;явилися на ринку десятки інструментів оркестрації, а пізніше &#8211; і тотальна docker-изація, яка потроху стає новим стандартом для software-delivery. Але процес цей має свої підводні камені, тому єдиний формат опису конфігурації обчислювальних ресурсів різних хмарних провайдерів досі залишається актуальною проблемою. Яку і вирішує Packer від HashiCorp.</p>
<p>Я не зупинятимусь надто довго над описом команд це все є в <a href="https://www.packer.io/docs">документації</a>. Тому, перейду одразу до практичного прикладу.</p>
<p>Декілька слів про термінологію:</p>
<ul>
<li>build &#8211; побудо образу машини для однієї платформи</li>
<li>artifacts &#8211; результат виконання build-а</li>
<li>builder &#8211; компонент, що використовується для виконання build-а для обраної платформи. Приклад builder-а: Vmware, Amazon EC2.</li>
<li>provisioner &#8211; компонент, що виконує налаштування зібраного білда (Puppet, shell etc.)</li>
<li>template &#8211; власне, та сама уніфікована конфігурація, білд якої дає нам артефакти</li>
</ul>
<p>Типова конфігурація шаблону:</p>
<pre class="brush: python; title: ; notranslate">
{
  &quot;variables&quot;: {
    &quot;var_name&quot;: &quot;var_value&quot;
  },
  &quot;builders&quot;: [
    { &quot;type&quot;: &quot;virtualbox-iso&quot; },
    { &quot;type&quot;: &quot;digitalocean&quot; },
    { &quot;type&quot;: &quot;amazon-instance&quot; }
  ],
  &quot;provisioners&quot;: [
    { &quot;type&quot;: &quot;shell&quot; },
    { &quot;type&quot;: &quot;ansible-local&quot; }
  ],
  &quot;post-processors&quot;: [
    { &quot;type&quot;: &quot;compress&quot; }
  ]
}
</pre>
<p>Щодо секції &#8220;variables&#8221; &#8211; звісно, тримати важливі дані доступу у файлі шаблону не рекомендується. Їх можна передати як параметр білда окремим файлом.</p>
<p>Для прикладу &#8211; приводжу файл зі змінними, які необхідно задати для білду AMI (Amazon Machine Instance).</p>
<p><strong>variables.json</strong></p>
<pre class="brush: python; title: ; notranslate">
{
  &quot;aws_access_key&quot;: &quot;AKIAxxxxxxxxUXVWLA&quot;,
  &quot;aws_secret_key&quot;: &quot;Z4i6ZpdHrW9xxxxxxxxxxxxxxxx0BVz/xYraS&quot;,
  &quot;aws_region&quot;: &quot;us-west-2&quot;,
  &quot;source_ami&quot;: &quot;ami-5189a661&quot;,
  &quot;instance_type&quot;: &quot;t2.micro&quot;,
  &quot;ssh_username&quot;: &quot;ubuntu&quot;,
  &quot;ami_name&quot;: &quot;ITBlogger packer build&quot;,
  &quot;security_group_id&quot;: &quot;sg-7xxxxx1x&quot;,
  &quot;user_pass&quot;: &quot;ubuntu&quot;,
  &quot;hostname&quot;: &quot;ITBlogger&quot;,
  &quot;web_server_ip&quot;: &quot;192.168.56.1&quot;,
  &quot;web_server_port&quot;: &quot;8080&quot;
}
</pre>
<p>Файл містить перелік необхідних полів. Насправді ж, доступних налаштувань набагато більше. Серед перелічених &#8211; всі до ami_name включно є обов&#8217;язковими. security_group_id створюється у процесі білда, але лише з ssh inbound rule. Оскільки, в нас буде веб-сервер &#8211; потрібно створити свою групу з доступом для ssh та http і додати id цієї групи у конфігурацію. З списком налаштувань можна ознайомитись тут <a href="https://www.packer.io/docs/builders/amazon-ebs.html">тут</a>. Щодо web_server_ip та web_server_port &#8211; ці значення додані для майбутнього розгортання білда через virtualbox.</p>
<p>Використовуючи файл зі змінними, тепер шаблон можна подати у такому вигляді:</p>
<p><strong>template.json</strong></p>
<pre class="brush: python; title: ; notranslate">
{
  &quot;builders&quot;: [{
    &quot;type&quot;: &quot;amazon-ebs&quot;,
    &quot;access_key&quot;: &quot;{{user `aws_access_key`}}&quot;,
    &quot;secret_key&quot;: &quot;{{user `aws_secret_key`}}&quot;,
    &quot;region&quot;: &quot;{{user `aws_region`}}&quot;,
    &quot;source_ami&quot;: &quot;{{user `source_ami`}}&quot;,
    &quot;instance_type&quot;: &quot;{{user `instance_type`}}&quot;,
    &quot;ssh_username&quot;: &quot;{{user `ssh_username`}}&quot;,
    &quot;tags&quot;: {
      &quot;OS_Version&quot;: &quot;Ubuntu 14.04&quot;
    },
    &quot;ami_name&quot;: &quot;{{user `ami_name`}} [{{timestamp}}]&quot;,
    &quot;ami_description&quot;: &quot;Test build for itblogger post about packer&quot;,
    &quot;security_group_id&quot;: &quot;{{user `security_group_id`}}&quot;,
  }],
  &quot;provisioners&quot;: [
    { 
      &quot;type&quot;: &quot;shell&quot;,
      &quot;script&quot;: &quot;bootstrap.sh&quot;,
      &quot;override&quot;: {
        &quot;amazon-ebs&quot;: {
          &quot;execute_command&quot;: &quot;echo {{user `user_pass`}}  | sudo -S sh '{{ .Path }}'&quot;
        }
      }
      }
  ]
}
</pre>
<p>Зверніть увагу, що порядок у файлі зі змінними має збігатися із порядком їхнього використання в шаблоні, бо в іншому випадку шаблон не пройде валідацію.<br />
Поки що сенсу в цій конфігурації мало, адже все, що ми робимо &#8211; це переводимо один AMI в інший. Тому додамо якогось provisioning-у. Packer підтримує безліч конфігураційних менеджерів і я особито віддаю перевагу Ansible, але щоб не зачіпати надто багато інструментів та технологій, обмежуся звичним shell provisioning. Ну і в якості типової задачі &#8211; встановлення веб-сервера.</p>
<pre class="brush: python; title: ; notranslate">
#!/usr/bin/env bash

sudo apt-get update
sudo apt-get install -y apache2
sudo rm /var/www/html/index.html -f
sudo mv /home/ubuntu/index.html /var/www/html/index.html
</pre>
<p>Тут все зовсім просто &#8211; оновлюємо систему, встановлюємо apache, видаляємо дефолтну сторінку, копіюємо свою наперед підготовлену сторінку, яку ми завантажили через file-provisioner.</p>
<p><strong>Build</strong></p>
<pre class="brush: python; title: ; notranslate">
  packer build -var-file=variables.json template.json
</pre>
<p>Результат виконання білда:</p>
<pre class="brush: python; title: ; notranslate">
==&gt; Builds finished. The artifacts of successful builds are:
--&gt; amazon-ebs: AMIs were created:

us-west-2: ami-bxxxxx85
</pre>
<p><a href="http://itblogger.org.ua/wp-content/uploads/2015/09/download.png"><img src="http://itblogger.org.ua/wp-content/uploads/2015/09/download.png" alt="download" width="1056" height="443" class="alignnone size-full wp-image-851" /></a></p>
<p>Запускаємо ec2-інстанс з AMI, створеного через Packer &#8211; і маємо робочий сайт. </p>
<p>А тепер, власне, для чого так ускладнювати. Наприклад, ви, як девелопер, хочете працювати з таким же середовищем, яке запущено у production. Додаємо конфігурацію для Virtualbox provisioner-а. Додаємо один рядок конфігурації в постпроцесинг &#8211; і маємо робоче середовище. Особливо легко це робити з ще одним продуктом HashiCorp &#8211; Vagrant. </p>
<p><strong>Preseeding</strong><br />
Єдина складність процесу інсталяції з iso &#8211; це preseeding &#8211; виконання інсталяції з використанням файлу конфігурації емуляції вибору параметрів сервера. Це не надто складна тема, якщо ви раніше вже мали досвід виконання таких інсталяцій. Коротко &#8211; в <a href="https://help.ubuntu.com/lts/installation-guide/armhf/apbs02.html">офіційній документації</a>.<br />
Нижче приводжу свій файл preseed.cfg:</p>
<pre class="brush: python; title: ; notranslate">
## Options to set on the command line
d-i debian-installer/locale string en_US.utf8
d-i console-setup/ask_detect boolean false
d-i console-setup/layout string us

d-i netcfg/get_hostname string this-host
d-i netcfg/get_domain string this-host

d-i time/zone string UTC
d-i clock-setup/utc-auto boolean true
d-i clock-setup/utc boolean true

d-i kbd-chooser/method select American English

d-i base-installer/kernel/override-image string linux-server

d-i debconf debconf/frontend select Noninteractive

d-i pkgsel/install-language-support boolean false
tasksel tasksel/first multiselect standard, ubuntu-server

d-i partman-auto/method string regular
d-i partman-auto/purge_lvm_from_device boolean true
d-i partman-lvm/confirm boolean true
d-i partman-auto/choose_recipe select atomic
d-i partman/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true

# Default user
d-i passwd/user-fullname string ubuntu
d-i passwd/username string ubuntu
d-i passwd/user-password password ubuntu
d-i passwd/user-password-again password ubuntu
d-i user-setup/encrypt-home boolean false
d-i user-setup/allow-password-weak boolean true

# Minimum packages (see postinstall.sh)
d-i pkgsel/include string openssh-server ntp

# Upgrade packages after debootstrap? (none, safe-upgrade, full-upgrade)
# (note: set to none for speed)
d-i pkgsel/upgrade select none

d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean true
d-i finish-install/reboot_in_progress note

d-i pkgsel/update-policy select none

choose-mirror-bin mirror/http/proxy string
</pre>
<p>Щоб доставити його до гостьової машини знадобиться якийсь веб-сервер. Для Windows раджу mongoose &#8211; один бінарник, мінімум налаштувань. Запускайте його в каталозі з вашим файлом preseed.cfg і отримуєте веб-сервер на localhost-і. Після цього додаєте в termplater-vars ip-адресу вашого virtualbox-інтерфейсу та дефолтний порт 8080 &#8211; і ваша конфігурація буде підхоплена в preseeding процедуру.</p>
<p>Фінальна конфігурація шаблону має такий вигляд:</p>
<pre class="brush: python; title: ; notranslate">
{
  &quot;builders&quot;: [{
    &quot;type&quot;: &quot;amazon-ebs&quot;,
    &quot;access_key&quot;: &quot;{{user `aws_access_key`}}&quot;,
    &quot;secret_key&quot;: &quot;{{user `aws_secret_key`}}&quot;,
    &quot;region&quot;: &quot;{{user `aws_region`}}&quot;,
    &quot;source_ami&quot;: &quot;{{user `source_ami`}}&quot;,
    &quot;instance_type&quot;: &quot;{{user `instance_type`}}&quot;,
    &quot;security_group_id&quot;: &quot;{{user `security_group_id`}}&quot;,    
    &quot;ssh_username&quot;: &quot;{{user `ssh_username`}}&quot;,
    &quot;tags&quot;: {
      &quot;OS_Version&quot;: &quot;Ubuntu 14.04&quot;
    },
    &quot;ami_name&quot;: &quot;{{user `ami_name`}} [{{timestamp}}]&quot;,
    &quot;ami_description&quot;: &quot;Test build for itblogger post about packer&quot;
  },
    {
  &quot;type&quot;: &quot;virtualbox-iso&quot;,
  &quot;guest_os_type&quot;: &quot;Ubuntu_64&quot;,
  &quot;iso_url&quot;: &quot;http://releases.ubuntu.com/14.04.3/ubuntu-14.04.3-server-amd64.iso&quot;,
  &quot;iso_checksum&quot;: &quot;9e5fecc94b3925bededed0fdca1bd417&quot;,
  &quot;iso_checksum_type&quot;: &quot;md5&quot;,
  &quot;ssh_username&quot;: &quot;{{user `ssh_username`}}&quot;,
  &quot;ssh_password&quot;: &quot;{{user `user_pass`}}&quot;,
  &quot;shutdown_command&quot;: &quot;echo '{{user `user_pass`}}' | sudo -S shutdown -P now&quot;,
   &quot;boot_command&quot; : [
            &quot;&lt;esc&gt;&lt;esc&gt;&lt;enter&gt;&lt;wait&gt;&quot;,
            &quot;/install/vmlinuz noapic &quot;,
            &quot;preseed/url=http://{{user `web_server_ip`}}:{{user `web_server_port`}}/preseed.cfg &quot;,
            &quot;debian-installer=en_US auto locale=en_US kbd-chooser/method=us &quot;,
            &quot;hostname={{user `hostname`}} &quot;,
            &quot;fb=false debconf/frontend=noninteractive &quot;,
            &quot;keyboard-configuration/modelcode=SKIP keyboard-configuration/layout=USA &quot;,
            &quot;keyboard-configuration/variant=USA console-setup/ask_detect=false &quot;,
            &quot;initrd=/install/initrd.gz -- &lt;enter&gt;&lt;wait&gt;&quot;
        ]
    }
  ],
  &quot;provisioners&quot;: [
      {
      &quot;type&quot;: &quot;file&quot;,
      &quot;source&quot;: &quot;index.html&quot;,
      &quot;destination&quot;: &quot;/home/{{user `ssh_username`}}/index.html&quot;
    },
    { 
      &quot;type&quot;: &quot;shell&quot;,
      &quot;script&quot;: &quot;bootstrap.sh&quot;,
      &quot;override&quot;: {
        &quot;amazon-ebs&quot;: {
          &quot;execute_command&quot;: &quot;echo {{user `user_pass`}}  | sudo -S sh '{{ .Path }}'&quot;
        }
      }
    }
  ],
  &quot;post-processors&quot;: [&quot;vagrant&quot;]
}
</pre>
<p>Серед артефактів, окрім AMI, тепер в нас є і packer_amazon-ebs_aws.box та packer_amazon-ebs_virtualbox-iso.box файли, який можна імпортувати у vagrant.  </p>
<pre class="brush: python; title: ; notranslate">
vagrant box add amazon_box packer_amazon-ebs_aws.box
</pre>
<p>Отже, у нас є єдина конфігурація  віртуальної машини, з якої можна отримати робочий ami образ для AWS та віртуальну машину для локальної роботи. Потрібно більше провайдерів &#8211; конфігуруєте свої provisioner-и та отримуєте той же результат на потрібній вам хмарній платформі. </p>
<p>На цьому завершую. Це лише перша частина матеріалу. Тепер, коли ви знайомі з інструментом Packer &#8211; можна переходити до хмарних мультиплатформенних архітектур сервісів, організацію яких забезпечує Terraform. Про це і розповім наступного разу. </p>
<p>Статті по темі: <a href="http://itblogger.org.ua/kontejnerna-virtualizatsiya-1-vagrant/">Vagrant</a></p>
]]></content:encoded>
			<wfw:commentRss>http://itblogger.org.ua/cross-provider-iaas-na-sterojidah-terraformpacker-ch1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Битва за контейнери. Учасники та перспективи</title>
		<link>http://itblogger.org.ua/bytva-za-kontejnery-uchasnyky-ta-perspektyvy/</link>
		<comments>http://itblogger.org.ua/bytva-za-kontejnery-uchasnyky-ta-perspektyvy/#comments</comments>
		<pubDate>Mon, 29 Dec 2014 07:21:05 +0000</pubDate>
		<dc:creator><![CDATA[core]]></dc:creator>
				<category><![CDATA[Веб]]></category>
		<category><![CDATA[Віртуалізація]]></category>
		<category><![CDATA[Огляд ПЗ]]></category>

		<guid isPermaLink="false">http://itblogger.org.ua/?p=812</guid>
		<description><![CDATA[Настрій такий в останні місяці був дивний, що багато книжок прочиталося і багато віршів написалося. Мої незнайому друзі в соціальних мережах могли б, навіть, подумати, що я зовсім не інженер з технічною освітою, а якийсь філолог (нічого особистого, я люблю філологів). Тож я таки зібрався з думками і вирішив зробити допис і на технічну тематику. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><img class="aligncenter" alt="" src="http://itblogger.org.ua/images/29122014/1.jpg" width="508" height="381" /></p>
<p style="text-align: justify;"><span style="line-height: 1.5em;">Настрій такий в останні місяці був дивний, що багато книжок прочиталося і багато віршів написалося. Мої незнайому друзі в соціальних мережах могли б, навіть, подумати, що я зовсім не інженер з технічною освітою, а якийсь філолог (нічого особистого, я люблю філологів). Тож я таки зібрався з думками і вирішив зробити допис і на технічну тематику. А так як основним трендом DevOps-року, що минає, були контейнери та Docker зокрема &#8211; про них і говоритиму.</span></p>
<p><span id="more-812"></span></p>
<p style="text-align: justify;">Я і подумати не міг, що невеличка пауза в дослідженні около-докерівської тематики так далеко відкине мене від ситуації. Тому знадобилося багато часу, аби скласти всі пазли в одну картину і зрозуміти таки, що відбувається на цьому ринку. Власне, про сам <a href="http://itblogger.org.ua/review/kontejnerna-virtualizatsiya-2-provajdery/">Docker</a> я вже писав і ще писатиму в новому році, але сьогодні мова про трохи вищий рівень абстракції &#8211; платформи для управління розгортанням, підтримки та моніторингу цих самих Docker-контейнерів.</p>
<p style="text-align: justify;">Отже, окрім <a href="http://itblogger.org.ua/review/kontejnerna-virtualizatsiya-3-coreos/">CoreOS</a> на арену вийшли також гіганти дистрибуції linux-based операційних систем &#8211; Ubuntu та RedHat відповідно з проектами Ubuntu Core Snappy та Atomic. Здавалося б, з CoreOS все зрозуміло, але останні рішення щодо зміни стратегії розвитку свого продукту, прийняті в керівництві CoreOS сплутали дуже багато карт. Мова іде про Rocket &#8211; альтернативний до Docker варіант контейнерів.</p>
<p style="text-align: center;"><strong>Rocket</strong></p>
<p style="text-align: center;"><img alt="" src="http://itblogger.org.ua/images/29122014/2.jpg" width="500" height="268" /></p>
<p style="text-align: justify;">Звинувачувати CoreOS складно &#8211; якщо б не вони &#8211; це зробив би хтось інший. Не тільки тому, що всі хочуть на чомусь заробляти. Але тому, що Docker має свої суттєві недоліки і поява продукту, який буде намагатися усунути ці недоліки &#8211; було лише питанням часу. Взяти, хоча б, до уваги той пункт, що всі контейнери Docker централізовано працюють через єдиний демон. Але це помилка концептуальна. Її не поправиш патчем чи оновленням модуля. Переписувати весь проект з нуля?</p>
<p style="text-align: justify;">Отже, CoreOS запустили open-source проект Rocket для менеджменту своїх App Containers (так в CoreOS називають Docker-контейнери). І основна причина такого кроку &#8211; це невідповідність шляху розвитку Docker-контейнерів очікуванням комюніті. Адже замість вдосконалення Docker-а як технології віртуалізації, Docker Inc. почали розробляти інтрументи для розгортання хмарних сервісів, кластерних систем, приватних репозиторіїв контейнерів. І все це зібрано та упаковано в один великий бінарник, який запускається з-під root-користувача&#8230; Погодьтеся &#8211; не надто привабливий програмний дизайн.</p>
<p style="text-align: justify;">Що пропонує Rocket? По більшій мірі все те ж, але&#8230; Всі допоміжні утиліти для збирання, встановлення та шейрінгу контейнерів мусять бути незалежними від системи, хоч і тісно інтегруватися з нею. Разом з тим, протокол дистрибуції контейнерів не має бути при&#8217;язаним до платформи, як це є у випадку Docker. А сам формат контейнерів повинен обговорюватись та змінюватись під впливом ком&#8217;юніті, що дозволить таким чином зійтися на якомусь відкритому стандарті. За рахунок зміни моделі виконання Rocket розділяє архітектуру на етапи конфігурування середовища, файлової системи та, власне запуску застосунку в контейнері. Саме таким шляхом, на думку CEO CoreOS Алекса Полві, мав іти Docker. Але ж якби проблема полягала лише у погодженні цих двох приблуд &#8211; Docker та Rocket&#8230; Після ініціативи CoreOS, про свої наміри відцапати шматочок приватних клаудів на контейнерах заявили і Ubuntu з RedHat.</p>
<p style="text-align: center;"><strong>Ubuntu Core Snappy</strong></p>
<p style="text-align: center;"><img alt="" src="http://itblogger.org.ua/images/29122014/3.png" width="452" height="320" /></p>
<p style="text-align: justify;">За слова Шатлворта (начальник Ubuntu) &#8211; випуск Snappy &#8211; одна з найважливіших подій за 20 років існування Canonical. Ця редакція має дуже полегшене ядро. Власне, таке tiny-ядро існує вже декілька років і знайшло широке використання в embedded-системах. Але ця редакція цілком і повністю оптимізована для запуску Docker-ів та інших контейнерних технологій. Better, quicker, greater. Майже, як в популярній пісні. Core Snappy покликана вирішити, в першу чергу, проблему досттавки та оновлення застосунків в хмару, забезпечуючи належний рівень безпеки цих процесів. Все те ж, що і в CoreOS.</p>
<p style="text-align: justify;">Серед інших особливостей Snappy &#8211; система безпеки AppArmor, яка вперше була представлена з мобільною версією Ubuntu. ОСобливість цієї система &#8211; повна ізольованість застосінків один від одного. Така архітектура забезпечить спокійний сон адміністраторам та девопс-ам, які захочуть встановлювати застосунки з нестабільних віток та неавторизованих джерел.</p>
<p style="text-align: justify;">Якщо ж ваша параноя має левел вище 80-ого, то в ційє ОС ще одна особливість &#8211; транзакційні оновлення. Snappy має новий менеджер пакетів з одноіменною назвою. Тобто, тепер, замість apt-get update ви використовуватимете snappy update, який автоматично робитиме контрольну точку для відновлення при помилковому оновленні чи встановленні окремих пакетів.</p>
<p style="text-align: justify;">Щодо менеджменту контейнерами, то Ubuntu Core Snappy має також свій гіпервізор для контейнерів &#8211; LXD. І з цим вищеперечисленим набором користувачі мають змогу погратися на Microsoft Azure, Amazon EC2 або Google Compute Engine. Digital Ocean поки не підтримує цієї операційної системи, тому я скористався останньою можливою опцією &#8211; запуск образа на локальній машині через KVM. Можливо, коли Snappy набере достатніх оборотів, я присвячу цій платформі трохи більше часу.</p>
<p style="text-align: center;"><strong>Red Hat Atomic</strong></p>
<p style="text-align: center;"><a href="http://itblogger.org.ua/images/29122014/4.png" target="_blank"><img alt="" src="http://itblogger.org.ua/images/29122014/4.png" width="600" height="325" /></a></p>
<p style="text-align: justify;">Покращена продуктивність, масштабованість та безпеки для розгортання та запуску ваших контейнерів &#8211; ось там описують проект Atomic Host в RHEL. Хм&#8230; Вам нічого не нагадує така характеристика продукту?</p>
<p style="text-align: justify;">Як і Snappy, Atomic має оновлену систему управління пакетами, яка заснована на rpm-ostree. За концепцією цієї системи, всі оновлення компонуються в атомарні дерева, які можуть бути завантажені та встановлені &#8220;одним кроком&#8221;. Ця атомарність операції оновлення дозволяє з релгкістю повертати систему в попередній стан при виникненні помилок після оновлення.</p>
<p style="text-align: justify;">А ось з процесом менеджменту контейнерами (модне слово &#8211; orchestration) RHEL теж не відстають. Atomic використовує проект Google &#8211; Kubernetes. Ця система включає інтструменти для горизонтального масштабування, мульти-контейнерне розгортання застосунків і, навіть, організацію багатошарових стеків із взаємопов&#8217;язаних кластерів контейнерів.</p>
<p style="text-align: justify;">Серед інших плюшок &#8211; Cockpit &#8211; новий застосунок для адміністрування серверів через браузер. Серед підтримуваних опцій &#8211; і диски, і сервіси і журнали &#8211; все в браузері. Особлива увага &#8211; функції моніторингу та управління ресурсами контейнерів (процесор, пам&#8217;ять), стартування, зупинка, видалення та оновлення контейнерів.</p>
<p style="text-align: justify;">Як і годиться для Enterprise-продукту, Atomic Host можна розгорнути не лише на Google Cloud Compute Engine чи Amazon EC2, але і на популярному інструменті для створення приватних хмар &#8211; VmWare VSPhere. Само собою, якщо ви звикли до стеку продуктів Red Hat &#8211; то Atomic підтримується і в Red Hat Enterprise Virtualization і Red Hat Enterprise Linux OpenStack Platform.</p>
<p style="text-align: center;"><strong>Що далі?</strong></p>
<p style="text-align: justify;">Підбиваючи підсумки хочеться сказати, що конкуренція &#8211; це завжди добре. Як і співпраця. Тому, надіюся, що розробники CoreOS, Ubuntu Core Snappy та RHEL Atomic Host разом з Docker прийдуть до спільного вирішення проблеми поділу ринку. Адже очевидно, що в 2015-у легкі  атомарні оновлення з дотриманням всіх стандартів безпеки гратимуть дуже важливу роль в розвитку як хмар великих провайдерів, так і приватних інфраструктур, побудованих з використанням переваг контейнерів і Docker-а зокрема.</p>
]]></content:encoded>
			<wfw:commentRss>http://itblogger.org.ua/bytva-za-kontejnery-uchasnyky-ta-perspektyvy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Контейнерна віртуалізація. 3. CoreOS</title>
		<link>http://itblogger.org.ua/kontejnerna-virtualizatsiya-3-coreos/</link>
		<comments>http://itblogger.org.ua/kontejnerna-virtualizatsiya-3-coreos/#comments</comments>
		<pubDate>Mon, 15 Sep 2014 20:53:58 +0000</pubDate>
		<dc:creator><![CDATA[core]]></dc:creator>
				<category><![CDATA[Веб]]></category>
		<category><![CDATA[Віртуалізація]]></category>
		<category><![CDATA[Огляд ПЗ]]></category>
		<category><![CDATA[coreos]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[etcd]]></category>
		<category><![CDATA[fleet]]></category>
		<category><![CDATA[systemd]]></category>
		<category><![CDATA[vagrant]]></category>

		<guid isPermaLink="false">http://itblogger.org.ua/?p=808</guid>
		<description><![CDATA[Всім привіт. Я пам&#8217;ятаю, обіцяв наступним матеріалом писати про системи конфігурацій, але &#8230; Як завжди, але, бо ця тема справді дуже велика. Імовірно, кожному з менеджерів конфігурацій я приділю окремий матеріал. Тож, аби не відходити далеко від каси, сьогодні мова знову ітиме частково про Docker-контейнери і, зокрема, про добре масштабовану, безпечну та автоматизовану платформу для [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><img class="aligncenter" alt="" src="/images/15092014/coreos.jpg" width="361" height="140" /></p>
<p style="text-align: justify;">Всім привіт. Я пам&#8217;ятаю, обіцяв наступним матеріалом писати про системи конфігурацій, але &#8230; Як завжди, але, бо ця тема справді дуже велика. Імовірно, кожному з менеджерів конфігурацій я приділю окремий матеріал. Тож, аби не відходити далеко від каси, сьогодні мова знову ітиме частково про <a href="http://itblogger.org.ua/review/kontejnerna-virtualizatsiya-2-provajdery/" target="_blank">Docker-контейнери</a> і, зокрема, про добре масштабовану, безпечну та автоматизовану платформу для розгортання цих контейнерів.</p>
<p style="text-align: justify;">Немає нічого дивного в тому, що із ростом популярності контейнерної віртуалізації, знайшлися люди, яких не задовільняло використання &#8220;важких&#8221; дистрибутивів Ubuntu Server, CentOS та інших. Використання для означення цих дистрибутивів слова &#8220;важких&#8221; &#8211; це про велику кількість зайвих компонентів та відсутність з коробки потрібних пакетів. Звісно ж, це ніяк не обмежує можливість налаштування і цих платформ як бази для розгортання контейнерів, але це марна трата ресурсів та часу на приведення платформи до потрібного стану.</p>
<p style="text-align: justify;"><span id="more-808"></span><br />
Всі ці проблеми вирішує CoreOS. Це дуже легковісна операційна система (114 MB RAM) на базі ядра Linux, форкнута з ChromeOS. Головна фішка цієї системи &#8211; ізольованість кожного пакету в своєму контейнері. Навіть, не пакету, а, швидше, повноцінних застосунків, адже система не має пакетного менеджера. Кожен процес &#8211; <a href="http://itblogger.org.ua/review/kontejnerna-virtualizatsiya-2-provajdery/" target="_blank">Docker-контейнер</a> як абстракція вищого рівня над LXC, що в свою чергу є абстракцією над низькорівневими cgroups.</p>
<p style="text-align: justify;">Дизайн CoreOS передбачає значне спрощення розгортання вашого застосунку в кластері з контейнерів. Для представлення кластера як розподіленої системи, CoreOS використовує fleet &#8211; компонент, який інтегрує між собою systemd та etcd.</p>
<p><a href="https://coreos.com/assets/images/media/Fleet-Scheduling.png" target="_blank"><img class="aligncenter" alt="" src="https://coreos.com/assets/images/media/Fleet-Scheduling.png" width="580" height="197" /></a></p>
<p style="text-align: justify;">systemd &#8211; досить молода, але, вже зараз одна з найпопулярніших систем ініціалізації та керування статусом запущених в системі сервісів. В рамках CoreOS під процесами ми, фактично, маємо на увазі Docker-контейнери, всередині яких запускаються всі сервіси. Хоча, на низькому рівні це ніяк не змінює факту використання традиційного концепту юнітів та таргетів. Unit &#8211; це опис вашого контейнера, target &#8211; механізм групування різних юнітів одночасно. Вам цей концепт може бути знайомим на прикладі одночасного запуску процесів на різних runlevel-ах.</p>
<p style="text-align: justify;">etcd &#8211; key-value storage, який використовується для збереження та обміну інформацією про сесії, кеш та багато інших параметрів конфігурації контейнерів. etcd встановлений на кожному контейнері. Обмін даними між вузлами здійснюється з допомогою протоколу Raft, а запис читання &#8211; по http/json через мережевий інтерфейс контейнера docker0. Якщо говорити про etcd, то для пояснення доцільності використання цієї key/value бази варто згадати його популярний аналог ZooKeeper від Apache Software Foundation. В чому, власне, особливість цих систем &#8211; їхня строга лінійна впорядкованість. Якщо піти трохи далі &#8211; то згадаємо і CAP-теорему Брюера, згідно якої в системах розподілених обчислень одночасно можливо реалізувати лише дві з трьох властивостей: consistency(у всіх вузлах дані синхронізовані), availability(доступність в будь-який момент часу), partition tolerance(розбивання на ноди не веде до повертання некоректних даних при запиті). В результаті цієї теореми, key/value стореджі розбиваються на три класи: CA, AP та CP.</p>
<p><img class="aligncenter" alt="" src="/images/15092014/1.png" width="565" height="425" /></p>
<p style="text-align: justify;">Отже, etcd відноситься до класу CP, що відповідає ситуації, коли ваша розподілена система не завжди може відповідати на запити, але гарантує строгу консистетність даних на всіх вузлах.</p>
<p><img class="aligncenter" alt="" src="https://coreos.com/assets/images/media/Etcd-Replication.png" width="400" height="299" /></p>
<p style="text-align: justify;">Реалізується ця консистентність протоколом Raft за рахунок вибору master-вузла та розподілених lock-ів. ОСь тут є дуже хороша <a href="https://speakerdeck.com/benbjohnson/raft-the-understandable-distributed-consensus-protocol" target="_blank">презентація по протоколу Raft</a>.</p>
<p style="text-align: justify;">Власне, тут мав іти приклад розгортання якогось кластера на базі CoreOS, але сайт проекту має на стільки хорошу документацію, що не бачу сенсу дублювати інформацію. Так, все вище описане &#8211; теж дублювання, але мета цього разу була інша &#8211; хотів донести до вас інформацію про існування такої штуки. Тим паче, на сьогодні офіційна підтримка CoreOS вже є в Amazon Ec2, Rackspace, Google Compute Engine та моєму улюбленому DigitalOcean. Або ж встановити на голе залізо, чи, навіть завантажитись через PXE. Якщо ж ви бажаєте погратися вже тут і зараз &#8211; опцію розгортання через <a href="http://itblogger.org.ua/review/kontejnerna-virtualizatsiya-1-vagrant/" target="_blank">Vagrant </a>теж ніхто не відміняв. Всього доброго!</p>
]]></content:encoded>
			<wfw:commentRss>http://itblogger.org.ua/kontejnerna-virtualizatsiya-3-coreos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Контейнерна віртуалізація. 2. Провайдери</title>
		<link>http://itblogger.org.ua/kontejnerna-virtualizatsiya-2-provajdery/</link>
		<comments>http://itblogger.org.ua/kontejnerna-virtualizatsiya-2-provajdery/#comments</comments>
		<pubDate>Sun, 13 Jul 2014 14:24:39 +0000</pubDate>
		<dc:creator><![CDATA[core]]></dc:creator>
				<category><![CDATA[Веб]]></category>
		<category><![CDATA[Мережі]]></category>
		<category><![CDATA[Огляд ПЗ]]></category>

		<guid isPermaLink="false">http://itblogger.org.ua/?p=803</guid>
		<description><![CDATA[Аби довго не запрягати з нудними вступами, перейдемо одразу до теми. Отже, минулого разу я пробував трохи розповідати про Vagrant. І зачепив декількома словами провайдерів віртуалізації. Прикладом виступив Virtualbox як базовий провайдер для Vagrant. Сьогодні ж я розповім і про деякі інші методи віртуалізації та провайдери, які допомагають з легкістю піднімати нові віртуальні середовища. Зауважте, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;">Аби довго не запрягати з нудними вступами, перейдемо одразу до теми. Отже, минулого разу я пробував трохи розповідати про Vagrant. І зачепив декількома словами провайдерів віртуалізації. Прикладом виступив Virtualbox як базовий провайдер для Vagrant. Сьогодні ж я розповім і про деякі інші методи віртуалізації та провайдери, які допомагають з легкістю піднімати нові віртуальні середовища. Зауважте, я часто кажу &#8211; віртуальні середовища і це не випадково &#8211; не плутайте VE зі &#8220;справжніми&#8221; віртуалками. Linux Containers &#8211; це ізольовані середовища, які працюють на одному ядрі хостової машини. Власне, хто мав справу із Solaris або FreeBSD &#8211; там є свої аналоги &#8211; Containers та Jails відповідно.</p>
<p><img class="aligncenter" alt="" src="/images/13072014/3.png" width="600" height="332" /></p>
<p style="text-align: justify;">Тобто, перелічена типи віртуалізації використовуються на рівні операційної системи. Якщо вам цікаво спуститися на рівень нижче &#8211; тоді вам до cgroups, на базі яких працює LXC. Ось тут є гарний <a href="http://tech.yandex.ru/education/kit/4/talks/1553/" target="_blank">відеоматеріл</a> з Яндекса по cgroup-ах . Зверніть увагу &#8211; LXC працює лише на хостовій платформі з ОС Linux. Переваги LXC &#8211; як і в будь-якій контейнерній віртуалізації &#8211; швидкість розгортання, нативна швидкодія. Наприклад, розгортання нового віртуального оточення з боксу Vagrant займає близько 30 секунд часу. Перезавантаження &#8211; 10-15 секунд. Щодо недоліків &#8211; то, власне, використання уніфікованого ядра може бути як перевагою так і недоліком.</p>
<p><strong>LXC</strong></p>
<p style="text-align: justify;">Надто багато я розписую. Як каже мій колега &#8211; &#8220;все це можна знайти в інтернеті і нікому непотрібно&#8221;. Стаття не про LXC, а про використання його та інших інструментів із Vagrant. Тому, аби зберегти свій час &#8211; перейду до плагіна.<span id="more-803"></span></p>
<p style="text-align: justify;">Для початку встановимо LXC, якщо ви ще не зробили цього.</p>
<pre class="brush: powershell; title: ; notranslate">sudo apt-get install lxc</pre>
<p style="text-align: justify;">Я міг би запропонувати вам знову ж <a href="http://www.vagrantbox.es/" target="_blank">www.vagrantbox.es</a> для пошуку потрібного нам бокса. Але там більшість боксів для старішої версії LXC. Тому, раджу ресурс <a href="https://vagrantcloud.com" target="_blank">vagrantcloud.com</a>, де можна взяти бокс від автора плагіна vagrant-lxc. Його назва &#8211; fgrehm/raring64-lxc. Створимо новий каталог та ініціалізуємо Vagrant-box:</p>
<pre class="brush: powershell; title: ; notranslate">mkdir test-lxc
 cd text-lxc/
vagrant init fgrehm/precise64-lxc</pre>
<p style="text-align: justify;">Щодо конфігурації Vagrantfile &#8211; то тут все аналогічно, за винятком, що в провайдері поки не працює config.vm.network. Тобто, брідж-мережу зробити вам не вийде. Та і для форвардингу використовується redir, бо реалізація iptables на різних дистрибутивах по-різному не дозволяє використовувати iptables для прокидання портів. Перед підняттям машинки залишається лише встановити плагін vagrant-lxc. Гадаю, ви вже використовуєте Vagrant версії 1.5+, тому встановлення плагіна виглядає трохи незвично:</p>
<pre class="brush: powershell; title: ; notranslate">vagrant plugin install vagrant-lxc --plugin-version 1.0.0.alpha.2</pre>
<p>Ну і, запуск VE:</p>
<pre class="brush: powershell; title: ; notranslate">vagrant up --provider=lxc</pre>
<p style="text-align: justify;">Будьте готові до того, що команда вимагає дуже багато введень пароля на root-доступ. Це пов&#8217;язано з відсутністю підтримки UserNamespaces на рівня ядра. Тому у Vagrant є спеціальна команда: vagrant lxc sudoers, яка створить скрипт із всіма командами, потрібними для роботи плагіна. Зробіть його виконуваним та запустіть &#8211; тепер вам не треба десятки разів вводити пароль.</p>
<pre class="brush: powershell; title: ; notranslate">chmod a+x lxc-sudoers.sh
sudo ./lxc-sudoers.sh</pre>
<p style="text-align: justify;">Перевіряємо через команду &#8220;sudo lxc-list&#8221; аби пересвідчитись, що все працює як треба. До речі, я тут про cgroup-и згадував. Так от, через cgroups можна керувати ресурсами lxc-контейнера прямо з конфігурації Vagrantbox. Наприклад, змінити ліміт оперативки:</p>
<pre class="brush: powershell; title: ; notranslate">Vagrant.configure(&quot;2&quot;) do |config|
 config.vm.box = &quot;precise64-lxc&quot;
 config.vm.provider :lxc do |lxc|
 # Те ж, що і 'customize [&quot;modifyvm&quot;, :id, &quot;--memory&quot;, &quot;1024&quot;]' для VirtualBox
 lxc.customize 'cgroup.memory.limit_in_bytes', '1024M'
 end</pre>
<p style="text-align: justify;">Треба відзначити, що на момент написання цього матеріалу &#8211; lxc-плагін для версії Vagrant 1.5+ працює не надто стабільно, але автор щоденно здійснює комміти на github з виправленням, тому, гадаю, найближчим часом плагін вийде вже у версії beta.</p>
<p><strong>AMAZON AWS</strong></p>
<p style="text-align: justify;">Власне, можна багато говорити про інші провайдери, але суть залишається та ж сама &#8211; шукаєте плагін <a href="https://github.com/mitchellh/vagrant/wiki/Available-Vagrant-Plugins" target="_blank">тут</a> , встановлюєте його через sudo apt-get install %PLUGIN_NAME% і тестуєте. Для вправляння у конфігурації Vagrantfile раджу глянути на libvirt-плагін. Сам по собі libvirt як інструмент керування гіпервізорами має дуже багато налаштувань для роботи з віртуальними ресурсами пам&#8217;яті, диска, процесора, мережі. Тому його конфігурація як провайдера для віртуальних оточень через Vagrant має багато особливостей.  Щодо інших провайдерів&#8230; Тут впевненим на 100% бути складно, адже плагіни розробляються по більшій мірі &#8211; як open-source проекти. Часто оновлюються, вилітають при оновлення версій гіпервізорів, змін в ядрі і т.д. Звісно ж, є комерційні рішення, як от плагін для VMware Fusion та Workstation від Hashi Corp (компанія Хашимото &#8211; автора Vagrant). Але коштують вони 75$ за інстанс Vagrant. Тому, варто поговорити трохи про ті провайдери, які зараз дуже популярні в користувачів та причини цієї популярності.</p>
<p style="text-align: justify;">Мова, звісно ж, іде про хмари та контейнерну віртуалізацію, як наслідок. І тут я пробіжуся по підготовці образів для розгортання в Amazon Web Services та DigitalOcean.</p>
<p><strong>AWS</strong></p>
<p>Встановлюємо плагін:</p>
<pre class="brush: powershell; title: ; notranslate">vagrant plugin install vagrant-aws</pre>
<p>Зверніть увагу, що на цьому етапі &#8211; у вас вже мають бути актуалізовані дані в профілі AWS, зокрема публічні ключі для створення інстансу та доступу по ssh (EC2), та спеціальні ключі від AWS. Додаємо новий бокс (використовується ubuntu від автора плагіна) та ініціалізуємо Vagrantfile:</p>
<pre class="brush: powershell; title: ; notranslate">vagrant box add itblogger-aws https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box
vagrant init itblogger-aws</pre>
<p>Далі відкриваємо в улюбленому редакторі Vagrantfile і додаємо наступний блок конфігурації (ключі, звісно, замінені):</p>
<pre class="brush: powershell; title: ; notranslate">config.vm.provider :aws do |aws, override|
 aws.access_key_id = &quot;ASFHGJGDDFG3Q24YDQ&quot;
 aws.secret_access_key = &quot;M1ByoSDHGJG+9JKiblGFHJSF9Ro8u3tZ&quot;
 aws.keypair_name = &quot;itblogger-aws&quot;

aws.ami = &quot;ami-7747d01e&quot;

 override.ssh.username = &quot;ubuntu&quot;
 override.ssh.private_key_path = &quot;itblogger-aws.pem&quot;

 aws.security_groups = [ 'core_access' ]

 aws.tags = {
 'site' =&gt; 'itblogger.org.ua',
 }
 end</pre>
<p style="text-align: justify;">Ця конфігурація базується на тій, яка приведена на сторінці автора плагіну на github за винятком двох параметрів. Першй з них &#8211; це aws.security_groups. Цей параметр дозволяє встановити параметри безпеки, згідно якими можна обмежити роботу деяких мережевих протоколів. За замовчуванням AWS EC2 має security group з іменем &#8220;default&#8221;, в якій дозволені всі протоколи. І саме цю групу використовує плагін vagrant-aws для підключення до інстансу по ssh після його розгортання. Але після двох спроб розгорнути новий інстанс &#8211; процес зависав на перевірці ssh-підключення для запуску rsync (використовується для шейру локальної директорії з /vagrant директорією інстансу). Як виявилося &#8211; це якийсь баг в плагіні. Інстанси створюються і їх можна бачити в консолі EC2, але локальна консоль висить на перевірці ssh. Треба баг-репорт зробити. Для того, аби виправити цю помилку &#8211; створіть нову security group і через параметр aws.security_groups задайте її у Vagrantfile.</p>
<p style="text-align: justify;"><a href="/images/13072014/1.png" target="_parent"><img alt="" src="/images/13072014/2.png" width="600" height="144" /></a></p>
<p style="text-align: justify;">Другий параметр &#8211; aws.tags ніяк функціонально не впливає на роботу інстансу, але без нього процес розгортання також обривався. Отже, запускаємо:</p>
<pre class="brush: powershell; title: ; notranslate">vagrant up --provider=aws</pre>
<p>Чекаємо хвилинку і отримуємо результат:</p>
<pre class="brush: powershell; title: ; notranslate">==&gt; default: Launching an instance with the following settings...
==&gt; default: -- Type: m1.small
==&gt; default: -- AMI: ami-7747d01e
==&gt; default: -- Region: us-east-1
==&gt; default: -- Keypair: itblogger-aws
==&gt; default: -- Security Groups: [&quot;core_access&quot;]
==&gt; default: -- Block Device Mapping: []
==&gt; default: -- Terminate On Shutdown: false
==&gt; default: -- Monitoring: false
==&gt; default: -- EBS optimized: false
==&gt; default: -- Assigning a public IP address in a VPC: false
==&gt; default: Waiting for instance to become &quot;ready&quot;...
==&gt; default: Waiting for SSH to become available...
==&gt; default: Machine is booted and ready for use!
==&gt; default: Rsyncing folder: /home/core/Dropbox/Projects/DevOps/Vagrant/itblogger-aws/ =&gt; /vagrant</pre>
<p>Перевіряємо статус:</p>
<pre class="brush: powershell; title: ; notranslate">vagrant box list
fgrehm/precise64-lxc (lxc, 1.1.0)
itblogger-aws (aws, 0)</pre>
<p>В EC2 консолі:</p>
<p><a href="/images/13072014/1.png" target="_parent"><img alt="" src="/images/13072014/1.png" width="600" height="155" /></a></p>
<p style="text-align: justify;">Чудово. Отже, для розгортання ваших боксів плагін чудово підійде. Щодо налаштування інстансу &#8211; інтеграція з Chef через ssh-сесію також працює без проблем. Але до цього питання ми ще повернемося, коли говоритимемо про систему управління конфігураціями.</p>
<p><strong>Ліричний відступ</strong></p>
<p style="text-align: justify;">Протягом цих розгортань готових боксів &#8211; у вас могло виникнути логічне питання &#8211; а як же свій приготувати? Про це я розповім пізніше, але якщо ви хочете почати створювати власні бокси вже зараз &#8211; інструмент Packer від автора Vagrant &#8211; те, що вам потрібно. Він дозволяє готувати і Docker-образи, і AMI для AMS і багато-багато іншого.</p>
<p><strong>DIGITALOCEAN</strong></p>
<p style="text-align: justify;">DigitalOcean &#8211; Мій улюблений VPS провайдер. Завдяки низьким цінам (5$ за місяць за інстанс з 512Ram та 2GB диску) та хорошій швидкодії завдяки SSD-дискам &#8211; популярність цього сервісу росте шаленими темпами, незважаючи на суттєві проблеми із стабільністю роботи зон. Але, на жаль, саме зараз, тимчасово, можливості ппрацювати з DigitalOcean у Vagrant немає, оскільки перші оновили API до версії 2.0 і авторизація тепер працює на токенах (oAuth), а от плагін досі використовує API версії 1.0, який для авторизації використовував cliend_id та private_key параметри, що тепер недоступні. Автор вже працює над оновленням плагіну, але термінів реалізації поки немає. Деталі <a href="https://github.com/smdahlen/vagrant-digitalocean" target="_blank">тут</a> .</p>
<p><strong>DOCKER</strong></p>
<p style="text-align: justify;">Переходимо до останнього розділу. Імовірно, Docker заслуговує окремого матеріалу, але &#8230; Чесно сказати, я не розділяю всього цього шуму навколо чергових Linux-контейнерів. Взагалі, як було відзначено раніше, популяризація хмар &#8211; одна з основних причин розростання моди на контейнери. Але у випадку з Docker &#8211; тут є ще деякі фактори, які можна виділити в процесі стрімкого зростання кількості згадувань його в мережі. Зокрема, це використання LXC як низькорівневої віртуалізації, для якої Docker &#8211; лише вищий рівень абстракції, що дуже спрощує ізоляцію процесів та їхню роботу з пам&#8217;яттю, процесором та диском. Ще один плюс в сторону &#8220;модності&#8221; &#8211; Docker написаний на Go, що за швидкодією рівняється до нативних програм, написаних на С, але без проблем контролю пам&#8217;яті (за рахунок вбудованого garbage collector-а). Ну і ще один, не менш важливий пункт, який ми поки не можемо оцінити по достоїнству &#8211; інтеграція із системами контролю конфігурацій &#8211; Puppet, Salt, Chef, Ansiblе. І, щоб ви не думали, що Docker це якась хіпстерська фігня &#8211; підтримка цих контейнерів вже є і в Amazon, і в Rackspace, і в Microsoft Azure, і в IBM SoftLayer, і в <a href="https://developers.google.com/compute/docs/containers">Google Compute Engine</a>.</p>
<p style="text-align: justify;">За час тестування Docker-а &#8211; у всяких мануалах я зустрічав багато різних тверджень про Docker, які не мають нічого спільного з реальністю. Тому, перед тим, як перейти до вирішення якоїсь реальної задачі, декілька слів про за і проти.<br />
Чим Docker може бути?<br />
1. Інструмент доставки та розгортання образів (distribution &amp; deploy) завдяки тісній інтеграцій ї менеджерами конфігурацій.<br />
2. Менеджер віртуальної інфраструктури. Це зараз Docker &#8211; надбудова на Linux Containers. Але ніхто не відкидає імовірність появи таких же надбудов над KVM чи Hyper-V.<br />
3. Віртуальна лабораторія з можливістю трекінгу різних версій вашого ПЗ (саме ПЗ, а не коду). Docker використовує btrfs (copy-on-write filesystem), що дозволяє відслідковувати зміни в образах через diff-like команди (чи, як в git status, якщо вам така аналогія рідніша).</p>
<p style="text-align: justify;">Підсумовуючи &#8211; мені подобається аналогія Docker-а з мовою програмування Java. Write once &#8211; run everywhere. Теж саме і тут &#8211; сконфігуруй раз &#8211; і запускай будь-те із впевненістю, що працюватиме ваш контейнер так само. Звісно, enterprise-девелопери заперечать мені, натякаючи на мільйони залежностей від баз даних/черг/балансерів і т.д. Але це все питання рівності рук і бажання автоматизувати рутину. І лише на 20% &#8211; готовності продукту до впровадження в production-системи.</p>
<p style="text-align: justify;">А тепер &#8211; про реальні задачі. Встановлення Docker описано <a href="https://docs.docker.com/installation" target="_blank">тут</a>  для різних платформ. Є два шляхи підняття VE -на базі власноруч написаного Dockerfile, або ж із використанням готового образу, взятого з <a href="https://registry.hub.docker.com/" target="_blank">Docker Index</a>. (аналог Amazon AMI Mаrketplace). Другий варіант чудово працює для запуску VE одразу через docker, але з vagrant такий метод вимагає використання великої кількості додаткових команд у Vagrantfile. Тому зручніше використовувати директиву build_dir = &#8220;. &#8221; та Dockerfile (інтерактивний туторіал &#8211; <a href="http://www.docker.com/tryit/" target="_blank">hwww.docker.com/tryit</a>.</p>
<p style="text-align: justify;">Ця тема присвячена провайдерам, але, оскільки зараз в мене є доступ лише до ОС Windows як host-системи, то я використовуватиму Docker як provisioner. Воно і добре &#8211; буде легенький вступ до наступного матеріалу. Тим більше, рідко хто використовує Docker саме як provider, а не provisioner. В чому різниця? Provider здійснює запуск готового образу, provisioner &#8211; виконує набір команд для налаштування вашого контейнера. Наприклад, автоматичне оновлення при запуску. Про provisioning ми поговоримо детально в наступному матеріалі, а для прикладу зараз я використаю Docker в якості provisioner-а для контейнера, запущеного через Vagrant з допомогою провайдера Virtualbox.</p>
<p>Наприклад, для запуску nginx-сервера. Vagrantfile:</p>
<pre class="brush: powershell; title: ; notranslate">VAGRANTFILE_API_VERSION = &quot;2&quot;

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
 # All Vagrant configuration is done here. The most common configuration
 # options are documented and commented below. For a complete reference,
 # please see the online documentation at vagrantup.com.

# Every Vagrant virtual environment requires a box to build off of.
 config.vm.box = &quot;docker&quot;
 config.vm.box_url = &quot;https://oss-binaries.phusionpassenger.com/vagrant/boxes/latest/ubuntu-14.04-amd64-vbox.box&quot;

#provision починається після старту віртуальної машин.
 #Тут - на основі Dockerfile виконується збирання образу і потім його запуск.
 config.vm.provision &quot;docker&quot; do |docker|
 docker.build_image &quot;/vagrant/nginx&quot;, args: &quot;-t nginx&quot;
 docker.run &quot;nginx&quot;
 end

#Прокидання портів до контейнера
 config.vm.network &quot;forwarded_port&quot;, guest: 80, host: 80
 config.vm.network &quot;forwarded_port&quot;, guest: 443, host: 443
 end</pre>
<p>Dockerfile, на основі якого відбувається збирання контейнера взятий <a href="https://github.com/dockerfile/nginx/blob/master/Dockerfile" target="_blank">тут</a> . Його потрібно покласти в папку nginx(як вказано у конфігурації вище):</p>
<pre class="brush: powershell; title: ; notranslate">
#
# Nginx Dockerfile
#
# https://github.com/dockerfile/nginx
#

# Pull base image.
FROM dockerfile/ubuntu

# Install Nginx.
RUN \
 add-apt-repository -y ppa:nginx/stable &amp;&amp; \
 apt-get update &amp;&amp; \
 apt-get install -y nginx &amp;&amp; \
 echo &quot;\ndaemon off;&quot; &gt;&gt; /etc/nginx/nginx.conf &amp;&amp; \
 chown -R www-data:www-data /var/lib/nginx

# Define mountable directories.
VOLUME [&quot;/data&quot;, &quot;/etc/nginx/sites-enabled&quot;, &quot;/var/log/nginx&quot;]

# Define working directory.
WORKDIR /etc/nginx

# Define default command.
CMD [&quot;nginx&quot;]

# Expose ports.
EXPOSE 80
EXPOSE 443</pre>
<p style="text-align: justify;">Оскільки я додавав блок provisioning вже після створення віртуалки, то для його застосування потрібно перезавантажити virtualbox-машину та явно вказати директиву provision: vagrant reload &#8211;provision:<br />
Результат:</p>
<pre class="brush: powershell; title: ; notranslate">==&gt; default: Attempting graceful shutdown of VM...
==&gt; default: Clearing any previously set forwarded ports...
==&gt; default: Clearing any previously set network interfaces...
==&gt; default: Preparing network interfaces based on configuration...
 default: Adapter 1: nat
==&gt; default: You are trying to forward to privileged ports (ports &lt;= 1024). Most ==&gt; default: operating systems restrict this to only privileged process (typical
ly
==&gt; default: processes running as an administrative user). This is a warning in
case
==&gt; default: the port forwarding doesn't work. If any problems occur, please try
==&gt; default: port higher than 1024.
==&gt; default: Forwarding ports...
 default: 80 =&gt; 80 (adapter 1)
 default: 443 =&gt; 443 (adapter 1)
 default: 22 =&gt; 2222 (adapter 1)
==&gt; default: Booting VM...
==&gt; default: Waiting for machine to boot. This may take a few minutes...
 default: SSH address: 127.0.0.1:2222
 default: SSH username: vagrant
 default: SSH auth method: private key
 default: Warning: Connection timeout. Retrying...
==&gt; default: Machine booted and ready!
==&gt; default: Checking for guest additions in VM...
==&gt; default: Mounting shared folders...
 default: /vagrant =&gt; E:/dropbox/Dropbox/Projects/DevOps/Vagrant/docker
==&gt; default: Running provisioner: docker...
 default: Installing Docker (latest) onto machine...
 default: Configuring Docker to autostart containers...
==&gt; default: Building Docker images...
==&gt; default: -- Path: /vagrant/nginx
==&gt; default: Starting Docker containers...
==&gt; default: -- Container: nginx</pre>
<p style="text-align: justify;">Аби пересвічитись, що все пройшло як треба, зайдемо через ssh в наш box і перевіримо статус контейнера:</p>
<pre class="brush: powershell; title: ; notranslate">
vagrant@ubuntu-14:~$ docker ps
CONTAINERID  IMAGE        COMMAND CREATED     STATUS         PORTS            NAMES
f64399f09210 nginx:latest nginx 56 seconds ago Up 55 seconds 443/tcp, 80/tcp nginx</pre>
<p style="text-align: justify;">Що ж, здається, все пройшло як треба. Щодо можливостей конфігруації в Dockerfile, то в наступному матеріалі я візьму якийсь ширший приклад із, скажімо, налаштуванням лінкування між контейнерами. Ну і в сторону більш складних систем конфігурацій гляну. А на сьогодні це все. Миру вам.</p>
]]></content:encoded>
			<wfw:commentRss>http://itblogger.org.ua/kontejnerna-virtualizatsiya-2-provajdery/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Контейнерна віртуалізація. 1. Vagrant</title>
		<link>http://itblogger.org.ua/kontejnerna-virtualizatsiya-1-vagrant/</link>
		<comments>http://itblogger.org.ua/kontejnerna-virtualizatsiya-1-vagrant/#comments</comments>
		<pubDate>Wed, 18 Jun 2014 20:46:40 +0000</pubDate>
		<dc:creator><![CDATA[core]]></dc:creator>
				<category><![CDATA[Веб]]></category>
		<category><![CDATA[Мережі]]></category>
		<category><![CDATA[Огляд ПЗ]]></category>

		<guid isPermaLink="false">http://itblogger.org.ua/?p=796</guid>
		<description><![CDATA[Привіт піпли. Від часу останнього матеріалу пройшло не так багато часу, але я вирішив не затягувати з оновленнями ще на декілька місяців. Як це часто буває, в процесі планування допису накопичилося дуже багато інформації, в результаті чого довелося трохи переформатувати початковий зміст. Як я і обіцяв у матеріалі про PaaS від IBM &#8211; Bluemix, наступною [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><img class="aligncenter" alt="" src="/images/18062014/2.png" width="590" height="162" /></p>
<p style="text-align: justify;">Привіт піпли. Від часу останнього матеріалу пройшло не так багато часу, але я вирішив не затягувати з оновленнями ще на декілька місяців. Як це часто буває, в процесі планування допису накопичилося дуже багато інформації, в результаті чого довелося трохи переформатувати початковий зміст. Як я і обіцяв у матеріалі про <a href="http://itblogger.org.ua/review/paas-ibm-bluemix/">PaaS від IBM &#8211; Bluemix</a>, наступною цілюю буде організація контейнерної віртуалізації без послуг хостера. Але це надто обширна тема, аби писати про неї одним дописом, тому я вирішив трохи розширити список технологій та продуктів для огляду, додавши сюди інші популярні провайдери VE (virtual environment), системи конфігурацій та менеджери віртуальних оточень. Аби тримати віртуальну лабораторію в порядку і не мусорити &#8211; почну саме з менеджера віртуальних оточень.</p>
<p style="text-align: justify;">Для чого вам це? Логічне питання, яке постає перед використанням будь-яких технологій, що замінюють вже звичні процедури: відкрити Virtualbox, створити віртуалку, задати мільйон параметрів, змонтувати образ, встановити систему, налаштувати мережу і т.д. Так от, Vagrant цей процес дуже спрощує, замінюючи вищеописаний процес &#8211; одним box-файлом. Ну і, Virtualbox &#8211; це ж лише погратися, для тестів. А якщо, коли ми готуємо ПЗ для розгортання на якийсь продакшн з KVM, openvz чи Xen? Про це далі.</p>
<p><span id="more-796"></span></p>
<p style="text-align: justify;">Рік тому, коли я краєм ока оглядав Vagrant &#8211; це був лише wrapper (обгортка) для VirtualBox-інстансів віртуальних машин. Але з часом комюніті активно почало дописувати свої плагіни для інших провайдерів віртуальних середовищ, тим самим популяризуючи Vagrant як передову систему менеджменту віртуальних оточень дла тестування та розгортання ПЗ. Особливу роль тут відіграли підтримка популярного в корпоративному сегменті VMWare та, Amazon AWS, послугами якого користуються більшість сучасних технологічних стартапів.</p>
<p style="text-align: justify;">Наперед мушу вибачитись, якщо девелоперам не сподобається мій виклад матеріалу. Я розглядатиму всі інструменти як operations engineer (devops), тому, імовірно, деякі пункти можу пропустити. Отже, для початку поділимо все вище-перелічене на три категорії: Management, Providing і Provisioning. В такому ж порядку ітимуть і статті. Так от Management(управління) &#8211; це Vagrant, Providing (забезпечення, надання) &#8211; це VMWare VSphere, AWS, Virtualbox, Docker, Azure, DigitalOcean, KVM, libvirt, LXC, Rackspace, Hyper-V, OpenStack, Proxmox, Openvz та інші. Тобто, це технології віртуалізації або ж побудовані на їх основі інструменти розгортання нових інстансів віртуальних оточень. Ну і Provisioning &#8211; не впевнений, що переклад &#8220;постачання&#8221; підходить, але якщо вже так &#8211; тоді це постачання конфігурацій. Тобто, логіка описаного стеку наступна: менеджер Vagrant через одного з провайдерів створює новий VE (virtual environment) та, користуючись однією, або і декількома, системами конфігурацій(етап provisioning) &#8211; перевіряє стан віртуального оточення на відповідність до описаної конфігурації (cookbook в Chef, модулі в Puppet, playbook в Ansible чи state в Salt).</p>
<p style="text-align: justify;">Ок, описувати процес інсталяції, звісно ж, не буду. Але що вам зараз треба зробити &#8211; так це піти і завантажити Vagrant віддповідно до вашої ОС. Зараз я використовую Vagrant на Windows 8 x64, хоча, надалі будуть приклади і на ОС з ядром Linux, тому, підготуйте і віртуалочку, якщо під рукою такої ОС немає. Ну і провайдер, за замовчуванням це Virtualbox, встановіть. Готово? Стартуємо cmd, створюємо новий каталог та ініціалізуємо новий box:</p>
<pre class="brush: powershell; title: ; notranslate">
vagrant init
</pre>
<p style="text-align: justify;">Ця команда генерує типовий конфігураційний файл Vagrantfile. Цей файл визначає всі необхідні параметри бокса (box &#8211; формат об&#8217;єкта, з яким працює Vagrant): ім&#8217;я базового образу, прокидувані порти, папки для синхронізації та інше. Про параметри Vagrantfile ми ще поговоримо пізніше.</p>
<p style="text-align: justify;">Для створення нової віртуальної машини використовуються так звані base boxes. Зазвичай, це образ із мінімальним набором конфігурацій та ПЗ, якого достатньо для комунікації із системою. Подальше розгортання конфігурацій та програмного забезпечення покладається на provisioning-систему. Дуже зручний сайт для вибору базового образу &#8211; <a href="https://www.vagrantbox.es">http://www.vagrantbox.es</a>. Як бачите, окрім чистих систем на зразок Ubuntu precise 32 VirtualBox, на сайті розміщені і готові користувацькі образи із сконфігурованими provisioning-системами, чи LAMP-стеком, чи MEAN-стеком, системами моніторингу та ін. Звісно ж, ніхто не заважає вам у базовому образі тримати налаштовану конфігурацію і починати розгортання віртуального оточення вже із підготовленим ПЗ. Але тут ідея в тому, що конфігурація provisioning-системи значно менша, за образ, відповідно розливати нові конфігурації того ж Puppet-а чи Chef-а &#8211; менш-затратно по ресурсах, ніж розливати оновлені образи.</p>
<p style="text-align: justify;">Отже, обрали базовий бокс &#8211; Ubuntu precise 64 VirtualBox &#8211; копіюємо (посилання із сайту www.vagrantbox.es) посилання і в консолі фігачимо:</p>
<pre class="brush: powershell; title: ; notranslate">
vagrant box add base http://files.vagrantup.com/precise64.box
</pre>
<p>&nbsp;</p>
<pre class="brush: powershell; title: ; notranslate">
==&gt; box: Adding box 'base' (v0) for provider:
    box: Downloading: http://files.vagrantup.com/precise64.box
    box: Progress: 100% (Rate: 1959k/s, Estimated time remaining: --:--:--)
==&gt; box: Successfully added box 'base' (v0) for 'virtualbox'!
</pre>
<p style="text-align: justify;">Спостерігаємо за процесом завантаження, допиваємо каву і стартуємо, нарешті, нашу машинку:</p>
<pre class="brush: powershell; title: ; notranslate">
vagrant up
</pre>
<p style="text-align: justify;">Повертаємося до Virtualbox-а &#8211; і бачимо нашу машинку вже в запущеному стані.</p>
<p style="text-align: justify;"><img class="aligncenter" alt="" src="/images/18062014/1.jpg" width="580" height="434" /></p>
<p style="text-align: justify;">Ще один метод перевірки &#8211; <em>vagrant status</em>:</p>
<pre class="brush: powershell; title: ; notranslate">
Current machine states:
default                   running (virtualbox)
</pre>
<p style="text-align: justify;">З Virtualbox ніяких проблем виникати і не мало. Тепер, як я і обіцяв, повернемося до вмісту Vagrantfile. Це написана на Ruby конфігруація нашого VE, тому будьте обережні, аби не поламати синтаксис. За замовчуванням &#8211; більшість параметрів закоментовані. Серед того, що не закоментовано:</p>
<ul style="text-align: justify;">
<li>VAGRANTFILE_API_VERSION = &#8220;2&#8221; &#8211; для нас це не надто актуально, адже параметр був введений для міграції з версії 1.1 до 2.0.</li>
<li>config.vm.box = &#8220;base&#8221; &#8211; тут вказано ім&#8217;я базового боксу, який використовуватиметься для запуску віртуального оточення. Оскільки проект був ініціалізований без імені, то за замовчуванням в ім&#8217;я записується <em>base</em>, для якого ми наступною командою вказали адресу боксу. Цей процес можна дещо автоматизувати, вказавши адресу образу в параметрі <em>config.vm.box_url</em>. Цей параметр також називаютьсь fallback url і, зазвичай, він використовується при шейрінгу вашого боксу. Тобто, ви забиваєте fallback url з адресою вашого боксу в конфіг і тоді просто віддаєте конфіг файл Vagrantfile, з яким ваші колеги набравши vagrant init &amp;&amp; vagrant up розгорнуть та запустять копію вашого інстансу.</li>
</ul>
<p style="text-align: justify;">Отже, наше середовище запущено, але як же з ним комунікувати? Якщо ви вже пробували запустити новий проект через Vagrant, то могли помітити, що під час стартування віртуалки логер видає такі рядки:</p>
<pre class="brush: powershell; title: ; notranslate">
==&gt; default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==&gt; default: Forwarding ports...
    default: 22 =&gt; 2222 (adapter 1)
</pre>
<p style="text-align: justify;">Отже, мережа за замовчуванням прокинута через NAT і налаштований форвард порта для встановлення ssh сесії. Тому до віртуального середовища можна підключитися як через ssh на порт 2222 мережевого інтерфейсу host-системи, або ж через команду &#8220;vagrant ssh&#8221; в директорії проекту. Звісно ж, окрім параметрів за замовчуванням &#8211; у Vagrantfile можна налаштувати прокидання й інших портів. Зокрема, для веб-проектів це може бути http порт 80. Це робить через відповідний запис в конфігурації:</p>
<pre class="brush: powershell; title: ; notranslate">
config.vm.network &quot;forwarded_port&quot;, guest: 80, host: 8080
</pre>
<p style="text-align: justify;">Ви можете і не прокидати портів, замінивши використання NAT на public(bridged) network:</p>
<pre class="brush: powershell; title: ; notranslate">
config.vm.network &quot;public_network&quot;
</pre>
<p style="text-align: justify;">або через private network:</p>
<pre class="brush: powershell; title: ; notranslate">
config.vm.network :private_network, ip: &quot;192.168.1.100&quot;.
</pre>
<p style="text-align: justify;">Ну і останнє, що може ваш зацікавити &#8211; це шейр директорій. Як і у випадку з SSH, за замовчуванням кореневий каталог проекту на host-системі синхронізується із каталогом /vagrant в корені гостьової системи. Через Vagrantfile можна додати й інші папки для снхронізації:</p>
<pre class="brush: powershell; title: ; notranslate">
config.vm.synced_folder &quot;../data&quot;, &quot;/vagrant_data&quot;
</pre>
<p style="text-align: justify;">де &#8220;../data&#8221; відповідно директорія host-системи, &#8220;/vagrant_data&#8221; &#8211; директорія guest-системи. Серед іншого &#8211; підтримка nfs.</p>
<p style="text-align: justify;">Гадаю, на цьому місці ми зупинемося. Зберігаючи логічну послідовність &#8211; більш цікаві провайдери, на зразок Docker LXC та KVM &#8211; залишимо для наступного матеріалу. Ніби все, якщо забув щось &#8211; коментарі внизу.</p>
]]></content:encoded>
			<wfw:commentRss>http://itblogger.org.ua/kontejnerna-virtualizatsiya-1-vagrant/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PaaS IBM Bluemix &#8211; новий гравець на ринку?</title>
		<link>http://itblogger.org.ua/paas-ibm-bluemix/</link>
		<comments>http://itblogger.org.ua/paas-ibm-bluemix/#comments</comments>
		<pubDate>Mon, 09 Jun 2014 19:07:19 +0000</pubDate>
		<dc:creator><![CDATA[core]]></dc:creator>
				<category><![CDATA[Веб]]></category>
		<category><![CDATA[Огляд ПЗ]]></category>
		<category><![CDATA[bluemix]]></category>
		<category><![CDATA[environment]]></category>
		<category><![CDATA[ibm]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[node]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[scalability]]></category>
		<category><![CDATA[virtual]]></category>

		<guid isPermaLink="false">http://itblogger.org.ua/?p=785</guid>
		<description><![CDATA[Привіт піпли. Так, це таки сталося. Я всівся, нарешті, у крісло і вирішив зробити допис до цього блогу. Останні місяці якось все було складно із справами в глобальному оточенні, тому і не до писанини було. Та і зараз все не набагато краще. Ситуація не виглядає такою, яка вирішиться в короткій перспективі, тому спробую трохи відволіктись [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;">Привіт піпли. Так, це таки сталося. Я всівся, нарешті, у крісло і вирішив зробити допис до цього блогу. Останні місяці якось все було складно із справами в глобальному оточенні, тому і не до писанини було. Та і зараз все не набагато краще. Ситуація не виглядає такою, яка вирішиться в короткій перспективі, тому спробую трохи відволіктись і розповісти вам про одного з &#8220;новачків&#8221; на ринку клауд-платформ &#8211; Bluemix від IBM.</p>
<p style="text-align: justify;">Чому я взяв новачок у лапки? Ну, називати ІТ-гіганта IBM новачком хоч у чомусь &#8211; досить складно. Звісно, раніше це були суто внутрішні сервіси, але минулого року IBM придбали IAAS (infrastructure as a service) компанії SoftLayer і почали просуватися в напрямку до користувача. Та все ж,серед PааS (platform as a service) IBM &#8211; не конкурент іменитим Amazon AWS, Microsoft Azure чи Google App Engine. Навіть, опустимося нижче, де є Cloud Foundry від VMWare; Heroku, який починав як популярна хост-платформа для Ruby-додатків, але потім додав і Node.js, Scala, Closure, Python та інші; OpenShift від RedHat; і, навіть, мій улюблений Digital Ocean, який позиціонує себе як VPS, в першу чергу, але пропонує і автоматичне розгортання сервісів: MEAN (популярний стек із Mongo, Express, Angular, Node.js), традиційний LAMP, Django-фреймворк для Python, блогова платформа WordPress, Ruby on Rails, Docker чи менеджер проектів Redmine. Отже, знову, чому ж IBM? Справа в тому, що я вже от два роки маю практики роботи з таким продуктом від IBM як Domino і кожного дня доводиться чути багато поганих слів про цю платформу. Та і сам я не часто щось хороше про неї говорю. Після втрати IBM позицій на hardware-ринку серверного обладнання, хочеться вірити, що IBM, окрім потужної дослідницької команди, може робити якісний продукт у сфері хмарних обчислень.</p>
<p><span id="more-785"></span></p>
<p style="text-align: justify;">IBM Bluemix знаходиться у стадії бета-тестування, але каталог додатків та сервісів вже містить досить широкий набір шаблонів, підготовлених як розробниками IBM, так і написаних членами комюніті. Ось так виглядає панель користувача Bluemix:</p>
<p><a href="/images/09062014/1.png" target="_blank"><img class="aligncenter" alt="" src="/images/09062014/1.png" width="640" height="582" /></a></p>
<p style="text-align: justify;">Досить приємно, хоча, і з великою кількістю порожніх місць, які в майбутньому будуть заповнені нашими додатками чи сервісами. Окрім цих опцій, Bluemix також пропонує add-ons (додатки) до сервісів та застосунків. Каталог шаблонів розбитий за функціональним принципом і містить аж 8 розділів. Розглянемо коротенько кожен із цих розділів:</p>
<p style="text-align: justify;">1. Boilerplates (комплексні рішення) &#8211; це наймасштабніші темплейти на Bluemix, які включають в себе декілька окремих рішень, вже сконфігурованих для використання &#8220;з коробки&#8221;. Власне, ці рішення &#8211; це просто runtime+db. Тому, якщо якась із цих складових у вас вже є &#8211; ви можете скористатися  одним з окреми обраних хмарних сервісів.</p>
<p><a href="/images/09062014/2.png" target="_blank"><img class="aligncenter" alt="" src="/images/09062014/2.png" width="640" height="122" /></a></p>
<p style="text-align: justify; padding-left: 30px;">1.1 Internet of Things &#8211; це тестовий набір для демонстрації платформи Bluemix, який включає в себе Node-Red (візуальний інструмент для побудови архітектури вашого застосунку. ), TimeSeriesDatabase та API<br />
1.2 Java Web Starter &#8211; WebSphere Liberty java web-server + DataCache (покращення продуктивності баз даних, які лежать на повільних дисках).<br />
1.3 Mobile Cloud &#8211; Node.js runtime + MAS (Mobile Application Security) + Push (для iOS та Android) + Mobile Data (scalable та managed DB сервіс)<br />
1.4 Node.js web-starter &#8211; runtime + DataCache<br />
1.5 Java + DB web-starter &#8211; runtime + SQL DB сервіс.</p>
<p style="text-align: justify;">2. Runtimes &#8211; як ви вже зрозуміли, з попереднього розділу &#8211; IBM додала підтримку Java та Javasxript рантаймів з коробки. А от комюніті вже додали Rails та Sinatra оточення. Дивно, досі немає пітонівських Django та Flask. Дрімає комюніті пітоністів.</p>
<p><a href="/images/09062014/3.png" target="_blank"><img class="aligncenter" alt="" src="/images/09062014/3.png" width="640" height="125" /></a></p>
<p style="text-align: justify;">3. Add-Ons &#8211; доповнення до існуючих сервісів для управління та моніторингу.</p>
<p style="text-align: justify; padding-left: 30px;">3.1 Auto-Scaling &#8211; автоматичне розгортання новий інстансів для масштабування проекту при зростанні навантаження.<br />
3.2 CloudIntegration &#8211; API для інтеграції вашої clоud-based з іншими системами.<br />
3.3 Monitoring and Analytics &#8211; власне, моніторинг та аналітика доступності вашого сервісу, навантаження та ін.<br />
3.4 RapidApps &#8211; візуальний білдер застосунків.</p>
<p style="text-align: justify;">4. Web and Application &#8211; ІМХО, найцікавіший розділ. Поясню чому &#8211; всі описані вище темплейти орієнтовані на комплексне розгортання на платформі Bluemix. Звісно, це хороше рішення, тримати все у хмарі. Але, якщо, скажімо, якісь security policy вимагають від вас утримання даних на своїх серверах, а от масштабування веб-додатку вимагає розгортання в хмарі &#8211; ви можете скористатися якимось окремими сервісами, як от runtime та AMQP меседжинг-сервіс (RabbitMQ, ElasticMQ, наприклад). Окрім згаданих меседж-сервісів, тут вам і сервіс аналізу логів, і Rules-сервіс для закладання бізнес-логіки застосунків, SessionCache для зберігання інформації про сесії користувачів, MemCached та Redis сховища даних, email-сервіс SendGrid, Twilio для збірки додатків з VoIP та чат-системою для вашого веб- чи мобільного застосунку.</p>
<p><a href="/images/09062014/4.png"><img class="aligncenter" alt="" src="/images/09062014/4.png" width="640" height="483" /></a></p>
<p style="text-align: justify;">5. Mobile &#8211; компоненти цієї категорії загадні вище, тому зупинятися детальніше не буду.</p>
<p style="text-align: justify;">6. Data Management &#8211; типові DBaaS (distributed database as a service) &#8211; Cloudant JSONDB, SQLDB (DB2), ClearDB Mysql, ElephantSQL (Postgre SQL) та, реалізовані комюніті, MongoDB, mysql та postgresql. На всі смаки.</p>
<p><a href="/images/09062014/5.png" target="_blank"><img class="aligncenter" alt="" src="/images/09062014/5.png" width="640" height="287" /></a></p>
<p style="text-align: justify;">7. Big Data &#8211; робота з великими об&#8217;ємами даних, для яких серед невідомих мені спеціалізованих рішень IBM є і традиційний Map/Reduce сервіс на базі Hadoop.</p>
<p><a href="/images/09062014/6.png" target="_blank"><img class="aligncenter" alt="" src="/images/09062014/6.png" width="640" height="173" /></a><br />
8. DevOps &#8211; сервіси для інженерів вашого стеку у хмарі. Тут і Git, і Web IDE, інтеграція з Eclipse та Visual Studio, load-тестування для перевірки стійкості вашого сервісу до навантаження.</p>
<p><a href="/images/09062014/7.png" target="_blank"><img class="aligncenter" alt="" src="/images/09062014/7.png" width="640" height="137" /></a></p>
<p style="text-align: justify;">Весь цей був би непотрібним, навіть, для мене, не кажу вже про можливих читачів (хоч хтось?), якби я не спробував запустити якийсь демо проект для наглядності. Звісно, в мене немає, ніяких застосунків, які потребують масштабування у хмарі, тому я розгорну якийсь демо-проект.</p>
<p style="text-align: justify;">Ось я за хвилинку накидав: веб-сервер на базі Node.js, який буде запускати наш застосунок, а, отже, розміщується в розділі APPS. Також я додав сервіс MongoDB, який в один клік кріпиться до нашого Node.js рантайму, DevOps сервіс, доповнення поніторингу та аналізу (меню Add-Ons зліва), сервіс автоматичного масштабування та незалежний сервіс Load Impact. Після додавання нового сервісу &#8211; віртуальне оточення потрібно перезавантажити, аби Manifest-конфігурація із внесеними поправками була зчитана повторно.  Сервіси дуже просто прикліплювати до вашого проекту:</p>
<p><img class="aligncenter" alt="" src="/images/09062014/8.png" width="577" height="263" /></p>
<p style="text-align: justify;">В панелі керування можна бачити кількість запущених сервісів, використовувану пам&#8217;ять та доступність ваших застосунків.</p>
<p><a href="/images/09062014/9.png" target="_blank"><img class="aligncenter" alt="" src="/images/09062014/9.png" width="640" height="404" /></a></p>
<p style="text-align: justify;">Після запуску застосунку &#8211; він одразу доступний за адресою в домені, наданим системою. Звісно ж, передбачена можливість прикріплення свого доменного імені.</p>
<p style="text-align: justify;">Всі сервіси конфігуруються через Manifest-файл з json-форматом конфігурацій, який містить багато системних змінних, як от, наприклад,  VCAP_SERVICES, де зберігається інформація про прикліплені сервіси. Доступні також User-Defined змінні оточення для задавання змінних, не пов&#8217;язаних із сервісами, а які відносяться суто до вашого інстансу із додатком.</p>
<p style="text-align: justify;">DevOps сервіс дозволяє автоматизувати створення git-репозиторію з розміщенням хабу на hub.jazz.net. Там вам пропонується і Web IDE для спільної роботи над проектом. Я залив проект, який використовує Express.js поверх Node.js в якості веб-фреймворку та Jade як template-engine. App.js за замовчуванням парсить Manifest-файл із всіма опціями, які нагенерував Bluemix та вписав сам користувач і, стартує наш веб-апп.</p>
<pre class="brush: jscript; title: ; notranslate">
// VCAP_APPLICATION contains useful information about a deployed application.
var appInfo = JSON.parse(process.env.VCAP_APPLICATION || &quot;{}&quot;);
// TODO: Get application information and use it in your app.
// VCAP_SERVICES contains all the credentials of services bound to
// this application. For details of its content, please refer to
// the document or sample of each service.
var services = JSON.parse(process.env.VCAP_SERVICES || &quot;{}&quot;);
// TODO: Get service credentials and communicate with bluemix services.
// The IP address of the Cloud Foundry DEA (Droplet Execution Agent) that hosts this application:
var host = (process.env.VCAP_APP_HOST || 'localhost');
// The port on the DEA for communication with the application:
var port = (process.env.VCAP_APP_PORT || 3000);
// Start server
app.listen(port, host);
console.log('App started on port ' + port);
</pre>
<p style="text-align: justify;">Звісно ж, вас ніхто не заставляє використовувати Web IDE. Хоча, вона досить мила.</p>
<p><a href="/images/09062014/13.png" target="_blank"><img class="aligncenter" alt="" src="/images/09062014/13.png" width="640" height="297" /></a></p>
<p style="text-align: justify;">Ви можете клонувати репозиторій на локальну машину, вносити свої правки, пушити зміни на віддалений репозиторій і вже з панелі роботи над проектом виконувати розгортання вашого додатку до прикліпленого інстансу (чи кластера &#8211; дивись ) на Bluemix. Двічі, поки я пробував це зробити &#8211; мій інстанс на Bluemix відвалювався. Встановивши Cloud Foundry cli, я таки розібрався в чому була проблема. Справа в тому, що після розгортання вашого застосунку, необхідно вказати ще і як його запускати. Для цього необхідно в корені проекту створити Procfile, в якому вписати відповідну команду: для цього проекту, наприклад, &#8220;web: node app.js&#8221;. Детальніше можна почитати в документації <a href="https://devcenter.heroku.com/articles/nodejs-support" target="_blank">Heroku</a>. Хоча, гадаю, з цим файлом &#8211; DevOps сервіс правильно розгортатиме ваш додаток. Консольна утиліта після логування працює дуже просто &#8211; вводите push команду з назвою вашого застосунку та списком сервісів, які прописані в маніфест-файлі:</p>
<pre class="brush: jscript; title: ; notranslate">
applications:
- services:
- mongodb-kx
- Monitoring and Analytics-vf
- DevOps Services-m4
disk_quota: 1024M
host: itblogger
name: itblogger
command: node app.js
path: .
domain: ng.bluemix.net
instances: 1
memory: 128M
</pre>
<p style="text-align: justify;">Після запуску скрипта розгортання &#8211; чекаємо деякий час для завантаження всіх залежностей, що прописані у вашому package.json файлі &#8211; і любуємося результатом:</p>
<pre class="brush: jscript; title: ; notranslate">
core@core-lunaos:~/Documents/hub/itblogger$ cf push itblogger -c &quot;node app.js&quot;
Using manifest file /home/core/Documents/hub/itblogger/manifest.yml
Updating app itblogger in org hidden@gmail.com / space dev as hidden@gmail.com...
OK
Using route itblogger.ng.bluemix.net
Uploading itblogger...
Uploading app files from: /home/core/Documents/hub/itblogger
Uploading 7.6K, 14 files
OK
Binding service mongodb-kx to app itblogger in org hidden@gmail.com / space dev as hidden@gmail.com...
OK
Binding service Monitoring and Analytics-vf to app itblogger in org hidden@gmail.com / space dev as hidden@gmail.com...
OK
Binding service DevOps Services-m4 to app itblogger in org hidden@gmail.com / space dev as hidden@gmail.com...
OK
Stopping app itblogger in org hidden@gmail.com / space dev as hidden@gmail.com...
OK
Starting app itblogger in org hidden@gmail.com / space dev as hidden@gmail.com...
----- Downloaded app package (8.0K)
----- Downloaded app buildpack cache (4.4M)
OK
----- Buildpack Version: 20140529-1413
----- Resolving node version by IBM
----- Requested node range: 0.10.26
----- Resolved node version: 0.10.26
----- Installing IBM SDK for Node.js from admin cache
----- Read service config: MonitoringAndAnalytics.json at the start
----- Read service config: SQLDB_BLUAcceleration.json at the start
----- Restoring node_modules directory from cache
----- Pruning cached dependencies not specified in package.json
----- Writing a custom .npmrc to circumvent npm bugs
----- Installing dependencies
----- Caching node_modules directory for future builds
----- Cleaning up node-gyp and npm artifacts
----- Building runtime environment
----- Read service config: MonitoringAndAnalytics.json at the end
----- Application bound service: [MonitoringAndAnalytics]
----- Add service extension at the end of the application staging
----- Install local dependency: resources/monitoring/knj
knj-plugin@1.0.0 node_modules/knj-plugin
----- Found boot js file: app.js
----- Add header to app.js: require(&quot;knj-plugin&quot;);
----- Read service config: SQLDB_BLUAcceleration.json at the end
----- Uploading droplet (11M)

0 of 1 instances running, 1 down
1 of 1 instances running
App started
Showing health and status for app itblogger in org hidden@gmail.com / space dev as hidden@gmail.com...
OK
requested state: started
instances: 1/1
usage: 128M x 1 instances
urls: itblogger.ng.bluemix.net
state since cpu memory disk
#0 running 2014-06-09 07:55:26 PM 0.0% 46M of 128M 33.5M of 1G
</pre>
<p><a href="/images/09062014/11.png" target="_blank"><img class="aligncenter" alt="" src="/images/09062014/11.png" width="640" height="297" /></a></p>
<p style="text-align: justify;">До речі, про cf &#8211; кинувши оком на документацію &#8211; побачив у них можливість розгортання Python-застосунків через heroku. Детальніше &#8211; в <a href="https://www.ng.bluemix.net/docs/DeployApps.jsp">документації</a>.</p>
<p style="text-align: justify;">Мушу зізнатися &#8211; матеріал писав дуже довго через постійні помилки то при створенні, то при видаленні, то при байндінгу сервісів &#8230; Але це бета. Тому буду лояльним. Як я і казав &#8211; Bluemix поки не може конкурувати з гігантами ринку, але перші кроки зроблено. Зараз важливо зібрати фідбеки, виправити помилки, додати стабільності і &#8230; Гадаю з тим темпом, з яким зростає популярність PааS систем, місце знайдеться і для IBM.</p>
<p style="text-align: justify;">Буду завершувати. Взагалі, я планував писати великий матеріал про менеджер віртуальних оточень Vagrant та провайдери для Docker, AWS, VMWare, Hyper-V та багатьох інших кастомних технологій віртуалізації. Але, підозрюю, що створення власної хмари локально &#8211; це такий таск зайшов би ще складніше. Адже там потрібно писати всі маніфест-конфіги вручну. Тому, почавши з хостед-клаудів, я трохи спростив задачу. Звісно, IBM Bluemix &#8211; не найкращий кандидат для представлення віддалених хмар. Але багато поганого про цей сервіс я теж не скажу. Бета-версія і все таке інше. Підсумовуючи &#8230; А нє, просто &#8211; до зустрічі в наступному матеріалі.</p>
<p style="text-align: justify;">.</p>
]]></content:encoded>
			<wfw:commentRss>http://itblogger.org.ua/paas-ibm-bluemix/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Алгоритми та структури даних. Шаблон класу</title>
		<link>http://itblogger.org.ua/alhorytmy-ta-struktury-danyh-shablon-na-majbutnje/</link>
		<comments>http://itblogger.org.ua/alhorytmy-ta-struktury-danyh-shablon-na-majbutnje/#comments</comments>
		<pubDate>Sat, 15 Feb 2014 21:06:12 +0000</pubDate>
		<dc:creator><![CDATA[core]]></dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Алгоритми]]></category>

		<guid isPermaLink="false">http://itblogger.org.ua/?p=777</guid>
		<description><![CDATA[Привіт піпли. Трохи затягнув я із продовженням теми алгоритмів та структур даних. Революційні настрої, невеличка операція на носі та інші непередбачувані проблеми трохи вибили мене з колії. З непередбачуваних проблем, звісно, треба згадати Skyrim, яким я вирішив розбавити двотижневе лікування вдома. Тому сьогодні постараюся без довгих прелюдій перейти до суті. Як ви вже зрозуміли, говорити [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-align: justify;">Привіт піпли. Трохи затягнув я із продовженням теми алгоритмів та структур даних. Революційні настрої, невеличка операція на носі та інші непередбачувані проблеми трохи вибили мене з колії. З непередбачуваних проблем, звісно, треба згадати Skyrim, яким я вирішив розбавити двотижневе лікування вдома. Тому сьогодні постараюся без довгих прелюдій перейти до суті.</p>
<p style="text-align: justify;">Як ви вже зрозуміли, говорити будемо про алгоритми сортування. Принаймні, почнемо. Я впевнений, нікого не дивує така тема для початку, адже будь-які курси, книжки та навчальні матеріали на дану тематику починаються саме з алгоритмів сортування. Мої друзі, з якими я навчався в одній групі, якось заперечували мені необхідність обговорення та писання на дану тематику. Що ж, вони працюють програмістами, я &#8211; здебільшого адмініструю системи, інколи пишу, але для такої системи, де крім алгоритмів стільки проблем, що до роботи над алгоритмами ніколи не доходять руки. Тому, я довіряю їхнім словам, але, звісно ж, ні разу не погоджуюсь з ними. Отже, їхній аргумент &#8211; це все описано, інформація є на Вікіпедії і вона не настільки важлива, аби займати нею те місце в голові, яке можна використати раціональніше. Для мене такий підхід є абсолютно незрозумілим і, навіть, таким, який я логці не можу піддати. Я, наприклад, не знаю скільки ресурсів мозку можу використовувати, але впевнений, що без постійних навантажень та &#8220;зарядки&#8221; мозку все, що нам залишиться &#8211; це рахувати незайняті ресурси. Людський мозок &#8211; не мікрочіп із відомою кількістю комірок. Тому вичерпати його ресурси навряд чи комусь вдастся. А щодо того, що опис алгоритмів є на Вікі &#8230; Ну, табличка множення теж є на Вікі. Вірші Шевченка є на Вікі. Теореми Ньютона. Атомні маси чисел. Якщо ви не знаєте цих речей &#8211; ви не володієте знаннями. А інформація про місцезнаходження даних &#8211; це ще далеко не знання.</p>
<p><span id="more-777"></span></p>
<p style="text-align: justify;">Отже, алгоритми сортування. Постановка задачі проста &#8211; є масив об&#8217;єктів, які містять значення ключів. Ключі треба впорядкувати у відповідності до якогось заздалегідь встановленого правила. Думаючи над тим, як уніфікувати подання реалізації алгоритмів, я розривався між варіантом використання всіх можливих засобів Python 3 чи більш низькорівневого подання. В результаті, вирішив знайти консенсус, уникаючи якихось готових інструментів python, які ховають логіку роботи програми для незнайомих з мовою користувачів.</p>
<p style="text-align: justify;">Отже, що нам потрібно &#8211; це якось міряти ефективність алгоритмів. Для цього зручно міряти кількість звертань до алгоритму та змін в ньому, що напряму впливає на час виконання алгоритму.</p>
<pre class="brush: python; title: ; notranslate">
&quot;&quot;&quot;Template for sort algorithm
Blog: itblogger.org.ua
&quot;&quot;&quot;

import timeit
import random

def generateShuffle(array):
    random.shuffle(array)
    return array

class Sorter:
    def __init__(self, obj):
        self.obj = [i for i in obj]
        self.startTime = 0
        self.endTime = 0

    def __str__(self):
        return &quot;&quot;.join([str(i) + &quot; &quot; for i in self.obj])

    def isSorted(self):
        return all(self.obj[i] &lt;= self.obj[i + 1] for i in range(len(self.obj) - 1))

    def sort(self):
        &quot;&quot;&quot;
        Реалізація алгоритму
        &quot;&quot;&quot;
        self.startTime = timeit.default_timer()

        for i in range(len(self.obj)):
            for j in range(i + 1, len(self.obj)):
                if self.obj[j] &lt; self.obj[i]:
                    self.obj[j], self.obj[i] = self.obj[i], self.obj[j]

        self.endTime = timeit.default_timer()

    def runTime(self):
        return self.endTime - self.startTime

def main():
    lst = generateShuffle(list(range(100))) #генеруємо послідовність

    o = Sorter(lst) # створення сортувальника
    print(&quot;Unsorted:&quot;, o)

    o.sort()

    assert o.isSorted() == True, &quot;Sequence is not sorted&quot; # перевірка сортованості

    print(&quot;Sorted:&quot;, o, &quot;Time:&quot;, o.runTime(), sep=&quot;\n&quot;)


main()
</pre>
<p>Результат:</p>
<blockquote><p>Unsorted: 25 56 76 92 78 21 49 34 20 53 77 31 82 62 68 51 60 57 72 37 97 8 86 50 65 94 35 33 73 48 99 23 64 30 88 75 19 16 2 66 81 70 24 44 83 41 45 90 29 18 17 1 11 95 7 43 36 67 80 5 63 47 52 98 55 4 10 39 9 93 79 13 3 87 89 42 12 38 59 26 40 15 54 22 58 74 85 32 69 71 61 91 14 27 46 0 84 96 28 6<br />
Sorted:<br />
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99<br />
Time:<br />
0.0018363387404734194</p></blockquote>
<p style="text-align: justify;">Поки хтось на зачепився &#8211; так, я знаю, писати геттери та сеттери треба з @property, бо втрачається вся інкапсуляція а з нею класична безпечна об&#8217;єктна орієнтованість. Давайте, поки, упустимо ці речі. Отже, для реалізації наших алгоритмів будемо використовувати якийсь узагальнений клас із методом sort(), де буде реалізація сортування, перевірка об&#8217;єкта на відсортованість та метод відображення послідовності. Звісно, назвати такий клас універсальним щодо типів складно, але для базових стрічок та чисел цього буде достатньо. З часом, скоріш за все, кожен метод доведеться переписувати під складніші типи даних. В якості прикладу роботи такої узагальненої схеми я використав славнозвісний метод бульбашки. Ми його навіть не розглядаємо, але для прикладу згодиться. Використаємо ще невеличку функцію для генерування випадкових послідовностей і таймери для вимірювання часу роботи алгоритму.</p>
<p style="text-align: justify;">Ну от, базову схему накидали, продовжимо іншим разом, бо лікарняний вже закінчився, а Skyrim ще багато місій має. Я побіг.</p>
]]></content:encoded>
			<wfw:commentRss>http://itblogger.org.ua/alhorytmy-ta-struktury-danyh-shablon-na-majbutnje/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
