如何使用Terraform在Kubernetes上的容器中推出新版本的容器?

时间:2018-12-17 03:54:47

标签: docker kubernetes microservices terraform

虽然我一直在学习Kubernetes和Terraform,但我一直在构建Node.js微服务示例。

到目前为止,一切都进行得很顺利,只需执行几条命令,我就可以配置一个Kubernetes集群并为其部署几个Node.js微服务。

完整的示例可在GitHub上找到:https://github.com/ashleydavis/nodejs-microservices-example

您可以在以下文件中查看群集的完整设置和Pod:https://github.com/ashleydavis/nodejs-microservices-example/blob/master/scripts/infrastructure/kubernetes/kubernetes.tf

例如,一个吊舱的定义如下:

resource "kubernetes_pod" "web" {
  metadata {
    name = "nodejs-micro-example-web"

    labels {
      name = "nodejs-micro-example-web"
    }
  }

  spec {
    container {
      image = "${var.docker_registry_name}.azurecr.io/web:${var.version}"
      name  = "nodejs-micro-example-web"
    }
  }
}

这一切对于首次推出都很有效,但是当我更改代码并构建新版本的Docker映像时,我无法使系统进行更新。

执行此操作时,我将更新变量“版本”,您可以在前面的代码片段中看到该变量。

随后我运行terraform apply时,出现以下错误,提示该吊舱已经存在:

kubernetes_pod.web: pods "nodejs-micro-example-web" already exists

所以我的问题是我如何使用Kubernetes和Terraform进行代码更新(即更新的Docker映像),以及如何将新的pod部署到集群? (同时清理旧的豆荚)。

2 个答案:

答案 0 :(得分:2)

以下行是不正确的:

    name = "nodejs-micro-example-web"

因为Pod的名称在其命名空间中是唯一的。

您几乎从不都想部署一个独立的Pod,因为kubernetes认为它们是短暂的。通常,这不是问题,因为Pod是在DeploymentReplicationController(或其他几个,但希望您能理解)的监督下创建的。在您的情况下,如果当Pod跌倒时^ H ^ H,kubernetes不会重新启动它,那么可以肯定的结果是,结果将否定kubernetes带来的很多价值。

答案 1 :(得分:0)

要回答我自己的问题...我现在在Terraform脚本中使用Kubernetes部署来配置Pod,这很好用。

Full code example is on Github

这是配置:

resource "kubernetes_deployment" "web" {
  metadata {
    name = "web"

    labels {
      test = "web"
    }
  }

  spec {
    replicas = 1

    selector {
      match_labels {
        test = "web"
      }
    }

    template {
      metadata {
        labels {
          test = "web"
    }
  }

  spec {
    container {
      image = "${var.docker_registry_name}.azurecr.io/web:${var.version}"
      name  = "web"

          port {
            container_port = 80
          }
        }
      }
    }
  }
}