虽然我一直在学习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部署到集群? (同时清理旧的豆荚)。
答案 0 :(得分:2)
以下行是不正确的:
name = "nodejs-micro-example-web"
因为Pod的名称在其命名空间中是唯一的。
您几乎从不都想部署一个独立的Pod,因为kubernetes认为它们是短暂的。通常,这不是问题,因为Pod是在Deployment
或ReplicationController
(或其他几个,但希望您能理解)的监督下创建的。在您的情况下,如果当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
}
}
}
}
}
}