Terraform - Infraestructura como código (Ej: Kubernetes Cluster)

La primera vez que escuché "infratructura como código" me sorprendí mucho, creo que lo mismo le puede ocurrir al lector. Después de esto analicé en qué caso necesitaríamos tener la infraestructura como código, ya que de por sí, no es muy dificil entrar a un panel y crear un servidor con las configuraciones deseadas (como en Digital Ocean, Vultr, Google Compute, AWS u otro proveedor), así que llegué rápidamente a las siguientes conclusiones:

  • Tener que escribir código para describir nuestra infraestructura vale la pena si tenemos gran cantidad de servidores, probablemente en diferentes proveedores de hosting o hasta para diferentes clientes. Es muy normal encontrarnos que un administrador promedio tiene bajo su cargo al menos 10 servidores, pero qué pasa cuando son muchos más, o se tienen varios clientes?, se puede volver inmanejable.
  • Si nuestra forma de trabajo es escricta, deseamos tener exactamente las configuraciones de nuestra infraestructura.
  • Cuando tenemos bajo nuestro cargo diferentes proyectos, vale la pena ser claros con las configuraciones.
  • Si contamos con diferentes tipos de clusters: Bases de datos, Kubernetes, Dataproc, etc, vale la pena abstraer toda esta información, que puede volverse muy compleja.
  • Es muy útil ya que podemos tener como código servicios de gran variedad de proveedores, algunos que me gustan mucho, como lo son: Cloudflare, Rancher, Gitlab, entre muchos otros https://www.terraform.io/docs/providers/index.html

También encontré algunos contras de esta idea:

  • Curva de aprendizaje para escribir infraestructura como servicio.
  • Mayor carga de trabajo al tener que mantener actualizado una serie de archivos.
  • Complejidad para el trabajo en conjunto en infraestructura. (Qué pasa si dos personas modifican de diferente forma un archivo?)

En todo caso la idea me parecio genial.

Terraform

Al entrar a la página tuve una gran persepción, el proyecto fue desarrollado por Hashicorp, una empresa conformada por un equipo de personas con mucho talento!. Tiene un proyecto abierto con todas las características y una versión paga que básicamente son interfaces que ayudan a la visualización de estos servicios, así mismo para mantener versionada la infraestructura y poder ser accedido por equipos de personas, muy valioso, pero en mi caso es suficiente con la versión OpenSource.

Entrando en materia

Deseo hacer un ejemplo un poco avanzado, ya que no deseo mostrar simplemente la creación de un servidor, con la intensión de mostrar el gran potencial de terraform. Así que supondré que se tiene instalado terraform y configurado Gcloud.

En el siguiente ejemplo desplegaremos un cluster de Kubernetes.

Manos a la obra

Es necesario crear una carpeta y ejecutar el comando terraform init, éste comando preparará todo el entorno para realizar posteriormente los depliegues.

Debemos crear y editar un archivo, el cuál podremos llamar kube-test.tf y agregamos:

Región y proyecto:

provider "google" {
  region  = "us-central1"
  project = "projectxxx"
}

Creamos una red privada para nuestro cluster:

resource "google_compute_network" "kube_test_development" {
  name                    = "kube-test-network"
  auto_create_subnetworks = "false"
}

resource "google_compute_subnetwork" "gkecluster-test" {
  name          = "gkecluster-test"
  ip_cidr_range = "10.0.1.0/24"
  network       = "${google_compute_network.kube_test_development.self_link}"
  region        = "europe-west1"
}

Agregamos dos nodos a nuestro cluster:

resource "google_container_node_pool" "np" {
  name       = "kube-test-node-pool"
  zone       = "europe-west1-b"
  cluster    = "${google_container_cluster.kube_test_cluster.name}"
  node_count = 1
}

resource "google_container_node_pool" "np2" {
  name       = "kube-test-node-pool2"
  zone       = "europe-west1-b"
  cluster    = "${google_container_cluster.kube_test_cluster.name}"
  node_count = 0

  node_config {
    machine_type     = "custom-4-12800"
    min_cpu_platform = "Skylake"
  }
}

Finalmente agregamos el cluster

resource "google_container_cluster" "kube_test_cluster" {
  name               = "kubectl-test-cluster"
  zone               = "europe-west1-b"
  initial_node_count = "2"
  network            = "kube-test-network"
  subnetwork         = "gkecluster-test"

  node_config {
    machine_type = "n1-standard-1"
    min_cpu_platform = "Skylake"
    # machine_type     = "custom-4-12800"
  }
}

Finalmente debemos ejecutar los comandos terraform plan y terraform apply para desplegar todo en Google Compute Platform. Cuando se desee eliminar toda la infraestructura creade se debe ejecutar terraform destroy.

Juan Pablo Arias

I constantly discover new technologies and ways to improve IT processes. I'm a fan of automation. I like programming, but my passion is cloud computing.