Dočasné prostředí pro vývojáře spravované Terraformem
#development #terraform #cloud
Team se nám ve firmě zvětšuje, najednou si více lidí potřebuje vytvářet dočasné testovací a vývojové prostředí, jako jsou Kubernetes clustery, virtuální stroje, které musíme nějak rozumě spravovat.
Problém
Kolega Jakub po mě chtěl Kubernetes cluster, aby na něm mohl udělat demo ohledně ArgoCD. Já bych to standardně řešil tak, že bych si spustil moje demo Kubernetes na DigitalOceanu pomocí Terraformu, viz repo ondrejsika/terraform-demo-k8s.
Jenže ono to není tak jednoduché. Já už tohle repo naklonované mám, a taky mám připravený i soubor terraform.auto.tfvars
se správně vyplněnými tokeny do Cloudflare a DigitalOceanu a v zásadě zapnutí toho clusteru mi nezabere žádný čas.
Ale v případě Jakuba je to něco jiného. On nemá ani repo, ani nastavené values a tokeny k dev infrastruktuře by musel hledat někde ve 1Passwordu. A to už není na chvilku, tenhle setup zabere mnohem víc času a musí se opakovat pro každý nový ukázkový repozitář.
Řešení
Řešení je mít jednoduchou možnost, jak si spustím resource, který aktuálně potřebuji co nejrychleji. A proto vznikly tyto 2 repozitáře sikalabs/terraform-module-sikalabs-do-k8s a sikalabs/sl-infra-live-dev
(ten druhý je privátní).
Řešení je v zásadě jednoduché, místo různých stand alone Terraformích repozitářů uděláme moduly co nám jednoduše spustí to co potřebujeme - v našem případě se jedná o Kubernetes cluster včetně load balanceru a DNS záznamu. Ten pak pouze používáme s různou konfigurací v rámci jednoho repozitáře a vše co je v masteru toho sikalabs/sl-infra-live-dev
repozitáře máme nasazené. Já mám nasazování masterů udělané automaticky pomocí integrace Terraform Cloudu s Githubem, ale i manuální spouštění nebo spouštění pomocí Gitlab CI je OK.
A jak to vlastně vypadá?
V repozitáři sikalabs/sl-infra-live-dev
máme nastavený remote backend a v něm všechny tokeny, vývojáři nemusí mít žádné lokální nastavení. Pouze stačí být přihlášen k Terraform Cloudu (pomoci příkazu terraform login
).
// _backend.tf
terraform {
backend "remote" {
organization = "sikalabs"
workspaces {
name = "sikalabs-live-dev"
}
}
}
Protože používáme remote execution, nastavení proměnných pro providery máme v Terraform Cloudu:
// _providers.tf
variable "digitalocean_token" {}
provider "digitalocean" {
token = var.digitalocean_token
}
variable "cloudflare_api_token" {}
provider "cloudflare" {
api_token = var.cloudflare_api_token
}
Všechny "globální" soubory mám prefixované podtržítkem, abych je oddělil od těch dočasných, kde si každý vytváří a maže podle potřeby.
Takže to může vypadat takhle:
module "ondrejsika_k8s_foo" {
source = "sikalabs/sikalabs-do-k8s/module"
version = "0.1.0"
prefix = "alp"
cloudflare_zone_id = local.sikadev_com_zone_id
digitalocean_region = "fra1"
kubernetes_version = "1.20.2-do.0"
node_size = "s-2vcpu-4gb"
node_count = 3
}
module "ondrejsika_k8s_bar" {
source = "sikalabs/sikalabs-do-k8s/module"
version = "0.1.0"
prefix = "alp"
cloudflare_zone_id = local.sikadev_com_zone_id
digitalocean_region = "fra1"
kubernetes_version = "1.20.2-do.0"
node_size = "s-2vcpu-4gb"
node_count = 1
}
output "ondrejsika_kubeconfig_foo" {
value = module.ondrejsika_k8s_foo.kubeconfig
sensitive = true
}
output "ondrejsika_kubeconfig_bar" {
value = module.ondrejsika_k8s_bar.kubeconfig
sensitive = true
}
Vidíme, že tady používám Terraform modul (sikalabs/terraform-module-sikalabs-do-k8s), co mi vytvoří Kubernetes cluster se vším co běžně potřebuju (load balancer a DNS záznamy).
A pak si každý kdo potřebuje něco v testovacím prostředí pustit pouze přidá své resources a commitne. Když už je nepotřebuje, zase je smaže a opět commitne.
Školení Terraformu
Zaujal Vás Terraform? Chcete se dozvědět více? Přijďte na mé Školení Terraformu!
Případně si můžete vybrat z nabídky otevřených kurzů.
Ondřej Šika
Jsem freelance DevOps konzultant a lektor. Zlepšuji práci vývojářských týmu zaváděním efektivních procesů ve vývoji. Naučím Vás používat prověřené nástroje a technologie, které povedou k rychlejšímu vývoji a bezpečnějšímu provozu vašeho software.