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

问题描述 投票:0回答:2

虽然我一直在学习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

例如,其中一个pod定义如下:

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镜像时,我无法让系统更新。

当我这样做时,我更新了您在之前的代码片段中可以看到的变量“version”。

当我随后运行terraform apply时,它给出了以下错误,说明该pod已经存在:

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

所以我的问题是如何使用Kubernetes和Terraform推出代码更新(即更新的Docker镜像)并将新的pod部署到群集中? (同时清理旧的豆荚)。

docker kubernetes microservices terraform
2个回答
2
投票

这是以下不正确的行:

    name = "nodejs-micro-example-web"

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

您几乎从不想部署独立的Pod,因为kubernetes认为这些是短暂的。这通常不是问题,因为Pods是在DeploymentReplicationController(或其他一些人,但你希望得到这个想法)的监督下创建的。在你的情况下,如果^ H ^ H当那个Pod倒下时,kubernetes将不会重新启动它然后它是一个相当不错的赌注,结果将否定kubernetes带来的大量价值。


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
          }
        }
      }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.