Terraform-правайдэр Selectel

Terraform-правайдэр Selectel

Мы запусцілі афіцыйны 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. Афіцыйная дакументацыя для абодвух правайдэраў даступная па наступных спасылках:

Пачатак працы

Для пачатку працы неабходна ўсталяваць Terraform (інструкцыі і спасылкі на ўсталявальныя пакеты можна паглядзець на афіцыйным сайце).

Для працы правайдэру патрабуецца ключ Selectel API, які ствараецца ў панэлі кіравання для акаўнта.

Маніфесты для працы з Selectel ствараюцца з дапамогай Terraform або выкарыстоўваючы набор гатовых прыкладаў, якія даступныя ў нашым Github-рэпазітары: terraform-examples.

Рэпазітар з прыкладамі разбіты на дзве дырэкторыі:

  • модулі, Утрымоўвальная невялікія перавыкарыстоўваныя модулі, якія прымаюць на ўваход набор параметраў і кіруюць невялікім наборам рэсурсаў;
  • Прыклады, Якая змяшчае прыклады поўнага набору звязаных паміж сабой модуляў.

Пасля ўсталёўкі Terraform, стварэнні ключа Selectel API і азнаямленні з прыкладамі, пераходзім да практычных прыкладаў.

Прыклад стварэння сервера з лакальнай кружэлкай

Разгледзім прыклад стварэння праекту, карыстача з роляй і віртуальнай машынай з лакальнай кружэлкай: terraform-examples/examples/vpc/server_local_root_disk.

У файле vars.tf апісаны ўсе параметры, якія будуць скарыстаны пры выкліку модуляў. Некаторыя з іх маюць значэнні па змаўчанні, напрыклад, сервер будзе створаны ў зоне by-3a з наступнай канфігурацыяй:

variable "server_vcpus" {
default = 4
}

variable "server_ram_mb" {
default = 8192
}

variable "server_root_disk_gb" {
default = 8
}

variable "server_image_name" {
default = "Ubuntu 18.04 LTS 64-bit"
}

У файле main.tf адбываецца ініцыялізацыя правайдэра Selectel:

provider "selectel" {
token    = "${var.sel_token}"
}

Таксама ў гэтым файле пазначана значэнне па змаўчанні для SSH-ключа, які будзе ўсталяваны на сервер:

module "server_local_root_disk" {
...
server_ssh_key      = "${file("~/.ssh/id_rsa.pub")}"
}

Пры неабходнасці можна пазначыць іншы публічны ключ. Ключ не абавязкова паказваць у выглядзе шляху да файла, таксама можна дадаць значэнне ў выглядзе радка.

Далей у гэтым файле запускаюцца модулі project_with_user и server_local_root_disk, якія кіруюць неабходнымі рэсурсамі.

Разбяром падрабязней гэтыя модулі.

Стварэнне праекта і карыстальніка з роляй

Першы модуль стварае праект і карыстальніка з роляй у гэтым праекце: terraform-examples/modules/vpc/project_with_user.

Створаны карыстач зможа аўтарызавацца ў OpenStack і кіраваць яго рэсурсамі. Модуль просты і кіруе ўсяго трыма сутнасцямі:

  • selectel_vpc_project_v2,
  • selectel_vpc_user_v2,
  • selectel_vpc_role_v2.

Стварэнне віртуальнага сервера з лакальнай кружэлкай

Другі модуль займаецца кіраваннем аб'ектамі OpenStack, якія неабходны для стварэння сервера з лакальнай кружэлкай.

Варта звярнуць увагу на некаторыя аргументы, якія пазначаны ў гэтым модулі для рэсурса openstack_compute_instance_v2:

resource "openstack_compute_instance_v2" "instance_1" {
  ...

  lifecycle {
    ignore_changes = ["image_id"]
  }

  vendor_options {
    ignore_resize_confirmation = true
  }
}

аргумент 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-examples/examples/vpc/server_local_root_disk, яе змесціва павінна быць такім:

$ ls
README.md	   main.tf		vars.tf

Ініцыялізуем модулі пры дапамозе каманды:

$ terraform init

У выснове відаць, што Terraform спампоўвае апошнія версіі выкарыстоўваных правайдэраў і правярае ўсе модулі, апісаныя ў прыкладзе.

Спачатку прымянім модуль project_with_user. Пры гэтым патрабуецца ўручную перадаць значэнні для зменных, якія не былі ўсталяваныя:

  • sel_account з нумарам вашага акаўнта Selectel;
  • sel_token з вашым ключом для Selectel API;
  • user_password з паролем для карыстальніка OpenStack.

Значэнні для першых двух зменных трэба ўзяць з панэлі кіравання.

Для апошняй зменнай можна прыдумаць любы пароль.

Для прымянення модуля неабходна замяніць значэння SEL_ACCOUNT, SEL_TOKEN и USER_PASSWORD запускам каманды:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply -target=module.project_with_user

Пасля запуску каманды 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

Як толькі праект, карыстач і роля будуць створаны, можна запусціць стварэнне астатніх рэсурсаў:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply

Пры стварэнні рэсурсаў звернеце ўвагу на выснову Terraform з вонкавым IP-адрасам, па якім будзе даступны створаны сервер:

module.server_local_root_disk.openstack_networking_floatingip_associate_v2.association_1: Creating...
  floating_ip: "" => "x.x.x.x"

З створанай віртуальнай машынай можна працаваць праз SSH па паказаным IP.

Рэдагаванне рэсурсаў

Апроч стварэння рэсурсаў праз Terraform, іх таксама можна змяняць.

Для прыкладу павялічым колькасць ядраў і памяці для нашага сервера, змяніўшы значэнні для параметраў server_vcpus и server_ram_mb у файле examples/vpc/server_local_root_disk/main.tf:

-  server_vcpus        = "${var.server_vcpus}"
-  server_ram_mb       = "${var.server_ram_mb}"
+  server_vcpus        = 8
+  server_ram_mb       = 10240

Пасля гэтага правяраем, да якіх змен гэта прывядзе, пры дапамозе наступнай каманды:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform plan

У выніку Terraform зрабіў змену рэсурсаў openstack_compute_instance_v2 и openstack_compute_flavor_v2.

Звярніце ўвагу, што гэта пацягне за сабой перазагрузку створанай віртуальнай машыны.

Для прымянення новай канфігурацыі віртуальнай машыны выкарыстоўвайце каманду terraform ўжываць, якую мы ўжо запускалі раней.

Усе створаныя аб'екты будуць адлюстроўвацца ў панэлі кіравання VPC:

Terraform-правайдэр Selectel

У нашым рэпазітары прыкладаў таксама можна азнаёміцца ​​з маніфестамі для стварэння віртуальных машын з сеткавымі кружэлкамі.

Прыклад стварэння кластара Kubernetes

Перад тым як перайсці да наступнага прыкладу, мы ачысцім створаныя раней рэсурсы. Для гэтага ў корані праекту terraform-examples/examples/vpc/server_local_root_disk запусцім каманду выдалення аб'ектаў OpenStack:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform destroy -target=module.server_local_root_disk

Затым запусцім каманду ачышчэння аб'ектаў Selectel VPC API:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform destroy -target=module.project_with_user

У абодвух выпадках запатрабуецца пацвердзіць выдаленне ўсіх аб'ектаў:

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

Наступны прыклад знаходзіцца ў дырэкторыі terraform-examples/examples/vpc/kubernetes_cluster.

Гэты прыклад стварае праект, карыстальніка з роляй у праекце і паднімае адзін кластар Kubernetes. У файле vars.tf можна ўбачыць значэння па змаўчанні, такія як колькасць нод, іх характарыстыкі, версія Kubernetes і іншае.

Для стварэння рэсурсаў аналагічна першаму прыкладу перш за ўсё запусцім ініцыялізацыю модуляў і стварэнне рэсурсаў модуля project_with_user, а затым стварэнне ўсяго астатняга:

$ terraform init

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply -target=module.project_with_user

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply

Перададзім стварэнне і кіраванне кластарамі Kubernetes праз кампанент OpenStack Magnum. Больш падрабязна аб тым, як працаваць з кластарам, вы можаце даведацца ў адной з нашых папярэдніх артыкулаў, а таксама ў базе ведаў.

Пры падрыхтоўцы кластара будуць створаны дыскі, віртуальныя машыны і адбудзецца ўстаноўка ўсіх неабходных кампанентаў. Падрыхтоўка займае каля 4 хвілін, у гэты час Terraform будзе выводзіць паведамленні віду:

module.kubernetes_cluster.openstack_containerinfra_cluster_v1.cluster_1: Still creating... (3m0s elapsed)

Пасля завяршэння ўстаноўкі Terraform паведаміць, што кластар гатовы і адлюструе яго ідэнтыфікатар:

module.kubernetes_cluster.openstack_containerinfra_cluster_v1.cluster_1: Creation complete after 4m20s (ID: 3c8...)

Apply complete! Resources: 6 added, 0 changed, 0 destroyed.

Для кіравання створаным кластарам Kubernetes праз утыліту кубектль неабходна атрымаць файл доступу да кластара. Для гэтага перайдзіце ў праект, створаны праз Terraform, у спісе праектаў вашага акаўнта:

Terraform-правайдэр Selectel

Далей перайдзіце па спасылцы віду xxxxxx.selvpc.ru, якая адлюстроўваецца ніжэй імя праекта:

Terraform-правайдэр Selectel

У якасці дадзеных для ўваходу выкарыстоўвайце імя і пароль карыстальніка, якія былі створаны праз Terraform. Калі вы не змянялі vars.tf або main.tf для нашага прыкладу, то карыстач будзе мець імя tf_user. У якасці пароля трэба выкарыстоўваць значэнне зменнай TF_VAR_user_password, якое было пазначана пры запуску terraform ўжываць раней.

Унутры праекта вам трэба перайсці на ўкладку Kubernetes:

Terraform-правайдэр Selectel

Тут размешчаны кластар, створаны праз Terraform. Спампаваць файл для кубектль можна на ўкладцы «Доступ»:

Terraform-правайдэр Selectel

На гэтай жа ўкладцы знаходзіцца інструкцыя па ўстаноўцы кубектль і выкарыстанню запампаванага config.yaml.

пасля запуску кубектль і ўстаноўкі зменнай асяроддзя KUBECONFIG можна выкарыстоўваць Kubernetes:

$ kubectl get pods --all-namespaces

NAMESPACE        NAME                                    READY  STATUS  RESTARTS AGE
kube-system   coredns-9578f5c87-g6bjf                      1/1   Running   0 8m
kube-system   coredns-9578f5c87-rvkgd                     1/1   Running   0 6m
kube-system   heapster-866fcbc879-b6998                 1/1   Running   0 8m
kube-system   kube-dns-autoscaler-689688988f-8cxhf             1/1   Running   0 8m
kube-system   kubernetes-dashboard-7bdb5d4cd7-jcjq9          1/1   Running   0 8m
kube-system   monitoring-grafana-84c97bb64d-tc64b               1/1   Running   0 8m
kube-system   monitoring-influxdb-7c8ccc75c6-dzk5f                1/1   Running   0 8m
kube-system   node-exporter-tf-cluster-rz6nggvs4va7-minion-0 1/1   Running   0 8m
kube-system   node-exporter-tf-cluster-rz6nggvs4va7-minion-1 1/1   Running   0 8m
kube-system   openstack-cloud-controller-manager-8vrmp        1/1   Running   3 8m
prometeus-monitoring   grafana-76bcb7ffb8-4tm7t       1/1   Running   0 8m
prometeus-monitoring   prometheus-75cdd77c5c-w29gb           1/1   Running   0 8m

Колькасць нод кластара лёгка змяняецца праз Terraform.
У файле main.tf паказана наступнае значэнне:

cluster_node_count = "${var.cluster_node_count}"

Гэта значэнне падстаўляецца з vars.tf:

variable "cluster_node_count" {
default = 2
}

Можна змяніць альбо значэнне па змаўчанні ў vars.tf, альбо пазначыць патрэбнае значэнне напрамую ў main.tf:

-  cluster_node_count = "${var.cluster_node_count}"
+  cluster_node_count = 3

Для прымянення змен, як і ў выпадку з першым прыкладам, скарыстайцеся камандай terraform ўжываць:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply

Пры змене колькасці нод кластар будзе заставацца даступным. Пасля дадання ноды праз 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.

Крыніца: habr.com

Дадаць каментар