Proveedor de Terraforma Selectel



Lanzamos el proveedor oficial de Terraform para trabajar con Selectel. Este producto permite a los usuarios implementar completamente la gestión de recursos a través de la metodología de Infraestructura como código.

Actualmente, el proveedor admite la gestión de recursos del servicio Virtual Private Cloud (en lo sucesivo, VPC). En el futuro, planeamos agregarle la gestión de recursos de otros servicios proporcionados por Selectel.

Como ya sabe, el servicio VPC se basa en OpenStack. Sin embargo, debido al hecho de que OpenStack no proporciona herramientas nativas para el servicio de la nube pública, hemos implementado la funcionalidad que falta en un conjunto de API adicionales que simplifican la administración de objetos compuestos complejos y hacen que el trabajo sea más conveniente. Parte de la funcionalidad disponible en OpenStack está cerrada por el uso directo, pero es accesible a través de nuestra API .

El proveedor de Selectel Terraform ahora ofrece la capacidad de administrar los siguientes recursos de VPC:

  • proyectos y sus cuotas;
  • usuarios, sus roles y tokens;
  • subredes públicas, incluidas las regionales y VRRP;
  • licencias de software

El proveedor utiliza nuestra biblioteca pública Go para trabajar con la API VPC. Tanto la biblioteca como el proveedor en sí son de código abierto, se están desarrollando en Github:


Para administrar otros recursos en la nube, como máquinas virtuales, discos, clústeres de Kubernetes, puede usar el proveedor OpenStack Terraform. La documentación oficial de ambos proveedores está disponible en los siguientes enlaces:


Empezando


Para comenzar, debe instalar Terraform (las instrucciones y los enlaces a los paquetes de instalación se pueden encontrar en el sitio web oficial ).

Para funcionar, el proveedor requiere la clave API Selectel, que se crea en el panel de control de la cuenta .

Los manifiestos para trabajar con Selectel se crean usando Terraform o usando un conjunto de ejemplos listos que están disponibles en nuestro repositorio de Github: terraform-examples .

El repositorio con ejemplos se divide en dos directorios:

  • módulos , que contienen pequeños módulos reutilizables que toman un conjunto de parámetros como entrada y administran un pequeño conjunto de recursos;
  • ejemplos , que contienen ejemplos de un conjunto completo de módulos interconectados.

Después de instalar Terraform, crear una clave de API Selectel y familiarizarse con los ejemplos, pasamos a ejemplos prácticos.

Ejemplo de crear un servidor con un disco local


Considere el ejemplo de crear un proyecto, un usuario con un rol y una máquina virtual con un disco local: terraform-examples / examples / vpc / server_local_root_disk .

El archivo vars.tf describe todos los parámetros que se usarán al llamar a los módulos. Algunos de ellos tienen valores predeterminados, por ejemplo, el servidor se creará en la zona ru-3a con la siguiente 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 el archivo main.tf , el proveedor Selectel se inicializa:

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

Este archivo también contiene el valor predeterminado para la clave SSH que se instalará en el servidor:

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

Si es necesario, puede especificar una clave pública diferente. La clave no tiene que especificarse como una ruta al archivo; también puede agregar un valor como una cadena.

Además en este archivo se lanzan los módulos project_with_user y server_local_root_disk , que administran los recursos necesarios.

Analizaremos estos módulos con más detalle.

Crear un proyecto y usuario con un rol


El primer módulo crea un proyecto y un usuario con un rol en este proyecto: terraform-examples / modules / vpc / project_with_user .

El usuario creado podrá iniciar sesión en OpenStack y administrar sus recursos. El módulo es simple y gestiona solo tres entidades:

  • selectel_vpc_project_v2,
  • selectel_vpc_user_v2,
  • selectel_vpc_role_v2.

Crear un servidor virtual con un disco local


El segundo módulo gestiona los objetos OpenStack necesarios para crear un servidor con un disco local.

Debe prestar atención a algunos de los argumentos que se especifican en este módulo para el recurso openstack_compute_instance_v2 :

 resource "openstack_compute_instance_v2" "instance_1" { ... lifecycle { ignore_changes = ["image_id"] } vendor_options { ignore_resize_confirmation = true } } 

El argumento ignore_changes le permite ignorar el cambio del atributo id para la imagen utilizada para crear la máquina virtual. En el servicio VPC, la mayoría de las imágenes públicas se actualizan automáticamente una vez por semana, y su identificación también cambia. Esto se debe a las características del componente OpenStack - Glance, en el que las imágenes se consideran entidades inmutables.

Si se crea o modifica un servidor o disco existente, que utiliza la identificación de la imagen pública como argumento image_id , luego de actualizar esta imagen, reiniciar el manifiesto de Terraform recreará el servidor o el disco. El uso del argumento ignore_changes evita esta situación.

Nota: el argumento ignore_changes apareció en Terraform hace mucho tiempo: pull # 2525 .

El argumento ignore_resize_confirmation es necesario para redimensionar con éxito el disco local, los núcleos o la memoria del servidor. Dichos cambios se realizan a través del componente OpenStack Nova utilizando la solicitud de cambio de tamaño . De manera predeterminada, Nova después de una solicitud de cambio de tamaño coloca al servidor en el estado verificar_resize y espera la confirmación adicional del usuario. Sin embargo, este comportamiento se puede cambiar para que Nova no espere acciones adicionales del usuario.

El argumento especificado permite que Terraform no espere el estado generate_resize para el servidor y esté preparado para que el servidor esté en el estado activo después de cambiar sus parámetros. El argumento está disponible en la versión 1.10.0 del proveedor de OpenStack Terraform: pull # 422 .

Creación de recursos


Antes de lanzar manifiestos, debe tenerse en cuenta que en nuestro ejemplo se lanzan dos proveedores diferentes, y el proveedor OpenStack depende de los recursos del proveedor Selectel, ya que es imposible administrar los objetos que pertenecen a él sin crear un usuario en el proyecto. Desafortunadamente, por la misma razón, no podemos simplemente ejecutar el comando terraform apply dentro de nuestro ejemplo. Primero tendremos que solicitar el módulo project_with_user y luego todo lo demás.

Nota: este problema aún no se ha resuelto en Terraform, puede seguir su discusión sobre Github en el número 2430 y el número 4149 .

Para crear recursos, iremos al directorio terraform-examples / examples / vpc / server_local_root_disk , su contenido debería ser así:

 $ ls README.md main.tf vars.tf 

Inicializamos los módulos usando el comando:

 $ terraform init 

El resultado muestra que Terraform descarga las últimas versiones de los proveedores utilizados y verifica todos los módulos descritos en el ejemplo.

Primero, aplique el módulo project_with_user . En este caso, debe transferir manualmente los valores para las variables que no se han establecido:

  • sel_account con su número de cuenta Selectel;
  • sel_token con su clave para la API Selectel;
  • contraseña_usuario con contraseña para el usuario de OpenStack.

Los valores para las dos primeras variables deben tomarse del panel de control .

Para la última variable, puede pensar en cualquier contraseña.

Para usar el módulo, es necesario reemplazar los valores SEL_ACCOUNT , SEL_TOKEN y USER_PASSWORD ejecutando el 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 

Después de ejecutar el comando Terraform, mostrará qué recursos desea crear y requerirá 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 

Una vez que se crean el proyecto, el usuario y el rol, puede comenzar a crear los recursos restantes:

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

Al crear recursos, preste atención a la salida de Terraform con una dirección IP externa a la que se podrá acceder al servidor creado:

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

Puede trabajar con la máquina virtual creada a través de SSH en la IP especificada.

Edición de recursos


Además de crear recursos a través de Terraform, también se pueden modificar.

Por ejemplo, aumente el número de núcleos y memoria para nuestro servidor cambiando los valores de los parámetros server_vcpus y server_ram_mb en el archivo 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 

Después de eso, verificamos qué cambios esto conducirá al uso del siguiente 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 realizó cambios en los recursos openstack_compute_instance_v2 y openstack_compute_flavor_v2 .

Tenga en cuenta que esto provocará un reinicio de la máquina virtual creada.

Para aplicar la nueva configuración de máquina virtual, use el comando terraform apply , que ya ejecutamos anteriormente.

Todos los objetos creados se mostrarán en el panel de control de VPC :



En nuestro repositorio de ejemplo, también puede ver manifiestos para crear máquinas virtuales con unidades de red.

Ejemplo de clúster de Kubernetes


Antes de continuar con el siguiente ejemplo, borraremos los recursos creados anteriormente. Para hacer esto, en la raíz del proyecto terraform-examples / examples / vpc / server_local_root_disk, ejecute el comando para eliminar objetos 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, ejecute el comando Selectel VPC API Object Cleanup:

 $ 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 casos, deberá confirmar la eliminación de todos los objetos:

 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 

El siguiente ejemplo se encuentra en el directorio terraform-examples / examples / vpc / kubernetes_cluster .

Este ejemplo crea un proyecto, un usuario con un rol en el proyecto y genera un clúster de Kubernetes. En el archivo vars.tf , puede ver los valores predeterminados, como el número de nodos, sus características, la versión de Kubernetes y más.

Para crear recursos, de manera similar al primer ejemplo, primero que nada, inicializaremos los módulos y crearemos los recursos del módulo project_with_user , y luego crearemos el resto:

 $ 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 

Transmitimos la creación y gestión de clústeres de Kubernetes a través del componente OpenStack Magnum. Puede obtener más información sobre cómo trabajar con un clúster en uno de nuestros artículos anteriores , así como en la base de conocimientos .

Durante la preparación del clúster, se crearán discos, máquinas virtuales y se instalarán todos los componentes necesarios. La preparación dura aproximadamente 4 minutos, momento en el que Terraform mostrará mensajes del formulario:

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

Una vez completada la instalación, Terraform le informará que el clúster está listo y mostrará su identificador:

 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 administrar el clúster Kubernetes creado a través de la utilidad kubectl, debe obtener el archivo de acceso al clúster. Para hacer esto, vaya al proyecto creado a través de Terraform en la lista de proyectos en su cuenta:



A continuación, siga el enlace del formulario xxxxxx.selvpc.ru , que se muestra debajo del nombre del proyecto:



Use el nombre de usuario y la contraseña que se crearon a través de Terraform como información de inicio de sesión. Si no cambió vars.tf o main.tf para nuestro ejemplo, entonces el usuario tendrá el nombre tf_user . Como contraseña, use el valor de la variable TF_VAR_user_password , que se especificó cuando se ejecutó Terraform Apply anteriormente.

Dentro del proyecto, debe ir a la pestaña Kubernetes :



Aquí hay un clúster creado a través de Terraform. Puede descargar el archivo para kubectl en la pestaña "Acceso":



La misma pestaña contiene instrucciones para instalar kubectl y usar el archivo config.yaml descargado.

Después de iniciar kubectl y configurar la variable de entorno KUBECONFIG, puede 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 

El número de nodos del clúster se cambia fácilmente a través de Terraform.
El siguiente valor se especifica en el archivo main.tf :

 cluster_node_count = "${var.cluster_node_count}" 

Este valor se sustituye de vars.tf :



 variable "cluster_node_count" { default = 2 } 

Puede cambiar el valor predeterminado en vars.tf o especificar el valor requerido directamente en main.tf :

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

Para aplicar los cambios, como en el caso del primer ejemplo, use el comando terraform apply :

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

Cuando cambia el número de nodos, el clúster permanecerá disponible. Después de agregar un nodo a través de Terraform, puede usarlo sin 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


En este artículo, aprendimos sobre las formas básicas de trabajar con la "Nube privada virtual" a través de Terraform. Estaremos encantados si utiliza el proveedor oficial de Terraform Selectel y proporciona comentarios.

Todos los errores encontrados del proveedor de Terraform, Selectel, se pueden informar a través de Github Issues .

Source: https://habr.com/ru/post/445162/


All Articles