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>
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 })
}
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:
kubectl config current-context
)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"
}
}
}
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