Provedor de Terraform Selectel

Provedor de Terraform Selectel

Lanzamos un provedor oficial de Terraform para traballar con Selectel. Este produto permite aos usuarios implementar plenamente a xestión de recursos mediante a metodoloxía Infraestrutura como código.

O provedor actualmente admite a xestión de recursos do servizo "Nube privada virtual" (en diante VPC). No futuro, pensamos engadir a xestión de recursos para outros servizos ofrecidos por Selectel.

Como xa sabes, o servizo VPC está construído en OpenStack. Non obstante, debido ao feito de que OpenStack non ofrece ferramentas nativas para atender a nube pública, implementamos a funcionalidade que faltaba nun conxunto de API adicionais que simplifican a xestión de obxectos compostos complexos e fan que o traballo sexa máis cómodo. Algunhas das funcións dispoñibles en OpenStack están pechadas polo uso directo, pero están dispoñibles a través nosa API.

O provedor de Selectel Terraform agora inclúe a capacidade de xestionar os seguintes recursos VPC:

  • proxectos e as súas cotas;
  • usuarios, os seus roles e tokens;
  • subredes públicas, incluíndo interrexionais e VRRP;
  • licenzas de software.

O provedor usa a nosa biblioteca pública de Go para traballar coa API de VPC. Tanto a biblioteca como o propio provedor son de código aberto, o seu desenvolvemento realízase en Github:

Para xestionar outros recursos na nube, como máquinas virtuais, discos, clústeres de Kubernetes, pode usar o provedor de OpenStack Terraform. A documentación oficial de ambos provedores está dispoñible nas seguintes ligazóns:

introdución

Para comezar, cómpre instalar Terraform (as instrucións e as ligazóns aos paquetes de instalación pódense atopar en sitio web oficial).

Para operar, o provedor require unha clave API de Selectel, que se crea en paneis de control de contas.

Os manifestos para traballar con Selectel créanse usando Terraform ou usando un conxunto de exemplos preparados que están dispoñibles no noso repositorio de Github: terraforma-exemplos.

O repositorio con exemplos está dividido en dous directorios:

  • módulos, que contén pequenos módulos reutilizables que toman un conxunto de parámetros como entrada e xestionan un pequeno conxunto de recursos;
  • exemplos, que contén exemplos dun conxunto completo de módulos interconectados.

Despois de instalar Terraform, crear unha clave de API de Selectel e familiarizarse cos exemplos, pasemos a exemplos prácticos.

Un exemplo de creación dun servidor cun disco local

Vexamos un exemplo de creación dun proxecto, un usuario cun rol e unha máquina virtual cun disco local: terraform-examples/examples/vpc/server_local_root_disk.

En arquivo vars.tf descríbense todos os parámetros que se utilizarán ao chamar aos módulos. Algúns deles teñen valores predeterminados, por exemplo, o servidor crearase na zona ru-3a coa seguinte configuración:

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

En arquivo principal.tf O fornecedor de Selectel está inicializado:

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

Este ficheiro tamén contén o valor predeterminado para a clave SSH que se instalará no servidor:

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

Se é necesario, pode especificar unha chave pública diferente. A chave non ten que especificarse como ruta do ficheiro; tamén pode engadir o valor como cadea.

Máis adiante neste ficheiro lánzanse os módulos proxecto_con_usuario и disco_raíz_local_servidor, que xestionan os recursos necesarios.

Vexamos estes módulos con máis detalle.

Creando un proxecto e un usuario cun rol

O primeiro módulo crea un proxecto e un usuario cun rol nese proxecto: terraform-examples/modules/vpc/project_with_user.

O usuario creado poderá iniciar sesión en OpenStack e xestionar os seus recursos. O módulo é sinxelo e xestiona só tres entidades:

  • selectel_vpc_project_v2,
  • selectel_vpc_user_v2,
  • selectel_vpc_role_v2.

Creación dun servidor virtual con disco local

O segundo módulo trata sobre a xestión de obxectos OpenStack, que son necesarios para crear un servidor cun disco local.

Debería prestar atención a algúns dos argumentos que se especifican neste módulo para o recurso openstack_compute_instance_v2:

resource "openstack_compute_instance_v2" "instance_1" {
  ...

  lifecycle {
    ignore_changes = ["image_id"]
  }

  vendor_options {
    ignore_resize_confirmation = true
  }
}

argumento ignorar_cambios permítelle ignorar os cambios de atributos id para a imaxe utilizada para crear a máquina virtual. No servizo VPC, a maioría das imaxes públicas actualízanse automaticamente unha vez á semana e ao mesmo tempo as súas id tamén cambia. Isto débese ás peculiaridades do compoñente OpenStack - Glance, no que as imaxes son consideradas entidades inmutables.

Se está a crear ou modificar un servidor ou disco existente que ten como argumento imaxe_id se usa id imaxe pública, despois de que esa imaxe se actualice, executar de novo o manifesto de Terraform recreará o servidor ou o disco. Usando un argumento ignorar_cambios permite evitar tal situación.

Nota: argumento ignorar_cambios apareceu en Terraform hai moito tempo: tirar #2525.

argumento ignore_resize_confirmation necesario para redimensionar correctamente o disco local, os núcleos ou a memoria do servidor. Estes cambios realízanse a través do compoñente OpenStack Nova mediante unha solicitude redimensionar. Nova predeterminada despois da solicitude redimensionar pon o servidor en estado verificar_redimensionar e agarda unha confirmación adicional do usuario. Non obstante, este comportamento pódese cambiar para que Nova non espere por accións adicionais do usuario.

O argumento especificado permite que Terraform non agarde o estado verificar_redimensionar para o servidor e estar preparado para que o servidor estea en estado activo despois de cambiar os seus parámetros. O argumento está dispoñible desde a versión 1.10.0 do fornecedor OpenStack Terraform: tirar #422.

Creación de Recursos

Antes de executar os manifestos, teña en conta que no noso exemplo lánzanse dous provedores diferentes, e o provedor OpenStack depende dos recursos do provedor Selectel, xa que sen crear un usuario no proxecto é imposible xestionar os obxectos que lle pertencen. . Desafortunadamente, polo mesmo motivo non podemos simplemente executar o comando aplicar terraform dentro do noso exemplo. Primeiro temos que facelo aplicar para módulo proxecto_con_usuario e despois para todo o demais.

Nota: Este problema aínda non está resolto en Terraform, podes seguir a discusión en Github en número 2430 и número 4149.

Para crear recursos, vai ao directorio terraform-examples/examples/vpc/server_local_root_disk, o seu contido debería ser o seguinte:

$ ls
README.md	   main.tf		vars.tf

Inicializamos os módulos mediante o comando:

$ terraform init

A saída mostra que Terraform descarga as últimas versións dos provedores que usa e comproba todos os módulos descritos no exemplo.

Primeiro imos aplicar o módulo proxecto_con_usuario. Isto require pasar manualmente os valores para as variables que non se estableceron:

  • conta_sel co seu número de conta de Selectel;
  • sel_token coa túa chave para Selectel API;
  • usuario_contrasinal cun contrasinal para o usuario de OpenStack.

Os valores das dúas primeiras variables deben ser tomados de paneis de control.

Para a última variable, podes crear calquera contrasinal.

Para usar o módulo é necesario substituír os valores SEL_ACCOUNT, SEL_TOKEN и CONTRASEÑA_USUARIO executando o comando:

$ 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

Despois de executar o comando, Terraform mostrará que recursos quere crear e pedirá confirmación:

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

Unha vez creado o proxecto, usuario e rol, podes comezar a crear os recursos restantes:

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

Ao crear recursos, preste atención á saída de Terraform co enderezo IP externo onde se poderá acceder ao servidor creado:

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

Podes traballar coa máquina virtual creada a través de SSH usando a IP especificada.

Recursos de edición

Ademais de crear recursos a través de Terraform, tamén se poden modificar.

Por exemplo, imos aumentar o número de núcleos e memoria para o noso servidor cambiando os valores dos parámetros server_vcpus и server_ram_mb en arquivo exemplos/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

Despois disto, comprobamos que cambios levará a isto usando o seguinte comando:

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

Como resultado, Terraform fixo un cambio de recurso openstack_compute_instance_v2 и openstack_compute_flavor_v2.

Teña en conta que isto implicará reiniciar a máquina virtual creada.

Para aplicar a nova configuración da máquina virtual, use o comando aplicar terraform, que xa puxemos en marcha antes.

Todos os obxectos creados mostraranse en Paneles de control VPC:

Provedor de Terraform Selectel

No noso repositorios de exemplo Tamén podes ver manifestos para crear máquinas virtuais con unidades de rede.

Exemplo de creación dun clúster de Kubernetes

Antes de pasar ao seguinte exemplo, limparemos os recursos que creamos anteriormente. Para facelo na raíz do proxecto terraform-examples/examples/vpc/server_local_root_disk Imos executar o comando para eliminar obxectos de 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

A continuación, execute o comando para borrar os obxectos da API de Selectel VPC:

$ 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

En ambos os casos, terás que confirmar a eliminación de todos os obxectos:

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

O seguinte exemplo está no directorio terraform-examples/examples/vpc/kubernetes_cluster.

Este exemplo crea un proxecto, un usuario cunha función no proxecto e crea un clúster de Kubernetes. En arquivo vars.tf podes ver os valores predeterminados, como o número de nodos, as súas características, a versión de Kubernetes, etc.

Para crear recursos similares ao primeiro exemplo, en primeiro lugar comezaremos a inicializar módulos e a crear recursos de módulo proxecto_con_usuarioe despois creando todo o demais:

$ 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

Transferiremos a creación e xestión de clústeres de Kubernetes a través do compoñente OpenStack Magnum. Podes obter máis información sobre como traballar cun clúster nun dos nosos artigos anterioresasí como base de coñecemento.

Ao preparar o clúster, crearanse discos e máquinas virtuais e instalaranse todos os compoñentes necesarios. A preparación leva uns 4 minutos, tempo durante o cal Terraform mostrará mensaxes como:

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

Unha vez completada a instalación, Terraform indicará que o clúster está listo e mostrará o seu 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.

Para xestionar o clúster de Kubernetes creado a través da utilidade kubectl cómpre obter o ficheiro de acceso ao clúster. Para iso, vai ao proxecto creado a través de Terraform na lista de proxectos da túa conta:

Provedor de Terraform Selectel

A continuación, segue a ligazón Gústame xxxxxx.selvpc.ruque aparece debaixo do nome do proxecto:

Provedor de Terraform Selectel

Para obter información de inicio de sesión, use o nome de usuario e o contrasinal que creou a través de Terraform. Se non enganou vars.tf ou principal.tf para o noso exemplo, o usuario terá o nome tf_usuario. Debe usar o valor da variable como contrasinal TF_VAR_contrasinal_usuario, que se especificou no inicio aplicar terraform antes.

Dentro do proxecto cómpre ir á pestana Kubernetes:

Provedor de Terraform Selectel

Aquí é onde se atopa o clúster creado a través de Terraform. Descargar arquivo para kubectl podes na pestana "Acceso":

Provedor de Terraform Selectel

As instrucións de instalación están situadas na mesma pestana. kubectl e uso do descargado config.yaml.

Despois do lanzamento kubectl e establecer a variable de ambiente KUBECONFIG podes usar 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

O número de nodos do clúster pódese cambiar facilmente a través de Terraform.
En arquivo principal.tf especifícase o seguinte valor:

cluster_node_count = "${var.cluster_node_count}"

Este valor substitúese desde vars.tf:

variable "cluster_node_count" {
default = 2
}

Podes cambiar o valor predeterminado en vars.tfou especifique o valor necesario directamente en principal.tf:

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

Para aplicar os cambios, como no caso do primeiro exemplo, use o comando aplicar terraform:

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

Cando cambie o número de nós, o clúster permanecerá dispoñible. Despois de engadir un nodo a través de Terraform, podes usalo sen configuración adicional:

$ 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

Conclusión

Neste artigo coñecemos as principais formas de traballar "Nube privada virtual" vía Terraform. Estaremos encantados de usar o provedor oficial de Selectel Terraform e proporcionar comentarios.

Calquera erro atopado no provedor Selectel Terraform pódese informar a través de Problemas de Github.

Fonte: www.habr.com

Engadir un comentario