我开发了一个Terraform脚本来在GKE上创建一个k8集群。
成功创建集群后,我已经设置了要应用于k8集群的yaml文件。
如何在我的Terraform脚本中调用以下命令?
kubectl create <.yaml>
有两种方法可以实现您想要的工作。
您可以使用Terraform资源template_file和null_resource。请注意,我总是使用trigger运行kubectl命令,总是修改模板(您可能希望将create替换为apply)。
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"
}
}
但是也许最好的方法是使用Kubernetes provider。有两种配置方法:
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")}"
}
完成后,您可以轻松创建自己的部署。对于基本的Pod,它很简单:
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"
}
}
}
您可以使用terraform local-exec执行此操作。
resource "aws_instance" "web" {
# ...
provisioner "local-exec" {
command = "echo ${aws_instance.web.private_ip} >> private_ips.txt"
}
}
参考:https://www.terraform.io/docs/provisioners/local-exec.html
您可以使用Terraform kubectl
第三方提供程序。请按照此处的安装说明进行操作:Kubectl Terraform Provider
然后简单地定义一个指向您的YAML文件的kubectl_manifest
,例如:
# 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")
}
此方法的一大优势是,所有内容都是动态获取的,并且不依赖任何本地配置文件(如果您在CI / CD服务器中运行Terraform或管理多集群环境,则非常重要。
kubectl
提供程序还提供了有助于轻松处理多个文件的数据源。从文档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))
}
额外点:您可以对yaml
文件进行模板化。我将集群名称插值到多资源自动缩放器yaml文件中,如下所示:
resource "kubectl_manifest" "autoscaler" {
yaml_body = templatefile("${path.module}/autoscaler.yaml", {cluster_name = var.cluster_name })
}
最好的方法是使用Terraform的Kubernetes提供程序