Блог ·
Як обрати діапазон VMID для хостинг-бізнесу
VMID є ідентичністю, а не лічильником. Що вирішує обраний діапазон: що платформа може створювати, що може читати і що станеться, коли він заповниться.
Автор: Provibr
Кожна інсталяція Proxmox починає вас зі 100 і рахує вгору. Це чудово працює, поки машина не перестає бути тільки вашою: поки на ній не зʼявиться панель керування, що створює гостей, колега, який створює гостей руками, бібліотека шаблонів і завдання резервного копіювання, яке щось відновлює о третій ночі.
У цій точці VMID перестає бути лічильником і стає ідентичністю, а діапазон, який ви віддаєте своїй автоматизації, перестає бути зручністю і стає межею. Його варто обирати свідомо, бо дві з трьох речей, які вирішує діапазон, невидимі, поки не підуть не так.
Що Proxmox насправді дозволяє
Увесь простір ширший, ніж більшість припускає:
| Значення | |
|---|---|
| Найнижчий VMID, який приймає Proxmox | 100 |
| Найвищий VMID, який приймає Proxmox | 999999999 |
| Типове ручне використання | від 100 до кількох сотень |
Девʼять цифр. Це не запрошення використати їх усі, але це означає, що звична турбота, «чи вони в мене закінчаться», є неправильною турботою. Погано обраний діапазон закінчиться у вас задовго до того, як закінчаться числа.
Ті дві межі це єдине, що навʼязує гіпервізор. Усе інше, та частина, яка має значення, є вашим рішенням.
Діапазон є межею дозволу раніше, ніж розподільником
Ось частина, яку легко проґавити. Якщо платформі сказано «ти розподіляєш від 5000 до 8999», їй сказано дві речі одночасно:
- Що вона може створювати. Нові гості отримують число з того вікна й нізвідки більше.
- Що не ваше. Усе поза тим вікном зробив хтось інший, і платформі нема чого його торкатися.
Друге варто написати на стіні. Коли ми будували інтеграцію з Proxmox, діапазон vmid у налаштуваннях інтеграції описано в коді саме так: платформа розподіляє лише всередині [vmidRangeStart, vmidRangeEnd], тож інтеграція за побудовою не може дотягнутися до VM поза ним. Хто тримає свої продакшн-машини поза діапазоном, тримає їх поза досяжністю.
Таке формулювання змінює те, як ви обираєте числа. Ви обираєте не місце, звідки ваша автоматизація почне рахувати. Ви проводите лінію навколо машин, які ви готові дозволити програмі видалити.
Читання це окреме питання, і воно кусає пізніше
Створення це очевидна половина. Читання це та половина, яка нас здивувала.
Наш агент опитує кластер раз на раунд одним GET /cluster/resources?type=vm, який не торкається жодного гостя. Але для кожного запущеного гостя з тієї відповіді він далі робив ще два виклики до гостьового агента QEMU, network-get-interfaces і get-fsinfo, щоб дізнатися адреси та використання диска. Той список ішов просто із запиту до кластера, без фільтра.
На тестовому гіпервізорі, який також несе продакшн-навантаження, до того списку потрапили продакшн-машини. Ці читання нешкідливі в тому сенсі, що нічого не записується. Вони не нешкідливі в тому сенсі, який має значення, бо «лише читання» не є відповіддю на питання чому ваш агент розмовляє з гостьовим агентом машини, яка вам не належить.
Виправлення полягає в тому, що той самий діапазон тепер обмежує й читання. Якщо ви будуєте таке самі, урок узагальнюється: межа, що покриває лише запис, є половиною межі, а половина для читання це та, відсутності якої ніхто не помічає.
Де має жити діапазон
Нам довелося відповісти на це один раз, і міркування варто проговорити, бо очевидна відповідь неправильна.
Очевидна відповідь це покласти діапазон поруч із обліковими даними, у той блок, який платформа надсилає агентові при створенні інтеграції. Це одне повідомлення, воно приходить разом з усім іншим, готово.
Це падає на перезапуску. Облікові дані надсилаються один раз; після перезапуску агент відбудовує свої інтеграції з локального сховища, без надсилання. Межа, доставлена тим шляхом, тихо зникає першого ж разу, коли процес перезапускається, а межа, що мовчки перестає діяти, гірша за відсутність межі, бо ніхто не піде її шукати.
Тож діапазон їде власним повідомленням, яке надсилається на кожному рукостисканні сесії і несе повний стан. Два шляхи доставки, одне джерело правди. Є ще змінна середовища на рівні хоста як запасний варіант, і порядок між ними свідомий:
| Джерело | Коли перемагає |
|---|---|
| Налаштування платформи | Щоразу, коли вона його надіслала |
| Змінна середовища хоста | Лише коли платформа нічого не сказала |
| Жодного обмеження | Коли не сказав ніхто |
Спокусливий порядок зворотний, за теорією, що пасок, застібнутий на хості, міцніший. Вона породжує стан, якого ніхто не бачить: адміністратор, який колись виставив змінну, мовчки тримає межу, що більше не збігається з показаним у панелі, а клієнт, який розширив діапазон в інтерфейсі, не може збагнути, чому нічого не змінилося.
Одна дрібна деталь із великим режимом відмови: нечитабельне значення трактується як «ніхто», а не як «усі». Хтось, хто просить межу й робить одруківку, не отримує читань узагалі плюс рядок у журналі з поясненням. Ціна косметична: відсутні адреса й цифра диска в панелі. Альтернатива, відкат до «дозволено все», є класичною відмовою білого списку: вона fail-open, мовчки, рівно в тому випадку, коли хтось намагався бути обережним.
Шаблони йдуть поза діапазон. Завжди.
Це правило, а не вподобання, і це помилка, яка зʼїдає сама себе.
Розподільник роздає числа з діапазону. Покладіть шаблон усередину діапазону, і одного дня розподільник дійде до нього, на тому числі буде створено нове замовлення, і шаблон стане клієнтською машиною. Наступне замовлення клонується з машини, яка вже не є шаблоном. Тож валідатор відхиляє VMID шаблона Proxmox, що потрапляє всередину діапазону інтеграції, а розподільник додатково вважає кожен привʼязаний шаблон зайнятим, на випадок, якщо хтось розширив діапазон після привʼязки.
Поза діапазоном шаблон може жити де завгодно. Діапазон обмежує те, що платформа створює, а не місце, де дозволено лежати вихідному матеріалу.
Ніколи не використовуйте число повторно, навіть коли машини вже немає
Розподільник роздає найнижчий вільний VMID у діапазоні, і «вільний» тут суворіше, ніж ви очікуєте: кожен VMID, який інтеграція колись видала, вважається зайнятим, включно з тими, що належали видаленим серверам.
Секунд пʼять це має вигляд марнотратства, поки ви не подумаєте, що означало б повторне використання. Запізніла подія стану від старої VM приземляється на новий рядок. Історія аудиту двох різних серверів зливається в одну стрічку. Хтось відновлює вчорашню резервну копію на число, яке тепер належить іншому клієнтові.
Цікаво, що для IP-адрес у тому самому продукті ми робимо протилежний вибір, і з поважної причини: адреса це адреса, і ніколи не використовувати її повторно означало б назавжди вичерпати /24 після 254 машин. VMID це імʼя для історії машини. Діапазони дешеві; плутанина ні.
Є третя категорія «зайнятого», яка проявляється лише тоді, коли машини створює більш ніж одна річ. Відновлення, яке ще триває, вже застовпило цільовий VMID, але ще не має рядка сервера, тож другому відновленню в ту саму хвилину інакше видали б те саме «вільне» число. Усе, що резервує VMID до появи рядка, має бути враховано.
Що стається, коли діапазон заповнюється
Дві відповіді, і мають існувати обидві.
Привітна це арифметика: розподільник сканує діапазон, не знаходить нічого вільного і повертає конкретну відмову, яка називає початок і кінець діапазону. Клієнт читає «цей діапазон повний, від 5000 до 8999», а не помилку гіпервізора чотирма шарами нижче.
Справжня це база даних. Унікальне обмеження на (інтеграція, зовнішній ідентифікатор) є суддею: два замовлення, розміщені в ту саму мить, можуть обидва побачити те саме найнижче вільне число, і рівно одна вставка виживе. Той, хто програв, повторює спробу, до невеликої фіксованої кількості разів. Спершу перевірити, а потім вставити відкриває рівно те вікно, яке обмеження закриває, тож механізмом є обмеження, а привітне повідомлення це любʼязність поверх нього.
Зверніть увагу на те, чого ми не використовуємо: у Proxmox є endpoint для наступного вільного ідентифікатора, і тут це неправильний інструмент. Він відповідає на «яке число вільне в цьому кластері», а це інше питання, ніж «яке число вільне й усередині вікна, що належить мені». Спитайте гіпервізор, і рано чи пізно вам видадуть число поза вашою власною межею.
Отже, практично
- Починайте високо й не чіпайте низькі числа. Від 100 до кількох сотень це місце, де на кожній інсталяції Proxmox живуть зроблені руками машини, включно з вашою через три роки, коли ви забудете про це рішення.
- Оберіть діапазон з очевидною формою. Від 5000 до 8999 читається як «наше» з першого погляду у вебінтерфейсі. Діапазон із 4000 чисел це чотири тисячі машин на одній інтеграції.
- Покладіть шаблони поза ним, у власний блок, далеко.
- Запишіть діапазон там, де його бачить платформа, а не лише у файлі конфігурації хоста, і подбайте, щоб він надсилався повторно, а не один раз.
- Перевірте, що читання теж обмежені, а не лише створення й видалення.
Саме число значить небагато. Значення має те, що межа є однією річчю, видимою в одному місці, застосованою однаково до читань і записів, і що вона fail-closed, коли її не вдається прочитати.
Це вийшло з побудови інтеграції з Proxmox для Provibr, де агент працює всередині власної мережі клієнта і зʼєднується лише назовні.