Founisè Terraform Selectel

Founisè Terraform Selectel

Nou te lanse yon founisè ofisyèl Terraform pou travay avèk Selectel. Pwodui sa a pèmèt itilizatè yo aplike totalman jesyon resous atravè metodoloji Enfrastrikti kòm kòd.

Founisè a sipòte kounye a jesyon resous sèvis yo "Nwaj prive vityèl" (ki refere yo kòm VPC). Nan lavni, nou planifye pou ajoute jesyon resous pou lòt sèvis Selectel ofri.

Kòm ou deja konnen, sèvis VPC a bati sou OpenStack. Sepandan, akòz lefèt ke OpenStack pa bay zouti natif natal pou sèvi nwaj piblik la, nou aplike fonksyonalite ki manke a nan yon seri API adisyonèl ki senplifye jesyon an nan objè konpoze konplèks epi fè travay la pi pratik. Gen kèk nan fonksyonalite ki disponib nan OpenStack fèmen nan itilizasyon dirèk, men yo disponib nan API nou an.

Founisè Selectel Terraform genyen kounye a kapasite pou jere resous VPC sa yo:

  • pwojè ak kota yo;
  • itilizatè yo, wòl yo ak marqueur yo;
  • sous-rezo piblik, ki gen ladan kwa-rejyonal ak VRRP;
  • lisans lojisyèl.

Founisè a sèvi ak bibliyotèk Go piblik nou an pou travay avèk API VPC. Tou de bibliyotèk la ak founisè a li menm se sous louvri, devlopman yo fèt sou Github:

Pou jere lòt resous nwaj yo, tankou machin vityèl, disk, grap Kubernetes, ou ka itilize founisè OpenStack Terraform la. Dokiman ofisyèl pou tou de founisè yo disponib nan lyen sa yo:

Pou kòmanse

Pou kòmanse, ou bezwen enstale Terraform (enstriksyon ak lyen ki mennen nan pakè enstalasyon yo ka jwenn nan ofisyèl sou sit wèb).

Pou fonksyone, founisè a mande pou yon kle API Selectel, ki kreye nan panno kontwòl kont.

Manifest pou travay ak Selectel yo kreye lè l sèvi avèk Terraform oswa lè l sèvi avèk yon seri egzanp ki pare ki disponib nan depo Github nou an: terraform-egzanp.

Repozitwa a ak egzanp divize an de repèrtwar:

  • modil, ki gen ti modil ki kapab itilize ankò ki pran yon seri paramèt kòm opinyon epi jere yon ti seri resous;
  • egzanp, ki gen egzanp yon seri konplè modil ki konekte.

Apre enstale Terraform, kreye yon kle API Selectel ak familyarize w ak egzanp yo, ann ale nan egzanp pratik.

Yon egzanp pou kreye yon sèvè ak yon disk lokal

Ann gade nan yon egzanp pou kreye yon pwojè, yon itilizatè ki gen yon wòl ak yon machin vityèl ak yon disk lokal: terraform-egzanp/egzanp/vpc/server_local_root_disk.

Nan dosye vars.tf tout paramèt ki pral itilize lè w ap rele modil yo dekri. Kèk nan yo gen valè default, pou egzanp, sèvè a pral kreye nan zòn nan ru-3a ak konfigirasyon sa a:

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

Nan dosye prensipal.tf Founisè Selectel la inisyalize:

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

Fichye sa a genyen tou valè default pou kle SSH ki pral enstale sou sèvè a:

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

Si sa nesesè, ou ka presize yon kle piblik diferan. Kle a pa oblije espesifye kòm yon chemen dosye; ou kapab tou ajoute valè a kòm yon fisèl.

Pli lwen nan dosye sa a modil yo ap lanse pwojè_avèk_itilizatè и server_local_root_disk, ki jere resous ki nesesè yo.

Ann gade modil sa yo an plis detay.

Kreye yon pwojè ak yon itilizatè ki gen yon wòl

Premye modil la kreye yon pwojè ak yon itilizatè ki gen yon wòl nan pwojè sa a: terraform-egzanp/modil/vpc/project_with_user.

Itilizatè a kreye yo pral kapab konekte nan OpenStack epi jere resous li yo. Modil la senp epi jere sèlman twa antite:

  • selectel_vpc_project_v2,
  • selectel_vpc_user_v2,
  • selectel_vpc_role_v2.

Kreye yon sèvè vityèl ak disk lokal yo

Dezyèm modil la fè fas ak jere objè OpenStack, ki nesesè pou kreye yon sèvè ak yon disk lokal.

Ou ta dwe peye atansyon sou kèk nan agiman yo ki espesifye nan modil sa a pou resous la openstack_compute_instance_v2:

resource "openstack_compute_instance_v2" "instance_1" {
  ...

  lifecycle {
    ignore_changes = ["image_id"]
  }

  vendor_options {
    ignore_resize_confirmation = true
  }
}

Agiman inyore_chanjman pèmèt ou inyore chanjman nan atribi yo id pou imaj la itilize pou kreye machin vityèl la. Nan sèvis VPC a, pifò imaj piblik yo mete ajou otomatikman yon fwa pa semèn e an menm tan yo id tou chanje. Sa a se akòz sengularite yo nan eleman nan OpenStack - Glance, nan ki imaj yo konsidere kòm antite imuiabl.

Si w ap kreye oswa modifye yon sèvè ki egziste deja oswa disk ki gen kòm yon agiman image_id se itilize id imaj piblik la, Lè sa a, apre imaj sa a mete ajou, kouri manifest Terraform la ankò pral rkree sèvè a oswa disk la. Sèvi ak yon agiman inyore_chanjman pèmèt ou evite yon sitiyasyon konsa.

Nòt: agiman inyore_chanjman te parèt nan Terraform sa gen anpil tan: rale#2525.

Agiman ignore_resize_confirmation bezwen redimansyonman avèk siksè disk lokal, nwayo, oswa memwa sèvè. Chanjman sa yo fèt atravè eleman OpenStack Nova lè l sèvi avèk yon demann rdimansyonman. Default Nova apre demann rdimansyonman mete sèvè a nan estati verifye_resize epi tann konfimasyon adisyonèl nan men itilizatè a. Sepandan, konpòtman sa a ka chanje pou Nova pa tann pou aksyon adisyonèl nan men itilizatè a.

Agiman espesifye a pèmèt Terraform pa tann estati a verifye_resize pou sèvè a epi prepare pou sèvè a nan yon estati aktif apre li fin chanje paramèt li yo. Agiman an disponib nan vèsyon 1.10.0 nan founisè a OpenStack Terraform: rale#422.

Kreye Resous

Anvan ou kouri manifeste yo, tanpri sonje ke nan egzanp nou an, de founisè diferan yo te lanse, ak founisè a OpenStack depann sou resous yo nan founisè a Selectel, paske san yo pa kreye yon itilizatè nan pwojè a, li enposib jere objè yo ki fè pati li. . Malerezman, pou menm rezon an nou pa ka jis kouri lòd la terraform aplike anndan egzanp nou an. Premye nou bezwen fè aplike pou modil pwojè_avèk_itilizatè epi apre sa pou tout lòt bagay.

Remak: Pwoblèm sa a poko rezoud nan Terraform, ou ka swiv diskisyon an sou Github nan pwoblèm #2430 и pwoblèm #4149.

Pou kreye resous, ale nan anyè a terraform-egzanp/egzanp/vpc/server_local_root_disk, kontni li yo ta dwe tankou sa a:

$ ls
README.md	   main.tf		vars.tf

Nou inisyalize modil yo lè l sèvi avèk kòmandman an:

$ terraform init

Pwodiksyon an montre ke Terraform telechaje dènye vèsyon founisè li itilize yo epi tcheke tout modil ki dekri nan egzanp lan.

Premyèman, ann aplike modil la pwojè_avèk_itilizatè. Sa a mande pou pase manyèlman valè pou varyab ki pa te fikse:

  • sel_account ak nimewo kont Selectel ou a;
  • sel_token ak kle ou pou Selectel API;
  • user_password ak yon modpas pou itilizatè a OpenStack.

Yo dwe pran valè pou de premye varyab yo panno kontwòl.

Pou dènye varyab la, ou ka vini ak nenpòt modpas.

Pou itilize modil la ou bezwen ranplase valè yo SEL_AKCOUNT, SEL_TOKEN и USER_PASSWORD kouri kòmandman an:

$ 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

Apre yo fin kouri lòd la, Terraform pral montre ki resous li vle kreye epi mande pou konfimasyon:

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

Yon fwa ke pwojè a, itilizatè a ak wòl yo te kreye, ou ka kòmanse kreye resous ki rete yo:

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

Lè w ap kreye resous, peye atansyon sou pwodiksyon Terraform ak adrès IP ekstèn kote sèvè kreye a pral aksesib:

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

Ou ka travay avèk machin vityèl kreye atravè SSH lè l sèvi avèk IP espesifye a.

Editing Resous

Anplis de sa nan kreye resous atravè Terraform, yo kapab tou modifye.

Pou egzanp, ann ogmante kantite nwayo ak memwa pou sèvè nou an pa chanje valè yo pou paramèt yo. server_vcpus и server_ram_mb nan dosye egzanp/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

Apre sa, nou tcheke ki chanjman sa a pral mennen nan lè l sèvi avèk lòd sa a:

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

Kòm yon rezilta, Terraform te fè yon chanjman resous openstack_compute_instance_v2 и openstack_compute_flavor_v2.

Tanpri sonje ke sa a pral egzije rdemare machin vityèl kreye a.

Pou aplike nouvo konfigirasyon machin vityèl la, sèvi ak lòd la terraform aplike, ke nou te deja lanse pi bonè.

Tout objè kreye yo pral parèt nan Panno kontwòl VPC:

Founisè Terraform Selectel

Nan nou an depo egzanp Ou ka wè tou manifeste pou kreye machin vityèl ak kondui rezo.

Egzanp pou kreye yon gwoup Kubernetes

Anvan nou ale nan pwochen egzanp lan, nou pral netwaye resous nou te kreye pi bonè yo. Pou fè sa nan rasin lan nan pwojè a terraform-egzanp/egzanp/vpc/server_local_root_disk Ann kouri lòd pou efase objè 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

Lè sa a, kouri lòd pou netwaye objè 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

Nan de ka yo, w ap bezwen konfime sipresyon tout objè yo:

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

Egzanp sa a se nan anyè a terraform-egzanp/egzanp/vpc/kubernetes_cluster.

Egzanp sa a kreye yon pwojè, yon itilizatè ki gen yon wòl nan pwojè a, epi ogmante yon gwoup Kubernetes. Nan dosye vars.tf ou ka wè valè default, tankou kantite nœuds, karakteristik yo, vèsyon Kubernetes, elatriye.

Pou kreye resous ki sanble ak premye egzanp lan, anvan tout bagay nou pral kòmanse inisyalize modil ak kreye resous modil pwojè_avèk_itilizatèak Lè sa a, kreye tout lòt bagay:

$ 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

Nou pral transfere kreyasyon ak jesyon gwoup Kubernetes atravè eleman OpenStack Magnum la. Ou ka jwenn plis enfòmasyon sou fason pou travay avèk yon gwoup nan youn nan nou yo atik anvan yoosi byen ke baz konesans.

Lè w ap prepare gwoup la, yo pral kreye disk ak machin vityèl epi yo pral enstale tout eleman ki nesesè yo. Preparasyon an pran apeprè 4 minit, pandan tan sa a Terraform ap montre mesaj tankou:

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

Yon fwa enstalasyon an fini, Terraform pral endike ke gwoup la pare epi montre ID li yo:

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

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

Pou jere gwoup Kubernetes kreye atravè sèvis piblik la kubectl ou bezwen jwenn dosye aksè gwoup la. Pou fè sa, ale nan pwojè a ki te kreye atravè Terraform nan lis la nan pwojè nan kont ou:

Founisè Terraform Selectel

Apre sa, swiv link lan like xxxxxx.selvpc.ruki parèt anba non pwojè a:

Founisè Terraform Selectel

Pou enfòmasyon konekte, sèvi ak non itilizatè ak modpas ou te kreye atravè Terraform. Si ou pa janm twonpe vars.tf oswa prensipal.tf pou egzanp nou an, itilizatè a pral gen non an tf_user. Ou dwe itilize valè varyab la kòm modpas la TF_VAR_user_password, ki te espesifye nan demaraj terraform aplike pi bonè.

Anndan pwojè a ou bezwen ale nan tab la Kubernetes:

Founisè Terraform Selectel

Sa a se kote gwoup la te kreye atravè Terraform sitiye. Telechaje fichye pou kubectl ou kapab sou tab la "Aksè":

Founisè Terraform Selectel

Enstriksyon enstalasyon yo sitiye sou menm tab la. kubectl ak itilizasyon telechaje a config.yaml.

Apre lansman kubectl epi mete varyab anviwònman an KUBECONFIG ou ka itilize 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

Kantite nœuds gwoup yo ka fasilman chanje atravè Terraform.
Nan dosye prensipal.tf valè sa a espesifye:

cluster_node_count = "${var.cluster_node_count}"

Valè sa a ranplase de vars.tf:

variable "cluster_node_count" {
default = 2
}

Ou ka chanje swa valè default nan vars.tf, oswa presize valè ki nesesè dirèkteman nan prensipal.tf:

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

Pou aplike chanjman yo, tankou nan ka premye egzanp lan, sèvi ak lòd la terraform aplike:

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

Lè kantite nœuds chanje, gwoup la ap rete disponib. Apre ou fin ajoute yon ne via Terraform, ou ka itilize li san konfigirasyon adisyonèl:

$ 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

Konklizyon

Nan atik sa a nou te fè konesans ak fason prensipal yo travay avèk yo "Nwaj prive vityèl" atravè Terraform. N ap kontan si w itilize founisè ofisyèl Selectel Terraform la epi w bay fidbak.

Nenpòt ensèk yo jwenn nan founisè a Selectel Terraform ka rapòte atravè Pwoblèm Github.

Sous: www.habr.com

Add nouvo kòmantè