Helm è, nella sua forma più elementare, un motore di templating per aiutarti a definire, installare e aggiornare applicazioni in esecuzione su Kubernetes. Con Helm puoi sfruttare la sua funzionalità Charts, ovvero file di configurazione YAML per Kubernetes (ulteriormente configurabili ed estendibili) combinati in un unico pacchetto che può essere usato per distribuire applicazioni su un cluster Kubernetes. Per poter usare Helm tramite Terraform, è necessario definire il provider corrispondente e passare le credenziali necessarie per connettersi al cluster GKE.
provider "helm" {
kubernetes {
token = data.google_client_config.client.access_token
host = data.google_container_cluster.gke.endpoint
cluster_ca_certificate = base64decode(data.google_container_cluster.gke.master_auth[0].cluster_ca_certificate)
}
}Configurazione Terraform
Sto definendo una risorsa helm_release con Terraform, che distribuirà il cluster ElasticSearch al momento dell'applicazione. Poiché uso un Helm chart per il cluster, farlo è incredibilmente semplice. Ho dovuto solo indicare a Helm il nome del chart da usare e dove si trova (repository), insieme alla versione di ElasticSearch che desidero. Con i blocchi set invece posso sovrascrivere i valori di default del template: questo rende semplice scegliere una storage class appropriata, la quantità di storage e in generale qualsiasi altra impostazione di configurazione modificabile (è necessario fare riferimento alla documentazione del chart per vedere quali valori possono essere sovrascritti), direttamente da Terraform.
resource "helm_release" "elasticsearch" {
name = "elasticsearch"
repository = "https://helm.elastic.co"
chart = "elasticsearch"
version = "6.8.14"
timeout = 900
set {
name = "volumeClaimTemplate.storageClassName"
value = "elasticsearch-ssd"
}
set {
name = "volumeClaimTemplate.resources.requests.storage"
value = "5Gi"
}
set {
name = "imageTag"
value = "6.8.14"
}
}Creazione di una nuova storage class
Ho poi dovuto eseguire il provisioning di una nuova storage class, che sarà usata dal cluster ElasticSearch per memorizzare i dati. La configurazione seguente imposta il disco persistente SSD (consigliato per questo scopo poiché è più veloce di un normale HDD) a cui ho fatto riferimento nella configurazione principale sopra.
resource "kubernetes_storage_class" "elasticsearch_ssd" {
metadata {
name = "elasticsearch-ssd"
}
storage_provisioner = "kubernetes.io/gce-pd"
reclaim_policy = "Retain"
parameters = {
type = "pd-ssd"
}
allow_volume_expansion = true
}Riepilogo
In questo post ho mostrato come distribuire ElasticSearch su GKE usando Terraform e Helm. La configurazione richiesta è semplice e molto leggibile, abbassando la barriera per gestire tutta l'infrastruttura tramite Terraform, anziché usare, ad esempio, il Cloud Marketplace, servizi gestiti o altre soluzioni personalizzate.
lucavallin

