Proveedor de Terraform Selectel

Proveedor de Terraform Selectel

Hemos lanzado un 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.

El proveedor actualmente admite la gestión de recursos del servicio. "Nube privada virtual" (en adelante denominado VPC). En el futuro, planeamos agregar gestión de recursos para otros servicios proporcionados por Selectel.

Como ya sabe, el servicio VPC se basa en OpenStack. Sin embargo, debido a que OpenStack no proporciona herramientas nativas para dar servicio a la nube pública, implementamos la funcionalidad faltante en un conjunto de API adicionales que simplifican la gestión de objetos compuestos complejos y hacen que el trabajo sea más conveniente. Algunas de las funciones disponibles en OpenStack no se pueden utilizar directamente, pero están disponibles a través de nuestra API.

El proveedor Selectel Terraform ahora incluye la capacidad de gestionar los siguientes recursos de VPC:

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

El proveedor utiliza nuestra biblioteca pública Go para trabajar con la API de VPC. Tanto la biblioteca como el propio proveedor son de código abierto, su desarrollo se realiza en Github:

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

Primeros pasos

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

Para operar, el proveedor requiere una clave API Selectel, la cual se crea en paneles de control de cuentas.

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

El repositorio con ejemplos se divide en dos directorios:

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

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

Un ejemplo de creación de un servidor con un disco local.

Veamos un ejemplo de creación de un proyecto, un usuario con un rol y una máquina virtual con un disco local: ejemplos-terraform/ejemplos/vpc/server_local_root_disk.

En archivo vars.tf Se describen todos los parámetros que se utilizará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 archivo principal.tf Se inicializa el proveedor Selectel:

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. No es necesario especificar la clave como una ruta de archivo; también puede agregar el valor como una cadena.

Más adelante en este archivo se lanzan los módulos. proyecto_con_usuario и disco_raíz_local_servidor, que gestionan los recursos necesarios.

Veamos estos módulos con más detalle.

Creando un proyecto y un usuario con un rol

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

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

  • selectel_vpc_project_v2,
  • selectel_vpc_user_v2,
  • selectel_vpc_role_v2.

Creando un servidor virtual con disco local

El segundo módulo trata de la gestión de objetos OpenStack, que son necesarios para crear un servidor con un disco local.

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

Argumento ignorar_cambios le permite ignorar los cambios de atributos 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 al mismo tiempo su id también cambia. Esto se debe a las peculiaridades del componente OpenStack, Glance, en el que las imágenes se consideran entidades inmutables.

Si está creando o modificando un servidor o disco existente que tiene como argumento id_imagen utilizado id imagen pública, luego de actualizar esa imagen, ejecutar nuevamente el manifiesto de Terraform recreará el servidor o el disco. Usando un argumento ignorar_cambios le permite evitar tal situación.

Nota: argumento ignorar_cambios apareció en Terraform hace bastante tiempo: tirar#2525.

Argumento ignorar_redimensionar_confirmación necesario para cambiar correctamente el tamaño del disco local, los núcleos o la memoria del servidor. Dichos cambios se realizan a través del componente OpenStack Nova mediante una solicitud. cambiar el tamaño. Nova predeterminada después de la solicitud cambiar el tamaño pone el servidor en estado verificar_redimensionar y espera confirmación adicional del usuario. Sin embargo, este comportamiento se puede cambiar para que Nova no espere acciones adicionales por parte del usuario.

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

Creando recursos

Antes de ejecutar los manifiestos, tenga en cuenta que en nuestro ejemplo se inician dos proveedores diferentes y el proveedor OpenStack depende de los recursos del proveedor Selectel, ya que sin crear un usuario en el proyecto es imposible administrar los objetos que le pertenecen. . Desafortunadamente, por la misma razón no podemos simplemente ejecutar el comando aplicar terraforma dentro de nuestro ejemplo. primero tenemos que hacer aplicar para módulo proyecto_con_usuario y después para todo lo demás.

Nota: Este problema aún no se ha resuelto en Terraform; puede seguir la discusión en Github en número 2430 и número 4149.

Para crear recursos, vaya al directorio. ejemplos-terraform/ejemplos/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 que utiliza y verifica todos los módulos descritos en el ejemplo.

Primero apliquemos el módulo. proyecto_con_usuario. Esto requiere pasar manualmente valores para las variables que no se han configurado:

  • cuenta_sel con tu número de cuenta Selectel;
  • token_sel con tu clave para Selectel API;
  • contraseña de usuario con una contraseña para el usuario de OpenStack.

Los valores de las dos primeras variables deben tomarse de paneles de control.

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

Para utilizar el módulo es necesario reemplazar los valores. SEL_ACCOUNT, SEL_TOKEN и CONTRASEÑA DE USUARIO 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 solicitará 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 creado el proyecto, usuario y rol, puedes 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 la dirección IP externa donde se podrá acceder al servidor creado:

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

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

Edición de recursos

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

Por ejemplo, aumentemos la cantidad de núcleos y memoria de nuestro servidor cambiando los valores de los parámetros. servidor_vcpus и servidor_ram_mb en archivo ejemplos/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 esto, verificamos a qué cambios conducirá esto usando el 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ó un cambio de recursos. openstack_compute_instance_v2 и openstack_compute_flavor_v2.

Tenga en cuenta que esto implicará reiniciar la máquina virtual creada.

Para aplicar la nueva configuración de la máquina virtual, use el comando aplicar terraforma, que ya hemos lanzado anteriormente.

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

Proveedor de Terraform Selectel

En nuestro repositorios de ejemplo También puede ver manifiestos para crear máquinas virtuales con unidades de red.

Ejemplo de creación de un clúster de Kubernetes

Antes de pasar al siguiente ejemplo, limpiaremos los recursos que creamos anteriormente. Para hacer esto en la raíz del proyecto. ejemplos-terraform/ejemplos/vpc/server_local_root_disk Ejecutemos 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

Luego ejecute el comando para borrar los objetos de la 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 casos, deberás 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 está en el directorio. ejemplos-terraform/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 archivo vars.tf puedes ver valores predeterminados, como el número de nodos, sus características, versión de Kubernetes, etc.

Para crear recursos similares al primer ejemplo, primero comenzaremos a inicializar módulos y a crear recursos de módulos. proyecto_con_usuarioy luego creando todo lo demás:

$ 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 la creación y gestión de clusters 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 articulos anterioresy así en base de conocimientos.

Al preparar el clúster, se crearán discos y máquinas virtuales y se instalarán todos los componentes necesarios. La preparación tarda unos 4 minutos, tiempo durante el cual Terraform mostrará mensajes como:

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

Una vez que se complete la instalación, Terraform indicará que el clúster está listo y mostrará su 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 administrar el clúster de Kubernetes creado a través de la utilidad kubectl necesita 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 de su cuenta:

Proveedor de Terraform Selectel

A continuación, siga el enlace como xxxxxx.selvpc.ruque aparece debajo del nombre del proyecto:

Proveedor de Terraform Selectel

Para obtener información de inicio de sesión, utilice el nombre de usuario y la contraseña que creó a través de Terraform. Si no has hecho trampa vars.tf o principal.tf para nuestro ejemplo, el usuario tendrá el nombre tf_usuario. Debes utilizar el valor de la variable como contraseña. TF_VAR_usuario_contraseña, que se especificó al inicio aplicar terraforma antes

Dentro del proyecto debes ir a la pestaña. Kubernetes:

Proveedor de Terraform Selectel

Aquí es donde se encuentra el clúster creado mediante Terraform. Descargar archivo para kubectl Puedes hacerlo en la pestaña “Acceso”:

Proveedor de Terraform Selectel

Las instrucciones de instalación se encuentran en la misma pestaña. kubectl y uso de la descarga configuración.yaml.

Después de iniciar el kubectl y estableciendo la variable de entorno KUBECONFIG puedes 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

La cantidad de nodos del clúster se puede cambiar fácilmente a través de Terraform.
En archivo principal.tf se especifica el siguiente valor:

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 especifique el valor requerido directamente en principal.tf:

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

Para aplicar los cambios, como en el caso del primer ejemplo, utilice el comando aplicar terraforma:

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

Cuando cambie la cantidad de nodos, el clúster permanecerá disponible. Después de agregar un nodo a través de Terraform, puedes 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 nos familiarizamos con las principales formas de trabajar con "Nube privada virtual" vía Terraform. Estaremos encantados de que utilice el proveedor oficial Selectel Terraform y nos proporcione sus comentarios.

Cualquier error encontrado en el proveedor Selectel Terraform se puede informar a través de Problemas de Github.

Fuente: habr.com

Añadir un comentario