Ми запустили офіційний провайдер Terraform для роботи з Selectel. Цей продукт дозволяє користувачам повністю реалізувати керування ресурсами через методологію Infrastructure-as-code (інфраструктура як код).
На даний час провайдер підтримує управління ресурсами послуги. «Віртуальна приватна хмара» (Далі VPC). У майбутньому ми плануємо додати до нього управління ресурсами інших послуг, що надаються Selectel.
Як ви вже знаєте, послуга VPC побудована на базі OpenStack. Однак, через те, що OpenStack не надає нативних засобів для обслуговування публічної хмари, ми реалізували недостатню функціональність у наборі додаткових API, які спрощують керування складними складовими об'єктами та роблять роботу зручнішою. Частина функціональності, доступна в OpenStack, закрита від використання безпосередньо, але доступна через наш API.
У Terraform-провайдері Selectel зараз реалізована можливість керування наступними ресурсами VPC:
проекти та їх квоти;
користувачі, їх ролі та токени;
публічні підмережі, у тому числі крос-регіональні та VRRP;
ліцензії ПЗ.
Провайдер використовує нашу публічну Go-бібліотеку для роботи з API VPC. І бібліотека, і сам провайдер є open-source, їх розробка ведеться на Github:
Для керування іншими ресурсами хмари, такими як віртуальні машини, диски, кластери Kubernetes, можна використовувати Terraform-провайдер OpenStack. Офіційна документація для обох провайдерів доступна за такими посиланнями:
Маніфести для роботи з Selectel створюються за допомогою Terraform або використовуючи набір готових прикладів, які доступні в нашому Github-репозиторії: terraform-examples.
Репозиторій із прикладами розбито на дві директорії:
Модулі, що містить невеликі модулі, що перевикористовуються, які приймають на вхід набір параметрів і управляють невеликим набором ресурсів;
Прикладимістить приклади повного набору пов'язаних між собою модулів.
Після встановлення Terraform, створення ключа Selectel API та ознайомлення з прикладами, переходимо до практичних прикладів.
У файлі vars.tf описано всі параметри, які будуть використані під час виклику модулів. Деякі з них мають значення за промовчанням, наприклад, сервер буде створено в зоні ru-3a з наступною конфігурацією:
аргумент ignore_changes дозволяє ігнорувати зміну атрибуту id для образу, що використовується створення віртуальної машини. У сервісі VPC більшість публічних образів оновлюються автоматично раз на тиждень і при цьому їх id також змінюється. Це пов'язано з особливостями роботи компонента OpenStack — Glance, у якому образи вважаються незмінними сутностями.
Якщо створюється або змінюється існуючий сервер або диск, у якого як аргумент image_id використовується id публічного образу, після того як цей образ буде оновлений, повторний запуск маніфесту Terraform призведе до перестворення сервера або диска. Використання аргументу ignore_changes дозволяє уникнути такої ситуації.
Примітка: аргумент ignore_changes з'явився у Terraform досить давно: pull#2525.
аргумент ignore_resize_confirmation необхідний успішного зміни розміру локального диска, ядер чи пам'яті сервера. Такі зміни здійснюються через компонент OpenStack Nova за допомогою запиту змінити розмір. За промовчанням Nova після запиту змінити розмір переводить сервер у статус verify_resize та чекає від користувача додаткового підтвердження. Однак цю поведінку можна змінити так, щоб компанія Nova не чекала від користувача додаткових дій.
Зазначений аргумент дозволяє Terraform не чекати статусу verify_resize для сервера та бути готовим до того, що сервер опиниться в активному статусі після зміни його параметрів. Аргумент доступний з версії 1.10.0 Terraform-провайдера OpenStack: pull#422.
Створення ресурсів
Перед запуском маніфестів слід врахувати, що в нашому прикладі запускаються два різні провайдери, причому провайдер OpenStack залежить від ресурсів провайдера Selectel, оскільки без створення користувача в проекті управляти об'єктами, що йому належать, неможливо. На жаль, з цієї причини ми не можемо просто запустити команду Терраформи застосовуються усередині нашого прикладу. Нам потрібно спочатку зробити застосовувати для модуля project_with_user і вже після цього для решти.
Примітка: зазначена проблема ще не вирішена в Terraform, за її обговоренням можна стежити на Github випуск №2430 и випуск №4149.
Після запуску команди Terraform покаже, які ресурси він хоче створити та вимагатиме підтвердження:
Plan: 3 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
Як тільки проект, користувач і роль буде створено, можна запустити створення інших ресурсів:
З створеною віртуальною машиною можна працювати через SSH за вказаним IP.
Редагування ресурсів
Крім створення ресурсів через Terraform їх також можна змінювати.
Для прикладу збільшимо кількість ядер і пам'яті для нашого сервера, змінивши значення параметрів server_vcpus и server_ram_mb у файлі examples/vpc/server_local_root_disk/main.tf:
В обох випадках потрібно підтвердити видалення всіх об'єктів:
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value: yes
Цей приклад створює проект, користувача з роллю у проекті та піднімає один кластер Kubernetes. У файлі vars.tf можна побачити значення за промовчанням, такі як кількість нод, їх характеристики, версія Kubernetes та інше.
Для створення ресурсів аналогічно першому прикладу насамперед запустимо ініціалізацію модулів та створення ресурсів модуля project_with_user, а потім створення решти:
Передамо створення та керування кластерами Kubernetes через компонент OpenStack Magnum. Докладніше про те, як працювати з кластером, ви можете дізнатися в одній із наших попередніх статей, а також в базі знань.
При підготовці кластера будуть створені диски, віртуальні машини та буде встановлено всі необхідні компоненти. Підготовка займає близько 4 хвилин, у цей час Terraform виводитиме повідомлення виду:
module.kubernetes_cluster.openstack_containerinfra_cluster_v1.cluster_1: Still creating... (3m0s elapsed)
Після завершення встановлення Terraform повідомить, що кластер готовий і відобразить його ідентифікатор:
Для керування створеним кластером Kubernetes через утиліту кубектл потрібно отримати файл доступу до кластера. Для цього перейдіть до проекту, створеного через Terraform, у списку проектів вашого облікового запису:
Далі перейдіть за посиланням виду xxxxxx.selvpc.ru, яка відображається нижче імені проекту:
Як дані для входу використовуйте ім'я та пароль користувача, створені через Terraform. Якщо ви не зраджували vars.tf або main.tf для нашого прикладу, то користувач матиме ім'я tf_user. Як пароль потрібно використовувати значення змінної TF_VAR_user_password, яке було вказано під час запуску Терраформи застосовуються раніше.
Всередині проекту потрібно перейти на вкладку Кубернетес:
Тут розташований кластер, створений через Terraform. Завантажити файл для кубектл можна на вкладці «Доступ»:
На цій же вкладці знаходиться інструкція з встановлення кубектл та використання скачаного config.yaml.
після запуску кубектл та установки змінної оточення KUBECONFIG можна використовувати Kubernetes:
При зміні кількості нід кластер залишатиметься доступним. Після додавання ноди через Terraform можна використовувати її без додаткової конфігурації:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
tf-cluster-rz6nggvs4va7-master-0 Ready,SchedulingDisabled master 8m v1.12.4
tf-cluster-rz6nggvs4va7-minion-0 Ready <none> 8m v1.12.4
tf-cluster-rz6nggvs4va7-minion-1 Ready <none> 8m v1.12.4
tf-cluster-rz6nggvs4va7-minion-2 Ready <none> 3m v1.12.4
Висновок
У цій статті ми ознайомилися з основними способами роботи з «Віртуальною приватною хмарою» через Terraform. Будемо раді, якщо ви скористаєтеся офіційним Terraform-провайдером Selectel і надаєте зворотній зв'язок.
Про всі знайдені баги Terraform-провайдера Selectel можна повідомити за допомогою Проблеми Github.