Мы запусцілі афіцыйны 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 апісаны ўсе параметры, якія будуць скарыстаны пры выкліку модуляў. Некаторыя з іх маюць значэнні па змаўчанні, напрыклад, сервер будзе створаны ў зоне by-3a з наступнай канфігурацыяй:
Пры неабходнасці можна пазначыць іншы публічны ключ. Ключ не абавязкова паказваць у выглядзе шляху да файла, таксама можна дадаць значэнне ў выглядзе радка.
Далей у гэтым файле запускаюцца модулі project_with_user и server_local_root_disk, якія кіруюць неабходнымі рэсурсамі.
аргумент 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, бо без стварэння карыстача ў праекце кіраваць прыналежнымі яму аб'ектамі немагчыма. Нажаль, па гэтай жа чынніку мы не можам проста запусціць каманду terraform ўжываць ўнутры нашага прыкладу. Нам спатрэбіцца спачатку зрабіць ўжываць для модуля project_with_user і ўжо пасля гэтага для ўсяго астатняга.
Заўвага: названая праблема яшчэ не вырашана ў Terraform, за яе абмеркаваннем можна сачыць на Github у issue#2430 и issue#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 ўжываць раней.
Унутры праекта вам трэба перайсці на ўкладку Kubernetes:
Тут размешчаны кластар, створаны праз 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 Issues.