代码之家  ›  专栏  ›  技术社区  ›  Ashley Davis

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

  •  0
  • Ashley Davis  · 技术社区  · 6 年前

    当我学习Kubernetes和TerraForm时,我正在构建一个node.js微服务示例。

    到目前为止一切都进展顺利,通过一些命令,我可以提供一个kubernetes集群,并向它部署几个node.js微服务。

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

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

    例如,其中一个pods的定义如下:

    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映像)并将新的pods部署到集群中?(同时清理旧的豆荚)。

    2 回复  |  直到 6 年前
        1
  •  2
  •   mdaniel    6 年前

    下面这一行是不正确的:

        name = "nodejs-micro-example-web"
    

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

    你几乎 从未 想部署一个独立的pod,因为kubernetes认为这些是短暂的。这通常不是问题,因为豆荚是被制造出来的。 在监督下 Deployment ReplicationController (或者其他一些人,但你希望能得到这个想法)。在你的例子中,如果当那个吊舱掉下来时,^h^h,kubernetes不会重新启动它,那么很有可能结果会否定kubernetes给情况带来的价值。

        2
  •  0
  •   Ashley Davis    6 年前

    回答我自己的问题…我现在使用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
              }
            }
          }
        }
      }
    }