Poskytovateľ Terraform Selectel

Poskytovateľ Terraform Selectel

Spustili sme oficiálneho poskytovateľa Terraform pre spoluprácu so Selectel. Tento produkt umožňuje používateľom plne implementovať správu zdrojov prostredníctvom metodiky Infrastructure-as-code.

Poskytovateľ v súčasnosti podporuje správu zdrojov služby "Virtuálny súkromný cloud" (ďalej len VPC). V budúcnosti plánujeme pridať správu zdrojov pre ďalšie služby poskytované spoločnosťou Selectel.

Ako už viete, služba VPC je postavená na OpenStack. Vzhľadom na to, že OpenStack neposkytuje natívne nástroje na obsluhu verejného cloudu, implementovali sme chýbajúcu funkcionalitu do sady ďalších API, ktoré zjednodušujú správu zložitých kompozitných objektov a uľahčujú prácu. Niektoré funkcie dostupné v OpenStack sú uzavreté z priameho používania, ale sú dostupné prostredníctvom naše API.

Poskytovateľ Selectel Terraform teraz zahŕňa možnosť spravovať nasledujúce zdroje VPC:

  • projekty a ich kvóty;
  • používatelia, ich úlohy a tokeny;
  • verejné podsiete vrátane medziregionálnych a VRRP;
  • softvérové ​​licencie.

Poskytovateľ používa našu verejnú knižnicu Go na prácu s VPC API. Knižnica aj samotný poskytovateľ sú open-source, ich vývoj prebieha na Github:

Na správu iných cloudových prostriedkov, ako sú virtuálne počítače, disky, klastre Kubernetes, môžete použiť poskytovateľa OpenStack Terraform. Oficiálna dokumentácia pre oboch poskytovateľov je k dispozícii na nasledujúcich odkazoch:

Začíname

Ak chcete začať, musíte si nainštalovať Terraform (pokyny a odkazy na inštalačné balíčky nájdete na oficiálne internetové stránky).

Na fungovanie poskytovateľ vyžaduje kľúč Selectel API, ktorý je vytvorený v ovládacie panely účtov.

Manifesty pre prácu so Selectel sa vytvárajú pomocou Terraformu alebo pomocou sady hotových príkladov, ktoré sú dostupné v našom úložisku Github: terraform-príklady.

Úložisko s príkladmi je rozdelené do dvoch adresárov:

  • Moduly, ktorý obsahuje malé opakovane použiteľné moduly, ktoré berú súbor parametrov ako vstup a riadia malý súbor zdrojov;
  • Príklady, ktorý obsahuje príklady kompletnej sady vzájomne prepojených modulov.

Po inštalácii Terraformu, vytvorení kľúča Selectel API a oboznámení sa s príkladmi prejdime na praktické príklady.

Príklad vytvorenia servera s lokálnym diskom

Pozrime sa na príklad vytvorenia projektu, používateľa s rolou a virtuálneho počítača s lokálnym diskom: terraform-examples/examples/vpc/server_local_root_disk.

V súbore vars.tf sú popísané všetky parametre, ktoré sa použijú pri volaní modulov. Niektoré z nich majú predvolené hodnoty, napríklad server sa vytvorí v zóne ru-3a s nasledujúcou konfiguráciou:

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"
}

V súbore main.tf Poskytovateľ Selectel je inicializovaný:

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

Tento súbor obsahuje aj predvolenú hodnotu pre kľúč SSH, ktorý sa nainštaluje na server:

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

V prípade potreby môžete zadať iný verejný kľúč. Kľúč nemusí byť zadaný ako cesta k súboru, hodnotu môžete pridať aj ako reťazec.

Ďalej v tomto súbore sa spúšťajú moduly projekt_s_používateľom и server_local_root_disk, ktoré spravujú potrebné zdroje.

Pozrime sa na tieto moduly podrobnejšie.

Vytvorenie projektu a používateľa s rolou

Prvý modul vytvorí projekt a používateľa s rolou v tomto projekte: terraform-examples/modules/vpc/project_with_user.

Vytvorený používateľ sa bude môcť prihlásiť do OpenStack a spravovať jeho zdroje. Modul je jednoduchý a spravuje iba tri entity:

  • selectel_vpc_project_v2,
  • selectel_vpc_user_v2,
  • selectel_vpc_role_v2.

Vytvorenie virtuálneho servera s lokálnym diskom

Druhý modul sa zaoberá správou OpenStack objektov, ktoré sú potrebné na vytvorenie servera s lokálnym diskom.

Mali by ste venovať pozornosť niektorým argumentom, ktoré sú špecifikované v tomto module pre zdroj openstack_compute_instance_v2:

resource "openstack_compute_instance_v2" "instance_1" {
  ...

  lifecycle {
    ignore_changes = ["image_id"]
  }

  vendor_options {
    ignore_resize_confirmation = true
  }
}

argument ignore_changes umožňuje ignorovať zmeny atribútov id pre obrázok použitý na vytvorenie virtuálneho počítača. V službe VPC sa väčšina verejných obrázkov aktualizuje automaticky raz týždenne a zároveň ich id sa tiež mení. Je to spôsobené zvláštnosťami komponentu OpenStack – Glance, v ktorom sú obrázky považované za nemenné entity.

Ak vytvárate alebo upravujete existujúci server alebo disk, ktorý má ako argument image_id použitý id verejný obrázok, potom po aktualizácii tohto obrázka opätovným spustením manifestu Terraform znova vytvoríte server alebo disk. Použitie argumentu ignore_changes umožňuje vyhnúť sa takejto situácii.

Poznámka: argument ignore_changes sa objavil v Terraforme už veľmi dávno: vytiahnuť#2525.

argument ignore_resize_confirmation potrebné na úspešnú zmenu veľkosti lokálneho disku, jadier alebo pamäte servera. Takéto zmeny sa vykonávajú prostredníctvom komponentu OpenStack Nova pomocou požiadavky veľkosť. Predvolená Nova po vyžiadaní veľkosť uvedie server do stavu over_resize a čaká na dodatočné potvrdenie od používateľa. Toto správanie sa však dá zmeniť, aby Nova nečakala na ďalšie akcie od používateľa.

Zadaný argument umožňuje Terraformu nečakať na stav over_resize pre server a buďte pripravení na to, že po zmene parametrov bude server v aktívnom stave. Argument je dostupný od verzie 1.10.0 poskytovateľa OpenStack Terraform: vytiahnuť#422.

Vytváranie zdrojov

Pred spustením manifestov si prosím všimnite, že v našom príklade sú spustení dvaja rôzni poskytovatelia a poskytovateľ OpenStack závisí od zdrojov poskytovateľa Selectel, pretože bez vytvorenia používateľa v projekte nie je možné spravovať objekty, ktoré mu patria. . Bohužiaľ, z rovnakého dôvodu nemôžeme príkaz len spustiť terraform platí v našom príklade. Najprv musíme urobiť platiť pre modul projekt_s_používateľom a potom na všetko ostatné.

Poznámka: Tento problém ešte nie je vyriešený v Terraforme, diskusiu môžete sledovať na Github na problém#2430 и problém#4149.

Ak chcete vytvoriť prostriedky, prejdite do adresára terraform-examples/examples/vpc/server_local_root_disk, jeho obsah by mal byť takýto:

$ ls
README.md	   main.tf		vars.tf

Moduly inicializujeme príkazom:

$ terraform init

Výstup ukazuje, že Terraform sťahuje najnovšie verzie poskytovateľov, ktorých používa, a kontroluje všetky moduly opísané v príklade.

Najprv aplikujme modul projekt_s_používateľom. To si vyžaduje manuálne odovzdanie hodnôt pre premenné, ktoré neboli nastavené:

  • sel_account s vaším číslom účtu Selectel;
  • sel_token s vaším kľúčom pre Selectel API;
  • užívateľské_heslo s heslom pre používateľa OpenStack.

Hodnoty pre prvé dve premenné musia byť prevzaté z ovládacie panely.

Pre poslednú premennú môžete prísť s ľubovoľným heslom.

Ak chcete použiť modul, musíte nahradiť hodnoty SEL_ACCOUNT, SEL_TOKEN и USER_PASSWORD spustenie príkazu:

$ 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

Po spustení príkazu Terraform ukáže, aké zdroje chce vytvoriť a požiada o potvrdenie:

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

Po vytvorení projektu, používateľa a roly môžete začať vytvárať zostávajúce zdroje:

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

Pri vytváraní zdrojov venujte pozornosť výstupu Terraform s externou IP adresou, kde bude vytvorený server prístupný:

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

S vytvoreným virtuálnym strojom môžete pracovať cez SSH pomocou zadanej IP.

Úprava zdrojov

Okrem vytvárania zdrojov cez Terraform sa dajú aj upravovať.

Zvýšme napríklad počet jadier a pamäte pre náš server zmenou hodnôt parametrov server_vcpus и server_ram_mb v súbore example/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

Potom pomocou nasledujúceho príkazu skontrolujeme, aké zmeny to povedie:

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

V dôsledku toho Terraform urobil zmenu zdrojov openstack_compute_instance_v2 и openstack_compute_flavor_v2.

Upozorňujeme, že to bude znamenať reštart vytvoreného virtuálneho počítača.

Ak chcete použiť novú konfiguráciu virtuálneho počítača, použite príkaz terraform platí, ktorý sme už spustili skôr.

Všetky vytvorené objekty sa zobrazia v ovládacie panely VPC:

Poskytovateľ Terraform Selectel

V našom príklady úložísk Môžete tiež vidieť manifesty na vytváranie virtuálnych počítačov so sieťovými jednotkami.

Príklad vytvorenia klastra Kubernetes

Predtým, ako prejdeme k ďalšiemu príkladu, vyčistíme zdroje, ktoré sme vytvorili predtým. Ak to chcete urobiť, v koreňovom adresári projektu terraform-examples/examples/vpc/server_local_root_disk Spustite príkaz na odstránenie objektov 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

Potom spustite príkaz na vymazanie objektov 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

V oboch prípadoch budete musieť potvrdiť vymazanie všetkých objektov:

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

Nasledujúci príklad je v adresári terraform-examples/examples/vpc/kubernetes_cluster.

Tento príklad vytvorí projekt, používateľa s rolou v projekte, a vytvorí jeden klaster Kubernetes. V súbore vars.tf môžete vidieť predvolené hodnoty, ako je počet uzlov, ich charakteristiky, verzia Kubernetes atď.

Aby sme vytvorili prostriedky podobné prvému príkladu, najskôr začneme inicializovať moduly a vytvárať prostriedky modulov projekt_s_používateľoma potom vytvorte všetko ostatné:

$ 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

Vytváranie a správu klastrov Kubernetes prenesieme cez komponent OpenStack Magnum. Viac o práci s klastrom nájdete v jednom z našich predchádzajúce články, ako aj v vedomostná základňa.

Pri príprave klastra sa vytvoria disky a virtuálne stroje a nainštalujú sa všetky potrebné komponenty. Príprava trvá približne 4 minúty, počas ktorých Terraform zobrazí správy ako:

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

Po dokončení inštalácie Terraform oznámi, že klaster je pripravený a zobrazí jeho ID:

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

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

Na správu vytvoreného klastra Kubernetes pomocou pomôcky kubectl musíte získať prístupový súbor klastra. Ak to chcete urobiť, prejdite na projekt vytvorený prostredníctvom Terraform v zozname projektov vo vašom účte:

Poskytovateľ Terraform Selectel

Ďalej postupujte podľa odkazu ako xxxxxx.selvpc.ruktorý sa zobrazuje pod názvom projektu:

Poskytovateľ Terraform Selectel

Pre prihlasovacie údaje použite užívateľské meno a heslo, ktoré ste si vytvorili cez Terraform. Ak ste nepodvádzali vars.tf alebo main.tf v našom príklade bude mať používateľ meno tf_user. Ako heslo musíte použiť hodnotu premennej TF_VAR_user_password, ktorý bol špecifikovaný pri spustení terraform platí skôr.

V rámci projektu musíte prejsť na kartu Kubernetes:

Poskytovateľ Terraform Selectel

Tu sa nachádza klaster vytvorený cez Terraform. Stiahnite si súbor pre kubectl na karte „Prístup“ môžete:

Poskytovateľ Terraform Selectel

Pokyny na inštaláciu sa nachádzajú na tej istej karte. kubectl a používanie prevzatého config.yaml.

Po spustení kubectl a nastavenie premennej prostredia KUBECOFIG môžete použiť 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

Počet uzlov klastra sa dá jednoducho zmeniť cez Terraform.
V súbore main.tf je určená nasledujúca hodnota:

cluster_node_count = "${var.cluster_node_count}"

Táto hodnota je nahradená z vars.tf:

variable "cluster_node_count" {
default = 2
}

Môžete zmeniť buď predvolenú hodnotu v vars.tfalebo zadajte požadovanú hodnotu priamo v main.tf:

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

Ak chcete použiť zmeny, ako v prípade prvého príkladu, použite príkaz terraform platí:

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

Keď sa počet uzlov zmení, klaster zostane dostupný. Po pridaní uzla cez Terraform ho môžete použiť bez ďalšej konfigurácie:

$ 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

Záver

V tomto článku sme sa oboznámili s hlavnými spôsobmi práce "Virtuálny súkromný cloud" cez Terraform. Budeme radi, ak využijete oficiálneho poskytovateľa Selectel Terraform a poskytnete nám spätnú väzbu.

Akékoľvek chyby nájdené u poskytovateľa Selectel Terraform je možné nahlásiť cez Problémy Github.

Zdroj: hab.com

Pridať komentár