DA MASER A MONFUMO | MOTO GUZZI V85TT | PURE SOUND POV 4K

🏍️ Il mio nuovo canale YouTube: giri in moto in POV, solo audio, tra le Dolomiti in 4K. Niente musica, niente parole — solo il motore e le Alpi. Vieni a fare un giro!

Iscriviti

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
}

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.