web-dev-qa-db-fra.com

Comment exécuter les commandes kubectl apply dans terraform

J'ai développé un script terraform pour créer un cluster k8 sur GKE.

Après la création réussie du cluster, j'ai défini des fichiers yaml à appliquer sur le cluster k8.

Comment puis-je invoquer la commande ci-dessous dans mon script terraform?

kubectl create <.yaml>
3
Sunil Gajula

Vous pouvez utiliser le fournisseur tiers Terraform kubectl. Suivez les instructions d'installation ici: Kubectl Terraform Provider

Définissez ensuite simplement un kubectl_manifest pointant vers votre fichier YAML comme:

# Get your cluster-info
data "google_container_cluster" "my_cluster" {
  name     = "my-cluster"
  location = "us-east1-a"
}

# Same parameters as kubernetes provider
provider "kubectl" {
  load_config_file       = false
  Host                   = "https://${data.google_container_cluster.my_cluster.endpoint}"
  token                  = "${data.google_container_cluster.my_cluster.access_token}"
  cluster_ca_certificate = "${base64decode(data.google_container_cluster.my_cluster.master_auth.0.cluster_ca_certificate)}"
}

resource "kubectl_manifest" "my_service" {
    yaml_body = file("${path.module}/my_service.yaml")
}

Cette approche a le gros avantage que tout est obtenu dynamiquement et ne repose sur aucun fichier de configuration local (très important si vous exécutez Terraform sur un serveur CI/CD ou pour gérer un environnement multicluster).

Le fournisseur kubectl propose également des sources de données qui permettent de gérer plusieurs fichiers très facilement. À partir des documents kubectl_filename_list :

data "kubectl_filename_list" "manifests" {
    pattern = "./manifests/*.yaml"
}

resource "kubectl_manifest" "test" {
    count = length(data.kubectl_filename_list.manifests.matches)
    yaml_body = file(element(data.kubectl_filename_list.manifests.matches, count.index))
}

Points supplémentaires : Vous pouvez modéliser vos fichiers yaml. J'interpole le nom du cluster dans le fichier yaml de mise à l'échelle automatique multi-ressources comme suit:

resource "kubectl_manifest" "autoscaler" {
  yaml_body = templatefile("${path.module}/autoscaler.yaml", {cluster_name = var.cluster_name })
}
6
david_g

Il y a plusieurs façons de réaliser ce que vous voulez faire.

Vous pouvez utiliser les ressources Terraform template_file et null_resource .
Notez que j'utilise le déclencheur pour exécuter le kubectl commande toujours vous modifiez le modèle (vous voudrez peut-être remplacer créer par appliquer).

data "template_file" "your_template" {
  template = "${file("${path.module}/templates/<.yaml>")}"
}

resource "null_resource" "your_deployment" {
  triggers = {
    manifest_sha1 = "${sha1("${data.template_file.your_template.rendered}")}"
  }

  provisioner "local-exec" {
    command = "kubectl create -f -<<EOF\n${data.template_file.your_template.rendered}\nEOF"
  }
}

Mais peut-être que la meilleure façon est d'utiliser le fournisseur Kubernetes .
Il existe deux façons de le configurer:

  • Par défaut, vos manifestes seront déployés dans votre contexte actuel (kubectl config current-context)
  • La deuxième façon consiste à définir de manière statique les informations d'identification du certificat TLS:
provider "kubernetes" {
  Host = "https://104.196.242.174"

  client_certificate     = "${file("~/.kube/client-cert.pem")}"
  client_key             = "${file("~/.kube/client-key.pem")}"
  cluster_ca_certificate = "${file("~/.kube/cluster-ca-cert.pem")}"
}

Une fois cela fait, vous pouvez créer votre propre déploiement assez facilement. Pour un pod de base, ce serait aussi simple que:

resource "kubernetes_pod" "hello_world" {
  metadata {
    name = "hello-world"
  }

  spec {
    container {
      image = "my_account/hello-world:1.0.0"
      name  = "hello-world"
    }

    image_pull_secrets  {
      name = "docker-hub"
    }
  }
}
5
Ricardo Jover

Pour ce faire, vous pouvez utiliser terraform local-exec.

   resource "aws_instance" "web" {
     # ...
     provisioner "local-exec" {
      command = "echo ${aws_instance.web.private_ip} >> private_ips.txt"
     }
   }

Réf: https://www.terraform.io/docs/provisioners/local-exec.html

0
AnmolNagpal