По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Планировщик распределенных ресурсов VMware (VMware DRS) — это система, которая позволяет автоматически сбалансировать виртуальные машины (ВМ) в кластерной среде VMware vSphere. В этой статье мы рассмотрим некоторые советы и рекомендации по планированию, настройке и использованию vSphere DRS. Сбалансированный кластер обозначает то, что ваши хосты в кластере будут одинаково (или почти) распределены. Если ваш кластер не сбалансирован, ваши ВМ будут автоматически перенесены с помощью vMotion на хосты с минимальным использованием ресурсов. Например, если в вашей среде есть DRS, вы не будете видеть, что один хост используется на 99%, а другой на 50%. DRS заботится о балансировке ВМ с помощью vMotion. В этой статье мы дадим вам несколько советов, которые позволят получить максимальную отдачу от VMware DRS и сделать эту технологию оправдывающей вложения. VMware DRS не является частью vSphere Standard и входит только в версии Enterprise Plus или Platinum. Всегда возникает вопрос, стоит ли переходить на версию vSphere с DRS. Если бы у меня была возможность выбора, я бы предпочел лицензионный вариант VMware DRS. Чтобы дать вам представление о том, что нужно, давайте начнем с основ. Для VMware vSphere Distributed Resources Scheduler (DRS) требуется следующее: VMware vCenter Server Кластер VMware vSphere ESXi Включенная сеть vMotion на хостах кластера Лицензия Enterprise Plus (или выше) Общее хранилище между хостами ESXi (традиционное или гиперконвергентное через VMware VSAN) При использовании Predictive DRS вам также будет нужно запустить лицензированный vRealize Operations Manager (vROPs). Советы и хитрости VMware DRS Используйте однородное оборудование. Первый совет касается оборудования при формировании кластеров. Основное правило VMware - выбирать хосты с одинаковым или похожим оборудованием. Для этого есть причина. Решая, какие хосты группировать в кластеры DRS, попытайтесь выбрать те, которые являются максимально однородными с точки зрения процессора и памяти. Это улучшает предсказуемость и стабильность производительности. Скорость DRS и снижение использования ресурсов. Обновитесь до последней версии vSphere. Последняя vSphere, 6.7, гораздо более эффективна, когда речь идет о скорости DRS и использовании ресурсов. Несмотря на то, что сама скорость vMotion не может быть выше, поскольку она зависит от базовой архитектуры сети и хранилища, VMware оптимизирует скорость принятия решений до того, как произойдет vMotion. Фактически, они достигли в 2-3 раза более быстрого принятия решений в vSphere 6.7. Одним из улучшений стало упрощенное начальное размещение, которое теперь не делает снимок всей среды, а просто использует непрерывный мониторинг, позволяя сохранять 1-2 секунды перед принятием каждого решения. Это особенно ценно в средах с высокой степенью затрат, где вы сможете увидеть снижение потребления ресурсов из-за улучшений DRS и уменьшенной задержки при создании VMotions для балансировки нагрузки. Также вы увидите быстрое начальное размещение ВМ. Используйте полностью автоматический режим. Уровень автоматизации DRS может быть установлен на ручной, частично автоматический или полностью автоматический. Какая разница? Давайте объясним: Вручную — vCenter будет рекомендовать только перемещение ресурсов. Частично автоматизировано — после того, как вы создадите ВМ и включите ее, vCenter автоматически разместить виртуальную машину на более подходящем хосте, чтобы поддерживать баланс кластера. После включения ВМ vCenter представит рекомендации по переходу с учетом использования процессора и памяти. Администратор vSphere должен одобрить переход. Полностью автоматизированный — vCenter контролирует начальное размещение и переход виртуальных машин. Всё полностью автоматически, и администратор не видит сообщений, касающихся рекомендаций. Никакое решение от администратора не нужно, чтобы держать кластер сбалансированным. По умолчанию, когда вы включаете DRS в кластере, уровень автоматизации, выбранный на уровне кластера, будет применён ко всем ВМ, которые находятся в этом кластере. Однако вы можете создать отдельные правила для виртуальных машин, которые необходимо разделить (или хранить вместе). Порог миграции Эта опция позволяет вам установить порог, который при ударе заставляет DRS срабатывать и перемещать виртуальные машины, чтобы достичь идеально сбалансированного состояния. Поскольку производительность каждой ВМ варьируется, процессор и использование памяти хоста также различаются. Вы можете переместить ползунок порога, чтобы использовать одну из пяти настроек, от консервативных до активных. Пять параметров миграции генерируют рекомендации на основе назначенного им уровня приоритета.При перемещении ползунка вправо каждый параметр позволяет включить один из более низких уровней приоритета. Консервативный параметр генерирует только рекомендации с приоритетом один (обязательные рекомендации), следующий уровень справа генерирует рекомендации с приоритетом два и выше и т. д. до уровня активный, который генерирует рекомендации с приоритетом пять и выше (то есть все рекомендации). Для этого выберите «Кластер» -> «Настроить» -> «vSphere DRS» -> «Редактировать». Ползунок позволяет перейти от консервативного (слева) к активному (правому) положению. Вы должны определить, насколько активно или консервативно вы хотите запустить DRS. Я обычно держу его на середине, потому что, если вы слишком активны, скорее всего, будете слишком часто перемещать свои виртуальные машины. И помните, что при каждом перемещении вы создаете нагрузку на базовую инфраструктуру, такую как хранилище или загрузка ЦП. Это связано с тем, что операции копирования во время vMotion могут насыщать сетевые ссылки, и, если у вас нет 10 Гб (или более), операции vMotion будут бесконечными. Если вы оставите настройку слишком низкой (слишком консервативной), ваши виртуальные машины не будут достаточно двигаться, и дисбаланс вашего кластера будет расти или будет происходить чаще, без исправления. Выключите виртуальные машины, которые вы не используете Оставьте включенными только те ВМ, которые вам действительно нужны. Виртуальные машины с включенным питанием потребляют ресурсы памяти и некоторые ресурсы ЦП даже в режиме ожидания. Даже неиспользуемые виртуальные машины с их малым пользованием ресурсов могут повлиять на решения DRS. Вы можете получить небольшое увеличение производительности, выключив или приостановив ВМ, которые не используются. Правила соответствия DRS. Правила соответствия DRS могут хранить две или более ВМ на одном хосте ESXi («соответствие VM / VM»), или с другой стороны, они могут быть уверены, что они всегда находятся на разных хостах («несоответствие VM / VM»). Правила соответствия DRS также можно использовать, чтобы убедиться, что группа виртуальных машин работает только на определенных хостах ESXi («соответствие VM / Хост») или никогда не запускается на определенных хостах («несоответствие VM / Хост») Зачастую лучше оставить настройки соответствия без изменений. Однако в некоторых конкретных и редких случаях указание правил соответствия может повысить производительность. Чтобы изменить настройки соответствия: Выберите кластер -> Настроить -> Правила виртуальной машины/хоста -> Добавить, введите имя для нового правила, выберите тип правила и перейдите через GUI в соответствии с выбранным типом правила. Помимо настроек по умолчанию, типами настроек соответствия являются: Хранение виртуальных машин вместе— этот тип соответствия может повысить производительность благодаря меньшим задержкам связи между машинами. Разделение виртуальных машин — этот тип соответствия может поддерживать максимальную доступность ВМ. Например, если они являются интерфейсными веб-серверами для одного и того же приложения, вы можете убедиться, что на них не повлияет сбой сервера (если это произойдет). Таким образом, эти две виртуальные машины не будут отключены одновременно. Это также позволит разделить два контроллера домена на двух разных хостах, чтобы пользователи могли проходить аутентификацию и получать доступ к ресурсам. ВМ к хостам — этот тип соответствия может быть полезен для кластеров с ограничениями лицензирования программного обеспечения или конкретными требованиями зоны доступности. Финальные заметки Как видите, VMware vSphere DRS является адаптивным для многих сценариев. Настройки по умолчанию будут сразу работать , но у вас есть много вариантов, чтобы адаптировать его к вашей среде, если это необходимо. При понимании ваших рабочих процессов и требований, вы сможете настроить vSphere DRS, чтобы получить максимальную производительность и максимальную выгоду от вашей виртуальной инфраструктуры.
img
Что такое DOM? DOM (Document Object Model) – это объектная модель документа. Это интерфейс между JavaScript и веб-браузером.  С помощью DOM вы можете написать код JavaScript для создания, изменения или удаления элементов HTML, установки стилей, классов и атрибутов, а также для принятия событий и реагирования на них. Дерево DOM формируется из HTML-документа, и с ним уже можно будет взаимодействовать. DOM – это очень сложный API, у которого есть методы и свойства для взаимодействия с деревом DOM. Как работает DOM – за кадром DOM продуманно организован. Родительский элемент называется EventTarget. Приведенная ниже диаграмма поможет вам лучше понять, как это работает: EventTarget – это интерфейс, реализуемый объектами, которые могут принимать события и у которых могут быть обработчики этих событий. Иными словами, любой источник событий реализует три метода, которые связаны с этим интерфейсом. Самыми распространенными генераторами событий являются Element и его дочерние элементы, Document и Window. Другие объекты также могут выступать в качестве источников событий.  Объект Window - это окно браузера. Все глобальные объекты, функции и переменные JavaScript автоматически становятся частью объекта Window. Глобальные переменные – это свойства Window. Глобальные функции – это методы Window. И даже Document (DOM HTML) является свойством Window. window.document.getElementById("header"); // Both are same document.getElementById("header"); В модели дом DOM есть узлы., и все части документа, такие как элементы, атрибуты, текст и т.д., организованы в виде иерархической древовидной структуры, которая состоит из родителей и потомков. Все эти части документа называются узлами (Node). Node на приведенной выше диаграмме представлен как объект JavaScript. В основном мы работаем с document, у которого есть такие распространенные методы, как document.queryselector(), document.getElementBy Id() и т.д. Теперь давайте посмотрим на document.  Как выбирать, создавать и удалять элементы с помощью DOM С помощью DOM мы можем выбирать, удалять и создавать элементы в JavaScript. Как выбирать элементы  Существует несколько способов выбрать HTML-элементы (HTML Elements) в JavaScript. Здесь мы рассмотрим следующие методы:  document.getElementById(); document.getElementByClassName(); document.getElementByTagName(); document.querySelector(); document.querySelectorAll(); Как использовать метод document.getElementById() Метод getElementById() возвращает элемент, идентификатор которого соответствует переданной строке. Идентификаторы элементов HTML должны быть уникальными, поэтому это самый быстрый способ выбрать элемент с идентификатором.  Пример: const ele = document.getElementById("IDName"); console.log(ele); // This will log the whole HTML element Как использовать метод document.getElementByClassName() Метод document.getElementByClassName() возвращает HTMLCollection элементов, которые соответствуют имени переданного класса. Можно искать сразу несколько имен классов, передав их через пробел. Тогда этот метод вернет «живую» HTMLCollection. Что такое «живая» HTMLCollection? Это означает, что как только мы получим HTMLCollection для какого-то имени класса, и если мы добавим элемент с тем же именем класса, то HTMLCollection автоматически обновится.  Пример: const ele = document.getElementByClassName("ClassName"); console.log(ele); // Logs Live HTMLCollection Как использовать метод document.getElementByTagName() Метод document.getElementByTagName() возвращает HTMLCollection элементов, которые соответствуют переданному имени тега. Его можно вызывать для любого элемента HTML. Метод вернет «живую» HTMLCollection. Пример: const paragraph = document.getElementByTagName("p"); const heading = document.getElementByTagName("h1"); console.log(paragraph); // p element HTMLCollection console.log(heading); // h1 element HTMLCollection   Как использовать метод document.querySelector() Метод document.querySelector() возвращает первый элемент, который соответствует переданному селектору. Здесь мы можем передать имя класса, идентификатор и имя тега. Давайте посмотрим на пример ниже: const id = document.querySelector("#idname"); // using id const classname = document.querySelector(".classname"); // using class const tag = document.querySelector("p"); // using tagname Правила выбора: если вы выбираете по имени класса, то используйте (.) в начале. Например, (“.classname”). если вы выбираете по идентификатору, то используйте (#) в начале. Например, (“#id”). если вы выбираете по имени тега, то просто введите тег. Например,  (“p”).  Как использовать метод document.querySelectorAll() Метод document.querySelectorAll() - это расширение метода querySelector. Этот метод возвращает все элементы, которые соответсвуют переданному селектору. Он возвращает «неживую» коллекцию Nodelist.  Пример: const ele = document.querySelectorAll("p"); console.log(ele); // return nodelist collection of p tag   ПРИМЕЧАНИЕ : HTMLCollection – это «живая» коллекция, а коллекция Nodelist – статическая.    Как создавать элементы Вы можете создавать HTML-элементы в JavaScript и динамически добавлять их в HTML. Вы можете создать любой элемент HTML с помощью метода document.createElement(), просто передав имя тега в скобках.    После того, как элемент будет создан, вы сможете добавить к нему имя класса, атрибуты и текст.    Вот пример: const ele = document.createElement("a"); ele.innerText = "Click Me"; ele.classList.add("text-left"); ele.setAttribute("href", "www.google.com"); // update to existing element in HTML document.querySelector(".links").prepend(ele); document.querySelector(".links").append(ele); document.querySelector(".links").befor(ele); document.querySelector(".links").after(ele); // Simalar to below anchor tag // Click Me   В приведенном выше примере мы создали тег привязки (anchor) в JavaScript и добавили атрибуты и имя класса к этому тегу. Там же у нас есть четыре метода для того, чтобы обновить созданный элемент в HTML. prepend(): вставляет данные поверх своего первого дочернего элемента. append(): вставляем данные или содержимое внутрь элемента по последнему индексу. before(): вставляет данные перед выбранным элементом. after(): помещает элемент после указанного элемента. Или можно сказать, что он вставляет данные за пределами элемента (делая это содержимое элементом того же уровня) в набор подходящих элементов. Как удалять элементы Мы знаем, как создавать элементы на JavaScript и помещать их в HTML. Но, что если нам нужно удалить элементы в HTML? Это довольно просто! Нам достаточно воспользоваться методом remove() для нужного элемента.  Вот пример: const ele = document.querySelector("p"); // This will remove ele when clicked on ele.addEventListner('click', function(){ ele.remove(); })   Как управлять CSS из JavaScript Мы знаем, как управлять HTML из JavaScript. А теперь мы узнаем, как управлять CSS из JavaScript. Это может помочь вам динамически менять стиль ваших веб-страниц.  Например, если вы нажимаете на элемент, то его фоновый цвет должен поменяться. Это реально сделать, управляя CSS из JavaScript.    Вот пример синтаксиса: const ele = document.querySelector("desired element"); ele.style.propertyName = value; // E.g - ele.style.color = red;   Когда вы меняете свойства CSS с помощью JavaScript, помните, что всякий раз, когда в CSS печатается «-», в JavaScript там будет стоять заглавная буква. Например, в CSS вы бы написали background-color, а в JavaScript – backgroundColor (с большой буквы C).    Вот пример: const ele = document.querySelector("div"); ele.style.backgroundColor = "red"; Предположим, что вы написали код CSS для своего проекта и хотите добавить классы с помощью JavaScript. Это можно сделать с помощью classList в JavaScript.    Вот еще один пример: const ele = document.querySelector(".link"); ele.classList.add("bg-red"); // add class bg-red to existing class list ele.classList.remove("pb-4");// remove class bg-red from existing class list ele.classList.toggle("bg-green"); // toggle class bg-red to existing class list which means if it already exists then it will be removed, if it doesn't exist it will be added. classList добавляет, удаляет или переключает классы относительно какого-то элемента. Это чем-то похоже на обновление существующих классов.    В отличие от element.className, он удаляет все существующие классы и добавляет указанный класс.  И еще один пример: const ele = document.querySelector(".link"); ele.classList.add("bg-red"); // add class bg-red to existing class list ele.classList.remove("pb-4");// remove class bg-red from existing class list ele.className = "p-10"; // Now this will remove all existing classes and add only "p-10 class to element."   Как использовать обработчики событий Событие (Event) – это изменение состояния объекта. Обработка событий (Event Handling) – процесс реагирования на события.  События происходит всякий раз, когда пользователь щелкает кнопкой мыши, наводит курсор на элемент, нажимает клавишу и т.д. Поэтому, когда происходит событие, и вы хотите выполнить какое-то действие, то вы используете обработчики событий, чтобы это действие произошло.  Мы используем обработчики событий для того, чтобы выполнить определенный код, когда это конкретное событие происходит. В JavaScript есть несколько обработчиков событий, однако процесс их добавления к элементам одинаков.  Вот синтаксис: const ele = document.querySelector("a"); ele.addEventListner("event", function(){ // callback function }); Вот некоторые события, которые вы можете использовать: click mouseover mouseout keypress keydown А вот пример использования события «click» (нажатия на кнопку мыши): const ele = document.querySelector("a"); ele.addEventListner("click", function(){ ele.style.backgroundColor = "pink"; }); Распространение событий: всплывание событий и перехват событий Распространение событий определяет то, в каком порядке элементы будут получать события. Существует два способа обработки порядка распространения событий в DOM: всплывание событий и перехват событий.  Что такое всплывание событий? Когда в каком-то компоненте происходит событие, то он сначала на нем запускается обработчик событий, только потом на его родительском компоненте, а затем уже и на всех остальных компонентах, которых называют предками.  По умолчанию все обработчики событий перемещаются именно в этом порядке - от события центрального компонента к событию компонента, который находится от него дальше всех.    Что такое перехват событий? Этот способ – противоположность предыдущему. Обработчик событий запускается сначала на родительском компоненте, а уже потом на том компоненте, на котором он фактически и должен был сработать.  Проще говоря, это означает, что событие сначала перехватывается самым удаленным элементом, а затем распространяется на внутренние элементы. Также этот способ называют «просачиванием вниз».    Давайте попробуем запустить следующий пример:                Example           
           
    Этот код выдаст нам следующее: Теперь давайте внимательно изучим приведенный выше пример. Я добавил получатель событий к тегу nav и тегу anchor. Когда вы нажимаете на nav, то цвет фона меняется на зеленый. Когда вы нажимаете на тег anchor, то цвет фона меняется на розовый.  Но когда вы нажимаете на тег anchor, то цвет фона меняется как у nav, так и у anchor. Это происходит из-за всплывания событий.    Вот что происходит, когда вы нажимаете только на элемент nav:       А вот что происходит, когда вы нажимаете только на элемент anchor: Для того, чтобы остановить распространение событий, мы можем воспользоваться методом stoppropagation() на получателе событий, из-за которого и происходит распространение события. В таком случае в приведенном выше примере получатель событий элемента nav не сработает.                   Example           
           
    Как перемещаться по модели DOM «Хороший разработчик JavaScript должен знать, как перемещаться по модели DOM. Перемещаться по модели DOM значит выбирать один элемент из другого,» - Зелл Лью. Теперь посмотрим, почему лучше обойти модель DOM, чем использовать метод document.querySelector(), и как это выполнить на профессиональном уровне.  Есть три способа обхода модели DOM: Снизу-вверх Сверху-вниз Продольный Как обойти модель DOM снизу-вверх Существует два метода, которые помогут вам перемещаться по модели DOM снизу-вверх: parentElement closest parentElement – это свойство, которое выбирает родительский элемент, например: const ele = document.querySelector("a"); console.log(ele.parentElement); //
parentElement отлично подходит для того, чтобы выбрать элемент, который находится на один уровень выше. Но closest позволяет найти элемент, который может быть на несколько уровней выше текущего. closest позволяет вам выбрать ближайший элемент-предок, который соответствует селектору.  Вот пример с использованием closest:
   

This is sample

   

This is heading

   

This heading 2

const ele = document.querySelector(".heading"); console.log(ele.closest(".demo")); // This is heading В приведенном выше фрагменте кода мы пытаемся получить ближайший элемент к .heading, который имеет класс .demo. Как обойти модель DOM сверху-вниз Мы можем перемещаться вниз, используя метод селектора children. При таком подходе вы можете выбрать прямого потомка нужного элемента.   Вот пример:
   Link-1    Link-2    Link-3    Link-4
const ele = document.querySelector("div"); const child = ele.children; console.log(child); // gives HTMLCollection // 4 element inside div Как обойти модель DOM продольно Это очень интересный вопрос, как же мы можем продольно обойти DOM. В основном мы можем использовать лишь два метода: previousElementSibling nextElementSibling С помощью метода previousElementSibling мы можем выбрать предшествующие элементы в HTML:
   Link-1    

Heading

const ele = document.querySelector("h1"); console.log(ele.previousElementSibling); // Link-1 А с помощью метода nextElementSibling мы можем выбрать последующие элементы в HTML:
   Link-1    

Heading

const ele = document.querySelector("a"); console.log(ele.nextElementSibling); //

Heading

img
Управление компьютерной сетью процесс довольно трудоемкий и динамичный. Поэтому разработка инструментов по обслуживанию компьютерных сетей не менее важный процесс, чем, собственно, расширение самих сетей. На сегодняшний момент в распоряжении сетевых администраторов представлены несколько наборов инструментов, позволяющих существенно облегчить развертывание, настройку и обновление конфигурации как небольших локальных сетей, так и достаточно масштабных объединений кластеров, насчитывающих десятки тысяч машин. Самые популярные из них это Salt, Ansible, Puppet и Chef, преимущества и недостатки которого мы и разберем в этой статье. Что же такое Chef? Это система конфигурирования сети, которая "заточена" под кулинарную тематику. Вкратце, система основана на "рецептах" файлах конфигурации, которые администратор объединяет в "кукбуки", или "кулинарные книги" сценарии поведения сети. Эти сценарии помещаются в хранилище, или "книжный шкаф", откуда актуальный набор конфигураций извлекается и устанавливается на клиентские машины в автоматическом режиме. Все операции исполняются с помощью консольного инструмента, который создатели ласково окрестили "шефским ножом". Что же хорошего можно ожидать от томного итальянского шеф-повара? Быстрота развертывания: При правильном прописывании параметров конфигурации, добавление в сеть нового устройства, или даже целого кластера достаточно простая и не требующая долгого времени операция. То, что еще лет пять назад требовало ручных настроек и двух-трех дней работы, с помощью Chef выполняется автоматически в течении считанных минут. Гибкость настроек: Благодаря Bookshelf’ам, Chef позволяет создать несколько сценариев поведения сети, которые позволяют за короткое время переконфигурировать сеть оптимальным образом для выполнения определенного рода задач. Такая возможность актуальна для тех сетей, которые требуют быстрой адаптации под нужды компании. Оперативное перераспределение ресурсной мощности сети один из главных козырей данного решения Доступность: Решение Chef широко распространено и доступно для широкого круга пользователей. Любой интересующийся человек может скачать ознакомительную версию и попробовать писать свои рецепты, и если дело пойдет можно приобрести лицензию и внедрять решения Chef непосредственно в рабочий процесс. Мультиплатформенность: Рецепты Chef можно адаптировать под любую операционную систему, и менять конфигурациии ОС клиентских машин независимо от того, какая ОС на них установлена. А где этот любитель женщин и хорошего вина слабоват? Человеческий фактор: Применение решений Chef требует от оператора внимательности и хорошего знания конфигурирования сети. Если ошибиться в коде и применить некорректные настройки можно столкнуться с рядом проблем, от потери соединения до полной потери данных с выходом удаленного оборудования из строя. Безопасность: Важнейшей задачей при работе с Chef является защищенность рабочей станции. Если не обеспечить защиту сети должным образом, то проникновение в систему злоумышленника и перехват управления системой может привести к серьезному ущербу, особенно в сетях крупных корпораций. Громоздкость: Рецепты Chef зачастую достаточно объемны, и это порождает некоторые сложности в их применении. Каждая строка настроек конфигурации должна быть выверена, и это требует от оператора особого внимания при создании и при проверке рецептов и кукбуков. Прожорливость: Данное решение на текущий момент несколько уступает конкурентам в производительности и потреблении ресурсов рабочей станции. Однако, работы над оптимизацией Chef ведутся непрерывно, поэтому продукт в ближайших версиях обещает быть более оптимизированным и эффективным. Итак, если сравнивать Chef с аналогичными продуктами от других разработчиков (а именно Ansible, Salt и Puppet), то данное решение будет несколько уступать в управляемости, за счет сложности описания рецептов (но это дело привычки), а также по производительности. По заявлениям специалистов Chef Enterprise идеальный инструмент именно для сферы разработки ПО. Работы над оптимизацией программы ведутся, и новые версии обещают быть более эффективными и производительными. Вывод Несмотря на наличие минусов, Chef остается одним из наиболее популярных и востребованных инструментов администратора сети. Данное решение имеет свои достоинства, а недостатки, как очевидно, легко устранимы. Поэтому данная программа имеет множество сторонников применения в самых разных компаниях.
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59